zk选举

核心机制

  • 逻辑时间 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
点击打赏
文章目录
  1. 1. 核心机制
  2. 2. 比较逻辑
  • 配置
    1. 1. myid
  • 启动
  • 载入天数...载入时分秒... ,