当所有节点日志条目都已提交时,如何安全地删除 raft 中的历史日志

How to safely remove history log in raft when all nodes log entries have been committed

最近在用RAFT搭建分布式系统,实现一个简单的功能就是复制日志条目到各个服务器保持数据的一致性,所以我的问题是如何安全的删除历史登录RAFT 当所有节点日志条目都已提交时。

我不确定你的问题是否足够完整,无法给出完整的答案,但通常这个问题是根据持久状态机提出的。如果 Raft 只是简单地用于线性化和复制客户端请求并且条目在提交后被单独持久化(例如存储在数据库中),正确的方法是定期持久化每个节点的 lastApplied 项和索引并删除到那时为止的所有条目。

但是,请注意,当节点重新启动时,仍然会有一些日志重放,这在技术上是不可避免的,因为无法自动完成应用条目和持久化 lastApplied 索引,因此日志条目的重放仍然需要在持久状态机中考虑。

另一个复杂问题是赶上新节点或落后于 lastApplied 索引的节点。在那种情况下,您必须将持久状态作为快照发送以赶上节点。

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

无论这是否正是您遇到的用例,为可立即丢弃的条目保护系统安全的一般方法都是相同的。