分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

加餐 | ZAB协议(一):主节点崩溃了,怎么办?

选举结果判断
投票信息处理
选举状态变更
lookForLeader函数
选票瓜分问题
数据同步和成员发现
事务标识符值
数据最完整节点
领导者选举实现
成员状态实现
大多数节点选举结果
选票更新和重新广播
领导者PK
选票创建和广播
发起领导者选举
OBSERVING
LEADING
FOLLOWING
LOOKING
观察者
跟随者
领导者
课堂思考
选举实现细节
选举目标
ZooKeeper实现
选举过程
成员状态
成员身份
ZAB协议选举领导者

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
咱们都知道,系统在运行中,不可避免会出现各种各样的问题,比如进程崩溃了、服务器死机了,这些问题会导致很严重的后果,让系统没办法运行。学完了 15 讲后,你应该还记得,在 ZAB 中,写请求是必须在主节点上处理的,而且提案的广播和提交,也是由主节点来完成的。既然主节点那么重要,如果它突然崩溃宕机了,该怎么办呢?
答案是选举出新的领导者(也就是新的主节点)。
在我看来,领导者选举,关乎着节点故障容错能力和集群可用性,是 ZAB 协议非常核心的设计之一。你想象一下,如果没有领导者选举,主节点故障了,整个集群都无法写入了,这将是极其严重的灾难性故障。
而对你来说,理解领导者选举(也就是快速领导者选举,Fast Leader Election),能更加深刻地理解 ZAB 协议,并在日常工作中,游刃有余地处理集群的可用性问题。比如如果写请求持续失败,可以先排查下集群的节点状态。
既然领导者选举这么重要,那么 ZAB 是如何选举领导者的呢?带着这个问题,我们进入今天的学习。

ZAB 如何选举领导者?

既然要选举领导者,那就涉及成员身份变更,那么在 ZAB 中,支持哪些成员身份呢?

有哪些成员身份?

ZAB 支持 3 种成员身份(领导者、跟随者、观察者)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

