加餐 | ZAB协议(一):主节点崩溃了,怎么办?
该思维导图由 AI 生成,仅供参考
ZAB 如何选举领导者?
有哪些成员身份?
- 深入了解
- 翻译
- 解释
- 总结
ZAB协议是处理分布式系统主节点崩溃的关键协议,领导者选举是至关重要的。ZAB支持三种成员身份:领导者、跟随者和观察者,以及四种成员状态。领导者选举涉及成员身份的变更,包括选举状态、跟随者状态、领导者状态和观察者状态。文章通过演示领导者选举的过程,详细介绍了节点间的投票和选举规则。在ZooKeeper中,成员状态通过枚举型变量实现,没有直接定义成员身份,而是用对应的成员状态来表示。领导者选举的实现是通过“见贤思齐,相互推荐”的方式,最终选举出大多数节点中数据最完整的节点。读者可以通过对应的成员状态作为切入点来研究相关成员的功能和实现。整体而言,文章深入浅出地介绍了ZAB协议和领导者选举的关键内容,对于处理集群的可用性问题具有重要参考价值。 文章通过详细介绍ZAB协议中领导者选举的实现流程,强调了选举的目标是选举出大多数节点中数据最完整的节点。在实现中,节点通过逻辑时钟的值执行加1操作,创建投票提案,并广播给所有节点。通过对投票信息进行比较和更新,最终选举出新的领导者。此外,文章还解释了在领导者选举实现中事务标识符的重要性,以及在节点异常情况下的处理方式。总结时,读者被鼓励理解源码实现,弥补文字无法表达的内容,以准确理解软件的功能和原理。最后,读者被引导思考选举中可能出现的问题,并鼓励分享和讨论。整体而言,文章内容详实,深入剖析了ZAB协议中领导者选举的关键实现细节,对于读者快速了解文章概览,体现了文章的技术特点。
《分布式协议与算法实战》,新⼈⾸单¥59
全部留言(21)
- 最新
- 精选
- Geek_yuanhe韩老师您好,raft算法跟zab的选举区别,可以理解为比较大的区别就是zab是有leader PK,而raft只是先来先得,一旦该节点已经确认投票,后面即使比他任期编号大的选票再来请求投票,也会拒绝,这样理解对么?
作者回复: 加一颗星:),可以这么理解,Raft领导者选举的关键是随机超时时间、一个节点在一个任期只有一张选票、基于任期编号大小和日志完整度来投票。
2020-05-11422 - zyz根据获取选举票数过半机制的原则,同时服务器数量为奇数,不会出现选举失败的情况
作者回复: 加一颗星:),其实节点的奇偶数不影响选举结果,影响的是节点故障容错能力,比如,4节点集群和3节点集群的“大多数”分别是3和2,也就是n/2 + 1,都只能容忍1个节点的故障。
2020-05-09214 - xzy你好,请问投票的结果如何同步的呢?当选节点知道自己是 leader,怎么让其他节点也知道呢?
作者回复: 加一颗星:),可以这么理解,每个节点维护一个投票池,每个投票池都包含自己和其他节点推荐的领导者的节点信息,如果有节点赢得大多数投票,那么这时会判断这个节点是否是自己,如果是自己,那么节点将设置自己的状态为LEADING状态,退出选举;如果不是自己,那么节点将设置自己的状态为FOLLOWING状态,退出选举。
2020-05-2529 - DullBird不会选举失败。假设要瓜分的节点是2个,那么最终这2个还是需要pk一轮。关键是zab的选票不是一张,是改变就可以投出去。
作者回复: 加一颗星:)
2020-05-186 - 竹马彦四郎的好朋友影法師老师,我想问一下 "选举出了新领导者,它是不是就可以处理写请求了呢?答案是不行的,比如这个时候各节点的数据副本还不一致呢,这就需要对数据做取舍,解决冲突,实现数据副本的一致" 那是不是raft也是如此呢? 就是说raft选出的新的leader也不能立即响应写请求~ 对吗?
作者回复: 加一颗星:),Raft是可以的,这个特性与ZAB的设计有关,在我看来,这个设计不是很精巧,我会在接下来的加餐中,具体说说。
2020-05-0656 - 小波菜“逻辑时钟(logicclock)(也就是选举的轮次),会影响选票的有效性,具体来说,逻辑时钟大的节点不会接收来自值小的节点的投票信息。比如,节点 A、B 的逻辑时钟分别为 1 和 2,那么,节点 B 将拒绝接收来自节点 A 的投票信息。” 老师我想请教下, 1:逻辑时钟具体工作原理是什么,这边如果A的事务id大于B,B也直接拒绝吗? 2:事务id是如何保证全局单调递增的,类似雪花算法吗?
作者回复: 加一颗星:),问题1:主要是为了避免接受到旧的投票信息;会的,具体细节,可参考FastLeaderElection.lookForLeader() 的实现。 问题2:是一个AtomicLong的变量(hzxid),因为领导者的存在,所以事务id,本质上是“单机”的,原子变量就可以了。
2020-05-2125 - 钟友兵韩老师,如果说投票时,因为网络问题,可能出现接收到的选票出现延迟,比如,节点A只接受到自身的票,没有接收到其他节点的票,其他节点也可能出现接收到的票数不一致的情况,这种情况是如何处理,设置超时时间吗?如果是超时时间,这个值的选取一般有什么原则
作者回复: 加一颗星:),引入超时,更确切的说是读超时,读超时且没有接收到其他节点的新的选票,重新发送自己的投票,在ZooKeeper中,这个值,初始值为200ms,之后每次超时时,指数退避,增加时长,最大值为60s,具体的实现,可以参考FastLeaderElection.lookForLeader()函数。
2020-05-103 - 宋菁在网络通讯正常情况下,各个节点都能够收到其他节点的选票,此时必然会选出最终领导者,不会出现选票瓜分的情况,因为即便是两个节点的任期编号和事物标识符一样,集群ID大的仍然会当选,集群ID小的根据规则会选举集群ID大的节点为领导者。
作者回复: 加一颗星:)
2020-05-0423 - HeavenZAB协议中,ZAB协议是通过快速领导者选举,来选举出新的领导者的,那么会出现选票会瓜分的情况吗? 必然可能啊,ZAB是一种脱胎于Multi-Paxos的算法,其本质上也是一种投票选举,那么对于这种投票选举,设置不同的选举时间是一种相对较好的选择 看到这个选举突然想到了网络环路中STP的算法解决
作者回复: 加一颗星:)
2020-08-1822 - Kvicii.Y逻辑时钟到底是什么作用呢?我看到源码有这个东西,但是一直把他当做其他的判断条件,既然和选票PK类似,为什么不把逻辑时钟比较的逻辑加入到选票PK的逻辑totalOrderPredicate中呢?还是说这个逻辑时钟只是代表了机器的标识?
作者回复: 加一颗星:),可以把逻辑时钟理解为选举的轮次,会影响选票的有效性,主要是为了避免接受到旧的投票信息。
2020-06-292