分布式系统选举算法剖析

1.概述

  我们在了解分布式选举算法之前,我们需要这样一种算法产生的背景。在一个分布式系统中,因为各种意外的因素,有的服务器可能会崩溃或变得不可靠,它就不能和其他服务器达成一致状态。因而这样就需要一种Consensus协议,来确保服务器的容错性,也就是说即使系统中有一两个服务器节点Crash,也不会影响其处理过程。为了让容错方式达成一致,我们不可能要求所有的服务器节点100%都达成Consensus状态,只要超过半数的大多数服务器节点Consensus即可,假设有N台服务器节点,(N/2)+1 就超过半数,即可代表大多数了。那么,今天笔者给大家分享的就是Raft分布式选举算法。

2.内容

  Raft为了实现Consensus这个目标,这个过程如果选举一样,参选者需要说服大多数服务器节点投票给他,一旦选定后就跟随其操作。在Raft中,任何时候一个服务器节点可以扮演下面角色之一:

  1. Leader:处理所有客户端交互,日志复制等操作,一般一次只有一个Leader。
  2. Follower:类似选民,处于被动状态。
  3. Candidate:类似Proposer,可以被选为一个新的Leader。

  Raft阶段分为两个,首先是选举过程,然后在选举出来的Leader带领下进行相关正常的操作,比如复制等。下面有相关示意图来展示该过程:

2.1 选举请求

  任何一个服务器节点都可以成为一个Candidate,它向其他服务器节点Follower发出要求选举自己的请求,如下图所示:

2.2 应答

  其他服务器应答同意,发出OK。如下图所示:

  需要注意的是,如果在这个过程当中,有一个FollowerCrash掉,没有收到请求选举的要求,因此候选者可以自己选举自己,只要达到 (N/2)+1 的大多数票,候选人还是可以成为Leader的。

2.3 发送指令

  在候选者成为Leader后,它可以向其他Follower节点发送指令,比如进行日志复制,如下图所示:

2.4 Heartbeats

  之后,通过心跳进行日志复制等通知,如下所示:

2.5 Crash

  在运行的过程当中,一旦该集群的Leader当场Crash了,那么Follower中有一个成为候选者,发出投票选举邀请,如下图所示:

2.6 New Leader

  在Follower同意后,其成为Leader,继续承担日志复制等操作动作,如下图所示:

  这里需要注意的是,在整个选举过程当中是有一个时间限制的,如下图所示:

  出现在Split Note的情况,是因为如果同时有两个候选人向其他节点发出投票邀请,这时通过类似的加时赛来解决,两个候选者在一段Timeout,比如100ms互相不服气的等待后,因为双方得到的票数是一样的,一半对一半,那么在100ms后,再由这两个候选者发出投票邀请,这时同时的概率大大降低,那么首先发出邀请投票的候选者得到大多数同意票后,成为Leader,而另外的一个候选者后来发出投票邀请,那些Follower选民已经投票给了第一个候选者,此时不能再投票给它,它就成为落选者了,最后这个落选者也就成为一名普通的Follower了。

3.日志复制案例

  下面通过以日志复制为例子来说明Raft分布式选举算法,假设这里Leader已经选出,这时候客户端发出一个新增的请求,比如日志内容是"smartloli",如下所图所示:

3.1 Append

  在Leader发送的指令下,Follower需要遵循它的指令,都将这个新的日志内容追加到他们各自的日志中:

3.2 Commit

  大多数Follower服务器节点日志写入磁盘文件后,确认追加成功,发出Commited OK,如下图所示:

  再下一个心跳Heartbeats中,Leader会通知所有的Follower更新Commited。对于每个新的日志记录,重复上述操作过程。如果在这个过程当中,发生了网络通信故障,使得Leader不能访问大多数Followers了,那么Leader只能正常更新它能访问的那些Follower服务器节点,而大多数的服务器Follower因为没有了Leader,他们重新选择一个候选者作为Leader,然后这个新的Leader作为代表与外界进行交互,如果外界发送新的请求操作,比如添加新的日志,这个新的Leader就按照上述步骤通知大多数Followers服务器节点,如果这时网络故障修复了,那么原先的Leader就要降级成为Follower,在失联阶段这个老Leader的任何更新都不能算Commit,都要Roll Back,接受新的Leader的新的更新操作。

4.总结

  目前,几乎所有的语言都已经支持Raft分布式选举算法的库了。这里我们通过对分布式选举算法的学习与分析,可以对分布式系统底层选举机制有更好的理解。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式一致性算法是为了解决分布式系统中数据一致性问题而提出的。常见的分布式一致性算法有Paxos、Raft、ZAB等。这里以Raft算法为例进行介绍。 Raft算法是一种相对容易理解的分布式一致性算法,它将一致性问题分解成了三个子问题:领导选举、日志复制和安全性。下面分别介绍这三个子问题的实现。 1. 领导选举 在Raft算法中,每个节点都有三种状态:跟随者、候选人和领导者。初始状态下,所有节点都是跟随者。当跟随者与领导者失去联系时,跟随者会变成候选人,并开始选举新的领导者。选举过程分为两个阶段:首先,候选人需要获得大多数节点的投票;然后,获得投票的候选人成为新的领导者。 2. 日志复制 在Raft算法中,每个节点都有一个日志,用于记录系统状态的变化。当客户端向领导者发送请求时,领导者会将请求添加到自己的日志中,并向其他节点发送日志条目。当大多数节点都复制了这个日志条目后,领导者会将这个日志条目应用到自己的状态机中,并向客户端返回结果。 3. 安全性 在Raft算法中,为了保证安全性,需要满足两个条件:领导者包含所有已提交的日志条目,且每个日志条目只被提交一次。为了满足这两个条件,Raft算法使用了递增的日志索引和递增的任期号。 以上是Raft算法的实现过程,当然,实际应用中还需要考虑很多细节问题。如果您对分布式一致性算法的实现有更深入的了解,可以进一步探究。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值