zookeeper 选主 (ZAB)
关键概念
- zxid zk的事务id,单项递增,zxid越大,表示节点处理的事物越多,存储的数据操作也越多。
- myid 分配给机器的唯一id,类型为数字
- epoch 任期,单项递增,同一任期的选票才能计数,低任期的选票作废。
选举步骤
1 所有机器首先初始化任期为1,此时zxid为 0,myid为当前机器配置的id
2 所有机器先给自己投票,比如第一台的myid为1,zxid 为0 那投票信息就是(0,1),前面0,是zxid,1是myid
3 所有机器将自己的投票广播给其他机器。
4 收到其他机器投票的机器,针对自己的投票进行比较,然后修改自己的投票,再次进行广播
修改投票的逻辑是
首先比较本机投票中的zxid号,如果收到的票中的zxid号,比本机投票中的zxid号大,直接使用收到的投票作为本机投票,然后呢再进行广播。,如果zxid号与本机投票号相同,那么比较myid号,使用myid大的投票作为本机投票再进行广播。简单来说,就是ZXID 号最大的会成为master,如果有zxid相同的两台主机,myid大的作为master。
5 票数过半投到同一个(zxid,myid)的时候,这台机器就成为master
kafka选主
1 kafka中的controller 监测到 zookeeper 中的临时节点/controller 消失,激活选主流程
2 所有kafka节点竞争在zookeeper中创建临时节点/controller,创建成功的,成为master
kafka 分区选主
想当随意,如果某个分区的主分区挂了,随机选一个。本质是hash get
rocketmq DLedger 选主 Raft
1 所有机器生成自己的任期,最初任期都是1,每选一次加1
2 每个机器等待一个随机时间,随机时间最短的机器首先成为candidata
3 成为candidate的机器对着其他机器疯狂输出选我为master,如果得到半数以上的机器accept就成为真的master。
4 成为真正master的机器对整个集群吼,我成功当选master,于是其他小弟纷纷拜服。都开始拜码头,认老大。
参考
https://cloud.tencent.com/developer/article/1596838
https://cloud.tencent.com/developer/article/1491188
网友评论