- 当集群正在启动过程中,或 Leader 崩溃后,集群就进入了恢复模式。对于要恢复的数
据状态需要遵循三个原则。
(1) Leader 的主动出让原则
- 若集群中 Leader 收到的 Follower 心跳数量没有过半,此时 Leader 会自认为自己与集群
的连接已经出现了问题,其会主动修改自己的状态为 LOOKING,去查找新的 Leader。为了防止集群出现脑裂。
而其它 Server 由于有过半的主机认为已经丢失了 Leader,所以它们会发起新的 Leader
选举,选出一个新的 Leader。
(2) 已被处理过的消息不能丢原则
- 当 Leader 收到超过半数 Follower 的 ACKs 后,就向各个 Follower 广播 COMMIT 消息,批准各个 Server 执行该写操作事务。当各个 Server 在接收到 Leader 的 COMMIT 消息后就会在本地执行该写操作,然后会向客户端响应写操作成功。
- 但是如果在非全部 Follower 收到 COMMIT 消息之前 Leader 就挂了,这将导致一种后
果:部分 Server 已经执行了该事务,而部分 Server 尚未收到 COMMIT 消息,所以其并没有
执行该事务。当新的 Leader 被选举出,集群经过恢复模式后需要保证所有 Server 上都执行
了那些已经被部分 Server 执行过的事务。
(3) 被丢弃的消息不能再现原则
- 当在 Leader 新事务已经通过,其已经将该事务更新到了本地,但所有 Follower 还都没
有收到 COMMIT 之前,Leader 宕机了(比前面叙述的宕机更早),此时,所有 Follower 根本就不知道该 Proposal 的存在。当新的 Leader 选举出来,整个集群进入正常服务状态后,之前挂了的 Leader 主机重新启动并注册成为了 Follower。若那个别人根本不知道的 Proposal还保留在那个主机,那么其数据就会比其它主机多出了内容,导致整个系统状态的不一致。所以,该 Proposa 应该被丢弃。类似这样应该被丢弃的事务,是不能再次出现在集群中的,应该被清除。