[原创]zookeeper关于Leader的选举过程
zookeeper关于Leader的选举,主要分为两种情况:
1、在刚开始启动服务器进行初始化的时候,这个时候至少需要两台服务器才能进入选举阶段,这种情况的过程如下:
①首先当第一台启动的时候,并不能进入选举阶段,然后启动第二台服务器,这个时候,两台服务器就可以进行通信了,于是进入选举阶段;
②假设服务器一共就两台,分别为server1和server2,然后这两台服务器会将自己的SID和ZXID广播出去,也包括自己;
③当服务器收到之后,首先会看下是不是这一轮次的,如果是,那么会将接受到的其余投票和自己的SID和ZXID进行比较,比较过程如下:
首先是ZXID进行比较,如果接受到的其它服务器的ZXID更大,那么就更新投票为该服务器的SID和ZXID,然后再次广播发送出去;
否则如果自己的ZXID更大,那么不用更新投票,直接再次发送自己的SID和ZXID;但如果ZXID相等,那么就比较SID,如果接受到的其它的服务器的SID更大,那么就更新投票 为该服务器的SID和ZXID并广播发送出去,如果自己的SID更大,那么就不进行更新投票;
④最后,进行统计投票信息,如果有超过半数以上的相同SID,那么就以该SID的服务器作为Leader,然后选举就结束了,否则的话,继续上面的操作;
2、如果是在运行过程中Leader服务器挂掉后,那么会重新进行选举操作,选举过程和上面的情况类似;
问题:
(1) 事物ID(ZXID)是什么意思?
网上给的一种解释:
znode节点的状态信息中包含czxid和mzxid, 那么什么是zxid呢?
ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction
id
, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生. 创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.
书上的解释:
每一个ZXID对应一次更新操作,从这些ZXID中间接地识别出ZooKeeper处理这些更新操作请求的全局顺序。
个人归纳的答案:
zk创建任意节点或者更新任意节点的数据或者删除任意节点都会导致状态发生改变,zk状态的每一次改变,都对应着一个递增的Transaction id,该id就叫做zxid。每一个ZXID对应一次更新操作,我们可以从这些ZXID中间接地识别出zk处理这些更新操作的先后顺序。
(2)服务器ID(SID)的意思是什么?
SID是一个数字,用来唯一标示一台Zookeeper集群中的机器。
未完待续。。。。