概念:
- Zookeeper的服务器三种角色:
Leader,Follower,Observer
。Leader提供读和写,Follower提供读,参与过半投票,Observer只提供读,不参与投票,可以提高读性能。 -
ZXID
,事务ID,用来唯一标识一次服务器状态的变更 -
myid
,服务器SID,一个数字,通过配置文件配置,唯一
选举有两种情况,一是服务器启动的投票,二是运行期间的投票。
一 最初启动时投票
- 每个服务器发送一个投票(SID,ZXID),其中sid是自己的myid,初始阶段都将自己投为Leader。
- 接收来自其他服务器的投票。首先判断投票有效性,包括验证是否是来自
Looking
状态的服务器。
- 接收来自其他服务器的投票。首先判断投票有效性,包括验证是否是来自
- 处理投票,针对每个投票都按以下规则与自己的投票PK,PK后依据情况是否更新投票,再发送给其他机器。
- 优先检查ZXID,ZXID较大者优先为Leader
- 如果ZXID相同,检查SID,SID较大者优先为Leader
- 统计投票:每次投票后,服务器统计所有投票,判断是否有过半的机器收到相同的投票,如果某个投票达到一半的要求,则认为该投票提出者可以成为Leader。
- 改变服务器状态:一旦确定了Leader,每个服务器都更新自己的状态,Leader变更为Leading,Follower变更为
Following
- 改变服务器状态:一旦确定了Leader,每个服务器都更新自己的状态,Leader变更为Leading,Follower变更为
正常情况下一旦选出一个Leader则一直会保持,除非Leader服务器宕掉☭,则再进行重新选举。
二 运行时的投票
- 变更状态
当Leader宕机后,余下的所非Observer的服务器都会将自己的状态变更为Looking,然后开启新的Leader选举流程。
- 变更状态
- 每个服务器发出一个投票。生成
(SID,ZXID)
信息,注意运行期间的ZXID可能是不同的,但是在投票时都会将自己投为Leader,然后发送给其他的服务器。
- 每个服务器发出一个投票。生成
- 接收来自各个服务器的投票
- 处理投票,规则与初次启动时相同。
- 统计投票
- 改变服务器状态
网友评论