2021SC@SDUSC
什么是数据恢复
当Leader出现故障或者重启时,所有节点都会使用崩溃恢复协议来使彼此达到一个一致的状态。
什么时候会进入数据恢复模式
1、当服务器刚刚启动时
2、当leader出现网络中断,崩溃或者重启的情况
3、当集群中已经不存在过半的服务器与Leader服务器保持正常通信。
数据恢复需要解决的问题
- 确保已经被leader提交的proposal必须最终被所有的follower服务器提交。
- 确保没有被处理proposal不能被提交。
流程
对于问题1:
1、选举zxid最大的节点作为新的 leader.
由于所有提案被commit 之前必须有合法数量的 follower ACK,即必须有合法数量的服务器的事务日志上有该提案的 proposal,因此,zxid最大也就是数据最新的节点保存了所有被 COMMIT 消息的 proposal 状态。
2、新的 leader 将自己事务日志中 proposal 但未 commit 的消息处理。
3、新的 leader 与 follower 建立先进先出的队列, 先将自身有而 follower 没有的 proposal 发送给 follower,再将这些 proposal 的 COMMIT 命令发送给 follower,以保证所有的 follower 都保存了所有的 proposal、所有的 follower 都处理了所有的消息。
通过以上策略,能保证已经被处理的消息不会丢。
对于问题2:
Zab 通过设计 zxid 来实现这一目的。一个 zxid 是64位,高 32 是纪元(epoch)编号,每经过一次 leader 选举产生一个新的 leader,新 leader 会将 epoch 号 +1。低 32 位是消息计数器,每接收到一条消息这个值 +1,新 leader 选举后这个值重置为 0。这样设计的好处是旧的 leader 挂了后重启,它不会被选举为 leader,因为此时它的 zxid 肯定小于当前的新 leader。当旧的 leader 作为 follower 接入新的 leader 后,新的 leader 会让它将所有的拥有旧的 epoch 号的未被 COMMIT 的 proposal 清除