Bully、Raft、Zab选举算法的差异比较

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: Bully算法、Raft算法、Zab的差与异。他们如何脱胎于Paxos而成?

Bully选举算法

节点角色:

  • 普通节点
  • 主节点
    消息通知:
  • Election通知:表示“我推举谁为主节点”。如A->B表示A推举B为主节点。
  • Alive通知:对Election通知的应答
  • Victory通知:选举成功后通知所有节点“我成为主节点”的通知。

选举流程:

1.优先发现集群中无主的节点向节点ID比自己大的节点发送Election通知。
2.若当前节点已为集群内节点ID最大节点或未收到Alive通知,则当前节点成为主节点。发送Victory通知宣誓主权。
3.接收到Election通知的节点发送Alive通知反馈。并向节点ID比自己大的节点发送Election通知。重复2步骤。
本算法优缺点:
1.选举快、易实现、算法复杂度低。
2.所有节点需要知道其他节点的节点ID信息。此为前置条件。
3.主节点频繁故障恢复则会触发频繁换主,不稳定。
4.选主过程不如说是寻主过程。

Raft选举算法

节点角色:

  • Follower:跟随者,不参与选主的节点,负责投票。
  • Candidate:候选人,参与选举的节点,选举成功可称为主节点。
  • Leader:领导者,即主节点
    消息通知:
  • 心跳通知:仅有Leader发起,阻止其他节点发起选举,用于宣誓主权。
  • 选举通知:Follower发起,为了竞选Leader。
  • 响应选举通知:接收选举通知后,若当前任期本节点未投票,则响应选举。一个任期一票。遵循“先来先服务”原则。

选举流程:

1.初始启动时所有节点均为Follower角色,各自随机150ms~300ms等待超时。
2.先超时节点发现集群无主,转为Candidate角色,任期+1,率先发出选举通知请求大家给自己投票,并给自己投一票。
3.其余Follower节点接收到选举通知,若任期内未投票,则复制对方任期并投票,重置超时时间。否则静默不响应。
4.Candidate节点统计得票,遵循“大多数派”原则,超过半数票则当选为Leader,给其他节点推送心跳通知宣誓主权。
5.Leader节点故障不可用或因网络分区原因无法发出心跳通知。重复2~4。
本算法优缺点:
1.使用随机超时时间策略简单又有效地解决了并发竞选可能导致选举无效的场景。
2.对比bully算法相较来说,选主结果随机,交互较复杂。
3.网络分区可能导致脑裂问题。
4.频繁的心跳消息带来的性能开销

Zab选举算法

节点状态

  • LOOKING:竞选状态
  • FOLLOWING:随从状态,同步leader状态,参与leader选举投票过程
  • OBSERVING:观察状态,同步leader状态,不参与leader选举投票过程。
  • LEADING:领导者状态

消息通知:

  • 心跳通知:仅有Leader发起,阻止其他节点发起选举,用于宣誓主权。
  • 选举通知:投票消息,包含节点数据ID(zxID)、节点ID(serverID)、选举周期(epoch),被选举节点ID(voteID)

选举流程:

1.初始启动,节点默认为Following状态。
2.Following状态节点切换为Looking状态,先投票给自己,然后将投票消息广播给其他节点。
3.其他节点收到投票消息后,比较zxID和serverID选出主节点,将选出主节点的消息也广播给其他节点。
4.Looking状态节点计算的票数,遵循“大多数派”原则,若超过集群中节点半数则切换为Leading状态,并向其他节点发送心跳消息宣誓主权。
5.其他节点切换为Following状态。
6.Leading状态节点故障不可用或因网络分区原因无法发出心跳通知。重复2~5。
本算法优缺点:
1.结合了bully和Raft算法,选举leader既跟服务器唯一标识(常量)有关。也跟事务ID(变量)先后顺序有关。
2.为Zookeeper定制化设计的选举算法,因此依赖myid和zxID进行协同选举以减少无效选举的情况。

总结

  • Bully选举算法:“霸道”的选主算法,永远遵循“长者”为大原则,集群中ID最大的为主节点。
  • Raft选举算法:“随缘”的选主算法。集群所有节点平等。随机超时时间等待后发起选举,遵循“先到先得”原则、“大多数派”原则。
  • Zab选举算法:“能力+地位”优先的选主算法。先看zxID,zxID相同时看myid。zxID为事务ID,事务ID越大优先考虑选主。myid为服务器ID,全剧唯一,启动后不变。

扩展

最早的分布式共识算法应当是Paxos算法。以上这些算法基本都有Paxos算法的影子。关于Paxos算法逻辑如下:

节点角色:

  • 提案者(proposer):负责对单个值操作生成提案(proposal,一个提案包括提案号和提案值)。并推送到各个接受者
  • 接收者(acceptor):接收提案,并进行提案确认和值确认
  • 学习者(learner):不参与提案和投票,被动接受提案结果,主要用于读扩展和跨区域同步。

消息通知:

  • prepare通知:提案者发出提案号给接收者,并根据接收者响应结果确认提案是否通过。
  • accept通知:提案者发出提案号+提案值给接收者,并根据接收者响应结果确认提案值是否达成了共识。

选举(提案)流程:

1.proposer接收到新请求后,生成提案号。
2.proposer发起prepare请求给所有接收者,并传递提案号。等待接收者响应
3.acceptor接收到prepare请求,若从未接收过其他提案或请求提案号大于已接收的提案号,则通过并响应给proposer。
4.proposer接收到prepare响应后,根据“大多数派”原则判断提案是否通过。若通过则继续发送accept通知给所有接收者。
5.acceptor接收到accept请求,若已接收到比请求提案号更大的提案则拒绝,否则通过。
6.proposer接收到accept响应后,根据“大多数派”原则判断提案值是否通过,若通过则表示本提案已达成共识。
由以上选举(提案)过程可知,Paxos是针对单值的共识。若为多值共识,则简单的可以对Paxos进行多次prepare+accept两段式提交即可。基于这个理论思想,无论是Bully、Raft还是Zab省略了两段式提交中的第一段。即优先选举出Leader节点,再由leader节点进行值提交。

相关文章
|
15天前
|
存储 算法 大数据
Apriori算法和Eclat算法差异
Apriori算法和Eclat算法差异
|
1月前
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
76 11
|
1月前
|
存储 算法 索引
(六)漫谈分布式之一致性算法上篇:用二十六张图一探Raft共识算法奥妙之处!
现如今,大多数分布式存储系统都投向了Raft算法的怀抱,而本文就来聊聊大名鼎鼎的Raft算法/协议!
|
2月前
|
算法 JavaScript 前端开发
深入了解Vue2和Vue3的Diff算法差异!
总的来说,Vue3在Diff算法上的优化体现了更智能的静态内容处理、更高效的动态内容更新以及更灵活的内部结构。这些优化使得Vue3在运行时性能上有了显著的提升,尤其是在大型应用和复杂界面的场景下。通过不断地技术迭代和优化,Vue3为开发者提供了更高效、更易用的前端开发体验。
217 6
|
2月前
|
存储 算法 大数据
Apriori算法和Eclat算法在性能上有哪些主要的差异
Apriori算法和Eclat算法在性能上有哪些主要的差异
|
2月前
|
算法
共识协议的技术变迁问题之Raft的选举算法进行如何解决
共识协议的技术变迁问题之Raft的选举算法进行如何解决
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
16天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
18天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。