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

Java 当所有节点日志条目都已提交时,如何安全地删除raft中的历史日志,java,consistency,raft,Java,Consistency,Raft,最近,我正在使用RAFT构建一个分布式系统,实现一个简单的功能就是将日志条目复制到每个服务器,以保持数据的一致性,因此,我的问题是,当所有节点日志条目都已提交时,如何安全地删除RAFT中的历史日志。我不确定您的问题是否足够完整,是否可以给出完整的答案,但一般来说,这个问题是根据持久状态机提出的。如果Raft只是用于线性化和复制客户端请求,并且条目在提交后被单独保存(例如存储在数据库中),正确的方法是定期保存每个节点的lastplicated项和索引,并删除所有条目,直到该点 但是,请注意,当节点

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

我不确定您的问题是否足够完整,是否可以给出完整的答案,但一般来说,这个问题是根据持久状态机提出的。如果Raft只是用于线性化和复制客户端请求,并且条目在提交后被单独保存(例如存储在数据库中),正确的方法是定期保存每个节点的
lastplicated
项和索引,并删除所有条目,直到该点

但是,请注意,当节点重新启动时,仍然会有一些日志的重放,这在技术上是不可避免的,因为应用条目和持久化
lastplicated
索引不能以原子方式完成,因此日志条目的重放仍然需要在持久化状态机中进行说明

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

请参阅本文中关于持久状态机的部分

不管这是否正是您遇到的用例,对于可以立即丢弃的条目,维护系统安全的一般方法是相同的