最近在看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:画图不易,转载请注明。
欢迎大家批评指正。