用于集群设置的 ActiveMQ 数据存储

ActiveMQ datastore for cluster setup

我们一直在生产中使用具有单个实例的 ActiveMQ 5.16.0 版代理。现在我们计划使用 AMQ 代理集群来实现 HA 和负载分配,并保持消息数据的一致性。目前我们只使用一个队列

HA 可以使用故障转移来实现,但是我们需要使用相同的数据存储还是可以分开?如果我为 AMQ 代理使用不同的实例,那么如何设置通用数据存储。

请指导我如何为 HA 和负载分配设置数据存储

您可以配置 ActiveMQ,使实例共享一个消息存储,或者它们具有单独的消息存储。如果他们共享一个消息存储,那么(本质上)代理将自动形成一个 master-slave 配置,这样只有一个代理(一次)会接受来自客户端的连接,并且只有一个代理会更新存储。客户端需要在其连接 URI 中识别这两个代理,并将连接到恰好是主代理的代理。

对于这样的共享消息存储,消息存储中的锁协调 master-slave 分配,这使得消息存储的选择变得至关重要。存储可以是共享文件系统或共享数据库。只有少数共享文件系统实现可以正常工作——任何基于 NFS 4.x 的东西都应该可以工作。 CIFS/SMB 商店 可以 工作,但供应商之间存在很大差异,因此很难确定。 NFS v3 工作,但是well-implemented,因为锁定语义不合适。在任何情况下,存储都需要健壮或可复制,或两者兼而有之,因为整个代理集群都依赖于它。没有商店,没有经纪人。

根据我的经验,从共享文件存储中获得良好的吞吐量比共享数据库更容易,当然,还有许多因素需要考虑。较差的网络连接将很难通过 任何 类型的共享存储(或任何类型的集群)获得良好的吞吐量。

使用单独的消息存储时,通常将代理放入某种网格中,使用 'network connectors' 将消息从一个代理传递到另一个。两个 broker 都会接受来自客户端的连接(没有 master),网络连接会处理消息发送到一个 broker,但需要从另一个 broker 消费的情况。

客户不一定需要在其连接 URI 中指定所有代理,但通常需要指定,以防其中一个代理出现故障。

与具有共享文件存储的 master-slave 相比,网格通常更容易设置,并且(从广义上讲)可以处理更多的客户端负载。但是,(a) 失去代理相当于丢失与其关联的任何消息(直到可以恢复代理)和 (b) 网格干扰消息分组和独占消费者等消息传递模式。

确实没有 hard-and-fast 规则来确定要使用的配置。许多已经拥有某种共享存储基础设施(例如,像样的关系数据库或集群 NFS)的安装者将倾向于使用它。云部署的兴起导致没有共享存储的网格操作变得(我认为)更受欢迎,因为它是如此对称。

还有更多——更多——可以在这里说。作为一个广泛的问题,我怀疑 OP 对于 SO 来说有点 out-of-scope。如果您将问题分解成更小、更集中的部分,您可能会获得更多关注。

集群在一起的多个 ActiveMQ 服务器可以通过几种方式提供 HA:

  1. 通过跨多个代理节点使用计算资源扩展消息流
  2. 在代理节点的单个节点计划或计划外中断期间维护消息流
  3. 在 ActiveMQ 进程失败时共享数据存储。

经纪人网络解决#1 和#2。标准的 3 节点集群将为您提供出色的性能和扩展生产者和消费者数量的能力,同时将整个流拆分到 3 节点以提供更大的容量。

解决#3 很复杂——在所有消息传递产品中。经纪人总是努力做到完全空无一物——因此将 single-broker 的数据存储集群变成了某种 anti-pattern。很多时候,依靠具有单个代理节点的 RAID 磁盘将比添加 NFSv4、GFSv2 或 JDBC 并使用 shared-store.

提供更高的可靠性

也就是说,如果您必须使用共享存储——请遵循最佳实践并使用 GFSv2 或 NFSv4。 JDBC 慢得多,需要大量的数据库维护才能保持 运行 高效。

注意:[@Kevin Boone] 关于 CIFS/SMB 的注释不正确,不应使用 CIFS/SMB。否则,他的回答很可靠。