0%

Raft(二) leader election

Raft的领导选举讨论

Raft的领导地位

一致性分析

集群机器的每个节点需要保持一致性,注意这里需要强一致性,这就不得不谈到副本一致性模型。这里是之前在简书记录的相关知识,第二篇暂时空缺(没时间,哈哈哈)
分布式系统复制和一致性(1)模型分析
分布式系统复制和一致性(2)复制管理

看待副本一致性问题的角度

从不同的角度看:

  • 客户端:一致性主要指的是多并发访问时更新过的数据如何获取的问题
  • 服务端:更新如何复制分布到整个系统

不同的一致性:

  • 客户端的视角
  1. 强一致性:关系型数据库,要求更新过的数据能被后续的访问都能看到
  2. 弱一致性:如果能容忍后续的部分或者全部访问不到
  3. 最终一致性:如果经过一段时间后要求能访问到更新后的数据
  • 服务端的视角
    如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。

复制的方式

  • 同步:主节点保证所有的备份节点写入成功,才可以算写成功
  • 异步:主节点收到client的写请求后。。。在没有保证所有节点写入,就可以返回client写成功。
    比较:
  • 同步:
  1. 如果一个备份节点宕掉的话,就需要等待(当然现在有很多解决办法)
  2. 整体同步复制,性能差,时延高
  3. 优点:实现简单!可靠!
  • 异步:
  1. 副本不会实时一致性
  2. NWR协议(控制一致性的一种策略)

Raft算法在复制的过程中方式是异步的,最终一致性,这是从服务端的角度来看;从客户端向集群读写数据来看,是强一致性,读取的数据必定是最新更新的数据,安全的数据

我们一般说Raft是强一致性的算法,是从client的视角来看待问题的

Raft中的领导的强地位

前面bb了那么多强一致性,现在步入正题。Raft算法保证leader的强领导地位,client读写都通过leader。leader收到集群中大部分的复制成功ack,则直接apply到状态机,在复制的过程中同步所有副本。多个client并发情况下,同时读leader,必然读到的是apply到状态机的安全状态(之后其他节点都会是这个状态),保证client视角的强一致性。

Raft三种节点

在谈领导选举前,需要谈一下Raft集群中的三种节点成员

  • follower
  • candidate
  • leader

一般情况下,只有一个leader,其他节点全是follower。
leader:处理所有的客户端请求(如果一个客户端和follower联系,那follower会把请求重定向给leader)
follower:不会发送任何请求,只是简单的响应来自leader或者candidate的请求,复制log和apply到自身的状态机。
candidate: 选举时期,来描述选举新leader

选举细节

如果一个follower 在一段时间里没有接收到任何消息,也就是选举超时,然后他就会认为系统中没有可用的领导者然后开始进行选举以选出新的领导者。
要开始一次选举过程,跟随者先要增加自己的当前任期(term)号并且转换到候选人状态,并且给自己投一票。然后他会并行的向集群中的其他服务器节点发送请求投票的 RPCs 来给自己投票。

什么时候开始选举?

集群中只有follower

选举超时时间

150ms~300ms,每个节点随机分配

  • 判断集群中没有leader,选举超时->认为系统没有leader
  • 选举超时:一个follower 在一段时间里没有接收到任何消息
  • 选举超时的结果:开始新一轮选举
    成为candidate,term+1,先投自己一票,发送投票请求rpc

Candidate的三种结局

note:收到大量同一个任期的选票,保证一个任期号,最多只会有一个领导人被选举出来(选举安全特性)

  • 收到大部分选票,成为leader
    发送心跳包,建立权威,阻止其他可能存在的candidate成为领导人
  • 其他服务器成为了leader
    case1:等待其他的投票回应期间,收到了leader的RPC,发现对方的term不小于自己,承认对方合法leader
  • 选票瓜分,既没有赢也没有输
    case2:有多个follower->candidate,在一个term号里同时发出投票请求,但是投选票数无法产生结果

follower在一个term号里只能投一票,一个term里只能有一个leader

当这种情况发生的时候,每一个候选人都会超时,然后通过增加当前任期号来开始一轮新的选举。

任期用连续的整数标记,t3就是选票瓜分的情况,当这种情况发生的时候,每一个候选人都会超时,然后通过增加当前任期号来开始一轮新的选举。

选举安全特性:

对于一个给定的任期号,最多只会有一个领导人被选举出来

如何保证的呢?

  1. 任期号:非常重要的成分,在Raft算法中起到一个逻辑时钟的作用,单调递增。各个节点心跳、投票请求、复制log都会交换任期号(得到更大的任期号),候选人或者领导者收到更大的任期号,会自动变成跟随者。
  2. major:同一任期获取大多数投票
  3. 选票瓜分:在一个任期里无法选举出领导者,进行下一轮选举,经过一个新的选举时间,任期号+1,发起投票请求…直到选出领导者。