0

使用 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"
4

1 回答 1

1

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

C不会有数据“abc”

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

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

于 2019-03-01T05:44:37.210 回答