【问题标题】: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 滴答声。看看这个功能的sourcetest specs。希望这可以帮助。

    【讨论】:

    • +_1 来源
    【解决方案2】:

    正如您在other question 中回答的那样,当节点八卦时,它们包括哪些其他节点看到了此更新。

    请注意,gossip 随机选择将 gossip 发送到哪个节点。尽管这个系统实现了一个加权随机优先于尚未看到更新的节点,但节点仍然可以向其他看到更新的节点发送消息。当这种情况发生时,seen set 会在 gossiping 节点对上更新。

    节点本质上是在八卦价值,然后八卦谁看到了价值。为简单起见,该协议实际上将这两个概念捆绑在一起。

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2014-04-04
      • 2017-06-23
      • 1970-01-01
      • 2018-10-29
      • 2015-07-21
      • 2022-11-05
      • 1970-01-01
      • 2021-07-05
      相关资源
      最近更新 更多