Zookeeper的通信架构

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过程中

系统默认提供了3种选择算法,AuthFastLeaderElection,FastLeaderElection,LeaderElection。其中AuthFastLeaderElection和LeaderElection采用UDP模式进行通信,而FastLeaderElection仍然采用tcp/ip模式。

Zookeeper的通信流程

Session创建

当启动一个Zookeeper client的时候,首先按照一定的算法查找出follower, 然后与Follower建立起NIO连接。当连接建立好后,发送create session的命令。当server收到create session命令,先从本地的session列表中查找看是否已经存在有相同sessionId,则关闭原session重新创建新的session。创建session的过程将需要发送到Leader,再由leader通知其他follower,大部分Follower都将此操作记录到本地日志再通知leader后,leader发送commit命令给所有Follower,连接客户端的Follower返回创建成功的session响应。

 Zookeeper查询命令

Zookeeper查询命令主要用来查询服务器端的数据,不会更改服务器端的数据。所有的查询命令都可以即刻从client连接的server立即返回,不需要leader进行协调。查询命令包括以下这些命令:

  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,setData,setACL),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之间的来回请求响应,并且在此过程中还会涉及事务日志的记录。

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