1

raft.github.io页面上的可视化和数据的秘密生活中都可以看出,Raft 中的写入请求必须通过领导者发送。

当我etcd使用 Raft 运行时,我可以向etcdctl put任何成员发送请求etcd,即使他们不是领导者,并且写入仍然会在整个集群中传播。

这背后的机制是什么?它是 Raft 的一部分吗?它是特定于etcdor的etcdctl吗?

4

1 回答 1

2

在 Raft 论文第 5.1 章中,

领导者处理所有客户端请求(如果客户端联系跟随者,则跟随者将其重定向到领导者)。

他们建议您联系任何对等点,该对等点要么是领导者并完成工作,要么使用有关当前领导者的信息响应客户端,然后客户端重试请求。这允许客户端只知道一个对等方,最终客户端找出领导者是谁。

由于集群内的所有对等点都知道其他对等点,因此可以在对等点本身上实现请求重定向。这样,客户端不知道重定向层,也只能知道一个对等方。

另一种选择是将请求广播给所有对等点,并检查是否只有一个对等点成功响应(如果正在进行选举,则没有,然后您可以重试请求)。这意味着客户端需要知道所有对等点,如果你有一个动态的 Raft 集群,你还需要跟踪客户端上的集群配置更改。

这背后的机制是特定于etcd它们的实现的。从github 上提供的文档中:

'MsgProp' 建议将数据附加到其日志条目。这是一种将提案重定向到领导者的特殊类型。因此,send 方法用其 HardState 的术语覆盖 raftpb.Message 的术语,以避免将其本地术语附加到“MsgProp”。当 'MsgProp' 传递给领导者的 'Step' 方法时,领导者首先调用 'appendEntry' 方法将条目附加到其日志中,然后调用 'bcastAppend' 方法将这些条目发送给其对等方。当传递给候选人时,'MsgProp' 被丢弃。当传递给关注者时,'MsgProp' 通过 send 方法存储在关注者的邮箱(msgs)中。它与发送者的 ID 一起存储,然后通过 rafthttp 包转发给领导者。

于 2019-05-29T15:13:06.243 回答