分布式理论之分布式选举

news2025/1/11 15:08:05

写在前面

一个国家需要领导人制定各种国家决策,一个军队也需要最高统领来制定各种军事决策,同理,一个分布式集群也需要一个领导,来协调整个集群的事务,比如保证数据一致性(这也是最重要的!),分布式集群的领导,我们一般称之为主节点,这个主节点选择的过程我们就叫做分布式选举,而分布式选举可以有各种不同的方案,这些不同的方案叫做分布式选举算法,本文就是来一起来学习常见的分布式选角算法都有哪些,接下来我们就一起看下吧!

1:分布式选举算法都有哪些

常见的算法有bully,raft,zab,分别来看下。

2:分布式选举算法

2.1:bully

英文[ˈbʊli] 恐吓,伤害,盛气凌人 school bully校园暴力,该算法比较简单粗暴,直接选择id最大的一个节点作为主节点。

  • 角色
    普通节点,主节点。
  • 消息类型
Election消息:发起选举
Alive消息:告知自己拥有更大id的消息
Victory消息:自己成为主。告知其它节点的消息
  • 选举过程
    该算法要求知道所有其它节点的id,用来比较大小,当收到其它节点的消息后就能获取其id(为什么不是在消息中携带自己的id?),则过程如下:
1:如果是节点判断自己当前拥有最大的id,则直接向其它节点发送Victory消息,宣布自己成为主节点
2:如果是当前节点判断自己并非拥有最大id,则向其它节点发送Election消息,发起选举过程,如果是指定的时间内都没有收到Alive消息回复,则宣布自己成为主节点,并再次向其它节点发送Victory消息,如果是在指定的时间内收到了大于等于1个的Alive消息,则等待接收其它节点发送的Victory消息

如下是一个可能的选举过程节点2发起选举最终节点3成为主节点

节点2发起选举最终节点3成为主节点
选主完成后,正常就不会重新选主了,除非主节点故障,或者是主节点与其它节点失去联系。

  • 优缺点

优点:

算法本身简单,容易实现,选举速度快

缺点:

1:每个节点都要存储其它节点的id等信息,占用额外存储空间
2:如果是有id更大的节点加入集群,或者是id更大的节点故障后重新加入集群,都会导致重新选主,如果是频繁发生,则会频繁出现重新选主,影响集群的稳定性

因此该算法适合节点较少的集群,较大集群首先每个节点都要存储大量的信息,其次,当节点增多时,部分节点出现故障的概率也会增大,导致频繁重新选主。

2.2:raft

英文[ræft] 木排;橡皮艇,这是一种少数服从多数的算法。

  • 角色
leader:主节点,负责管理和协调其它节点
candidate:候选节点,只有处于该角色的节点才有资格成为leader
follower:leader的跟随者,当选出leader后,其它节点都是该角色
  • 选主过程

注意:

1:每个节点只能投一票。

2:投票原则是时间优先,即如果是某节点收到投票申请,如果是还没有进行过投票,则直接投票,后续在收到投票申请,因为已经投过票,就不能再次投票了。

集群初始化完成后,每个节点的状态都是follower,如下:

在这里插入图片描述

在经过时间范围在150ms到300ms的Election timeout后,会转换状态follower->candidate,如下图其中一个节点首先到达Election timeout,变为candidate状态,如下图:

在这里插入图片描述

如图节点A,率先变为candidate状态,其term即任期从0变为1,然后先给自己投一票,所以Vote Count变为1。然后其会向NodeB,Node C,发送投票申请,如下图:

在这里插入图片描述

Node B,Node C,收到Node A的投票请求后,发现自己的term小于当前收到请求term,会从0更新为1,另外因为都还未投过票,所以会返回同意票,如下图:

在这里插入图片描述
此时,Node A的得票数是3,超过了集群总节点数3的多半,成为新的主节点,其它节点都成为follower节点,主节点会以heartbeat timeout时间间隔发送心跳包到所有follower节点,以供follower检测主节点状态,此时如下图:

在这里插入图片描述

接下来当其中一个follower变为candidate状态时,就代表主节点任期结束,此时转换为candidate状态节点,会发起重新选举,如下是发起投票,和接受投票,如下图:

在这里插入图片描述

Node C成为term 2的新主节点。

接下来我们看下raft是如何保证数据一致性的,如下当前主节点是Node A:

在这里插入图片描述

假设此时客户端向主节点发送了set 5,如下图:

在这里插入图片描述

然后主节点会将set 5同步给所有的follower,只有当主节点收到大多数follower数据写入确认后,才会提交数据,返回给客户端数据写入成功,这样就保证了数据的安全性,如下图:

在这里插入图片描述
后续有数据更新也是这个流程。

以上我们可以看到,节点状态在不断的转换,如下状态转换图:

在这里插入图片描述

  • 优缺点
    优点:
1:选举速度快,复杂度低。
2:节点退出后重新加入,虽然会触发重新选主,但是因为超过半数投票才能成为主节点,一般一会导致更换主,所以稳定性好

缺点:

1:要求所有节点可通信,因为超过半数才能选主成功,所以通信量大
2:重新选主产生的主节点数据比较旧,从而导致大量数据丢失,即数据安全性低

2.3:zab

英文全程zookeeper atomic broadcast,是zookeeper提出的一种带有优先级的少数服从多数选主算法,该算法和raft相比增加了优先级,而非简单的先到先得选票,这里的优先级主要是数据的最新程度

  • 角色
leader:主节点
follower:跟随节点
observer:观察者,无权投票

节点可能的状态如下:

looking状态:选举状态,无主节点时处于该状态
leader状态:主节点状态,代表是主节点,即处于leader角色
follower状态:跟随者状态,选主成功后从looking状态,变更为该状态,即处于follower角色
observer状态:观察者状态,即处于observer角色
  • 选主过程
    因为要根据优先级来决定是否投票,因此发起投票时增加了三元组 (server_id, server_zxID, epoch),含义如下:
server_id:服务器id
server_zxID:服务节点数据id,越大说明数据越新
epoch:选举轮数(为了便于理解,该值可先忽略)

对比过程是取server_zxID最大的投票,相同的则取server_id投票。

初始状态时,epoch=1,即第一轮投票,server_zxID=0,因为此时还没有任何数据,因此先投自己一票,将投自己的三元组投票发给其它节点,如下图:

在这里插入图片描述

接着server1,server2,都发现server3按照优先级,应该投一票,因此将vote_id都改为server3的serverID,即3,然后将其放到投票箱中,并广播出去,如下:

在这里插入图片描述

server3成为主节点后开始和follower节点发送heartbeat,follower回复ACK,即开始心跳,如下图:

在这里插入图片描述

  • 优缺点
    优点:
1:算法稳定性好,新节点加入,故障节点恢复,不会造成频繁选主

缺点:

1:需要额外比较server_zxID,server_id,选举时间长
2:广播方式发送消息,容易产生广播风暴

2.4:各种算法对比

参考下图:

在这里插入图片描述

在这里插入图片描述

少数服从多数算法为什么要奇数个节点?

偶数时,容易出现,相同个数的选票,从而无法选择主节点,即便重新选主,出现相同选票的概率也比较大,但奇数个节点,更容易出现某个节点获取大多数选票,从而成为主节点。

写在后面

参考文章列表:

raft动画演示 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uni-app学习总结

本文以B站黑马教程的uni-app项目实战视频为载体,总结uni-app相关用法,如有误,请指出~ 一、创建项目: HbuilderX工具-->文件-->新建-->项目---》选择uni--app项目,创建。 二、项目初始化: 去掉一…

设计模式之结构型模式:适配器模式

前言 前面讲解完了设计模式中的创建性模式,本文开始讲解设计模式中的结构性模式之一:适配器模式。 一、适配器模式的是干什么的? A类想要使用B类中的某些方法,但是不能直接使用,需要一个中间类对B类进行处理后&…

C++的类型转换

目录C语言中的类型转换为什么C需要四种类型转换C强制类型转换static_castreinterpret_castconst_castdynamic_castC语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不…

【Linux】第七部分 Linux中系统管理

【Linux】第七部分 Linux中系统管理 文章目录【Linux】第七部分 Linux中系统管理7. Linux中系统管理7.1 进程和服务7.2 service 服务管理systemctl 基本语法systemctl设置后台服务的自启动配置关机重启命令总结7. Linux中系统管理 7.1 进程和服务 一个正在执行的程序或命令&a…

2023年快到了,就简单用python写个对联吧

人生苦短 我用python 我知道现在离过年还早~ 但是早点准备早点轻松~ Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联、横批,然后自动生成春联保存在代码文件夹,如果…

梦想SkyPython IDLE入门

IDLE是Python软件包自带的一个集成开发环境,初学者可以利用它方便地创建、运行、测试和调试Python程序。 一、IDLE的安装 实际上,IDLE是跟Python一起安装的,不过要确保安装时选中了“Tcl/Tk”组件,准确地说,应该是不要…

六、应用层(一)网络应用模型

目录 1.1 客户/服务器模型 1.2 P2P模型 应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。 早期基于文本的应用(电子邮件、远程登陆、文件传输、新闻组)20世纪90年代将…

node.js+uni计算机毕设项目基于微信小程序的培训机构管理系统小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

六、应用层(二)域名系统(DNS)

目录 2.1层次域名空间 2.2域名服务器 2.3域名解析过程 域名系统(Domain Name System,DNS)是因特网使用的命名系统,用来把便于人们记忆的具有特定含义的主机名转换为便于机器处理的IP地址。 多台主机可以映射到同一个域名上(如负…

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 yolo

智慧工地车辆冲洗系统 工地渣土车未冲洗自动抓拍 通过Python基于YOLOv7深度学习网络对现场画面实时监测分析。当识别到现场车辆冲洗不干净或者没有冲洗,系统就立即抓拍。与C / C等语言相比,Python速度较慢。也就是说,Python可以使用C / C轻松…

SpringCloud图文详解 | 两种注册中心远程调用负载均衡服务网关... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘SpringCloud,顺便上传笔记。 下图是我总结的 SpringCloud 知识的初级思维导图,后续会不断补充 文章目录微服务技术演变单体架构分布式架构微服务 - 特点微服务实现 - 技术对比微服务技术 - 实际应用SpringCloud知识点总结服务拆分和…

SSM框架学习记录-SpringMVC_day02

1.SSM整合 代码参考Springmvc_08_ssm 流程分析 添加依赖:pom.xml编写配置类: Spring的配置类SpringConfig.javaSpringMVC的配置类SpringMvcConfig.javaWeb项目的入口配置类ServletConfig.javaMyBatis的配置类MyBatisConfig.java第三方数据源的配置类Jdbc…

uniapp动态切换显示不同内容组件

需求描述 通过点击注册或是登录按钮切换不同的组件.默认显示登陆界面,登录字样加粗显示,登录页面显示手机号密码登录.点击注册切换到注册页面,注册字样加粗显示,页面显示手机号和验证码以及注册按钮.对应页面显示如下: 实现代码: <template><view class"conte…

pytorch实战(五)——时间序列多步预测的五种方法介绍

当需要根据已有的时间序列数据&#xff0c;预测未来多个时刻的状态时&#xff0c;被称之为时间序列多步预测。 时间序列多步预测有五种策略&#xff0c;分别为&#xff1a; 1、直接多步预测&#xff08;Direct Multi-step Forecast&#xff09; 2、递归多步预测&#xff08;Rec…

Redis5.0+——主从复制

说明 主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff08;一主一从&#xff0c;一主多从&#xff09; 能实现目的 读写分离&#xff0c;性能拓展容灾区快速恢复&#xff08;当一个从…

【软件测试】资深测试的总结,接口测试中的最常见的几个错误......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 为了彻底进行API接口…

入门力扣自学笔记221 C++ (题目编号:1739)

1739. 放置盒子 题目&#xff1a; 有一个立方体房间&#xff0c;其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子&#xff0c;每个盒子都是一个单位边长的立方体。放置规则如下&#xff1a; 你可以把盒子放在地板上的任何地方。 如果盒子 x 需要放置在盒子 y…

工作流运行

工作流运行 定义内涵 工作流运行是工作流模板的依次执行&#xff0c;在工作流运行时&#xff0c;用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同&#xff0c;运行过程中可能会产生不同的新资源&#xff0c;如数据 处理类型的工作流会产生新的数据集&…

DJ15 8086 中断程序设计

目录 一、8086/8088 中断系统 1. 8086/8088 中断源类型 2. 中断向量表 3. CPU 中断类型码的获取方法 二、8259A 的引线及内部结构 1. 外部引线 2. 内部结构 3. 与系统总线的连接方式 4. 级联连接方式 5. 中断触发方式 三、8259A 的工作过程 四、8259A 的工作方式 …

K. The Robot(思维 + 看数据范围)

Problem - 1468K - Codeforces 有一个机器人在一个格子场上&#xff0c;这个格子场在各个方向都是无尽的。最初&#xff0c;机器人位于坐标为(0,0)的单元中。他将执行由一串大写拉丁字母 "L"、"R"、"D"、"U "描述的命令。当一个命令被…