分布式选举算法-霸道算法/欺负算法(bully algorithm)

简介: 分布式 选举 算法 霸道算法 欺负算法bully algorithm

定义

霸道算法每次都会选出存活的进程中标识符最大的候选者作为协调者。

霸道算法之所以霸道是因为当有新的进程加入时,如果这个新进程是整个分布式系统进程标识符最大的进程那么它会决定自己是协调者,并向其他进程选举。即使当前有协调者进程正在正常工作,新进程也会替换掉老的协调者进程,这就是霸道算法的霸道点。

前提条件

  1. 霸道算法需要知道如何与整个分布式系统中所有进程通信。
  2. 霸道算法需要知道其他进程的标识符。

霸道算法假设进程间消息发送是可靠的,但是它允许在选举期间进程崩溃。

消息类型

霸道算法主要有三种消息类型:

  1. 选举消息: 用于宣布选举。
  2. 应答消息:用于回复选举。
  3. 协调者消息:用于宣布当选进程的协调者身份。

选举触发条件

  1. 当前协调者故障

故障检测器可以通过超时发现协调者已经出现故障,那么故障检测器就开始一次选举。

  1. 新的进程加入(老的进程从故障中恢复)

新的进程加入时发送一个选举消息

故障检测方式

基于超时机制。
客户端-服务端交互如下图:

那么一次交互完成的时间应该为消息请求发送时间(T2-T1)+消息处理时间(T3-T2)+消息应答发送时间(T4-T3),总时间为:T4-T1。基于总时间来设计一个超时机制检测故障。

算法流程

  1. 进程P向所有编号比它大的进程发送选举消息;
  2. 如果无人响应,P获胜并称为协调者;
  3. 如果编号比它大的进程响应,则由又想着接管选举工作,P的工作完成。

几个简单的时序图

最大标识符进程选举

在这里插入图片描述

