Zookeeper

Zookeeper的选举和读写流程

2020-11-03  本文已影响0人  王勇1024

Zookeeper选举过程

服务器启动或者服务器运行期间(Leader挂了),都会进入Leader选举,我们来看一下~假设现在ZooKeeper集群有五台服务器,它们myid分别是服务器1、2、3、4、5,如图:

服务器启动的Leader选举

zookeeper集群初始化阶段,服务器(myid=1-5)依次启动,开始zookeeper选举Leader~

  1. 每个服务器发出一个投票
    服务器1 和 服务器2都将自己作为Leader服务器进行投票,投票的基本元素包括:服务器的myid和ZXID,我们以(myid,ZXID)形式表示。初始阶段,服务器1和服务器2都会投给自己,即服务器1的投票为(1,0),服务器2的投票为(2,0),然后各自将这个投票发给集群中的其他所有机器。
  2. 接受来自各个服务器的投票
    每个服务器都会接受来自其他服务器的投票。同时,服务器会校验投票的有效性,是否本轮投票、是否来自LOOKING状态的服务器。
  3. 处理投票
    收到其他服务器的投票,会将被人的投票跟自己的投票PK,PK规则如下:
  1. 统计投票
    每次投票后,服务器会统计所有投票,判断是否有过半的机器接受到相同的投票信息。服务器2收到两票,少于3(n/2+1,n为总服务器),所以继续保持LOOKING状态

服务器运行期间的Leader选举

zookeeper集群的五台服务器(myid=1-5)正在运行中,突然某个瞬间,Leader服务器3挂了,这时候便开始Leader选举~

Zookeeper写入流程

通过Leader进行写操作

通过Leader进行写操作流程如下图所示

由上图可见,通过Leader进行写操作,主要分为五步:

  1. 客户端向Leader发起写请求
  2. Leader将写请求以Proposal的形式发给所有Follower并等待ACK
  3. Follower收到Leader的Proposal后返回ACK
  4. Leader得到过半数的ACK(Leader对自己默认有一个ACK)后向所有的Follower和Observer发送Commmit
  5. Leader将处理结果返回给客户端

这里要注意

通过Follower/Observer进行写操作

通过Follower/Observer进行写操作流程如下图所示:

image

从上图可见

读操作

Leader/Follower/Observer都可直接处理读请求,从本地内存中读取数据并返回给客户端即可。

由于处理读请求不需要服务器之间的交互,Follower/Observer越多,整体可处理的读请求量越大,也即读性能越好。

参考资料

深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制
麻辣ZooKeeper十二连问,你顶得住嘛?!

上一篇 下一篇

猜你喜欢

热点阅读