Raft 分布式一致性算法理解

分布式一致性算法就是要在分布式系统上保证数据一致的算法,既然是分布式,就涉及到主备节点的选举。

选举

在 Raft 种每个节点有 3 种状态:

  1. follower
  2. candidate
  3. leader

整个选举的流程分为 3 个部分:

选举超时等待:follower->candidate

一开始所有节点都是 follower 状态,每个节点在 150 ms 至 300 ms 之间随机选取一个时间作为选举超时(election timeout)时间,当等待超过这个时间后,就转化为 candidate 状态,准备进行选举。

之所以要随机选取时间,是为了避免多个节点同时选举影响选举成功的速度。

选举:candidate->leader

进入 candidate 状态后,该节点开始选举,它会向其他所有节点发送“选我”的消息,其他节点收到消息后,会判断是否赞成,candidate 会对赞成票计数(包括它自己的一票),必须当接收到大多数节点(节点总数的一半加一)的赞成票后,candidate 会当选成为 leader,否则选举失败,candidate 退回 follower 状态。

leader 维持:

leader 为了维持自己主的地位,不让其他节点选举,需要定时向其他 follower 节点发送消息,这个消息叫做心跳消息(heartbeat),定时的间隔称为心跳超时(heartbeat timeout)。follower 节点一收到心跳消息并回复,就会将本地选举超时计时重置,因此始终保持 follower 状态不变。

数据一致性

Raft 采用二段提交(2 phase commit)的方法来保证系统数据的一致性。

当 leader 收到用户写入数据后,经过两个阶段才会提交:

  1. 将写入数据发送到 follower 节点,由 follower 节点先提交并回复成功。
  2. 对提交成功数进行计数(包括自己的一次,虽然自己还并未提交),当大多数节点(节点总数的一半加)都提交后,leader 进行提交,否则不会提交。

在遇到 network partition 的情况时,可能会同时选出多个主,但因要求大多数提交,所以只能最多有一个 leader 节点能够提交成功,保证了数据一致性。