在Raft论文中,他们提到所有的客户端交互都发生在leader节点上。我不明白的是领导者一直在变化。因此,假设我的集群位于负载均衡器之后。如何通知负载均衡器leader变更?或者,如果我是正确的,是不是负载均衡器可以向任何节点(追随者或领导者)发送客户端请求,而追随者节点负责将请求发送给领导者?
发布于 2016-12-27 13:43:53
投票结束后,您将有一个领导者(新的或旧的)。领导者有责任通知网络中的所有节点以规则的间隔(小于网络的保活时间,但大于最大往返时间)向所有节点发送心跳。
您的负载均衡器应该在每次获得心跳时更新leader。负载均衡器只将数据发送给leader,因为根据raft算法,所有客户端请求都直接发送给leader,其他节点不能发送数据,只能向投票和附加命令发送确认。
这里有一个非常好的演示文稿:- Raft: Log-Replication
发布于 2016-12-27 15:44:40
实际上有两种方法可以做到这一点:要么负载均衡器需要了解领导者在哪里,要么追随者可以代理请求到领导者。
通过追随者将客户端请求代理给领导者并没有错,事实上,这可能会带来重大好处。许多Raft实现允许客户端从跟随者读取,同时保持顺序一致性。这仍然可以通过负载均衡器向任意节点发送请求来安全地完成,前提是客户端跟踪它看到的最后一个索引,并将其与每个请求一起发送,以确保它不会看到状态及时返回。我不会在这里写完整的算法,但这是在你应该参考的Raft论文中描述的。
但在某些情况下,以这种方式使用负载均衡器可能会变得不安全。如果客户端被允许发送多个并发请求,负载均衡器可以通过不同的节点路由这些请求,它们可能会乱序到达leader。这可以通过将序列号附加到客户端请求并在领导者上对请求进行重新排序来说明。但要做到这一点,实现必须包括会话,以允许领导者跟踪每个客户端的状态。
不过,通常情况下,Raft客户端连接到特定的节点,并尽可能长时间地保持连接,以减少在切换服务器时维护一致性的开销。如果实现支持从追随者读取,则切换服务器的成本仍然很高,因为服务器必须等待状态赶上以保持顺序一致性。
https://stackoverflow.com/questions/41339413
复制相似问题