分布式技术原理与算法解析
聂鹏程
智载云帆 CTO,前华为分布式 Lab 资深技术专家
39663 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 43 讲
分布式技术原理与算法解析
15
15
1.0x
00:00/00:00
登录|注册

04 | 分布式选举:国不可一日无君

应用案例
选举稳定性
选举过程
应用案例
选举稳定性
选举流程
应用案例
优缺点
消息类型
选举原则
双主场景
分布式选举与一致性
奇数节点选择
ZAB算法
Raft算法
Bully算法
思考题
一致性与分布式选举的关系
多数派选主算法
选举算法
分布式选举

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

你好,我是聂鹏程。今天,我来继续带你打卡分布式核心技术。
相信你对集群的概念并不陌生。简单说,集群一般是由两个或两个以上的服务器组建而成,每个服务器都是一个节点。我们经常会听到数据库集群、管理集群等概念,也知道数据库集群提供了读写功能,管理集群提供了管理、故障恢复等功能。
接下来,你开始好奇了,对于一个集群来说,多个节点到底是怎么协同,怎么管理的呢。比如,数据库集群,如何保证写入的数据在每个节点上都一致呢?
也许你会说,这还不简单,选一个“领导”来负责调度和管理其他节点就可以了啊。
这个想法一点儿也没错。这个“领导”,在分布式中叫做主节点,而选“领导”的过程在分布式领域中叫作分布式选举。
然后,你可能还会问,怎么选主呢。那接下来,我们就一起去揭开这个谜底吧。

为什么要有分布式选举?

主节点,在一个分布式集群中负责对其他节点的协调和管理,也就是说,其他节点都必须听从主节点的安排。
主节点的存在,就可以保证其他节点的有序运行,以及数据库集群中的写入数据在每个节点上的一致性。这里的一致性是指,数据在每个集群节点中都是一样的,不存在不同的情况。
当然,如果主故障了,集群就会天下大乱,就好比一个国家的皇帝驾崩了,国家大乱一样。比如,数据库集群中主节点故障后,可能导致每个节点上的数据会不一致。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式系统中的选主算法对于集群的稳定运行至关重要。本文介绍了Bully算法、Raft算法和ZAB算法三种常见的选主算法。Bully算法以“长者为大”原则选主,速度快、简单易实现,但需要全局节点信息,且可能导致频繁切主;Raft算法采用多数派投票机制,选主稳定性较好,但需要节点相互通信且通信量大。ZAB算法则是对Raft算法的改进,通过节点ID和数据ID作为参考进行选主,保证数据的最新性。ZAB算法选举稳定性较好,但选举时间相对较长。 在ZAB算法中,每个节点拥有三种角色:Leader、Follower和Observer,以及四个状态:Looking、Leading、Following和Observing。选主的核心原则是“少数服从多数,ID大的节点优先成为主”。ZAB算法的性能高,但容易出现广播风暴,选举时间相对较长。 文章还对Bully算法、Raft算法和ZAB算法进行了对比分析,从消息传递内容、选举机制和选举过程等维度进行了详细比较,帮助读者理解记忆。 此外,文章还解释了为什么“多数派”选主算法通常采用奇数节点,而不是偶数节点,以及分布式选举和一致性的关系。最后,文章总结了分布式选举的重要性,介绍了Bully算法、Raft算法和ZAB算法,并提出了思考题,引发读者深入思考。 总的来说,本文通过对三种选主算法的介绍和对比分析,帮助读者快速了解分布式选主算法的特点和应用,为理解分布式系统的选主问题提供了有益的参考。

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

