etcd如何传播写给非领导成员的信息?

时间:2019-05-29 09:41:06

标签: distributed-system etcd raft etcd3 leader

raft.github.io页上的可视化视图和The Secret Lives of Data中,都显示了Raft中的写请求必须通过领导者发送。

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

其背后的机制是什么?它是木筏的一部分吗?它是特定于etcd还是etcdctl

1 个答案:

答案 0 :(得分:0)

在Raft论文的第5.1章

  

领导者处理所有客户请求(如果   客户与关注者联系,则关注者会将其重定向到   负责人)。

他们建议您与任何对等方联系,并且该对等方是领导者并进行工作,或者它以有关当前领导者的信息响应客户端,然后客户端重试该请求。这样一来,客户只能认识一个同龄人,最终客户可以找出领导者是谁。

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

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

其背后的机制特定于etcd及其实现。 来自github上的文档:

  

'MsgProp'建议将数据附加到其日志条目。这很特别       键入将建议重定向到领导者。因此,发送方法将覆盖       raftpb.Message的术语及其HardState的术语,以避免附加其       “ MsgProp”的本地术语。当“ MsgProp”传递给领导者的“步骤”时       方法,领导者首先调用“ appendEntry”方法来追加条目       到其日志,然后调用“ bcastAppend”方法将这些条目发送到       同行。当传递给候选者时,将删除“ MsgProp”。当传递给       关注者,“ MsgProp”通过发送存储在关注者的邮箱(msgs)中       方法。它与发件人的ID一起存储,然后由       rafthttp包。