`

Zookeeper中ZooKeeperServer们的分析

阅读更多

             最近在看ZooKeeper的源码,在zookeeper中用LeaderZooKeeperServer , FollowerZooKeeperServer和ObserverZooKeeperServer 这三个类来实现三种类型的服务器节点。

           他们之间的关系是这样的,我用viso画张图先:



       Zookeeper采用了责任链模式处理他们之间的各种请求,接下来我逐一分析他们处理请求的过程:

 

1.  LeaderZookeeperServer

LeaderZookeeperServer处理的过程的文字描述:

 

1、接收客户端的request请求

2、将会修改同步数据的request请求 转化为proposal,并保存。

3、向所有的follower发送proposal。

4、接收follower的ack。

5、统计收到的ack,如果某一个proposal的ack超过了半数,那么向所有follower发送commit 信令,并向所有observer发送inform信令,执行这个proposal的动作。

6、leader自己执行已经被commit的proposal所对应的操作,并回复结果。

 

我用一张图展示一下LeaderZookeeperServer的责任链:



 

 详细流程如下:



 

2.  FollowerZookeeperServer

FollowerZookeeperServer处理的过程的文字描述:

 

1、 发现leader。

2、 建立与leader的连接。

3、 向leader注册。(leader activation)

4、 与leader进行同步。

5、 无限循环

---读取从leader处接收到的信令。

---处理从leader处接收到的信令。

A、 如果是PROPOSAL信令(写请求),将此信令投递到FollowerZooKeeperServer的synProcessor。主要作用是回复leader一个ack。

B、 如果是COMMIT信令,将此信令投递到FollowerZooKeeperServer的commitProcessor。最终执行FollowerZooKeeperServer的commit函数。

C、 如果是SYNC信令,将此信令投递到FollowerZooKeeperServer的commitProcessor。commitProcessor直接将此信令转发给FinalRequestProcessor,将sync信令带的内容写入持久层。

 

 

我用一张图展示一下FollowerZookeeperServer的责任链:



 
详细流程如下:



  

 

3.  ObserverZookeeperServer
ObserverZookeeperServer处理的过程的文字描述:

 

1、 发现leader。

2、 连接到leader上,建立TCP连接。

3、 与leader进行同步,同步leader上已经被commit的proposal。

4、 无限循环,读取接收到得信令,处理信令。

1、如果是syn信令,调用ObserverZooKeeperServer的syn函数,投递到commitProcessor中。

2、如果是info信令,同样调用ObserverZooKeeperServer的commit函数,投递到commitProcessor中。

OserverZookeeperServer的责任链基本上与follower的相同如下,只是commitProcessor调用的commit函数里的处理不同:

 

 

我用一张图展示一下ObserverZookeeperServer的责任链:



 详细流程如下:

 


 最后看一下ZK的源码中对SyncRequestProposal的解释,秒懂:



 
 

ps:画图不易,转载请注明。

欢迎大家批评指正。

  • 大小: 292.9 KB
  • 大小: 263.6 KB
  • 大小: 163.3 KB
  • 大小: 163.6 KB
  • 大小: 425.1 KB
  • 大小: 320.9 KB
  • 大小: 333.9 KB
  • 大小: 418 KB
  • 大小: 381.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics