首页 > 其他分享 >04.分布式选举:国不可一日无君(非原创)

04.分布式选举:国不可一日无君(非原创)

时间:2023-04-06 13:03:45浏览次数:37  
标签:状态 04 选举 节点 算法 Leader 无君 ID 分布式


作者:聂博士

Bully算法:长者为大,选择剩余存活的节点中最大的id
    Bully 算法在选举过程中,需要用到以下 3 种消息:Election 消息,用于发起选举;Alive 消息,对 Election 消息的应答;Victory 消息,竞选成功的主节点向其他节点发送的宣誓主权的消息。Bully 算法选举的原则是“长者为大”,意味着它的假设条件是,集群中每个节点均知道其他节点的 ID。在此前提下,其具体的选举过程是:集群中每个节点判断自己的 ID 是否为当前活着的节点中 ID 最大的,如果是,则直接向其他节点发送 Victory 消息,宣誓自己的主权;如果自己不是当前活着的节点中 ID 最大的,则向比自己 ID 大的所有节点发送 Election 消息,并等待其他节点的回复;若在给定的时间范围内,本节点没有收到其他节点回复的 Alive 消息,则认为自己成为主节点,并向其他节点发送 Victory 消息,宣誓自己成为主节点;若接收到来自比自己 ID 大的节点的 Alive 消息,则等待其他节点发送 Victory 消息;若本节点收到比自己 ID 小的节点发送的 Election 消息,则回复一个 Alive 消息,告知其他节点,我比你大,重新选举

    目前已经有很多开源软件采用了 Bully 算法进行选主,比如 MongoDB 的副本集故障转移功能。MongoDB 的分布式选举中,采用节点的最后操作时间戳来表示 ID,时间戳最新的节点其 ID 最大,也就是说时间戳最新的、活着的节点是主节点。

但这种算法的缺点在于,需要每个节点有全局的节点信息,因此额外信息存储较多;其次,任意一个比当前主节点 ID 大的新节点或节点故障后恢复加入集群的时候,都可能会触发重新选举,成为新的主节点,如果该节点频繁退出、加入集群,就会导致频繁切主。

raft算法

采用 Raft 算法选举,集群节点的角色有 3 种:Leader,即主节点,同一时刻只有一个 Leader,负责协调和管理其他节点;Candidate,即候选者,每一个节点都可以成为 Candidate,节点在该角色下才可以被选为新的 Leader;Follower,Leader 的跟随者,不可以发起选举。Raft 选举的流程,可以分为以下几步:初始化时,所有节点均为 Follower 状态。开始选主时,所有节点的状态由 Follower 转化为 Candidate,并向其他节点发送选举请求。其他节点根据接收到的选举请求的先后顺序,回复是否同意成为主。这里需要注意的是,在每一轮选举中,一个节点只能投出一张票。若发起选举请求的节点获得超过一半的投票,则成为主节点,其状态转化为 Leader,其他节点的状态则由 Candidate 降为 Follower。Leader 节点与 Follower 节点之间会定期发送心跳包,以检测主节点是否活着。当 Leader 节点的任期到了,即发现其他服务器开始下一轮选主周期时,Leader 节点的状态由 Leader 降级为 Follower,进入新一轮选主。

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

Kubernetes、etcd 均采用此算法

 

zab算法:

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

使用 ZAB 算法选举时,集群中每个节点拥有 3 种角色:Leader,主节点;Follower,跟随者节点;Observer,观察者,无投票权。选举过程中,集群中的节点拥有 4 个状态:Looking 状态,即选举状态。当节点处于该状态时,它会认为当前集群中没有 Leader,因此自己进入选举状态。Leading 状态,即领导者状态,表示已经选出主,且当前节点为 Leader。Following 状态,即跟随者状态,集群中已经选出主后,其他非主节点状态更新为 Following,表示对 Leader 的追随。Observing 状态,即观察者状态,表示当前节点为 Observer,持观望态度,没有投票权和选举权。投票过程中,每个节点都有一个唯一的三元组 (server_id, server_zxID, epoch),其中 server_id 表示本节点的唯一 ID;server_zxID 表示本节点存放的数据 ID,数据 ID 越大表示数据越新,选举权重越大;epoch 表示当前选取轮数,一般用逻辑时钟表示。ZAB 选举算法的核心是“少数服从多数,ID 大的节点优先成为主”,因此选举过程中通过 (vote_id, vote_zxID) 来表明投票给哪个节点,其中 vote_id 表示被投票节点的 ID,vote_zxID 表示被投票节点的服务器 zxID。ZAB 算法选主的原则是:server_zxID 最大者成为 Leader;若 server_zxID 相同,则 server_id 最大者成为 Leader。

