文章目录
2021SC@SDUSC
一、ZooKeeper综述
1.ZooKeeper是什么
ZooKeepe是Apache Hadoop项目下的一个子项目,是一个树形目录服务。
ZooKeeper是一个分布式的、开源的分布式应用程序的协调服务。换句话说,它是一个用来管理分布式应用程序的软件。既然它是一个管理的软件,那么它也为分布式应用程序提供了相应的管理功能服务,因而分布式应用程序可以实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Leader选举、分布式锁和分布式队列等功能。
ZooKeeper会封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户使用。
简单来说,ZooKeeper提供了文件系统和通知机制,并保证了顺序一致性、原子性、单一视图、可靠性和最终一致性。
2.ZooKeeper文件系统、通知机制和访问控制列表(ACL)
ZooKeeper提供一个多层级的节点命名空间,节点称为znode。与文件系统不同的是,znode可以设置关联的数据,而文件系统中只有文件节点可以存放数据而目录节点不行。其中znode有默认的四个类型:
(1)PERSISTENT-持久化目录节点:除非手动删除,否则即使客户端与ZooKeeper断开连接后,该节点依然存在。
(2)EPHEMERAL-临时目录节点:临时节点的生命周期与客户端会话绑定,一旦会话失效,那么该临时节点会被删除。
(3)PERSISTENT_SEQUENTIAL-持久化顺序目录节点:与持久化目录节点类似,只是增加了顺序属性。
(4)EPHEMERAL_SEQUENTIAL-临时顺序目录节点:与临时目录节点类似,只是增加了顺序属性。
此外,ZooKeeper在内存中维护了这个树状目录结构,这个特征使得ZooKeeper不能用于存放大量的数据,每个节点的存放数据上限为1M。
通知机制:客户端对某个它感兴趣的znode建立一个watcher事件。当该znode发生变化时,对该znode感兴趣的客户端就会收到ZooKeeper的通知,进而客户端根据znode变化而有所作为。
ACL 权限控制,使用:scheme🆔perm 来标识,主要涵盖 3 个方面:
权限模式(Scheme):授权的策略
授权对象(ID):授权的对象
权限(Permission):授予的权限
其特性如下:
ZooKeeper的权限控制是基于每个znode节点的,需要对每个节点设置权限
每个znode支持设置多种权限控制方案和多个权限
子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
3.ZooKeeper主从节点同步——ZAB协议
ZooKeeper的核心是原子广播机制,这个机制保证了各个服务端之间的同步。实现这个机制的协议叫做ZAB协议。
分布式系统中Leader负责对外部客户端的写请求,Follower负责对外部客户端的读请求和数据同步。因而产生了相应的问题:
(1)Leader如何将数据同步到各个Follower?
(2)Leader由于自身原因失效或者过半Follower失效导致Leader失效后,集群如何工作?
因此ZAB协议为了解决上面的问题而设计了两种模式,分别是广播模式和恢复模式,整个ZooKeeper在这两个模式之间切换。
(1)恢复模式:当服务启动或者在领导者失效后,ZAB进入恢复模式。当Leader被选举出来且过半Follower完成了和Leader的状态同步后,恢复模式结束。状态同步保证了Leader和Follower具有相同的系统状态。
(2)广播模式:Leader和过半Follower进行了状态同步后,进入广播模式。ZooKeeper服务一直维持在Broadcast状态,直到Leader失效。
4.ZooKeeper网络通信以及会话
ZooKeeper中网络通信方式有两种:
(1)Zookeeper 客户端与Follower之间的网络通信采用了NIO通信方式。当客户端与服务端Follower之间需要建立网络通信时,客户端根据配置文件以及load balance算法从集群中选定一个Follower作为通信目标。这样客户端和Follower之间就有了一条由NIO构成的通信通道。通信通道建立好后,Follower会生成一个 ServerCnxn对象,当该对象创建好之后,会为当前这个客户端建立成功的连接,创建一个 Session 对象。这条通道会一直保持到客户端关闭Session或者因为客户端或Follower任一方因异常中断通信连接。
(2)Zookeeper 还提供了对netty的支持,而使用netty作为zookeeper网络通信层的实现的话需要在客户端和Follower分别指定。
会话包括会话状态、会话创建、会话管理、会话清理以及重连。这里挑出ZooKeeper的会话创建做一下简单的介绍,其余部分将在后续源码分析时做详细介绍。
ZooKeeper 会话创建:当由NIO构成通信通道连接建立好后,客户端发送create session的命令。当Follower收到create session命令,先从本地的Session列表中查找看是否已经存在有相同sessionID,如果存在,则关闭原Session重新创建新的Session。创建Session的过程将发送到Leader,再由Leader通知其他Follower,当过半Follower根据ZAB协议将此请求记录到本地日志后通知Leader,Leader发送commit命令给所有Follower,连接客户端的Follower返回创建成功的session响应。
二、组内分工
组员 | ZooKeeper源码解析分工 |
---|---|
陈伊臻 | Znode、Watcher、ACL |
刘翔 | ZAB Protocol |
张磊 | ZAB Protocol |
萧科多 | Network Communications 、Session |
三、总结
本章节通过对ZooKeeper的深入理解和分析,从而划分了ZooKeeper的核心内容,并对核心内容进行了概念性阐述。之后将根据组内分工对ZooKeeper的源码进行逐一解析。