HA 集群 ActiveMQ Artemis 的正确配置

Right configuration for HA cluster ActiveMQ Artemis

我是 ActiveMQ Artemis 的新手,请社区检查我是否正确配置了 HA 代理集群,或者我应该以其他方式配置它们,因为我没有找到关于我的案例的详细教程。所有代理 运行 在同一台机器上。

场景:

61617端口上有一个主节点,6161861619端口上有两个从节点(slave1,slave2)。如果主节点死亡,其中一个从节点变为活动节点(复制模式)。

消费者有必要作为 "black-box" 与集群通信。我的意思是 master 的变化(即当 master 死亡时)不应该对消费者有任何影响(即它连接到集群的方式)。

我设法做了什么(据我所知,对于这种情况,我们应该只配置集群、接受器和连接器属性,因此我只附上这部分代理配置):

经纪人大师:

<connectors>
    <connector name="artemis">tcp://localhost:61617</connector> 
</connectors>

<ha-policy>
    <replication>
        <master/>
    </replication>   
</ha-policy>

<acceptors>
    <acceptor name="artemis">tcp://localhost:61617</acceptor>
</acceptors>

<cluster-user>cluster</cluster-user>
<cluster-password>cluster</cluster-password>
<broadcast-groups>
    <broadcast-group name="bg-group1">
        <group-address>231.7.7.7</group-address>
        <group-port>9876</group-port>
        <broadcast-period>5000</broadcast-period>
        <connector-ref>artemis</connector-ref>
    </broadcast-group>
</broadcast-groups>
<discovery-groups>
    <discovery-group name="dg-group1">
        <group-address>231.7.7.7</group-address>
        <group-port>9876</group-port>
        <refresh-timeout>10000</refresh-timeout>
    </discovery-group>
</discovery-groups>
<cluster-connections>
    <cluster-connection name="my-cluster">
        <connector-ref>artemis</connector-ref>
        <message-load-balancing>ON_DEMAND</message-load-balancing>
        <max-hops>0</max-hops>
        <discovery-group-ref discovery-group-name="dg-group1"/>
    </cluster-connection>
</cluster-connections>

slave 1 broker cluster conf与master相同(通过控制台--clustered创建节点时自动配置)

<ha-policy>
    <replication>
        <slave/>
    </replication>
</ha-policy>

<connectors>
    <connector name="artemis">tcp://localhost:61618</connector>
    <connector name="netty-live-connector">tcp://localhost:61617</connector>
</connectors>

<acceptors>
    <acceptor name="artemis">tcp://localhost:61618 </acceptor>
</acceptors>

slave 2 broker cluster conf与master相同(通过控制台--clustered创建节点时自动配置)

<ha-policy>
    <replication>
        <slave/>
    </replication>
</ha-policy>

<connectors>
    <connector name="artemis">tcp://localhost:61619</connector>
    <connector name="netty-live-connector">tcp://localhost:61617</connector>
</connectors>

<acceptors>
    <acceptor name="artemis">tcp://localhost:61619</acceptor>
</acceptors>

消费者中的 JNDI 配置:

java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory
connectionFactory.ConnectionFactory=(tcp://localhost:61617?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10,tcp://localhost:61618?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10,tcp://localhost:61619?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10)

我的配置有效,但我不确定它是否正确。

我还发现了使用静态连接器的类似 question。他们在做什么?我不明白他们是如何工作的。或者这可能是我正在寻找的正确配置方式?

首先要注意的是,使用单个 live/backup 对(甚至 live/backup/备份三元组)进行网络复制是危险的,因为 "split-brain." 我会建议您使用 1 live/backup 对共享存储或 3 live/backup 对复制(这将允许建立适当的法定人数)。阅读 the documentation about split brain 了解更多详情。

除了脑裂的风险外,代理配置看起来还不错。大多数(如果不是全部)配置细节都包含在 clustering and HA 文档中。代理也附带了大量示例,其中许多特定于集群和 HA。

您可以简化连接工厂 URL。目前您有:

(tcp://localhost:61617?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10,tcp://localhost:61618?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10,tcp://localhost:61619?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10)

但是,您可以使用:

(tcp://localhost:61617,tcp://localhost:61618,tcp://localhost:61619)?ha=true&retryInterval=1000&retryIntervalMultiplier=1.0&reconnectAttempts=10

静态连接器通常用于不支持 UDP 多播的环境。它允许手动配置集群成员。如果您处于支持 UDP 多播的环境中,我建议您使用 discovery/broadcast 组配置而不是静态发现。

一般来说,如果一切都按您希望的方式工作,则表明您的配置没有问题。