从raft.github.io
页面上的可视化和数据的秘密生活中都可以看出,Raft 中的写入请求必须通过领导者发送。
当我etcd
使用 Raft 运行时,我可以向etcdctl put
任何成员发送请求etcd
,即使他们不是领导者,并且写入仍然会在整个集群中传播。
这背后的机制是什么?它是 Raft 的一部分吗?它是特定于etcd
or的etcdctl
吗?
从raft.github.io
页面上的可视化和数据的秘密生活中都可以看出,Raft 中的写入请求必须通过领导者发送。
当我etcd
使用 Raft 运行时,我可以向etcdctl put
任何成员发送请求etcd
,即使他们不是领导者,并且写入仍然会在整个集群中传播。
这背后的机制是什么?它是 Raft 的一部分吗?它是特定于etcd
or的etcdctl
吗?
在 Raft 论文第 5.1 章中,
领导者处理所有客户端请求(如果客户端联系跟随者,则跟随者将其重定向到领导者)。
他们建议您联系任何对等点,该对等点要么是领导者并完成工作,要么使用有关当前领导者的信息响应客户端,然后客户端重试请求。这允许客户端只知道一个对等方,最终客户端找出领导者是谁。
由于集群内的所有对等点都知道其他对等点,因此可以在对等点本身上实现请求重定向。这样,客户端不知道重定向层,也只能知道一个对等方。
另一种选择是将请求广播给所有对等点,并检查是否只有一个对等点成功响应(如果正在进行选举,则没有,然后您可以重试请求)。这意味着客户端需要知道所有对等点,如果你有一个动态的 Raft 集群,你还需要跟踪客户端上的集群配置更改。
这背后的机制是特定于etcd
它们的实现的。从github 上提供的文档中:
'MsgProp' 建议将数据附加到其日志条目。这是一种将提案重定向到领导者的特殊类型。因此,send 方法用其 HardState 的术语覆盖 raftpb.Message 的术语,以避免将其本地术语附加到“MsgProp”。当 'MsgProp' 传递给领导者的 'Step' 方法时,领导者首先调用 'appendEntry' 方法将条目附加到其日志中,然后调用 'bcastAppend' 方法将这些条目发送给其对等方。当传递给候选人时,'MsgProp' 被丢弃。当传递给关注者时,'MsgProp' 通过 send 方法存储在关注者的邮箱(msgs)中。它与发送者的 ID 一起存储,然后通过 rafthttp 包转发给领导者。