在使用筏时,提交日志条目后,我们应该将节点建议的数据写入到我们的存储中。如果节点之一写入失败怎么办。假设磁盘变坏了。失效节点应该终止吗?
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"
答案 0 :(得分:1)
请不要忘记,这些更改已保存在Raft日志中。 Raft甚至不能保证一旦提交更改x(例如将更改写入另一个文件)将在任何时间范围内发生。所以
C将没有数据“ abc”
这是不正确的。数据已保存在Raft日志中,只是在提交后尚未写入其他文件中。您在这里描述的是持久性状态机的行为,其中数据在提交到Raft日志中之后被保存在一些单独的存储区 中。但是请不要忘记在Raft日志中提交数据等同于持久保存数据。
持久状态机不仅具有基本的Raft协议要求,而且可以在raft dissertation中找到更多关于持久状态机的要求。通常,在持久状态机中,除了lastApplied
和term
外,还需要持久保存votedFor
索引。当条目被提交并应用于持久状态机(例如,写入每个节点上的数据文件)时,lastApplied
索引将保持不变。在成功应用之前,不会从筏日志中删除条目。这样,即使无法将数据"abc"
写入节点C
上的文件,也不会丢失数据。