Leader的选举一般分为启动时选举跟Leader挂掉后的运行时选举
以5台机器为例,只有超过半数以上,即最少启动3台服务器,集群才能正常工作
服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING。
服务器1和2分别投自己一票,此时服务器1发现服务器2的id比自己大,更改选票投给服务器2。此时服务器1票数0票,服务器2票数2票,不够半数以上(3票),选举无法完成。服务器1,2状态保持LOOKING。
与上面过程一样,服务器1和2先投自己一票,然后因为服务器3id最大,两者更改选票投给为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
此时服务器1、2、3已经不是LOOKING状态,不会更改选票信息,交换选票信息结果。服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,服务器4并更改状态为FOLLOWING。
同4一样投票给3,此时服务器3一共5票,服务器5为0票。服务器5并更改状态为FOLLOWING;
Leader是服务器3,状态为LEADING。其余服务器是Follower,状态为FOLLOWING。
运行时候如果Master节点崩溃了会走恢复模式,新Leader选出前会暂停对外服务,大致可以分为四个阶段 选举、发现、同步、广播
选举步骤
脑裂问题(集群中出现不止一个master)是集群部署必须考虑的一点,比如在Hadoop跟Spark集群中。而ZAB为解决脑裂问题,要求集群内的节点数量为2N+1。当网络分裂后,始终有一个集群的节点数量过半数,而另一个节点数量小于N+1, 因为选举Leader需要过半数的节点同意,所以我们可以得出如下结论:
有了过半机制,对于一个Zookeeper集群,要么没有Leader,要没只有1个Leader,这样就避免了脑裂问题
原文:https://www.cnblogs.com/z-dk/p/14674394.html