设计之初,PolarFS 考虑到实现的复杂性,选择了 Raft。但:
前提:如果日志的写入范围互不重叠,则可以乱序执行
由于日志复制和提交可以乱序,日志中会存在空洞。一个日志条目被确认提交后,并不意味着在这个日志之前的所有日志都已经被成功提交
那么,如何安全的应用日志?

选择具有最新 checkpoint 的节点作为 leader 候选,而不是拥有最新日志的节点
原因:
由于日志空洞的存在,新 Leader 需要进行日志合并才能开始提供服务
对于已提交的日志:
对于未提交的日志:

追赶(Catch up):让 Follower 跟上 Leader 当前的状态
天下武功,唯快不破!