java - 当所有节点日志条目都已提交时,如何安全地删除 raft 中的历史日志
问题描述
最近在用RAFT搭建一个分布式系统,实现一个简单的功能就是将日志条目复制到每台服务器,以保持数据的一致性,所以我的问题是在RAFT中所有节点都登录的时候如何安全的删除历史日志条目已提交。
解决方案
我不确定您的问题是否足够完整以给出完整的答案,但通常这个问题是根据持久状态机提出的。如果 Raft 仅用于线性化和复制客户端请求,并且一旦提交,条目将单独持久化(例如存储在数据库中),正确的方法是定期持久化lastApplied
每个节点的术语和索引,并删除所有条目观点。
但是,请注意,当节点重新启动时,仍然会有一些日志重放,这在技术上是不可避免的,因为应用条目和持久化lastApplied
索引不能原子地完成,因此仍然需要在持久状态机中考虑日志条目的重放。
另一个复杂因素是要赶上新节点或落后于lastApplied
索引的节点。在这种情况下,您必须将持久状态作为快照发送以赶上节点。
请参阅 Raft 论文中有关持久状态机的部分。
不管这是否正是您遇到的用例,为可以立即丢弃的条目保护系统安全的一般方法是相同的。
推荐阅读
- html - 如何在 flexbox 中使用自动边距
- javascript - 用于移动浏览器的 Reactjs 中的事件侦听器
- node.js - Mongodb 架构问题
- rancher - 有没有办法迁移 k3s 数据存储端点
- google-sheets - Google 电子表格中的符号显示为一个框。即使在搜索谷歌符号时也显示为框,几天前并非如此
- swift - 绕过 exc_breakpoint 崩溃继续程序执行
- javascript - 用于 html5 的二维码和条形码阅读器 javascript 文档
- github-pages - GH页面中“丢失”的HTML文件实际上只是缺少扩展名
- javascript - 如何使用道具制作反应js元素?
- html - 如何在 R Markdown 中设置上一个/下一个按钮