最近,我正在使用RAFT构建一个分布式系统,实现一个简单的功能就是将日志条目复制到每个服务器以保持数据一致性,所以我的问题是当所有节点都安全时如何安全地删除RAFT中的历史日志日志条目已提交。
我不确定你的问题是否足够完整,无法给出完整的答案,但通常这个问题是根据持久状态机提出的。如果 Raft 只是用于线性化和复制客户端请求,并且条目在提交后单独保存(例如存储在数据库中),则正确的方法是定期保存每个节点的
lastApplied
项和索引并删除所有条目到那时为止。
但是,请注意,当节点重新启动时,仍然会出现一些日志重播,这在技术上是不可避免的,因为应用条目和持久化
lastApplied
索引无法自动完成,因此日志条目的重播仍然需要在持久状态机。
另一个复杂的问题是追赶新节点或落后于
lastApplied
索引的节点。在这种情况下,您必须将持久状态作为快照发送以赶上节点。
请参阅 Raft 论文中有关持久状态机的部分。
无论这是否正是您遇到的用例,保护可立即丢弃的条目的系统安全的一般方法是相同的。
添加 @kuujo 的答案 - Raft 论文提供了一个 InstallSnapshot RPC,它基本上可以帮助重新启动的追随者,这些追随者因日志而滞后,这些日志在 master 达成共识时被保留并丢弃。