raft提交后保存失败如何处理

how to handle the saving failure after raft committed

当使用 raft 时,在提交日志条目后,我们应该将节点提议的数据写入我们的存储。如果其中一个节点写入失败怎么办。假设磁盘坏了。故障节点应该自行终止吗?

the proces like the following.
1. node A propose with data "abc"
2. raft log committed
3. A write data "abc" to file ok.
   B write data "abc" to file ok.
   C write data "abc" failed.
what should we do now ? since C won't have data "abc"

不要忘记这些更改已经保存在 Raft 日志中。 Raft 甚至不保证一旦更改被提交 x(例如,将更改写入另一个文件)将在任何时间范围内发生。所以

C won't have data "abc"

这不准确。数据已经持久化在 Raft 日志中,只是提交后没有写入其他文件。您在这里描述的是持久状态机的行为,其中数据在 提交到 Raft 日志中后持久保存在某个单独的存储中。但是不要忘记,在 Raft 日志中提交数据就等于持久化它。

持久状态机的要求超出了基本的 Raft 协议,有关它们的更多信息可以在 raft dissertation 中找到。通常,在持久状态机中,除了 termvotedFor 之外,您还需要持久保存 lastApplied 索引。随着条目被提交并应用于持久状态机(例如写入每个节点上的数据文件),lastApplied 索引被持久化。在成功应用之前,条目不会从 Raft 日志中删除。这就是确保数据 "abc" 不丢失的方法,即使它不能写入节点 C 上的文件。