安全性
安全性
要保证所有的状态机有一样的状态,单凭复制与选举算法还不够。例如有
- 拥有最新的已提交的
log entry 的Follower 才有资格成为Leader 。 Leader 只能推进commit index 来提交当前term 的已经复制到大多数服务器上的日志,旧term 日志的提交要等到提交当前term 的日志来间接提交(log index 小于commit index 的日志被间接提交) 。
选主的限制
拥有最新的已提交的
log entry 的Follower 才有资格成为Leader 。
在所有的主从结构的一致性算法中,主节点最终都必须包含所有提交的日志。有些算法在从节点不包含所有已提交日志的情况下,依旧允许它当选为主节点,之后从节点会将这些日志同步到主节点上。但是
注意到节点当选主节点要求得到多数票,同时一个日志被提交的前提条件是它被多数节点接收,综合这两点,说明选举要产生结果,则至少有一个节点在场,它是包含了当前已经提交的所有日志的。
因此,
这个保证是在
提交前一个term 的日志
Leader 只能推进commit index 来提交当前term 的已经复制到大多数服务器上的日志,旧term 日志的提交要等到提交当前term 的日志来间接提交(log index 小于commit index 的日志被间接提交) 。
这里我们要讨论一个特别的情况。我们知道一个主节点如果发现自己任期(term)内的某条日志已经被存储到了多数节点上,主节点就会提交这条日志。但如果主节点在提交之前就挂了,之后的主节点会尝试把前任未提交的这些日志复制到所有子节点上,但与之前不同,仅仅判断这些日志被复制到多数节点,新的主节点并不能立马提交这些日志,下面举一个反例:

- 在
(a) 时,S1 当选并将日志编号为2 的日志复制到其它节点上。 - 在
(b) 时,S1 宕机,S5 获得来自S3 与S4 的投票,当选为term 3 的主节点,此时收到来自客户端的消息,写入自己编号为2 的日志。 (c) 期间,S5 宕机而S1 重启完毕,它重新当选为主节点并继续将自己的日志复制给S3 ,此时编号为2 且term 为2 的日志已经被复制到多数节点,但它还不能被提交。- 如果此时
S1 宕机,如(d) 所示,此时S5 获得来自S2 S3 S4 的投票,当选新的主节点,此时它将用自己的编号为2 ,term 为3 的日志覆盖其它节点的日志。 - 而如果
S1 继续存活,且在自己的任期内将某条日志复制到多数节点,如(e) 所示,则此时S5 已经不可能继续当选为主节点,因此该日志之前的所有日志均可被提交(包括前任创建的,编号2 的日志) 。
上例中的
网络分区容忍
根据前文介绍的

在开始的时候所有节点的
在网络分区被修复后,