04.分布式选举:国不可一日无君(非原创)_github

 

04.分布式选举:国不可一日无君(非原创)_时间戳_02

参考:

1. https://github.com/sluk3r/Bully-Algorithm
2. https://github.com/sluk3r/sofa-jraft
3. http://thesecretlivesofdata.com/raft/#election 动画效果。

标签:状态,04,选举,节点,算法,Leader,无君,ID,分布式
From: https://blog.51cto.com/u_11027113/6172671

相关文章

  • 分布式追踪的最佳工具:SigNoz
    分布式追踪的最佳工具:SigNozvsJaeger参考链接分布式追踪的最佳工具:SigNozvsJaeger_devops_weixin_0010034-DevPress官方社区(csdn.net)开源可观测性平台SigNoz参考链接开源可观测性平台SigNoz_JAVA序码的博客-CSDN博客使用开源工具监控全栈Nodejs应用参考链接使用开源工具监......
  • 分布式与微服务之间的关系
    根据设计期的架构思想和运行期的不同结构分为:面向服务的架构分布式服务架构微服务架构1、面向服务架构。以业务服务的角度和服务总线的方式,一般是webservice与ESB,考虑系统架构和企业IT治理;2、分布式服务架构。基于去中心化的分布式服务框架与技术,考虑系统架构和服务治理;3、......
  • 产品原型8-20230405
                  ......
  • 新一代分布式任务调度框架
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~Github地址如果访问不了Github,可以访问gitee地址。gitee地址我们先思考......
  • GFS分布式文件系统
    GFS分布式文件系统  1.GlusterFS简介  GlusterFS(GlusterFileSystem)是一个开源的分布式文件系统,主要由ZRESEARCH公司负责开发。GlusterFS是Scale-Out存储解决方案Gluster的核心,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS......
  • 20230405-Python运算符-day3
    运算符4月4日算数运算符赋值运算符复合赋值运算符⽐较运算符逻辑运算符算数运算符符号描述实例+加print(1+1)输出结果为2-减print(1-1)输出结果为0*乘print(2*2)输出结果为4/除print(4/2)输出结果为2//整除print(9//4)输出结果......
  • 每日总结2023-04-05
    今天实现了AndroidStudio从mySQL云端数据库进行登录注册成果  ......
  • DFS分布式文件系统
    一、GFS文件系统概述1.GlusterFS简介GlusterFS是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。MFS传统的分布式文件系统大多通过元服务器来存储元数据,元数......
  • 3d打印 LCD2004/12864显示不清楚 正面看不清 背光太强 的问题
    第一次买相关配件,没经验解决方法:背面有一个调节显示电压的旋钮。背光强调低点,字体弱,调高点。背部调节电压的旋钮:   原因:用专业语言就是液晶屏鬼影和字浅,鬼影是本不该显示的内容显示出来了,一般是电路供给液晶屏的电压高于液晶屏的工作电压造成的;字浅就是液晶屏上的内容颜......
  • MYSQL ERROR1045 报错的解决办法
    问题原因是密码错误导致的但是我输入的密码是安装MYSQL的时候设定的密码,应该是正确的。其实并不是,因为mysql会随机生成一个乱码作为你的密码。你需要改掉(或者记下)这个密码。解决方法:1.在my.ini中输入以下内容3.保存之后在命令行输入netstartmysql启动服务4.免密码登陆my......