全部留言(77)

  • 最新
  • 精选
  • 每天晒白牙
    今天这篇文章赚到了 1.分布式选举算法是为了保证数据一致性的 在集群中存在多个节点提供服务,如果每个节点都可以写数据,这样容易造成数据的不一致,所以需要选举一个leader,往leader节点中写数据,然后同步到follower节点中。这样就能更好的保证一致性 但因为同步数据存在延迟,所以follower节点的数据不是每时每刻都和leader节点数据保持一致的 有的框架是由leader提供读写操作,这样能保证写和读都是最新的数据,我没记错的话kafka就属于这种,读写都发生在主副本上。 而像mysql集群是在主节点写入数据,从节点提供读功能,即主从架构 总之,我觉得,一个好的分布式选举算法能更好的保证数据的一致性 2.老师说的集群中存在双主是说选举算法出了问题,出现了两个主,还是说双主是正常情况,两个主互提供写服务,然后再互相同步数据的情况呢?

    作者回复: 从你对分布式选举的总结可以看出,你很善于思考和总结。关于双主的情况,一般是因为网络故障,比如网络分区等导致的。出现双主的期间,如果双主均提供服务,可能会导致集群中数据不一致。所以,需要根据业务对数据不一致的容忍度来决定是否允许双主情况下提供服务。

    2019-09-30
    13
    37
  • 阅过留痕 赞,老师的专栏有两个创新点,一是有一个扩展点,另一个是专栏的总结,特别是以脑图的形式展现。 之前也学习过分布式选举算法,不知道是老师有裁剪还是怎么回事,感觉比这复杂难懂,老师讲解的基本能听懂。 OK,记一下自己的理解。 1:分布式选主算法,为选主而生,那为啥非要有一个主哪?人人平等不好嘛?分布式系统和人类社会非常的像,如果没有主,有些事情特别是有冲突的需要协作完成的,有谁来负责呢?针对数据库,好多机器都存数据,为了提高性能和可用性,如果都能接受写请求,各个库中的数据不一致了,又该怎么办呢?这就是要有主的原因了! 2:选主的算法,老师介绍了三种经典的,已经总结的很好了,我就不总结啦!我来个比喻,方便记忆。 bully算法——类似选武林盟主,谁武功最高,谁来当 raft算法——类似选总统,谁票数最高,谁来当 zab算法——类似选优秀班干部,是班干部且票多才行 感觉只有能确定一台电脑为主就行,不管什么方式,比如:一组两台跑定时任务的集群,刚开始无主,谁先启动谁就是主,当启动一台机器后先看有没有主,有主自己就是从,否则就告诉其他机器自己是主。

    作者回复: 赞👍,总结得很到位,加油

    2020-02-13
    8
  • Raft哪有说的这么简单。其他候选者发起选举,在leader在的情况下,可以被认为无效

    作者回复: 本文主要是针对raft算法进行选主的原理进行介绍,确实raft算法并没有那么简单,比如,在真正实现过程中,心跳检测及超时的限制,以及你说的leader存在的情况下,其他候选者发起选举。对于你说的问题,又可以进一步深挖,什么情况下导致leader存在时,其他候选者发起选举呢?心跳超时还是其他原因?在实践中,具体问题需要具体分析。

    2020-04-28
    5
  • 鸭先知
    核心是为了数据一致性,分布式选举为数据一致性提供了保障;网络分区会导致脑裂

    作者回复: 是的,数据一致性是分布式领域中一个非常重要的问题。

    2020-03-29
    1
  • Lane
    双主是脑裂吧

    作者回复: 双主是网络分区导致的,是脑裂的一种情况。

    2020-03-09
    1
  • Joe Black
    raft算法中每个节点都可以参与选举,也可以发起选举,当有多个节点发起时候,收到消息的节点如何决定投票给谁?或者说自己也是发起投票的节点,但是收到了其它节点的发起投票请求,那么自己是投还是不投呢?

    作者回复: 投票的原则通常采用谁的请求先到,就投票给谁。

    2019-11-18
    2
    1
  • kylexy_0817
    老师您好,Raft算法,当Leader降级为Follower的那段新一轮选举的时间里,集群里是否就无主了?

    作者回复: 是的,在选举过程中,主未选出,集群中无主。

    2019-10-23
    2
    1
  • zhaozp
    打卡文章学习: 1、选主意义:主节点负责其他节点的协调和管理,保证其他节点有序的运行。 2、选举算法: (1).Bully算法,选择ID最大的节点作为主节点。需要用到3种消息:Election消息用于发起选举;Alive消息对Election消息的应答; Victory消息,宣誓主权。优点:选举速度快、算法复杂度低、实现简单。缺点:每个节点需要有全局的节点信息,额外存储的信息较多;有 频繁切主的风险。 (2).Raft算法,民主投票,少数服从多数。3种角色:Leader,Candidate,Follower。优点:选举速度快、算法复杂度低、易于实现。缺点:要求集群中每个节点都可以互相通信,且需要获取超过半数的投票才能选主成功,通信量大。 (3).ZAB算法,具有优先级的民主投票,尽可能保证数据最新性,ID大的节点优先成为主。3种角色:Leader,Follower,Observer。4种状态:Looking,Leading,Following,Observing。。。每个节点有三元组(server_Id,server_zxID,epoch)。。。选主原则:server_zxID最大者成为Leader,若server_zxID相同,则server_id最大者成为Leader。优点:性能稳定。缺点:选举时间较长,容易出现广播风暴,需要知道所有节点的zxId和serverId,选举时间较长。

    作者回复: 积跬步,而终至千里!加油!

    2019-10-08
    1
  • piboye
    raft的优先级是通过超时时间来排列的

    作者回复: 你这里说的优先级具体是指的什么优先级呢?

    2020-05-05
    2
  • piboye
    raft在zab之后出现,不应该是zab是raft的改进吧。还有raft选举也要考虑日志高的优先,高日志的拒绝低日志的

    作者回复: Zab借鉴了Paxos算法。你说的raft一般有两个作用,一个是选主,一个是写数据的一致性。通常就是根据数据的新旧体现,在选主是,采用心跳,心跳会有版本号等,在写数据事,日志高优先体现在日志数据的新旧。

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