1:分布式选举的概念

一般来说,集群有两个或两个以上的服务器组件而成,其中,每个服务器都是集群中的一个节点。对于一个节点来说,多个节点是如何做到协同工作?比如数据库集群,如何保证数据库写入集群在每个节点上都是一致的呢?

即:在众多节点中,选举一个leader来管理和调度其他节点,而“选举”的过程在分布式领域中,就叫分布式选举。

2:为什么要有分布式选举

leader节点,也就是主节点,在一个分布式集群中负责对其他节点的协调和管理,也就是说,其他节点都必须听从主节点的安排。主节点的存在,就可以保证其他节点的有序运行,以及数据库集群中的写入数据在每个节点上的一致性。这里的一致性是指数据在每个集群节点中都是一样的。但是,如果主节点故障了,集群也会出现混乱,可能导致每个节点上的数据会不一致。
总结来说,选举的作用就是选出一个主节点,由它来协调和管理其他节点,以保证集群有序运行和节点间数据的一致性

3:分布式选举算法

目前常见的选主方法主要有以下几种:

  1. 基于序号选举的算法,比如,Bully 算法
  2. 多数派算法,比如,Raft 算法、ZAB 算法

3.1:Bully 算法

选举原则:Bully 算法机制比较简单,选举原则是“长者”为大,即在所有存活的节点中,选取 ID 最大的节点作为主节点。

在 Bully 算法中,节点的角色有两种:普通节点和主节点。初始化时,所有节点都是平等的,都是普通节点,并且都有成为主的权利。但是,当选主成功后,有且仅有一个节点成为主节点,其他所有节点都是普通节点。当且仅当主节点故障或与其他节点失去联系后,才会重新选主。

Bully 算法在选举过程中,需要用到以下 3 种消息:

  • Election 消息,用于发起选举;
  • Alive 消息,对 Election 消息的应答;
  • Victory 消息,竞选成功的主节点向其他节点发送的宣誓主权的消息。

具体选举过程如下:

  1. 集群中每个节点判断自己的 ID 是否为当前活着的节点中 ID 最大的,如果是,则直接向其他节点发送 Victory 消息,宣誓自己的主权;
  2. 如果自己不是当前活着的节点中 ID 最大的,则向比自己 ID 大的所有节点发送 Election 消息,并等待其他节点的回复;
  3. 若在给定的时间范围内,本节点没有收到其他节点回复的 Alive 消息,则认为自己成为主节点,并向其他节点发送 Victory 消息,宣誓自己成为主节点;若接收到来自比自己 ID 大的节点的 Alive 消息,则等待其他节点发送 Victory 消息;
  4. 若本节点收到比自己 ID 小的节点发送的 Election 消息,则回复一个 Alive 消息,告知其他节点,我比你大,重新选举。


优缺点总结

优点:Bully算法的选举机制比较简单,存活的节点大会的ID最大谁就是主节点,这种算法的有点是比较简单,选举速度快,简单容易实现。
缺点:每个节点需要有全局的节点信息,因此额外信息存储比较多,其次,任意一个比当前主节点ID大的新节点或节点故障恢复后,都可能重新触发选举,成为新的主节点,如果该节点频繁退出、加入集群,就是导致频繁切主。

3.2 :Raft 算法

Bully算法简单且暴力,相比之下,Raft 算法是典型的多数派投票选举算法,其选举机制与日常生活中的投票机制类似,简单地说就是“少数服从多数”,获得投票最多的节点成为主。

采用 Raft 算法选举,集群节点的角色有 3 种:

  • Leader,即主节点,同一时刻只有一个 Leader,负责协调和管理其他节点
  • Candidate,即候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;
  • Follower,Leader 的跟随者,不可以发起选举。

Raft 选举的流程,可以分为以下几步:

  1. 初始化时,所有节点均为 Follower 状态。
  2. 开始选主时,所有节点的状态由 Follower 转化为 Candidate,并向其他节点发送选举请求。
  3. 其他节点根据接收到的选举请求的先后顺序,回复是否同意成为主。这里需要注意的是,在每一轮选举中,一个节点只能投出一张票。
  4. 若发起选举请求的节点获得超过一半的投票,则成为主节点,其状态转化为 Leader,其他节点的状态则由 Candidate 降为 Follower。Leader 节点与 Follower 节点之间会定期发送心跳包,以检测主节点是否活着。
  5. 当 Leader 节点的任期到了,即发现其他服务器开始下一轮选主周期时,Leader 节点的状态由 Leader 降级为 Follower,进入新一轮选主。

节点的状态迁移如下所示(图中的 term 指的是选举周期):

每一轮选举,每个节点只能投一次票。 Raft 算法中,选主是周期进行的,也就是隔一段时间重新选举,但也有例外的时候,如果主节点故障,会立马发起选举,重新选出一个主节点。

