Artemis 复制备份不会故障恢复

Artemis replication backup does not failback

我有三台“复制”模式的服务器,一台是主服务器,两台是从服务器。

Master 启用了“check-for-live-server”。从站启用了“允许故障回复”。

故障转移工作正常,但是当主服务器再次可用时,等待至少 5 分钟后,从服务器仍然没有进行自动故障恢复。

下面是 HA 设置。

大师 (192.168.102.55) broker.xml:

    <connectors>
        <connector name="netty-connector">tcp://192.168.102.55:61616</connector>
    </connectors>

    <acceptors>
        <acceptor name="netty-acceptor">tcp://192.168.102.55:61616</acceptor>
    </acceptors>

    <cluster-user>user</cluster-user>
      <cluster-password>password</cluster-password>

      <broadcast-groups>
         <broadcast-group name="bg-group">
            <group-address>231.7.7.7</group-address>
            <group-port>9876</group-port>
            <broadcast-period>5000</broadcast-period>
            <connector-ref>netty-connector</connector-ref>
         </broadcast-group>
      </broadcast-groups>

      <discovery-groups>
         <discovery-group name="dg-group">
            <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>netty-connector</connector-ref>
            <message-load-balancing>ON_DEMAND</message-load-balancing>
            <max-hops>2</max-hops>
            <discovery-group-ref discovery-group-name="dg-group"/>
         </cluster-connection>
      </cluster-connections>

      <ha-policy>
         <replication>
            <master>
                <check-for-live-server>true</check-for-live-server>
            </master>
         </replication>
      </ha-policy>

从机 (192.168.102.53) broker.xml:

    <connectors>
        <connector name="netty-connector">tcp://192.168.102.53:61616</connector>
    </connectors>

    <acceptors>
        <acceptor name="netty-acceptor">tcp://192.168.102.53:61616</acceptor>
    </acceptors>

    <cluster-user>user</cluster-user>
    <cluster-password>password</cluster-password>

     <broadcast-groups>
         <broadcast-group name="bg-group">
            <group-address>231.7.7.7</group-address>
            <group-port>9876</group-port>
            <broadcast-period>5000</broadcast-period>
            <connector-ref>netty-connector</connector-ref>
         </broadcast-group>
      </broadcast-groups>

      <discovery-groups>
         <discovery-group name="dg-group">
            <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>netty-connector</connector-ref>
            <message-load-balancing>ON_DEMAND</message-load-balancing>
            <max-hops>2</max-hops>
            <discovery-group-ref discovery-group-name="dg-group"/>
         </cluster-connection>
      </cluster-connections>

      <ha-policy>
         <replication>
            <slave>
                <allow-failback>true</allow-failback>
            </slave>
         </replication>
      </ha-policy>

我使用的Artemis版本是2.11.0。有谁知道我可能做错了什么?

故障回复仅适用于 live/backup 对。它不适用于 live/backup/备份三元组。

在您的用例中有 3 个代理实例 - 一个是实时的,两个是备份的。但是,备份服务器仅由一台活动服务器拥有。这意味着当 3 个代理实例启动时,将有 1 个实时备份对和一个“剩余”备份,后者将处于一种空闲状态,等待附加到没有备份的实时代理。然后,如果实时代理失败,实时代理的备份将接管并变为实时,另一个备份现在将成为刚刚变为实时的服务器的备份。一旦失败的代理实例重新启动,它将尝试将自己注册为现存代理的备份并启动故障回复。但是,由于现存代理已经有一个备份,它将拒绝来自原始活动的注册消息,因为它已经有一个备份,因此不会发生故障恢复。

需要说明的是,一个 live 一次只能复制到一个 单个 备份。我不太清楚多个备份有什么好处,因为它们会阻止故障恢复工作。