通常选举

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1SJREc3d-1646904209396)(en-resource://database/1798:1)]

算法分析

安全性

安全性是指参与选举的进程P要么没有选举要么已经选定了一个进程Q,Q是选举结束时具有最大标识符的非崩溃进程。

活性

活性是指所有参与选举的进程最终都知道了选举结果或者进程崩溃。

网络带宽

假设目前分布式系统中有N个进程:

  1. 最好情况

最好情况是在协调者故障后,目前正常运行的最大标识符进程立即检测到了协调者的故障立即选举自己并发送N-2个协调者消息给其他小标识符的进程。此时消息数量为θ(N)

  1. 最坏情况

最坏情况是最小标识符的进程先检测到了协调者故障,然后从小到大依次检测到了协调者故障(N-1个进程),然后向其他N-2个进程发送选举消息,此时选举消息数量为(N-2) + (N-3) + ... + 1 + 0为θ(N^2)个选举消息。

实现

简单情况

情况1:只有一个节点

启动后检查是否只有自己,如果只有自己那么就直接将自己设置为Leader。

情况2:有多个节点

启动后对大于自己的节点组播选举消息,等待应答;等待超时后如果没有应答则直接让自己成为Leader然后向其他人组播协调者消息。

情况3:霸道

启动后如果检查其他节点的标识符小于自己,则直接广播自己是Leader消息;当前的协调者收到后将自己Leader的角色放弃改为Follower。

情况4:协调者崩溃

Follower检测到Leader崩溃后,向比自己标识符大的节点发送选举消息。

算法

/**
 * 霸道选举算法
 * 流程节点
 * 1. 配置加载与解析
 * 2. 发起选举
 *  2.1 if 集群中只有自己一个节点,
 *          then 直接选择自己为Coordinator;
 *  2.2 else
 *          if 如果自己的选举标识符比所有的都大,
 *              then 直接向所有的节点发送协调者消息;
 *          else
 *              向所有大于自己选举标识符的节点发送选举消息,等待响应;
 *              if 等待超时后没有节点回复,
 *                  then 直接选举自己为协调者并向所有的节点发送协调者消息
 *              else
 *                  等待协调者消息;
 *                  if 收到协调者消息
 *                      then 设置协调者并将自己设置为follower
 *                  else 进入2.2循环
 *
 *      endif
 * 3. 故障检测
 *  3.1 定时与协调者发起心跳消息进行故障检测
 *      在3T时间内(实现为3次吧,每次T秒钟超时时间)没有响应则认为协调者故障
 *      算法:
 *      send 心跳消息,等待协调者回复
 *      if 心跳消息超时,故障计数+1
 *          if 故障计数 >=3:协调者故障
 *              发起选举;
 *           else
 *              等待下次定时器调用
 *       else
 *          收到了服务;
 *          故障计数清零;
 *
 *
 * @author errorfatal89@gmail.com
 * @date 2022/03/09
 */

代码实现

我简单实现了一版本霸道选举算法,代码地址:霸道选举算法

参考

  1. 维基百科:霸道选举算法
  2. 分布式系统概念与设计(原书第五版)
  3. 分布式系统原理与范型(第二版)
目录
相关文章
|
21天前
|
消息中间件 算法 分布式数据库
Raft算法:分布式一致性领域的璀璨明珠
【4月更文挑战第21天】Raft算法是分布式一致性领域的明星,通过领导者选举、日志复制和安全性解决一致性问题。它将复杂问题简化,角色包括领导者、跟随者和候选者。领导者负责日志复制,确保多数节点同步。实现细节涉及超时机制、日志压缩和网络分区处理。广泛应用于分布式数据库、存储系统和消息队列,如Etcd、TiKV。其简洁高效的特点使其在分布式系统中备受青睐。
|
21天前
|
算法 分布式数据库
Paxos算法:分布式一致性的基石
【4月更文挑战第21天】Paxos算法是分布式一致性基础,由Leslie Lamport提出,包含准备和提交阶段,保证安全性和活性。通过提案编号、接受者和学习者实现,广泛应用于分布式数据库、锁和配置管理。其简单、高效、容错性强,影响了后续如Raft等算法,是理解分布式系统一致性关键。
|
4天前
|
算法
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
【免费】基于ADMM算法的多微网电能交互分布式运行策略(matlab代码)
|
4天前
|
算法 Serverless 调度
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究(matlab代码)
|
24天前
|
存储 分布式计算 负载均衡
分布式(计算机算法)
分布式(计算机算法)
|
2月前
|
缓存 算法 关系型数据库
深度思考:雪花算法snowflake分布式id生成原理详解
雪花算法snowflake是一种优秀的分布式ID生成方案,其优点突出:它能生成全局唯一且递增的ID,确保了数据的一致性和准确性;同时,该算法灵活性强,可自定义各部分bit位,满足不同业务场景的需求;此外,雪花算法生成ID的速度快,效率高,能有效应对高并发场景,是分布式系统中不可或缺的组件。
102 2
深度思考:雪花算法snowflake分布式id生成原理详解
|
2月前
|
算法 安全
金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)
金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)
57 1
金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(Paxos篇)
|
2月前
|
算法 调度
金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)
金石原创 |【分布式技术专题】「分布式技术架构」一文带你厘清分布式事务协议及分布式一致性协议的算法原理和核心流程机制(上篇)
61 1
|
15天前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
112 2
|
10天前
|
监控 NoSQL 算法
探秘Redis分布式锁:实战与注意事项
本文介绍了Redis分区容错中的分布式锁概念,包括利用Watch实现乐观锁和使用setnx防止库存超卖。乐观锁通过Watch命令监控键值变化,在事务中执行修改,若键值被改变则事务失败。Java代码示例展示了具体实现。setnx命令用于库存操作,确保无超卖,通过设置锁并检查库存来更新。文章还讨论了分布式锁存在的问题,如客户端阻塞、时钟漂移和单点故障,并提出了RedLock算法来提高可靠性。Redisson作为生产环境的分布式锁实现,提供了可重入锁、读写锁等高级功能。最后,文章对比了Redis、Zookeeper和etcd的分布式锁特性。
111 16
探秘Redis分布式锁:实战与注意事项