【问题标题】:How does node know which nodes have seen the cluster current state?节点如何知道哪些节点看到了集群当前状态?
【发布时间】:2017-01-19 04:15:09
【问题描述】:
我正在阅读 akka 文档,但在理解他们实现 Gossip 的方式时遇到了一些麻烦。 (docs here)。让我困惑的部分,(强调我的):
定期,默认是每1秒,每个节点选择另一个
随机节点发起一轮八卦。 如果小于 1/2
节点驻留在已看到的集合中(已看到新状态),然后
集群八卦 3 次,而不是每秒一次。 这调整了
gossip区间是一种加速收敛过程的方法
状态变化后的早期传播阶段。
因此,如果八卦轮处于开始阶段(少于 1/2 个节点已经看到当前状态),来自所见集的节点开始每秒发送 3 个八卦,而不是一个。但是,如果八卦收敛发生了,他们怎么知道(他们仍然保持每秒发送 3 次八卦)。或者,可能会像任何其他“集群事件”一样在整个集群中传播收敛?
【问题讨论】:
标签:
java
scala
akka
distributed-system
gossip
【解决方案1】:
您可能知道,当所有节点都被看到(即所有成员节点都在 Gossip 事件的已看到列表中)时,就会发生 gossip 收敛。如果集群不收敛,ClusterDeamon 会加速八卦。
def gossipTick(): Unit = {
gossip()
if (isGossipSpeedupNeeded) {
scheduler.scheduleOnce(GossipInterval / 3, self, GossipSpeedupTick)
scheduler.scheduleOnce(GossipInterval * 2 / 3, self, GossipSpeedupTick)
}
}
def isGossipSpeedupNeeded: Boolean =
(latestGossip.overview.seen.size < latestGossip.members.size / 2)
一旦集群收敛,它就会使用配置的 gossip 间隔回退到正常的预定 gossip 滴答声。看看这个功能的source 和test specs。希望这可以帮助。
【解决方案2】:
正如您在other question 中回答的那样,当节点八卦时,它们包括哪些其他节点看到了此更新。
请注意,gossip 随机选择将 gossip 发送到哪个节点。尽管这个系统实现了一个加权随机优先于尚未看到更新的节点,但节点仍然可以向其他未看到更新的节点发送消息。当这种情况发生时,seen set 会在 gossiping 节点对上更新。
节点本质上是在八卦价值,然后八卦谁看到了价值。为简单起见,该协议实际上将这两个概念捆绑在一起。