【发布时间】:2021-01-04 02:34:05
【问题描述】:
我对分布式系统还很陌生,想知道 Raft 共识算法是如何线性化的。 Raft 通过 quorum 提交日志条目。在领导者 Raft 提交的那一刻,这意味着超过一半的参与者拥有复制的日志。但是可能有一部分参与者没有最新的日志,或者他们有日志但没有收到提交这些日志的指令。
或者 Raft 的读取线性化是否需要读取仲裁?
【问题讨论】:
标签: distributed consensus raft
我对分布式系统还很陌生,想知道 Raft 共识算法是如何线性化的。 Raft 通过 quorum 提交日志条目。在领导者 Raft 提交的那一刻,这意味着超过一半的参与者拥有复制的日志。但是可能有一部分参与者没有最新的日志,或者他们有日志但没有收到提交这些日志的指令。
或者 Raft 的读取线性化是否需要读取仲裁?
【问题讨论】:
标签: distributed consensus 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 做了几件事来保证:
logEntry:8 同步到其他对等方。如果 RPC 失败,(有可能)logEntry:8之后,follower会比较RPC args中的本地commitIndex和leaderCommitIndex来决定是否应该commitlogEntry:8。如果领导者在提交日志后立即失败,(这种情况很少见,但可能)logEntry:8 can win the election.选出新的leader后,新的leader会继续使用heartBeat同步logEntry:8到其他peer。如果追随者落后太多以至于无法从领导者那里获得所有日志,会发生什么? (当您尝试添加新节点时会发生很多情况)。在这种情况下,Raft 将使用快照 RPC 机制来同步所有数据和修剪后的日志。【讨论】: