zookeeper节点的4种状态:
LEADING:说明此节点已经是leader节点,处于领导者地位的状态,差不多就是一般集群中的master。但在zookeeper中,只有leader才有写权限,其他节点(FOLLOWING)是没有写权限的,可以读
LOOKING:选举中,正在寻找leader,即将进入leader选举流程中
FOLLOWING:跟随者,表示当前集群中的leader已经选举出来了,主要具备以下几个功能点
向leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息)
接收leader消息并进行处理;
接收client发送过来的请求,如果为写请求,会发送给Leader进行投票处理,然后返回client结果
OBSERVING:OBSERVING和FOLLOWING差不多,但不参加投票和选举,接受leader选举后的结果
启动时期的 Leader 选举
每个server 自身都有一票,在初始化或者server崩溃数过半的时候,每个server都有一个自身的myid(zookeeper配置文件),这里按1、2、3、4、5算
在选举过程中主要是依据zxid和myid来进行轮训server然后比较统计投票
zxid (ZooKeeper Transaction Id,每次请求对应一个唯一的zxid,如果zxid a < zxid b ,则可以保证a一定发生在b之前)。
选举分为两种情况,初始化和leader挂掉的时候,要进行leader选举,至少需要2台机器,集群机器台数基本是奇数
初始化
当启动初始化集群的时候,server1的myid为1,zxid为0 server2的myid为2,zxid同样是0,以此类推。此种情况下zxid都是为0。先比较zxid,再比较myid
服务器1启动,发起一次选举,服务器1投自己一票,此时服务器1票数一票,不够半数以上(3票),选举无法完成。投票结果:服务器1为1票。服务器1状态保持为LOOKING。
服务器2启动,发起一次选举,服务器1和2分别投自己一票,此时服务器1发现服务器2的id比自己大,更改选票投给服务器2。投票结果:服务器1为0票,服务器2为2票。服务器1,2状态保持LOOKING
服务器3启动,发起一次选举,服务器1、2、3先投自己一票,然后因为服务器3的id最大,两者更改选票投给为服务器3;投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING
服务器4启动,发起一次选举,此时服务器1,2,3已经不是LOOKING 状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3。服务器4并更改状态为FOLLOWING。
服务器5启动,与服务器4一样投票给3,此时服务器3一共5票,服务器5为0票。服务器5并更改状态为FOLLOWING
最终的结果:服务器3是 Leader,状态为 LEADING;其余服务器是 Follower,状态为 FOLLOWING。
当选举机器过半的时候,已经选举出leader后,后面的就跟随已经选出的leader,所以4和5跟随成为leader的server3
所以,在初始化的时候,一般到过半的机器数的时候谁的myid最大一般就是leader
运行时期的Leader选举
在 Zookeeper运行期间 Leader 和 非 Leader 各司其职,当有非 Leader 服务器宕机或加入不会影响 Leader,但是一旦 Leader 服务器挂了,那么整个 Zookeeper 集群将暂停对外服务,会触发新一轮的选举。
初始状态下服务器3当选为Leader,假设现在服务器3故障宕机了,此时每个服务器上zxid可能都不一样,server1为99,server2为102,server4为100,server5为101
运行期选举与初始状态投票过程基本类似,大致可以分为以下几个步骤:
(1)状态变更。Leader 故障后,余下的非 Observer 服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。
(2)每个Server会发出投票。
(3)接收来自各个服务器的投票,如果其他服务器的数据比自己的新会改投票。
(4)处理和统计投票,每一轮投票结束后都会统计投票,超过半数即可当选。
(5)改变服务器的状态,宣布当选。
选举机制中涉及到的核心概念
(1)Server id(或myid):服务器ID
比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大,比如初始化启动时就是根据服务器ID进行比较。
(2)zxid:事务ID
服务器中存放的数据的事务ID,值越大说明数据越新,在选举算法中数据越新权重越大。
(3)Epoch:逻辑时钟
也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。
(4)Server状态:选举状态
LOOKING,竞选状态。
FOLLOWING,随从状态,同步leader状态,参与投票。
OBSERVING,观察状态,同步leader状态,不参与投票。
LEADING,领导者状态。
总结
(1)Zookeeper 选举会发生在服务器初始状态和运行状态下。
(2)初始状态下会根据服务器sid的编号对比,编号越大权值越大,投票过半数即可选出Leader。
(3)Leader 故障会触发新一轮选举,zxid 代表数据越新,权值也就越大。
(4)在运行期选举还可能会遇到脑裂的情况