加餐 | ZAB协议(一):主节点崩溃了,怎么办?
加餐 | ZAB协议(一):主节点崩溃了,怎么办?
讲述:于航
时长16:11大小14.81M
ZAB 如何选举领导者?
有哪些成员身份?
如何选举?
ZooKeeper 是如何实现的?
如何实现选举?
内容小结
课堂思考
赞 10
提建议
精选留言(20)
- Geek_yuanhe2020-05-11韩老师您好,raft算法跟zab的选举区别,可以理解为比较大的区别就是zab是有leader PK,而raft只是先来先得,一旦该节点已经确认投票,后面即使比他任期编号大的选票再来请求投票,也会拒绝,这样理解对么?
作者回复: 加一颗星:),可以这么理解,Raft领导者选举的关键是随机超时时间、一个节点在一个任期只有一张选票、基于任期编号大小和日志完整度来投票。
共 4 条评论21 - zyz2020-05-09根据获取选举票数过半机制的原则,同时服务器数量为奇数,不会出现选举失败的情况
作者回复: 加一颗星:),其实节点的奇偶数不影响选举结果,影响的是节点故障容错能力,比如,4节点集群和3节点集群的“大多数”分别是3和2,也就是n/2 + 1,都只能容忍1个节点的故障。
共 2 条评论14 - xzy2020-05-25你好,请问投票的结果如何同步的呢?当选节点知道自己是 leader,怎么让其他节点也知道呢?
作者回复: 加一颗星:),可以这么理解,每个节点维护一个投票池,每个投票池都包含自己和其他节点推荐的领导者的节点信息,如果有节点赢得大多数投票,那么这时会判断这个节点是否是自己,如果是自己,那么节点将设置自己的状态为LEADING状态,退出选举;如果不是自己,那么节点将设置自己的状态为FOLLOWING状态,退出选举。
共 2 条评论7 - DullBird2020-05-18不会选举失败。假设要瓜分的节点是2个,那么最终这2个还是需要pk一轮。关键是zab的选票不是一张,是改变就可以投出去。
作者回复: 加一颗星:)
5 - 竹马彦四郎的好朋友影...2020-05-06老师,我想问一下 "选举出了新领导者,它是不是就可以处理写请求了呢?答案是不行的,比如这个时候各节点的数据副本还不一致呢,这就需要对数据做取舍,解决冲突,实现数据副本的一致" 那是不是raft也是如此呢? 就是说raft选出的新的leader也不能立即响应写请求~ 对吗?
作者回复: 加一颗星:),Raft是可以的,这个特性与ZAB的设计有关,在我看来,这个设计不是很精巧,我会在接下来的加餐中,具体说说。
共 5 条评论6 - 小波菜2020-05-21“逻辑时钟(logicclock)(也就是选举的轮次),会影响选票的有效性,具体来说,逻辑时钟大的节点不会接收来自值小的节点的投票信息。比如,节点 A、B 的逻辑时钟分别为 1 和 2,那么,节点 B 将拒绝接收来自节点 A 的投票信息。” 老师我想请教下, 1:逻辑时钟具体工作原理是什么,这边如果A的事务id大于B,B也直接拒绝吗? 2:事务id是如何保证全局单调递增的,类似雪花算法吗?展开
作者回复: 加一颗星:),问题1:主要是为了避免接受到旧的投票信息;会的,具体细节,可参考FastLeaderElection.lookForLeader() 的实现。 问题2:是一个AtomicLong的变量(hzxid),因为领导者的存在,所以事务id,本质上是“单机”的,原子变量就可以了。
共 2 条评论4 - Kvicii.Y2020-06-29逻辑时钟到底是什么作用呢?我看到源码有这个东西,但是一直把他当做其他的判断条件,既然和选票PK类似,为什么不把逻辑时钟比较的逻辑加入到选票PK的逻辑totalOrderPredicate中呢?还是说这个逻辑时钟只是代表了机器的标识?
作者回复: 加一颗星:),可以把逻辑时钟理解为选举的轮次,会影响选票的有效性,主要是为了避免接受到旧的投票信息。
2 - 钟友兵2020-05-10韩老师,如果说投票时,因为网络问题,可能出现接收到的选票出现延迟,比如,节点A只接受到自身的票,没有接收到其他节点的票,其他节点也可能出现接收到的票数不一致的情况,这种情况是如何处理,设置超时时间吗?如果是超时时间,这个值的选取一般有什么原则
作者回复: 加一颗星:),引入超时,更确切的说是读超时,读超时且没有接收到其他节点的新的选票,重新发送自己的投票,在ZooKeeper中,这个值,初始值为200ms,之后每次超时时,指数退避,增加时长,最大值为60s,具体的实现,可以参考FastLeaderElection.lookForLeader()函数。
3 - 宋菁2020-05-04在网络通讯正常情况下,各个节点都能够收到其他节点的选票,此时必然会选出最终领导者,不会出现选票瓜分的情况,因为即便是两个节点的任期编号和事物标识符一样,集群ID大的仍然会当选,集群ID小的根据规则会选举集群ID大的节点为领导者。
作者回复: 加一颗星:)
共 2 条评论3 - arun2022-04-11老师,逻辑时钟和epoch是同一个么,他们的关系是什么呢?逻辑时钟可以理解为每次leader挂掉重新选举时,逻辑时钟会重置为0,而epoch是每次触发选举都会加1,不知道理解的时候正确,谢谢老师解答1
- Heaven2020-08-18ZAB协议中,ZAB协议是通过快速领导者选举,来选举出新的领导者的,那么会出现选票会瓜分的情况吗? 必然可能啊,ZAB是一种脱胎于Multi-Paxos的算法,其本质上也是一种投票选举,那么对于这种投票选举,设置不同的选举时间是一种相对较好的选择 看到这个选举突然想到了网络环路中STP的算法解决
作者回复: 加一颗星:)
共 2 条评论2 - Geek_c89d452022-07-31 来自广东不会出现选票瓜分的情况,因为领导者pk总能比较出优劣,即使epoch相同、zxid相同,最终还有myid兜底,myid是一定不同的。
- 徐同学呀2021-10-08原文:当跟随者检测到异常,退出跟随者状态时(在 follower.shutdown() 函数中),ZooKeeper 会将所有未提交提案提交 但是我并没有在源码中找到(3.7.0),哪位大佬找到了可以贴一下局部代码吗共 1 条评论
- 达子不一般2021-10-05为什么需要领导者pk,pk结果再进行广播? 第一轮投票广播后,每个节点可以从其他节点的response中知道自己是否是数据最完备的节点及数据最完备的节点是谁,此时可以直接更新LEADING和FOLLOWING状态了
- Jia Tiancai2021-07-081. 领导者选举的目标,是选举出大多数节点中数据最完整的节点,也就是大多数节点中事务标识符值最大的节点。 问题1:如果只有少数节点数据更新,选举出来的主节点数据可能不是最完整的吧? 问题2:一个任期内节点可以响应多次,那么就会存在多个节点都获取大多数选票,出现这种情况怎么处理呢?
- amy2021-05-19韩老师,也就是在 follower 检测到 leader 崩溃退出后,follower 切换状态为选举状态并生成初始投票时,选取的事务 zxid 是所有接收到的 proposal 中最大的 zxid,尽管这个 proposal 可能还没有被 commit。 比如,除了原来旧的 leader 外,一个 proposal 仅仅只被集群中的一个 follower 收到,在重新选 leader 时,拥有这个 proposal 的 follower 会被选为新的 leader ,因为事务id zxid 最大,然后这个 proposal 会被同步到整个集群。共 1 条评论
- 约书亚2021-02-17epoch和逻辑时钟是什么关系?zookeeper的paper中的伪代码用round这个变量来代表逻辑时钟,其判断逻辑和文章中说的是一样的。那epoch还有什么用处?能否起到raft中term类似的作用?有点糊涂了。逻辑时钟知否只有在lookForLeader方法中才会+1?
- Bachue Zhou2021-01-27感觉这个选举算法好慢,中间有不少通讯其实是可以省略的,过多的通讯在网络较差的情况下必然减慢选举速度,而根据我的理解,迟迟选不出领导者,整个系统就不能写入了,也就是虽然有半数以上节点存活,系统事实上不可用。共 2 条评论
- 李二木2020-11-06是怎么计算选票的了。每个looking节点是要记录投票信息吗?那looking节点怎么知道投票数超过大多数节点。也就是它怎么知道当前参与所有选举所有节点个数。
- 西门吹牛2020-08-10逻辑时钟怎么理解,不是应该所有节点都参与选举吗,选举一次逻辑时钟加1,那所有节点的逻辑时钟不是应该相同吗共 1 条评论