假设有5台机器
znode状态:looking、following、leading 、observing(提高读取效率)
初始化:
1、服务器d为1启动,广播,没有应答,此时处于looking状态
2、服务器id为2启动,与1交换,胜出;由于选举没有超过半数,此时处于looking状态
3、服务器id为3启动根据,前面的理论,被选举为leader
4、服务器id为4、5 因为前面3已经为leader,只能当小弟了
5、服务器id为3 与其他服务器同步数据,成功则为真正的“leader” , 其他的服务器则为“follower”
数据同步(leader不接受client的请求):
读,直接读就好了
写:
1、follower告之leader
2、leader通过lead_listen_port广播通知到其他的follower
3、当有超过一半follower接收到回复,leader告诉该follower可以回复客户端了
重新选举(基于fast leader算法):
条件 leader宕机,或者失去大多数follow
1、server根据自己的状态回复自己选举的serverid和上一次处理事务的zxid
2、收到回复后,计算出zxid最大的那个server,设为投票的server
3、超过一半就将这个server设置为leader