筏如何线性化?

问题描述

我对分布式系统还很陌生,想知道Raft共识算法如何线性化。 Raft通过仲裁提交日志条目。负责人Raft提交此刻,这意味着一半以上的参与者具有复制的日志。但是可能有一部分参与者没有最新的日志,或者他们有日志,但是没有收到提交这些日志的说明。

还是Raft的读取线性度需要读取仲裁?

解决方法

好吧,线性化与读和写都有关,是的,两者都是通过定额完成的。为了使读取线性化,读取必须由领导者处理,并且领导者必须在将读取应用于状态机之后但在响应客户端之前,确认它没有被新的领导者所取代。不过实际上,许多现实世界的实现都使用宽松的一致性模型进行读取,例如允许跟随者阅读。但是请注意,虽然法定人数可以保证Raft集群的线性度,但这并不意味着客户端请求可以线性化。为了将线性化扩展到客户端,必须添加会话,以防止丢失/重复的客户端请求在Raft日志中为单个提交生成多个提交,这会违反线性化。

,

kuujo解释了线性化是什么。我将回答您对该问题的其他疑问。

But there may be a portion of the participants that don't have the latest logs or that they have the logs but haven't received instructions to commit those logs

这可能是在领导者提交日志条目并且某些对等方现在没有该日志项之后 ,但是其他对等方最终会以某种方式拥有它,Raft做了几件事保证:

  • 即使领导者提交了一个日志条目(让我们在索引= 8处输入LogEntry来表示日志)并回答了客户端,后台例程仍在尝试将logEntry:8同步到其他同级对象。如果RPC失败,(有可能
  • 筏定期发送心跳(一种AppendEntries ),如果跟随者没有,该心跳RPC将把领导者必须的日志同步到关注者。关注者拥有logEntry:8之后,关注者将在RPC参数中比较其本地commitIndex和LeaderCommitIndex,以决定是否应提交logEntry:8。如果领导者在提交日志后立即失败,(这很罕见,但有可能
  • 根据选举规则,只有谁拥有logEntry:8能在大选中获胜的人。选举新的领导者后,新的领导者将继续使用heartBeat将logEntry:8同步到其他同伴。如果追随者落后很多,以至于无法从领导者那里获取所有日志,会发生什么? (在尝试添加新节点时会发生很多情况)。在这种情况下,Raft将使用快照RPC机制来同步所有数据和修剪的日志。