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

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


Zookeeper中ZooKeeperServer们的分析
       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的责任链:


Zookeeper中ZooKeeperServer们的分析
 

 详细流程如下:


Zookeeper中ZooKeeperServer们的分析
 

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的责任链:


Zookeeper中ZooKeeperServer们的分析
 
详细流程如下:


Zookeeper中ZooKeeperServer们的分析
  

 

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的责任链:


Zookeeper中ZooKeeperServer们的分析


 详细流程如下:

 

Zookeeper中ZooKeeperServer们的分析
 最后看一下ZK的源码中对SyncRequestProposal的解释,秒懂:


Zookeeper中ZooKeeperServer们的分析
 
 

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

欢迎大家批评指正。

相关文章:

  • 2022-03-09
  • 2021-06-15
  • 2021-08-22
  • 2021-07-28
  • 2021-10-01
  • 2022-01-10
  • 2021-07-28
  • 2022-12-23
猜你喜欢
  • 2021-07-31
  • 2022-02-04
  • 2021-12-30
  • 2021-05-25
  • 2021-04-21
  • 2021-08-22
  • 2021-08-22
相关资源
相似解决方案