答:
zookeeper的节点数必须为2n+1,也就是奇数个节点,以此来保证选举成功。以5个节点的集群为例,每个zk都有自己的id,叫myid,这里假设我5台服务器zk的myid依次为1-5。
(1)启动myid为1的zk,它会给自己投票,然后发现集群中无其他节点启动,于是它处于looking状态
(2)启动myid为2的zk,它会给自己投票,然后与节点1互换投票,由于节点2的myid大于节点1,所以此次投票节点2胜出,但节点2此时的得票少于总节点数的一半,所以节点2不能被作为master,节点2也将处于looking状态
(3)启动myid为3的zk,它会给自己投票,然后与节点1,2互换投票,由于节点3的myid大于节点2,所以此次投票节点3胜出,节点3的得票数大于节点总数的一半了,此时节点3胜出,成为master节点,其他两个节点成为slaver节点
(4)启动myid为4的zk,尽管节点4的myid最大,但此时已经有主了,节点4也只能乖乖做一个从节点。。。
(5)启动myid为5同上。。。
(6)当有节点挂了之后,开始重新选举,选举规则跟上面类似。