Raft算法之安全性

Raft 论文地址:https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf

Raft论文中分为三块:

经过对Raft中的领导选举日志复制介绍以后,我们已经对Raft有了一个大致的了解,本文中将从安全的角度来介绍Raft的安全性。

选举限制

必须保证候选人的日志必自己的日志新

我们在领导选举这一文中知道,不是任何节点都可以成为领导人的,被选举出来的领导人必须要包含所有已经提交的日志,否则将会无法保证状态机的一致性。

换句话说,在其他服务器节点给候选人投票时,需要对候选人的“资格”做一些校验,这里的“资格”就是必须保证候选人的日志必须必自己“新”,即当前的任期和候选人的任期相同,且候选人的日志长度比当前的日志长度 或者 候选人的任期比比当前节点的任期高。

提交之前任期内的日志

领导人只能提交当前任期的日志

有这样一种情况,如果领导人在将日志复制到大多数(N/2+1)的服务器以后,还没有来的机提交之前就奔溃了,经过了一系列的奔溃重启,原先奔溃的领导人又被重新选举为新任期的新领导人,如果此时新领导人将之前尚未提交的老任期的日志进行了提交,那么将会是非常危险的,因为可能在日志提交以后,其他节点再次被选举为领导人,然后将当前的已经提交的日志覆盖。如下图所示:

raft-commit-old-term-log

  1. S1在任期2的时候,将日志2传播到了S1S2两个节点上,然后自己崩溃了
  2. 然后S5被选举成为了领导人,并追加了日志3,但是还没来得及将日志传播给其他节点就崩溃了
  3. 此时S1又被重新选举为领导人,如果此时S1继续将日志2附加到其余节点,附加成功,并进行了提交
  4. 此时S1又崩溃了,S3被选举为了任期4时候的领导人,因为领导人的日志可以强行覆盖跟随者的日志,所以就导致了被提交(可能被Apply到了状态机中)的日志被覆盖。