优缺点总结
优点:Raft 算法具有选举速度快、算法复杂度低、易于实现的优点,该算法选举稳定性比 Bully 算法好,这是因为当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点获得投票数过半,才会导致切主。;
加粗样式:缺点是,它要求系统内每个节点都可以相互通信,且需要获得过半的投票数才能选主成功,因此通信量大。

3.3:ZAB 算法

ZAB(ZooKeeper Atomic Broadcast)选举算法是为 ZooKeeper 实现分布式协调功能而设计的。相较于 Raft 算法的投票机制,ZAB 算法增加了通过节点 ID 和数据 ID 作为参考进行选主,节点 ID 和数据 ID 越大,表示数据越新,优先成为主

相比较于 Raft 算法,ZAB 算法尽可能保证数据的最新性,所以,ZAB 算法可以说是对 Raft 算法的改进。

使用 ZAB 算法选举时,集群中每个节点拥有 3 种角色:

  1. Leader,主节点;
  2. Follower,跟随者节点;
  3. Observer,观察者,无投票权。

选举过程中,集群中的节点拥有 4 个状态:

  1. Looking 状态,即选举状态。当节点处于该状态时,它会认为当前集群中没有 Leader,因此自己进入选举状态。
  2. Leading 状态,即领导者状态,表示已经选出主,且当前节点为 Leader。
  3. Following 状态,即跟随者状态,集群中已经选出主后,其他非主节点状态更新为 Following,表示对 Leader 的追随。
  4. Observing 状态,即观察者状态,表示当前节点为 Observer,持观望态度,没有投票权和选举权。

投票过程中,每个节点都有一个唯一的三元组 (server_id, server_zxID, epoch),其中 server_id 表示本节点的唯一 ID;server_zxID 表示本节点存放的数据 ID,数据 ID 越大表示数据越新,选举权重越大;epoch 表示当前选取轮数,一般用逻辑时钟表示。

ZAB 选举算法的核心与Raft类似,即:“少数服从多数,ID 大的节点优先成为主”,选举过程中通过 (vote_id, vote_zxID) 来表明投票给哪个节点,其中 vote_id 表示被投票节点的 ID,vote_zxID 表示被投票节点的服务器 zxID。ZAB 算法选主的原则是:server_zxID 最大者成为 Leader;若 server_zxID 相同,则 server_id 最大者成为 Leader。

以 3 个 Server 的集群为例,每个 Server 代表一个节点,说明 ZAB 选主的过程。

第一步:当系统启动时,3个服务器当前投票均为第一轮投票,即epoch=1,且 zxID 均为 0。此时每个服务器都推选自己,并将选票信息 <epoch, vote_id, vote_zxID> 广播出去。

第二步:根据判断规则,由于 3 个 Server 的 epoch、zxID 都相同,因此比较 server_id,较大者即为推选对象,因此 Server 1 和 Server 2 将 vote_id 改为 3,更新自己的投票箱并重新广播自己的投票。

第三步:此时系统内所有服务器都推选了 Server 3,因此 Server 3 当选 Leader,处于 Leading 状态,向其他服务器发送心跳包并维护连接;Server1 和 Server2 处于 Following 状态。

优缺点总结:

优点:ZAB 算法性能高,对系统无特殊要求,该算法选举稳定性比较好,当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点数据 ID 和节点 ID 最大,且获得投票数过半,才会导致切主。

缺点:ZAB算法采用广播方式发送信息,若节点中有 n 个节点,每个节点同时广播,则集群中信息量为 n*(n-1) 个消息,容易出现广播风暴;且除了投票,还增加了对比节点 ID 和数据 ID,这就意味着还需要知道所有节点的 ID 和数据 ID,所以选举时间相对较长。

4:三种算法对比总结

5:相关延伸问题

1. 为什么"多数派"选主算法通常采用基数节点,而不是偶数节点?

多数派选主算法的核心是少数服从多数,获得投票多的节点胜出。想象一下,如果现在采用偶数节点集群,当两个节点均获得一半投票时,无法选主,必须重新投票,但即使重新投票选举,两个节点拥有相同投票数的概率也会很大。因此,多数派选主算法通常采用奇数节点。

2.分布式选举和一致性的关系是什么?
分布式选举是为了保证数据一致性,在集群中存在多个节点提供服务,以mysql数据库集群为例,如果每个节点都可以写数据,这样容易造成数据的不一致,所以需要选举一个leader,往leader节点中写数据,然后同步到follower节点中。这样就能更好的保证一致性
。所以mysq集群主节点写入数据,从节点提供读功能,即主从架构

最后总结

参考文献

  1. George Coulouris:《分布式系统:概念与设计》
  2. 聂鹏程:《分布式技术原理与算法解析》

