在raft.github.io
页上的可视化视图和The Secret Lives of Data中,都显示了Raft中的写请求必须通过领导者发送。
运行使用Raft的etcd
时,我可以向任何etcdctl put
成员发送etcd
请求,即使他们不是领导者,写操作也会仍然可以在整个群集中传播。
其背后的机制是什么?它是木筏的一部分吗?它是特定于etcd
还是etcdctl
?
答案 0 :(得分:0)
在Raft论文的第5.1章
中领导者处理所有客户请求(如果 客户与关注者联系,则关注者会将其重定向到 负责人)。
他们建议您与任何对等方联系,并且该对等方是领导者并进行工作,或者它以有关当前领导者的信息响应客户端,然后客户端重试该请求。这样一来,客户只能认识一个同龄人,最终客户可以找出领导者是谁。
由于集群中的所有对等节点都知道其他对等节点,因此可以在对等节点本身上实现请求重定向。这样,客户端就不知道重定向层,也只能知道一个同位体。
另一种选择是将请求广播给所有对等方,并检查只有一个对等方成功响应(如果正在进行选举,则无人响应,然后您可以重试该请求)。这意味着客户端需要了解所有对等节点,并且如果您有动态Raft群集,则还需要跟踪客户端上的群集配置更改。
其背后的机制特定于etcd
及其实现。
来自github上的文档:
'MsgProp'建议将数据附加到其日志条目。这很特别 键入将建议重定向到领导者。因此,发送方法将覆盖 raftpb.Message的术语及其HardState的术语,以避免附加其 “ MsgProp”的本地术语。当“ MsgProp”传递给领导者的“步骤”时 方法,领导者首先调用“ appendEntry”方法来追加条目 到其日志,然后调用“ bcastAppend”方法将这些条目发送到 同行。当传递给候选者时,将删除“ MsgProp”。当传递给 关注者,“ MsgProp”通过发送存储在关注者的邮箱(msgs)中 方法。它与发件人的ID一起存储,然后由 rafthttp包。