ZAB协议是处理分布式系统主节点崩溃的关键协议,领导者选举是至关重要的。ZAB支持三种成员身份:领导者、跟随者和观察者,以及四种成员状态。领导者选举涉及成员身份的变更,包括选举状态、跟随者状态、领导者状态和观察者状态。文章通过演示领导者选举的过程,详细介绍了节点间的投票和选举规则。在ZooKeeper中,成员状态通过枚举型变量实现,没有直接定义成员身份,而是用对应的成员状态来表示。领导者选举的实现是通过“见贤思齐,相互推荐”的方式,最终选举出大多数节点中数据最完整的节点。读者可以通过对应的成员状态作为切入点来研究相关成员的功能和实现。整体而言,文章深入浅出地介绍了ZAB协议和领导者选举的关键内容,对于处理集群的可用性问题具有重要参考价值。 文章通过详细介绍ZAB协议中领导者选举的实现流程,强调了选举的目标是选举出大多数节点中数据最完整的节点。在实现中,节点通过逻辑时钟的值执行加1操作,创建投票提案,并广播给所有节点。通过对投票信息进行比较和更新,最终选举出新的领导者。此外,文章还解释了在领导者选举实现中事务标识符的重要性,以及在节点异常情况下的处理方式。总结时,读者被鼓励理解源码实现,弥补文字无法表达的内容,以准确理解软件的功能和原理。最后,读者被引导思考选举中可能出现的问题,并鼓励分享和讨论。整体而言,文章内容详实,深入剖析了ZAB协议中领导者选举的关键实现细节,对于读者快速了解文章概览,体现了文章的技术特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • Geek_yuanhe
    韩老师您好,raft算法跟zab的选举区别,可以理解为比较大的区别就是zab是有leader PK,而raft只是先来先得,一旦该节点已经确认投票,后面即使比他任期编号大的选票再来请求投票,也会拒绝,这样理解对么?

    作者回复: 加一颗星:),可以这么理解,Raft领导者选举的关键是随机超时时间、一个节点在一个任期只有一张选票、基于任期编号大小和日志完整度来投票。

    2020-05-11
    4
    22
  • zyz
    根据获取选举票数过半机制的原则,同时服务器数量为奇数,不会出现选举失败的情况

    作者回复: 加一颗星:),其实节点的奇偶数不影响选举结果,影响的是节点故障容错能力,比如,4节点集群和3节点集群的“大多数”分别是3和2,也就是n/2 + 1,都只能容忍1个节点的故障。

    2020-05-09
    2
    14
  • xzy
    你好,请问投票的结果如何同步的呢?当选节点知道自己是 leader,怎么让其他节点也知道呢?

    作者回复: 加一颗星:),可以这么理解,每个节点维护一个投票池,每个投票池都包含自己和其他节点推荐的领导者的节点信息,如果有节点赢得大多数投票,那么这时会判断这个节点是否是自己,如果是自己,那么节点将设置自己的状态为LEADING状态,退出选举;如果不是自己,那么节点将设置自己的状态为FOLLOWING状态,退出选举。

    2020-05-25
    2
    9
  • DullBird
    不会选举失败。假设要瓜分的节点是2个,那么最终这2个还是需要pk一轮。关键是zab的选票不是一张,是改变就可以投出去。

    作者回复: 加一颗星:)

    2020-05-18
    6
  • 竹马彦四郎的好朋友影法師
    老师,我想问一下 "选举出了新领导者,它是不是就可以处理写请求了呢?答案是不行的,比如这个时候各节点的数据副本还不一致呢,这就需要对数据做取舍,解决冲突,实现数据副本的一致" 那是不是raft也是如此呢? 就是说raft选出的新的leader也不能立即响应写请求~ 对吗?

    作者回复: 加一颗星:),Raft是可以的,这个特性与ZAB的设计有关,在我看来,这个设计不是很精巧,我会在接下来的加餐中,具体说说。

    2020-05-06
    5
    6
  • 小波菜
    “逻辑时钟(logicclock)(也就是选举的轮次),会影响选票的有效性,具体来说,逻辑时钟大的节点不会接收来自值小的节点的投票信息。比如,节点 A、B 的逻辑时钟分别为 1 和 2,那么,节点 B 将拒绝接收来自节点 A 的投票信息。” 老师我想请教下, 1:逻辑时钟具体工作原理是什么,这边如果A的事务id大于B,B也直接拒绝吗? 2:事务id是如何保证全局单调递增的,类似雪花算法吗?

    作者回复: 加一颗星:),问题1:主要是为了避免接受到旧的投票信息;会的,具体细节,可参考FastLeaderElection.lookForLeader() 的实现。 问题2:是一个AtomicLong的变量(hzxid),因为领导者的存在,所以事务id,本质上是“单机”的,原子变量就可以了。

    2020-05-21
    2
    5
  • 钟友兵
    韩老师,如果说投票时,因为网络问题,可能出现接收到的选票出现延迟,比如,节点A只接受到自身的票,没有接收到其他节点的票,其他节点也可能出现接收到的票数不一致的情况,这种情况是如何处理,设置超时时间吗?如果是超时时间,这个值的选取一般有什么原则

    作者回复: 加一颗星:),引入超时,更确切的说是读超时,读超时且没有接收到其他节点的新的选票,重新发送自己的投票,在ZooKeeper中,这个值,初始值为200ms,之后每次超时时,指数退避,增加时长,最大值为60s,具体的实现,可以参考FastLeaderElection.lookForLeader()函数。

    2020-05-10
    3
  • 宋菁
    在网络通讯正常情况下,各个节点都能够收到其他节点的选票,此时必然会选出最终领导者,不会出现选票瓜分的情况,因为即便是两个节点的任期编号和事物标识符一样,集群ID大的仍然会当选,集群ID小的根据规则会选举集群ID大的节点为领导者。

    作者回复: 加一颗星:)

    2020-05-04
    2
    3
  • Heaven
    ZAB协议中,ZAB协议是通过快速领导者选举,来选举出新的领导者的,那么会出现选票会瓜分的情况吗? 必然可能啊,ZAB是一种脱胎于Multi-Paxos的算法,其本质上也是一种投票选举,那么对于这种投票选举,设置不同的选举时间是一种相对较好的选择 看到这个选举突然想到了网络环路中STP的算法解决

    作者回复: 加一颗星:)

    2020-08-18
    2
    2
  • Kvicii.Y
    逻辑时钟到底是什么作用呢?我看到源码有这个东西,但是一直把他当做其他的判断条件,既然和选票PK类似,为什么不把逻辑时钟比较的逻辑加入到选票PK的逻辑totalOrderPredicate中呢?还是说这个逻辑时钟只是代表了机器的标识?

    作者回复: 加一颗星:),可以把逻辑时钟理解为选举的轮次,会影响选票的有效性,主要是为了避免接受到旧的投票信息。

    2020-06-29
    2
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部