【问题标题】:minimum activemq cluster size with replicated leveldb store具有复制的 leveldb 存储的最小 activemq 集群大小
【发布时间】:2017-03-03 12:57:19
【问题描述】:

需要至少 3 个 ActiveMQ 实例和 3 个 ZooKeeper 服务器来运行具有复制 LevelDB 存储的主/从设置的原因是什么?如果要求是使用需要至少 3 台服务器的 ZooKeeper,那么 ZooKeeper 需要至少 3 台服务器来提供可靠性的理由是什么?

  • 是为了保证网络分区的一致性(通过牺牲较小分区的可用性),因为在 2 节点主备份配置中,无法区分失败的对等节点或两个节点位于不同的网络分区中?
  • 它是为了提供对拜占庭故障的容错,您需要 2f+1 个节点才能在 f 个故障节点中存活(考虑到只有崩溃故障需要 f+1 个节点才能在 f 个故障中存活)?

还是有其他原因?

谢谢!

【问题讨论】:

    标签: activemq apache-zookeeper leveldb


    【解决方案1】:

    Zookeeper 需要至少 3 台服务器,因为它选择了一个新的 Activemq Master。 Zookeeper 需要多数 (n/2+1) 来选举新的 master。如果它没有那个多数,则不会选择任何主节点,系统将失败。这与您使用奇数个 Zookeepers 服务器的原因相同。 (EG. 3 台服务器的故障率与 4 台相同,因为大多数情况下,仍然只能丢失 1 台服务器。)

    对于 Activemq,至少 3 台服务器的必要性源于消息的同步方式,以及当新的 master 被选举时,它需要至少一个法定节点 (N/2+1) 才能能够以识别最新更新。 ActiveMQ 将与 1 个从站同步消息,然后以 OK 响应。然后它将与所有其他从站异步同步。如果一个节点发生故障时仲裁不存在,那么 Zookeeper 无法区分哪个节点是最近更新的。当您最初只有 2 个节点时会发生这种情况,因此建议至少 3 个。

    From ActiveMQ site,在它的工作原理下:

    所有需要同步到磁盘的消息传递操作都将等待更新复制到法定节点,然后再完成。因此,如果您使用 replicas="3" 配置存储,则仲裁大小为 (3/2+1)=2。 master 将更新存储在本地,并等待其他 1 个 slave 存储更新,然后报告成功。另一种思考方式是,存储将对法定数量的复制节点进行同步复制,并将异步复制复制到任何其他节点。

    当一个新的主节点被选举出来时,你还需要至少有一个法定人数的在线节点才能找到具有最新更新的节点。具有最新更新的节点将成为新的主节点。因此,建议您至少运行 3 个副本节点,这样您就可以在不中断服务的情况下关闭一个。

    【讨论】:

    • 谢谢 - 但这并不能回答我的问题:
    • 谢谢 - 但这并不能回答我的问题,例如为什么activemq 的开发人员选择将消息同步到法定人数的节点?是为了在网络分区的情况下保证一致性,还是仅仅因为已经有 Zookeeper 需要 3 个服务器?提供一个可靠的网络,如果您有 f+1 个进程,就可以实现可以在 f 个崩溃故障中幸存下来的主/从集群 - 这显然比需要 2f+1 个进程才能在 f 个故障中幸存下来要少得多。
    • 这是为了一致性。虽然我同意它在某些情况下并不完全有意义,但他们选择新主节点的默认算法需要 n/2+1 个可用节点。该决定的部分原因是它们的同步机制以及您需要至少 2 个可用节点来确定哪些节点具有最新消息。我认为如果它们始终只需要至少 2 个节点会更有意义,因此您最好进行故障转移,基本上 n-2 个节点可能会丢失。我敢肯定他们这样做是有原因的。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多