在使用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不会有数据“abc”
这不准确。数据一直存在于Raft日志中,它只是在提交后才被写入其他文件。您在这里描述的是持久状态机的行为,其中数据在Raft日志中提交后保存在某个单独的存储中。但是不要忘记在Raft日志中提交数据等于持久化它。
持久状态机的要求超出了基本的Raft协议,在raft dissertation上可以找到更多关于它们的要求。通常,在持久状态机中,除了lastApplied
和term
之外,还需要保持votedFor
指数。当条目被提交并应用于持久状态机(例如,写入每个节点上的数据文件)时,lastApplied
索引被持久化。在成功应用条目之前,不会从Raft日志中删除条目。这就是您确保数据"abc"
不会丢失的方法,即使它无法写入节点C
上的文件。