Raft实现报告(17)
紧接着日志压缩和快照
快照
尽管服务器通常独立拍摄快照,但是leader必须偶尔讲快照发送给落后的follower。当leader已经丢弃了他需要给follower发送的下一条日志条目的时候,就会发生这种情况。好的是,这种情况在正常操作中不太可能发生:跟上leader的follower已经有了这个条目。但是异常缓慢的follower或是加入集群的新服务器就不会。那么让这种新服务器追上leader的方法就是,让leader通过网络向他们发送快照。
新的RPC
leader将会使用InstallSnapshot的新RPC讲快照发送给太落后的follower。当follower收到RPC带来的快照时,他必须决定如何处理其现有的日志条目。通常,快照讲包含收件人日志中尚未包含的新信息。在这种情况下,follower会丢弃他的整个日志;它报不被快照所取代,并且有可能有未提交的条目与快照的冲突。相反,如果follower收到描述其日志前缀的快照(由于重新传输或错误),快照覆盖的日志条目将会被删除,但快照后面的条目仍然有效并且必须保留。
这种快照方法违背了Raft的强leader原则,因为follower可以在leader不知道的情况下拍摄快照。但这种偏离或者叫做异常是合理的。虽然拥有leader有助于避免在达成共识时出现了冲突的决策,但是在快照时已经达成共识,因此没有决策冲突。数据仍然只从leader流向follower,只是follower可以重新组织他们的数据。