本文的主题就是讲解Zookeeper通信模型,本节将通过一个概要图来说明Zookeeper的通信模型。
Zookeeper的通信架构
在Zookeeper整个系统中,有3中角色的服务,client、Follower、leader。其中client负责发起应用的请求,Follower接受client发起的请求,参与事务的确认过程,在leader crash后的leader选择。而leader主要承担事务的协调,当然leader也可以承担接收客户请求的功能,为了方便描述,后面的描述都是client与Follower之间的通信,如果Zookeeper的配置支持leader接收client的请求,client与leader的通信跟client与Follower的通信模式完全一样。Follower与leader之间的角色可能在某一时刻进行转换。一个Follower在leader crash掉以后可能被集群(Quorum)的Follower选举为leader。而一个leader在crash后,再次加入集群(Quorum)将作为Follower角色存在。在一个集群(Quorum)中,除了在选举leader的过程中没有Follower和leader的区分外,其他任何时刻都只有1个leader和多个Follower。Client、Follower和leader之间的通信架构如下:
Client与Follower之间
为了使客户端具有较高的吞吐量,Client与Follower之间采用NIO的通信方式。当client需要与Zookeeper service打交道时,首先读取配置文件确定集群内的所有server列表,按照一定的load balance算法选取一个Follower作为一个通信目标。这样client和Follower之间就有了一条由NIO模式构成的通信通道。这条通道会一直保持到client关闭session或者因为client或Follower任一方因某种原因异常中断通信连接。正常情况下, client与Follower在没有请求发起的时候都有心跳检测。
Follower与leader之间
Follower与leader之间的通信主要是因为Follower接收到像(create, delete, setData, setACL, createSession, closeSession, sync)这样一些需要让leader来协调最终结果的命令,将会导致Follower与leader之间产生通信。由于leader与Follower之间的关系式一对多的关系,非常适合client/server模式,因此他们之间是采用c/s模式,由leader创建一个socket server,监听各Follower的协调请求。
集群在选择leader过程中
由于在选择leader过程中没有leader,在集群中的任何一个成员都需要与其他所有成员进行通信,当集群的成员变得很大时,这个通信量是很大的。选择leader的过程发生在Zookeeper系统刚刚启动或者是leader失去联系后,选择leader过程中将不能处理用户的请求,为了提高系统的可用性,一定要尽量减少这个过程的时间。选择哪种方式让他们可用快速得到选择结果呢?Zookeeper在这个过程中采用了策略模式,可用动态插入选择leader的算法。系统默认提供了3种选择算法,AuthFastLeaderElection,FastLeaderElection,LeaderElection。其中AuthFastLeaderElection和LeaderElection采用UDP模式进行通信,而FastLeaderElection仍然采用tcp/ip模式。在Zookeeper新的版本中,新增了一个learner角色,减少选择leader的参与人数。使得选择过程更快。一般说来Zookeeper leader的选择过程都非常快,通常<200ms。
Zookeeper的通信流程
要详细了解Zookeeper的通信流程,我们首先得了解Zookeeper提供哪些客户端的接口,我们按照具有相同的通信流程的接口进行分组:
Zookeeper系统管理命令
Zookeeper的系统管理接口是指用来查看Zookeeper运行状态的一些命令,他们都是具有4字母构成的命令格式。主要包括:
1. ruok:发送此命令可以测试zookeeper是否运行正常。
2. dump:dump server端所有存活session的Ephemeral(临时)node信息。
3. stat:获取连接server的服务器端的状态及连接该server的所有客服端的状态信息。
4. reqs: 获取当前客户端已经提交但还未返回的请求。
5. stmk:开启或关闭Zookeeper的trace level.
6. gtmk:获取当前Zookeeper的trace level是否开启。
7. envi: 获取Zookeeper的java相关的环境变量。
8. srst:重置server端的统计状态
当用户发送这些命令的到server时,由于这些请求只与连接的server相关,没有业务处理逻辑,非常简单。Zookeeper对这些命令采用最快的效率进行处理。这些命令发送到server端只占用一个4字节的int类型来表示不同命令,没有采用字符串处理。当服务器端接收到这些命令,立刻返回结果。
Session创建
任何客户端的业务请求都是基于session存在的前提下。Session是维持client与Follower之间的一条通信通道,并维持他们之间从创建开始后的所有状态。当启动一个Zookeeper client的时候,首先按照一定的算法查找出follower, 然后与Follower建立起NIO连接。当连接建立好后,发送create session的命令,让server端为该连接创建一个维护该连接状态的对象session。当server收到create session命令,先从本地的session列表中查找看是否已经存在有相同sessionId,则关闭原session重新创建新的session。创建session的过程将需要发送到Leader,再由leader通知其他follower,大部分Follower都将此操作记录到本地日志再通知leader后,leader发送commit命令给所有Follower,连接客户端的Follower返回创建成功的session响应。Leader与Follower之间的协调过程将在后面的做详细讲解。当客户端成功创建好session后,其他的业务命令就可以正常处理了。
Zookeeper查询命令
Zookeeper查询命令主要用来查询服务器端的数据,不会更改服务器端的数据。所有的查询命令都可以即刻从client连接的server立即返回,不需要leader进行协调,因此查询命令得到的数据有可能是过期数据。但由于任何数据的修改,leader都会将更改的结果发布给所有的Follower,因此一般说来,Follower的数据是可以得到及时的更新。这些查询命令包括以下这些命令:
1. exists:判断指定path的node是否存在,如果存在则返回true,否则返回false.
2. getData:从指定path获取该node的数据
3. getACL:获取指定path的ACL。
4. getChildren:获取指定path的node的所有孩子结点。
所有的查询命令都可以指定watcher,通过它来跟踪指定path的数据变化。一旦指定的数据发生变化(create,delete,modified,children_changed),服务器将会发送命令来回调注册的watcher. Watcher详细的讲解将在Zookeeper的Watcher中单独讲解。
Zookeeper修改命令
Zookeeper修改命令主要是用来修改节点数据或结构,或者权限信息。任何修改命令都需要提交到leader进行协调,协调完成后才返回。修改命令主要包括:
1. createSession:请求server创建一个session
2. create:创建一个节点
3. delete:删除一个节点
4. setData:修改一个节点的数据
5. setACL:修改一个节点的ACL
6. closeSession:请求server关闭session
我们根据前面的通信图知道,任何修改命令都需要leader协调。 在leader的协调过程中,需要3次leader与Follower之间的来回请求响应。并且在此过程中还会涉及事务日志的记录,更糟糕的情况是还有take snapshot的操作。因此此过程可能比较耗时。但Zookeeper的通信中最大特点是异步的,如果请求是连续不断的,Zookeeper的处理是集中处理逻辑,然后批量发送,批量的大小也是有控制的。如果请求量不大,则即刻发送。这样当负载很大时也能保证很大的吞吐量,时效性也在一定程度上进行了保证。
zookeeper server端的业务处理-processor链
<!--EndFragment-->
Zookeeper通过链式的processor来处理业务请求,每个processor负责处理特定的功能。不同的Zookeeper角色的服务器processor链是不一样的,以下分别介绍standalone Zookeeper server, leader和Follower不同的processor链。
Zookeeper中的processor
1. AckRequestProcessor:当leader从向Follower发送proposal后,Follower将发送一个Ack响应,leader收到Ack响应后,将会调用这个Processor进行处理。它主要负责检查请求是否已经达到了多数Follower的确认,如果满足条件,则提交commitProcessor进行commit处理
2. CommitProcessor:从commited队列中处理已经由leader协调好并commit的请求或者从请求队列中取出那些无需leader协调的请求进行下一步处理。
3. FinalRequestProcessor:任何请求的处理都需要经过这个processor,这是请求处理的最后一个Processor,主要负责根据不同的请求包装不同的类型的响应包。当然Follower与leader之间协调后的请求由于没有client连接,将不需要发送响应(代码体现在if (request.cnxn == null) {return;})。
4. FollowerRequestProcessor:Follower processor链上的第一个,主要负责将修改请求和同步请求发往leader进行协调。
5. PrepRequestProcessor:在leader和standalone server上作为第一Processor,主要作用对于所有的修改命令生成changelog。
6. ProposalRequestProcessor:leader用来将请求包装为proposal向Follower请求确认。
7. SendAckRequestProcessor:Follower用来向leader发送Ack响应的处理。
8. SyncRequestProcessor:负责将已经commit的事务写到事务日志以及take snapshot.
9. ToBeAppliedRequestProcessor:负责将tobeApplied队列的中request转移到下一个请求进行处理。
Standalone zookeeper processor链
Leader processor链
Follower processor链
相关推荐
- **数据模型的一致性**: 由于Zookeeper保证了数据的强一致性,所以在设计数据结构时要考虑如何避免数据竞争和死锁。 - **会话超时**: 需要合理设置会话超时时间,既要防止因网络抖动导致的频繁重连,也要避免因...
RPC是一种进程间通信方式,允许一个程序调用另一个不在同一个地址空间中的程序。Dubbo作为RPC框架,它简化了服务间的远程调用,使得开发者可以像调用本地方法一样调用远程服务,提高了开发效率和系统的可维护性。 ...
在Java中,Zookeeper提供了丰富的API供开发者使用,如`org.apache.zookeeper.ZooKeeper`类是核心接口,用于与Zookeeper服务器通信。通过`connect()`方法建立连接,然后可以调用`create()`, `exists()`, `getData()`,...
ZooKeeper的数据模型类似文件系统,由一系列的ZNode构成,每个ZNode可以有子ZNode,也可以存储数据。ZNode有临时和持久两种类型,临时ZNode在创建它的会话结束时自动删除,而持久ZNode除非被显式删除,否则一直存在...
Zookeeper的数据模型类似文件系统,由一系列Znode构成,每个Znode有父节点和子节点,但与文件系统不同的是,Znode可以有数据也可以有子节点,同时支持顺序节点(创建时自动添加编号)。 ### 4. 功能应用 - **命名...
1. **节点(ZNode)**:ZooKeeper 的数据存储结构类似文件系统,由一系列的节点构成,每个节点称为ZNode。每个ZNode都可以存储数据,有唯一的路径标识,并可以设置权限和监控事件。 2. **会话(Session)**:客户端...
在“尚硅谷大数据技术之Zookeeper.doc”文档中,详细介绍了Zookeeper的架构原理,包括服务器角色(如follower、leader和observer)、Zookeeper的数据模型(如ZNode和路径)、会话机制以及Zookeeper的操作命令等。...
中间件通过ZooKeeper能够实现数据的自适应通信,即能够根据业务需求的变化动态地调整通信模型和服务能力,从而满足业务发展的需求。 分布式通信服务中间件在实际应用中具有广泛的应用场景。例如,在服务解耦和事件...
在ZooKeeper中,每个节点都可以是客户端,也可以是服务器,客户端通过发送请求到服务器,服务器之间通过ZAB协议进行通信,确保数据在集群中的同步。 ZooKeeper的数据模型是一个层次化的命名空间,类似于文件系统。...
通过阅读源码,我们可以了解到如何与Zookeeper服务器通信,如何解析和展示数据,以及如何实现图形化操作的逻辑。这对于理解和开发类似的分布式协调服务管理工具具有很大的价值。 总结来说,Zookeeper管理工具是管理...
Zookeeper的数据模型是一个层次化的命名空间,类似于文件系统的目录结构,称为ZNode。每个ZNode都可以存储数据,并且有自己的子节点。ZNode分为临时节点和持久节点,临时节点在创建它的客户端断开连接后会自动删除,...
1. **Zookeeper的数据模型**:Zookeeper的数据存储结构是一个层次化的命名空间,类似于文件系统的目录结构,由一系列的Znode(节点)构成。 2. **Zookeeper的工作流程**:包括客户端连接、会话建立、请求处理、数据...
7. **数据模型**:Zookeeper的数据模型是树形结构,由节点(znode)组成,每个节点有数据、ACL权限、时间戳等属性。节点分为临时节点和持久节点,临时节点在客户端断开连接后会自动删除。 8. **Watch机制**:Watch...
4. **操作API**:ZooKeeper提供了一系列的操作API,包括创建、删除、更新、读取ZNode,以及设置和取消watcher等。 5. **原子性**:ZooKeeper保证所有操作都是原子的,即一次操作要么全部完成,要么全部不完成,不会...
`zookeeperInternals.pdf` 深入剖析了 Zookeeper 内部工作原理,可能包括其数据模型、选举算法、客户端通信机制等,适合希望深入理解 Zookeeper 的读者。 `zookeeperTutorial.pdf` 和 `zookeeperStarted.pdf` 是...
Zookeeper的数据模型类似于文件系统,由一系列的路径标识符组成,每个路径称为Znode。Znode可以存储数据,并且具有版本号,支持多版本控制。 **三、Zookeeper角色** 1. **Leader**: 负责处理写请求,维护全局的...
Zookeeper的数据模型是一个层次化的命名空间,类似于文件系统。每个节点称为ZNode,存储数据和元数据,支持临时节点和持久节点,以及 watches(观察者)机制,用于实时监听节点变化。 5. **Zookeeper的应用场景** ...
Zookeeper的关键特性之一是它使用watch机制,允许客户端在监控的znode发生变化时获得通知。 在Zookeeper集群中,有三种角色:Leader、Follower和Observer。集群中只有一个Leader,它负责处理客户端的写请求并同步...