问题描述
考虑五个节点(S1,S2,S3,S4,S5)获取键/值数据。然后发生了以下步骤
- S3成为领导者,客户端向集群写入等于2的密钥
- S3将条目追加到S1,S2,S4,S5,然后S1,S2,S4,S5接受并将其写入自身日志(如图1所示)
- S3收到多数响应(来自S1,S2,S4,S5),键等于2的S3提交实体,向客户端发送写成功消息,然后向S1,S2,S4,S5发送提交消息
- S2,S4,S5收到提交消息并提交成功,但S1崩溃了。就像图2中一样,S1将具有未提交的条目。
- 现在,S1重新启动并成为密钥等于2的未提交条目的领导者(如图3所示)
完成上述步骤后,客户端查询一个条目(键等于2,刚写成功)。但是现在S1是领导者,并且密钥等于2的条目未提交。因此,客户将找不到自己之前写的条目。那么,我在哪里弄错了?请帮我 (图片1) (图2) (图3)
解决方法
我在Diego Ongaro论文中找到了更详细的版本In Search of an Understandable Consensus Algorithm(Extended Version)的解决方案。在第8节(客户互动)中,我找到了答案, 筏通过让每个领导者在其开始时在日志中提交一个空白的无操作条目来解决此问题 之后,有问题的S1将通过提交空白的无操作条目来提交等于1项的日志索引。