raft 节点如何了解对等节点?

mlz*_*lz7 5 distributed-system consensus raft

我刚刚完成了草稿纸并开始实施。然而,我意识到我对一个关键细节有点困惑。raft 节点 \xe2\x80\x9c\xe2\x80\x9d 如何了解其对等节点?我在论文中没有看到\xe2\x80\x99 提到这一点,所以我认为它是特定于实现的,但在我看来,它导致了许多问题:

\n
    \n
  • raft集群的大小是静态的吗?由于每个节点都必须了解其他所有对等点(以便发送 RPC),因此新节点如何加入现有集群?现有节点如何了解这个新节点?
  • \n
  • 初始化时是否必须将每个节点\xe2\x80\x99s 网络位置硬编码到每个其他节点中?节点如何知道将 RPC 发送到哪里?
  • \n
\n

非常感谢对此的一些帮助。我真的很想完全理解 raft,并且很高兴能够实现它,但我对系统架构的这一部分有点迷失。对我来说,节点应该使用硬编码的网络位置进行静态配置似乎并不正确,因为在现实世界中,我绝对可以想象需要将新节点添加到现有集群中。谢谢!

\n

kuu*_*ujo 6

成员变更是 Raft 协议的核心组件(在扩展论文的第 6 节中指定,并在 Diego\xe2\x80\x99s 论文中详细讨论)。但你提出了一些很好的问题。在实践中,肯定存在一些安全配置要求以及现实世界 Raft 实现中常见的一些不同方法。

\n

一般来说,有几种方法可以引导 Raft 集群:使用标识集群每个成员的配置来初始化节点,或者使用单个节点启动集群并将节点添加到配置中(使用成员资格更改协议)以进行扩展集群达到其预期大小。两者都会给你相同的最终结果,它\xe2\x80\x99s只是一个偏好问题。

\n

集群配置的一个要求是每个成员都有固定的身份。如果追随者确认其将条目持久化到某个索引i并且领导者标记该索引已提交,则领导者应该能够假设条目 1- i将永久存在于该追随者上,即使追随者重新启动也是如此。因此,具有该身份的副本必须始终具有该日志。

\n

但这一要求给我们带来了成员变更的另一个用例:替换失败的成员。I\xe2\x80\x99d follower\xe2\x80\x99s 日志已损坏或主机崩溃且永远不会返回,只能通过执行成员资格更改协议来替换它:添加新副本并删除旧副本。同样,使用 Raft 文献中讨论的成员资格变更协议之一很重要。

\n

请记住,更改集群中的节点数量也可能意味着仲裁大小也会发生变化,这就是导致成员资格更改难以处理的原因。当更改仲裁大小时,协议需要确保提交仍然存储在大多数节点上。为了安全地调整法定人数以避免中断,必须精确实施成员协议。

\n