每个 sever 首先给自己投票,然后用自己的选票和其他 sever 选票对比,权重大的胜出,使用权重较大的更新自身选票箱。具体选举过程如下:
1.
每个
Server
启动以后都询问其它的
Server
它要投票给谁。对于其他
server
的询问,
server
每次根据自己的状态都回复自己推荐的
leader
的
id
和上一次处理事务的 zxid(系统启动时每个
server
都会推荐自己)
2.
收到所有
Server
回复以后,就计算出
zxid
最大的哪个
Server
,并将这个
Server
相关信息设置成下一次要投票的
Server
。
3.
计算这过程中获得票数最多的的
sever
为获胜者,如果获胜者的票数超过半数,则改
server
被选为
leader
。否则,继续这个过程,直到
leader
被选举出来
4. leader
就会开始等待
server
连接
5. Follower
连接
leader
6. Leader
根据
follower
的
zxid
确定同步点,至此选举阶段完成。
7.
选举阶段完成
Leader
同步后通知
follower
已经成为
uptodate
状态
8. Follower
收到
uptodate
消息后,又可以重新接受
client
的请求进行服务了
列举的选主例子:
目前有
5
台服务器,每台服务器均没有数据,它们的编号分别是
1,2,3,4,5,
按编号依次启动,它们的选择举过程如下:
1.
服务器
1
启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器
1
的状态一直属于
Looking
。
2.
服务器
2
启动,给自己投票,同时与之前启动的服务器
1
交换结果,由于服务器
2
的编号大所以服务器
2
胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是 LOOKING。
3.
服务器
3
启动,给自己投票,同时与之前启动的服务器
1,2
交换信息,由于服务器
3
的编号最大所以服务器
3
胜出,此时投票数正好大于半数,所以服务器
3
成为领导者, 服务器1,2
成为小弟。
4.
服务器
4
启动,给自己投票,同时与之前启动的服务器
1,2,3
交换信息,尽管服务器
4
的编号大,但之前服务器
3
已经胜出,所以服务器
4
只能成为小弟。
5.
服务器
5
启动,后面的逻辑同服务器
4
成为小弟。