核心机制
- 逻辑时间 epoch ,判断是否是同一轮投票(网络原因导致投票广播信息滞后)
- 事物ID(Zxid),事物ID最大的数据最新
- 服务器ID(myid),数值大的权重大
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| start=>start: 选self info=>operation: 广播信息 j1=>condition: 投票结果状态
j2=>condition: 是否过时 yj2=>operation: 清空投票信息 nj2=>operation: 更新投票信息
j3=>condition: 是否同一轮 yj3=>operation: 比较投票信息 nj3=>operation: 已完成投票信息
j=>condition: 是否形成共识 end=>end: 退出
start->info->j1 j1(yes)->j3 j1(no)->j2
j2(yes)->yj2(right)->nj2 j2(no)->nj2
j3(yes)->yj3->j j3(no)->nj3->j
nj2->yj3->j j(no)->info j(yes)->end
|
比较逻辑
同一轮,对投票信息(epoch,zxid,myid)进行比较(zxid,myid)
是否过时:
过时(小于),更新使用self信息(epoch,zxid,myid)
非过时(大于),清空信息,更新(epoch)进行比较(zxid,myid)
根据以下规则,超过半数收到相同投票选出leader
逻辑时钟小的选举结果被忽略,重新投票
统一逻辑时钟后,事物ID大的胜出
事物ID相同的情况下,服务器ID大的胜出
配置
/opt/servers/zookeeper-3.4.8/conf/zoo.cfg
1 2 3 4 5
| dataDir=/opt/servers/zookeeper-3.4.8/zkdatas
server.1=kafka01:2888:3888 server.2=kafka02:2888:3888 server.3=kafka03:2888:3888
|
myid
三台机器依次写入123
1 2 3 4 5 6
| #kafka01 echo 1 > /opt/servers/zookeeper-3.4.8/zkdatas/myid #kafka02 echo 2 > /opt/servers/zookeeper-3.4.8/zkdatas/myid #kafka03 echo 3 > /opt/servers/zookeeper-3.4.8/zkdatas/myid
|
创建一个文件,文件名为myid ,文件内容为1 (路径正确,只包含一个数字,具有读写权限)
启动
1
| /opt/servers/zookeeper-3.4.8/bin/zkServer.sh start
|