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

问题描述

我们一直在将ActiveMQ版本5.16.0代理与生产中的单个实例一起使用。现在,我们计划使用AMQ代理群集进行HA和负载分配,并使消息数据保持一致。目前,我们仅使用一个队列

可以使用故障转移来实现HA,但是我们是否需要使用相同的数据存储还是可以将其分开?如果我将不同的实例用于AMQ代理,则如何设置公共数据存储。

请指导我如何设置数据存储区以进行HA和负载分配

解决方法

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

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

经纪人网络解决#1和#2。标准的3节点群集将为您提供出色的性能和扩展生产者和消费者数量的能力,并在3节点之间分配全部流量以提高容量。

在所有消息产品中,解决#3都很复杂。经纪人一直在努力使自己完全空着-因此,对单个经纪人的数据存储进行群集成为一种反模式。很多时候,依靠具有单个代理节点的RAID磁盘将提供比添加NFSv4,GFSv2或JDBC和使用共享存储更高的可靠性。

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

注意:[@Kevin Boone]关于CIFS / SMB的注释不正确,不应使用CIFS / SMB。否则,他的反应是坚定的。

,

您可以配置ActiveMQ,以便实例共享一个消息存储,或者它们具有单独的消息存储。如果他们共享一个消息存储,则(基本上)代理将自动形成主从配置,这样,一次仅一个代理将接受来自客户端的连接,并且只有一个代理将更新该存储。客户端需要在其连接URI中标识两个代理,然后将连接到恰好是主代理的任何代理。

使用这样的共享消息存储库,锁定消息存储库可协调主从分配,这使得选择消息存储至关重要。存储可以是共享文件系统或共享数据库。只有少数共享文件系统实现可以正常工作-基于NFS 4.x的任何文件都应该可以工作。 CIFS / SMB存储可以正常工作,但是提供程序之间的差异太大,很难确定。 NFS v3 不能正常运行,因为锁定语义不合适。无论如何,因为整个代理群集都依赖于此存储,所以该存储需要是健壮的,复制的或两者兼有的。没有商店,没有经纪人。

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

使用单个消息存储库时,通常将代理置于某种网状结构中,并使用“网络连接器”将消息从一个代理传递到另一个代理。这两个代理都将接受来自客户端的连接(没有主服务器),并且网络连接将处理将消息发送到一个代理但需要从另一个代理接收的情况。

客户端不一定需要在其连接URI中指定所有代理,但通常会在其中一个代理发生故障的情况下指定

与具有共享文件存储的主从设备相比,网格通常更容易设置,并且(从广义上讲)可以处理更多的客户端负载。但是,(a)丢失代理等于丢失与其关联的所有消息(直到可以还原代理为止),并且(b)网格会干扰消息分组和独占使用者之类的消息传递模式。

确实没有确定要使用哪种配置的严格规则。许多已经拥有某种共享存储基础结构(例如,体面的关系数据库或群集的NFS)的安装程序将倾向于使用它。云部署的兴起带来了影响,即没有共享存储的网格操作变得越来越流行,因为它是如此对称。

还有更多-更多-在这里可以说。作为一个广泛的问题,我怀疑OP对SO来说有点超出范围。如果将问题分解为更小,更集中的部分,您可能会获得更大的吸引力。