分布式计算原理之分布式协调与同步(1)——分布式选举相关推荐

  1. 分布式计算原理之分布式协调与同步(1)——分布式事务

    什么是分布式事务 事务,其实是包含一系列操作的.一个有边界的工作序列,有明确的开始和结束标志,且要么被完全执行,要么完全失败,即 all or nothing.通常情况下,我们所说的事务指的都是本地事 ...

  2. 分布式计算原理之分布式协调与同步(1)——分布式互斥

    1:什么是分布式互斥 分布式进程常常需要协调他们的动作,如果一组进程共享一个或一组资源,那么访问这些资源时,需要互斥来防止干扰并保证一致性.在分布式系统里,这种排他性的资源访问方式,叫作分布式互斥(D ...

  3. 一举拿下高可用与分布式协调系统设计!

    前言 在上文中我们了解到, canal 可以通过订阅 binlog 日志来提供增量数据订阅和消费,通过这种方式可以实现数据库的实时备份,实时索引构建等 我们再来详细看看它的工作原理 如图示,每个 se ...

  4. 大数据技术:Zookeeper分布式协调服务

    1 Zookeeper概念简介 Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务 A.  zookeeper是为别的分布式程序进行服务的 B. zookeeper本身就是 ...

  5. 详解分布式协调服务 ZooKeeper

    这篇文章主要会介绍 Zookeeper 的实现原理以及常见的应用 在 2006 年,Google 发表了一篇名为 The Chubby lock service for loosely-coupled ...

  6. zookeeper中展示所有节点_分布式协调服务之Zookeeper

    ??理论篇 一.基础概念 ZooKeeper是开源分布式协调服务,提供高可用.高性能.稳定的分布式数据一致性解决方案,通常被用于实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知.集群管理. ...

  7. fourinone分布式协调设计解析

    分布式协同是分布式应用中不可缺少的,通常担任协调者的角色,或者说是将多机协同的职责从分布式应用中独立出来,以减少系统的耦合性和增强扩充性.Apache的Zookeeper, google的Chubby ...

  8. 分布式协调服务——Zookeeper入门

    什么是Zookeeper Zookeepr的定位: Zookeeper是一个分布式协调服务框架,,为分布式系统提供高效稳健的分布式协调服务,我们要如何理解zookeeper的定位呢?我们知道,各个分布 ...

  9. 并行计算与分布式计算原理

    云计算是一种新的技术趋势,可以更好地利用IT基础设施.服务和应用.云计算采用了一种按使用付费的服务交付模式,用户无需拥有自己的基础设备.平台或应用,只在需要时使用这些服务即可.串行和并行是两种基本的主 ...

最新文章

  1. 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
  2. 如何用ps简单快速扣头发丝
  3. python 之GUI设计:messabebox组件
  4. echarts迁徙图 vue_【可视化插件】Vue项目中Echarts流向图迁徙图实现
  5. 嵌入式linux 网络唤醒,C语言实现wake on lan(网络唤醒...-Windows系统下用命令行编译C/C++...-字符串常量引起的思考_169IT.COM...
  6. 外卖匹配系统_困扰外卖骑手的“系统” ,无人能置身事外
  7. as cast float server sql_SQL语言在数据工程(Data Engineering)中的运用(一)
  8. 软件的接口设计图_基于GJB 5000A的软件配置管理研究与系统实现
  9. oracle体系结构视频学习笔记
  10. [bug]小米部分机型(5x、mix2)中,文字/背景闪现然后消失
  11. [BZOJ]3727: PA2014 Final Zadanie
  12. 字符串中第一个只出现一次的字符
  13. 并发编程游玩---ExecutorService的isShutdown()和isTerminated(),以及一些方法的区别
  14. webService教程之cxf框架
  15. 车辆信息管理系统(C语言大作业)
  16. HTML页面跳转及传递参数
  17. 以太网协议 | ARP协议详解-ARP报文结构解析
  18. 计算机启动硬盘自检,启动时硬盘自检?这样处理就没事了
  19. 【web前端面试题整理07】我不理解表现与数据分离
  20. 输入正整数后逆置输出

热门文章

  1. 为什么苹果的官网看上去这么美
  2. mysql int 11手机号_【mysql】我用不小心用 mysql 的int(11) 存了 手机号,数据都有问题,有办法恢复么?...
  3. 《基础水文数据库》应用软件-水文预报中PA值计算
  4. (二)xlwt模块详解--设置列宽、行高
  5. Win11 封杀第三方浏览器工具,不用 Edge 就不行
  6. 简单解决Edge浏览器被sb360篡改的方法
  7. Html随机数小程序
  8. 可视监控对讲、楼宇对讲等领域中的回声消除、音频降噪
  9. 别再问什么是数据库分库分表了,看这里!
  10. 详解C语言实现植物大战僵尸阳光9999