zookeeper的核心以下三点
- 一致:对外提供的数据是一致的
- 有头:有Leader
- 数据树:存储数据的一颗数据树
1、Paxos算法
基于消息传递的一致性算法
参考 https://www.douban.com/note/208430424/
2、ZAB协议
Zab借鉴了Paxos算法,但又不像Paxos那样,是一种通用的分布式一致性算法。是为Zookeeper设计的支持崩溃恢复的原子广播协议。
Leader的选举过程:
- 3888端口(选举Leader)两两机器通信
- 只要任何人投票,就会触发那个准Leader发起自己的投票
- 推选制,先比较zxid(事务id),zxid相同,再比较myid(机器自己的id)
分以下两种情况:
注意:zxid——集群中过半的机器产生的最大的事物id
1、第一次启动集群
机器数量启动过半了才能选出Leader
假设机器node1( mid=1,Zid=0);node2(mid=2,Zid=0);node3 (mid=3,Zid=0);node4 (mid=4,Zid=0)。其中Node1,Node2,Node3三台机器启动完,各自发出投票信息,先比对Zid都为0,无法选出;再比对mid大小 Node3胜出被选为Leader
2、重启集群或者Leader挂了
zookeeper机器集群之间都会保持1s一次的心跳,从leader同步最新的数据
假如 某一个时刻Node3机器 (Leader) Zid增长到8(事物id)突然挂了, Node4 Zid =7 没来的急同步Leader信息,先发现Leader挂了。
- Node4(mid=4,Zid=7)向Node1,Node2发起自身投票为Leader
- 假如Node2(mid=2,Zid=8)接收Node4(mid=4,Zid=7)信息。发现自身Zid,Node2(Zid=8) > Node4(Zid=7),反馈给Node4说哥们儿不行啊,你的票信息过期了;同时Node2(mid=2,Zid=8)被动触发给自己投票当选Leader并广播投票信息(mid=2,Zid=8)给其他机器,同时自身加一票
- Node1(mid=1,Zid=8)接收到Node2(mid=2,Zid=8)投票信息。Zid相等;Node1(mid=1)<Node2(mid=2);Node1反馈给Node2说你是大哥,Node2加一票。
- Node4(mid=4,Zid=7)接收到Node2(mid=2,Zid=8)投票信息。Zid相等;Node4(Zid=7)<Node2(Zid=8);Node4反馈给Node2说你是大哥,Node2加一票。
- 最终Node2此轮竞争中3票胜出,当选Leader