提交所有节点日志条目后,如何安全删除筏中的历史日志

时间:2018-12-17 08:05:20

标签: java consistency raft

最近,我正在使用RAFT构建分布式系统,一个简单功能的实现是将日志条目复制到每个服务器以保持数据一致性,因此我的问题是如何在以下情况下安全删除RAFT中的历史日志:所有节点日志条目均已提交。

1 个答案:

答案 0 :(得分:0)

我不确定您的问题是否足够完整,无法给出完整的答案,但通常会以持久状态机的形式问这个问题。如果仅使用Raft来线性化和复制客户端请求,并且一旦提交则将条目分别保存(例如存储在数据库中),则正确的方法是定期保存每个节点的lastApplied术语和索引并删除到此为止的所有条目。

但是,请注意,当节点重新启动时,仍然会有一些日志重播,这在技术上是不可避免的,因为无法自动进行应用条目和持久保存lastApplied索引,因此仍然需要重做日志条目在持久状态机中占了比重。

另一个麻烦是赶上新的节点或落后于lastApplied索引的节点。在这种情况下,必须将持久状态作为快照发送以赶上该节点。

请参阅Raft论文中有关持久状态机的部分。

不管这是否恰好是您遇到的用例,为立即丢弃的条目保护系统安全的一般方法都是相同的。