_N_了吧唧的_ 发表于 2017-4-19 11:12:51

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:画图不易,转载请注明。
  欢迎大家批评指正。
页: [1]
查看完整版本: Zookeeper中ZooKeeperServer们的分析