14.3. 实施高可用性


您可以通过实施高可用性(HA)来提高可靠性,即使一个或多个代理离线,代理集群也会继续运行。

实施 HA 涉及几个步骤:

  1. 为您的 HA 实现配置代理集群,如 第 14.2 节 “创建代理集群” 所述。
  2. 您应该了解 live-backup 组是什么,并选择一个最适合您的要求的 HA 策略。请参阅了解 HA 在 AMQ Broker 中如何工作
  3. 当您选择了适当的 HA 策略时,请在集群中的每个代理中配置 HA 策略。请参阅:

  4. 配置客户端应用程序以使用故障转移
注意

在稍后需要对代理进行高可用性配置的代理集群进行故障排除时,建议您为运行代理的每个 Java Virtual Machine(JVM)实例启用 Garbage Collection(GC)日志记录。要了解如何在 JVM 上启用 GC 日志,请参阅您的 JVM 使用的 Java Development Kit(JDK)版本的官方文档。有关 AMQ Broker 支持的 JVM 版本的更多信息,请参阅 Red Hat AMQ 7 支持的配置

14.3.1. 了解高可用性

在 AMQ Broker 中,您可以通过将集群中的代理分组到 live-backup groups 来实现高可用性(HA)。在 live-backup 组中,实时代理链接到备份代理,如果实时代理失败,则可接管该代理。AMQ Broker 还提供了几个不同的策略,用于实时备份组内故障转移(称为 HA 策略)。

14.3.1.1. 实时备份组如何提供高可用性

在 AMQ Broker 中,您可以通过将集群中的代理链接在一起以组成 live-backup 组 来实现高可用性(HA)。live-backup 组提供 故障切换,这意味着如果一个代理失败,另一个代理可以接管其消息处理。

live-backup 组由一个实时代理(有时也称为 代理)组成,链接到一个或多个备份代理(有时称为代理)。实时代理提供客户端请求,而备份代理则以被动模式等待。如果 live 代理失败,备份代理会替换 live 代理,使客户端可以重新连接并继续工作。

14.3.1.2. 高可用性策略

高可用性(HA)策略定义在 live-backup 组中进行故障转移的方式。AMQ Broker 提供几个不同的 HA 策略:

共享存储(推荐)

实时和备份代理将其消息传递数据存储在共享文件系统中的通用目录中;通常是存储区域网络(SAN)或网络文件系统(NFS)服务器。如果您配置了基于 JDBC 的持久性,您也可以将代理数据存储在指定的数据库中。使用共享存储时,如果实时代理失败,备份代理会从共享存储中加载消息数据,并接管了失败的实时代理。

在大多数情况下,您应该使用共享存储而不是复制。由于共享存储不会通过网络复制数据,它通常比复制提供更好的性能。共享存储还可避免网络隔离(也称为 "split brain")问题,其中实时代理及其备份会同时变为现实。

在共享存储 HA 策略中,实时和备份代理同时访问共享位置的日志。
复制

实时和备份代理在网络上持续同步其消息传递数据。如果 live 代理失败,备份代理会加载同步数据,并为失败的实时代理接管。

实时和备份代理之间的数据同步可确保当实时代理失败时不会丢失消息数据。当实时和备份代理最初加入到一起时,实时代理通过网络将所有现有数据复制到备份代理。完成此初始阶段后,实时代理会将持久数据复制到备份代理中,因为实时代理接收它。这意味着,如果实时代理丢弃了网络,备份代理具有实时代理接收至该点的所有持久性数据。

因为复制通过网络同步数据,所以网络故障可能会导致实时代理及其备份同时变为实时的网络隔离。

在复制 HA 策略中,实时和备份代理会将它们的日志与网络相互同步。
仅实时(仅限 HA 限制)

当实时代理安全停止时,它会将信息及事务状态复制到另一个实时代理,然后关闭。然后,客户端可以重新连接其他代理,以继续发送和接收消息。

在 live-only HA 策略中,代理会将其信息及事务状态复制到另一个代理中。

其他资源

14.3.1.3. 复制策略限制

当您使用复制来提供高可用性时,实时迁移和备份代理可以同时处于活动状态,这称为"脑裂"。

如果实时代理及其备份丢失了连接,则脑裂可能发生。在这种情况下,实时代理及其备份可以同时处于活动状态。因为在这种情况下,代理之间没有消息复制,所以它们会在没有其他知道它的情况下服务客户端和处理信息。在这种情况下,每个代理都有完全不同的日志。从这种情形中进行恢复可能非常困难,在某些情况下无法进行恢复。

  • 消除 脑裂的可能性,请使用 共享存储 HA 策略。
  • 如果您使用复制 HA 策略,请执行以下步骤以减少分区发生的风险。

    如果您希望代理使用 ZooKeeper Coordination Service 协调代理,请在至少三个节点上部署 ZooKeeper。如果代理丢失到一个 ZooKeeper 节点,使用至少三个节点可确保当实时备份代理对造成复制中断时,大多数节点都可用来协调代理。

    如果要使用嵌入式代理协调,它使用集群中的其他可用代理提供仲裁投票,这可以减少(但不会完全消除)遇到脑裂的可能性(最少三个 live-backup 对)。使用至少三个 live-backup 对可确保当实时备份代理对遇到复制中断时,任何仲裁投票都会获得多数结果。

使用复制 HA 策略时需要考虑一些额外的注意事项:

  • 当实时代理失败并且备份转换为实时时,不会进行进一步复制,直到新的备份代理附加到实时,或者会恢复到原始 live 代理。
  • 如果 live-backup 组中的备份代理失败,则 live 代理将继续提供消息。但是,在另一个代理添加为备份之前,消息不会被复制,或者重启原始备份代理。在此期间,信息只映射到 live 代理。
  • 如果代理使用嵌入的代理协调,且在实时备份对中的代理都已关闭,为了避免消息丢失,您必须首先重启最近活跃的代理。如果最近活跃的代理是备份代理,则需要手动将此代理重新配置为主代理,以便首先重启该代理。

14.3.2. 配置共享存储高可用性

您可以使用共享存储高可用性(HA)策略在代理集群中实现 HA。使用共享存储时,实时和备份代理访问共享文件系统上的通用目录;通常是 Storage Area Network(SAN)或网络文件系统(NFS)服务器。如果您配置了基于 JDBC 的持久性,您也可以将代理数据存储在指定的数据库中。使用共享存储时,如果实时代理失败,备份代理会从共享存储中加载消息数据,并接管了失败的实时代理。

通常,SAN 提供更好的性能(例如,速度)与 NFS 服务器,如果可用,则建议选择。如果您需要使用 NFS 服务器,请参阅 Red Hat AMQ 7 支持的配置。有关 AMQ Broker 支持的网络文件系统的更多信息。

在大多数情况下,您应该使用共享存储 HA 而不是复制。由于共享存储不会通过网络复制数据,它通常比复制提供更好的性能。共享存储还可避免网络隔离(也称为 "split brain")问题,其中实时代理及其备份会同时变为现实。

注意

在使用共享存储时,备份代理的启动时间取决于消息日志的大小。当备份代理接管失败的实时代理时,它会从共享存储中加载日志。如果日志包含大量数据,这个过程可能会消耗大量时间。

14.3.2.1. 配置 NFS 共享存储

使用共享存储高可用性时,您必须将 live 和 backup 代理配置为使用共享文件系统上的通用目录。通常,您使用 Storage Area Network(SAN)或网络文件系统(NFS)服务器。

在每个代理机器实例上从 NFS 服务器挂载导出的目录时,列出了以下一些推荐的配置选项。

sync
指定所有更改都会立即冲刷到磁盘。
intr
如果服务器关闭或无法访问,允许中断 NFS 请求。
noac
禁用属性缓存。需要在多个客户端间实现属性缓存一致性。
soft
指定如果 NFS 服务器不可用,应该报告错误,而不是等待服务器重新上线。
lookupcache=none
禁用查询缓存。
timeo=n
NFS 客户端(如代理)在重试请求前等待来自 NFS 服务器的响应(以毫秒为单位)。对于通过 TCP 的 NFS,默认的 timeo 值为 600 (60 秒)。对于通过 UDP 的 NFS,客户端使用一种适应性算法来估算常用请求类型的适当超时值,如读写请求。
retrans=n
NFS 客户端在尝试进一步恢复操作前重试请求的次数。如果没有指定 retrans 选项,则 NFS 客户端会尝试每个请求三次。
重要

配置 timeoretrans 选项时,务必要使用合理的值。一个默认的 timeo 等待时间为 600 deciseconds(60 秒),retrans 值为 5(重试 5 次),可能会导致 AMQ Broker 需要 5 分钟的等待时间来检测到一个 NFS 已断开连接。

其他资源

14.3.2.2. 配置共享存储高可用性

此流程演示了如何为代理集群配置共享存储高可用性。

先决条件

  • live 和 backup 代理必须可以访问共享存储系统。

流程

  1. 将集群中的代理分组到 live-backup 组。

    在大多数情况下,live-backup 组应该包含两个代理:一个实时代理和备份代理。如果集群中有六个代理,则需要三个 live-backup 组。

  2. 创建由一个 live 代理和一个备份代理组成的第一个 live-backup 组。

    1. 打开 live 代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    2. 如果使用:

      1. 用于提供共享存储的网络文件系统,验证实时代理的分页、绑定、日志和大量消息目录指向备份代理也可以访问的共享位置。

        <configuration>
            <core>
                ...
                <paging-directory>../sharedstore/data/paging</paging-directory>
                <bindings-directory>../sharedstore/data/bindings</bindings-directory>
                <journal-directory>../sharedstore/data/journal</journal-directory>
                <large-messages-directory>../sharedstore/data/large-messages</large-messages-directory>
                ...
            </core>
        </configuration>
      2. 提供共享存储的数据库,确保 master 和备份代理都可以连接到同一数据库,并在 broker.xml 配置文件的 database-store 元素中指定相同的配置。下面是一个配置示例。

        <configuration>
          <core>
            <store>
               <database-store>
                  <jdbc-connection-url>jdbc:oracle:data/oracle/database-store;create=true</jdbc-connection-url>
                  <jdbc-user>ENC(5493dd76567ee5ec269d11823973462f)</jdbc-user>
                  <jdbc-password>ENC(56a0db3b71043054269d11823973462f)</jdbc-password>
                  <bindings-table-name>BIND_TABLE</bindings-table-name>
                  <message-table-name>MSG_TABLE</message-table-name>
                  <large-message-table-name>LGE_TABLE</large-message-table-name>
                  <page-store-table-name>PAGE_TABLE</page-store-table-name>
                  <node-manager-store-table-name>NODE_TABLE<node-manager-store-table-name>
                  <jdbc-driver-class-name>oracle.jdbc.driver.OracleDriver</jdbc-driver-class-name>
                  <jdbc-network-timeout>10000</jdbc-network-timeout>
                  <jdbc-lock-renew-period>2000</jdbc-lock-renew-period>
                  <jdbc-lock-expiration>15000</jdbc-lock-expiration>
                  <jdbc-journal-sync-period>5</jdbc-journal-sync-period>
               </database-store>
            </store>
          </core>
        </configuration>
    3. 将实时代理配置为使用共享存储作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <shared-store>
                      <master>
                          <failover-on-shutdown>true</failover-on-shutdown>
                      </master>
                  </shared-store>
              </ha-policy>
              ...
          </core>
      </configuration>
      failover-on-shutdown
      如果此代理正常停止,则此属性会控制备份代理是否应该处于活动状态并接管。
    4. 打开备份代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    5. 如果使用:

      1. 提供共享存储的网络文件系统,验证备份代理的分页、绑定、日志和大型消息目录指向与实时代理相同的共享位置。

        <configuration>
            <core>
                ...
                <paging-directory>../sharedstore/data/paging</paging-directory>
                <bindings-directory>../sharedstore/data/bindings</bindings-directory>
                <journal-directory>../sharedstore/data/journal</journal-directory>
                <large-messages-directory>../sharedstore/data/large-messages</large-messages-directory>
                ...
            </core>
        </configuration>
      2. 提供共享存储的数据库,确保 master 和备份代理都可以连接到同一数据库,并在 broker.xml 配置文件的 database-store 元素中指定相同的配置。
    6. 将备份代理配置为使用共享存储作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <shared-store>
                      <slave>
                          <failover-on-shutdown>true</failover-on-shutdown>
                          <allow-failback>true</allow-failback>
                          <restart-backup>true</restart-backup>
                      </slave>
                  </shared-store>
              </ha-policy>
              ...
          </core>
      </configuration>
      failover-on-shutdown
      如果此代理已变为 live 状态,然后正常停止,此属性会控制备份代理(原始实时代理)是否应该变为实时状态并接管。
      allow-failback

      如果发生了故障转移,并且备份代理已接管了实时代理,则此属性会控制备份代理是否在重启并重新连接到集群中时是否应该回退到原始的 live 代理。

      注意

      故障恢复用于实时备份对(一个与单一备份代理进行一对一的代理)。如果 live 代理配置了多个备份,则不会出现问题。如果发生故障转移事件,备份代理将变为 live 状态,下一次备份就成为其备份。当原始 live 代理恢复在线时,它无法启动故障,因为现在已经备份的代理已经有备份。

      restart-backup
      此属性控制备份代理在返回到实时代理失败后是否自动重启。此属性的默认值为 true
  3. 对集群中的每个剩余的 live-backup 组重复步骤 2。

14.3.3. 配置复制高可用性

您可以使用复制高可用性(HA)策略在代理集群中实施 HA。使用复制时,持久数据会在实时和备份代理之间同步。如果实时代理遇到失败,则会将消息数据同步到备份代理中,并为失败的实时代理接管。

如果没有共享文件系统,您应该使用复制作为共享存储的替代选择。但是,复制可能会导致一个场景中实时代理及其备份。

注意

因为 live 和 backup 代理必须通过网络同步其消息传递数据,所以复制会增加性能开销。此同步进程块日志操作,但它不会阻止客户端。对于数据同步,您可以配置可阻止日志操作的最长时间。

如果 live-backup 代理对间的复制连接中断,代理需要协调一个方法来确定实时代理是否仍活跃,或者是否不可用,且需要故障转移到备份代理。要提供此协调过程,您可以将代理配置为使用以下任意一种:

  • Apache ZooKeeper 协调服务。
  • 嵌入式代理协调,它使用集群中的其他代理提供仲裁投票。

14.3.3.1. 选择协调方法

您可以将代理配置为使用 ZooKeeper 协调服务或嵌入式代理协调服务,以确定复制中断时是否需要故障转移。本节介绍基础架构要求,以及这两种方法管理数据一致性之间的区别,这是选择协调方法时可能出现的注意事项。

基础架构要求

  • 如果您希望代理使用 ZooKeeper 协调服务,您必须将代理连接到至少 3 个 Apache ZooKeeper 节点。至少 3 个 ZooKeeper 节点,如果代理丢失到一个节点的连接,则可以继续正常工作。要为代理提供协调服务,您可以共享由其他应用程序使用的现有 ZooKeeper 节点。有关设置 Apache ZooKeeper 的更多信息,请参阅 Apache ZooKeeper 文档。
  • 如果要使用嵌入式代理协调(使用集群中的其他可用代理)提供仲裁投票,则必须至少有三个实时备份代理对。至少使用三个实时备份对可确保当实时备份代理对造成复制中断时,会发生大多数结果。

数据一致性

  • 如果您使用 Apache ZooKeeper 协调服务,ZooKeeper 跟踪每个代理上的数据版本,因此只有具有最新日志数据的代理才能作为实时代理激活,无论代理是否配置为复制目的。版本跟踪消除了代理可通过过期日志和启动客户端激活的可能性。
  • 如果您使用嵌入的代理协调,则不存在相应的机制来跟踪每个代理中的数据版本,以确保只有具有最新日志的代理即可成为实时代理。因此,具有过时日志的代理可能会成为实时和启动客户端,这会导致在日志中发生冲突。

14.3.3.2. 在复制中断后代理如何协调

本节介绍在复制连接中断后如何工作协调方法。

使用 ZooKeeper 协调服务

如果使用 ZooKeeper 协调服务来管理复制中断,则两个代理必须连接到多个 Apache ZooKeeper 节点。

  • 如果有任何时候,实时代理都会丢失到大多数 ZooKeeper 节点的连接,它会关闭以避免发生 "plit brain" 的风险。
  • 如果有任何时候,备份代理会丢失到大多数 ZooKeeper 节点的连接,它会停止接收复制数据并等待其连接大多数 ZooKeeper 节点,然后再重新作为备份代理。当连接恢复到大多数 ZooKeeper 节点时,备份代理使用 ZooKeeper 来确定是否需要丢弃其数据并从中搜索实时代理,或者是否可使用其当前数据成为实时代理。

zookeeper 使用以下控制机制来管理故障切换过程:

  • 共享租期锁定,随时只能由单一实时代理所有。
  • 跟踪代理数据的最新版本的激活序列计数器。每个代理跟踪其日志数据在本地计数器中的版本,保存在其服务器锁定文件中,及其 NodeID。实时代理还在 ZooKeeper 上的协调激活序列计数器中共享其版本。

如果 live 代理和备份代理之间的复制连接丢失,则 live 代理会同时增加其本地激活序列计数器值,并在 ZooKeeper 上增加协调激活序列计数器值(1)来公告它具有最新数据。备份代理的数据现在被视为过时的数据,在复制连接被恢复并且同步最新的数据前,代理无法变为实时代理。

在复制连接丢失后,备份代理会检查 ZooKeeper 锁定是否归 live 代理所有,如果 ZooKeeper 协调激活序列计数器与本地计数器值匹配。

  • 如果锁定归 live 代理所有,则备份代理检测到在复制连接丢失时由 live 代理更新 ZooKeeper 上的激活序列计数器。这表示 live 代理正在运行,因此备份代理不会尝试故障切换。备份代理会搜索实时代理来复制数据,使其具有最新数据。
  • 如果锁定没有由 live 代理所有,则实时代理不可用。如果备份代理上的激活序列计数器的值与 ZooKeeper 上的协调激活序列计数器值相同,这表示备份代理具有最新数据,备份代理将会失败。
  • 如果锁定不归 live 代理所有,但备份代理中的激活序列计数器的值小于 ZooKeeper 上的计数器值,则备份代理中的数据不会被更新,且备份代理无法失败。

使用嵌入的代理协调

如果实时备份代理对使用嵌入式代理协调协调复制中断,可以启动以下两类仲裁投票。

投票类型描述initiator所需配置参与者基于投票结果的操作

备份投票

如果备份代理丢失了与实时代理的复制连接,备份代理会根据这个投票的结果来决定是否启动。

备份代理

无。备份代理丢失与其复制合作伙伴的连接时,自动进行备份投票。

但是,您可以通过为这些参数指定自定义值来控制备份投票的属性:

  • quorum-vote-wait
  • vote-retries
  • vote-retry-wait

集群中的其他实时代理

如果备份代理收到来自集群中其他 live Broker 的投票,则会启动备份代理(即 仲裁)投票,表示其复制合作伙伴不再可用。

实时投票

如果实时代理丢失了与其复制合作伙伴的连接,则实时代理会决定根据这个投票继续运行。

实时代理

当实时代理丢失与复制合作伙伴的连接并将 vote-on-replication-failure 设置为 true 时,会出现实时投票功能。已成为活跃的备份代理被视为实时代理,并可以启动实时投票。

集群中的其他实时代理

如果实时代理 没有 从集群中的其他实时代理收到多数投票,代表其 cluster connection 仍活跃,则会关闭它。

重要

下面列出了一些重要事项,需要注意如何配置代理集群会影响仲裁投票的行为。

  • 要使仲裁投票方可成功,集群的大小必须允许实现多数结果。因此,您的集群应该 至少有三个 实时备份代理对。
  • 添加到集群中的 live-backup 代理对越大,您可以增加集群的整体容错功能。例如,假设您有三个实时备份对。如果您丢失了完整的 live-backup 对,则两个剩余的实时备份对无法实现多数结果,后续的仲裁投票。这种情况意味着,集群中的任何进一步复制中断都可能会导致实时代理关闭,并防止备份代理启动。通过使用配置集群(如五个代理对),集群可能会至少出现两个故障,同时仍然保证所有仲裁投票中多数结果。
  • 如果您有意 减少 集群中实时备份代理对的数量,则以前建立的阈值不会自动减少。在此期间,丢失复制连接触发的任何仲裁投票都无法成功,从而使集群容易受到脑裂的影响。要使集群重新计算仲裁投票的大多数阈值,首先关闭您要从集群中移除的 live-backup 对。然后,重启集群中剩余的 live-backup 对。当所有剩余的代理都已重启时,集群会重新计算仲裁投票阈值。

14.3.3.3. 配置代理集群以使用 ZooKeeper 协调服务复制高可用性

以下流程描述了如何为使用 Apache ZooKeeper 协调服务的代理集群配置复制高可用性(HA)。

先决条件

  • 至少 3 个 Apache ZooKeeper 节点,确保在代理丢失到一个节点时,代理可以继续运行。
  • zookeeper 必须有足够的资源来确保暂停时间明显小于 ZooKeeper 服务器空循环时间。根据代理的预期负载,请仔细考虑代理和 ZooKeeper 节点是否应该共享相同的节点。如需更多信息,请参阅 https://zookeeper.apache.org/

流程

  1. 使用 ZooKeeper 协调服务,将实时代理配置为使用复制高可用性。

    1. 打开 live 代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    2. 将实时代理配置为使用复制作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <primary>
                          <manager>
                          ...
                          </manager>
                            <group-name>my-group-1</group-name>
                      </primary>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      主要
      表示此代理在初始配置后作为 live 代理启动。
      group-name
      此 live-backup 组的名称(可选)。要形成 live-backup 组,必须使用相同的组名称和备份代理配置 live-backup 代理。如果您没有指定 group-name,备份代理可以使用任何实时代理复制。
    3. manager 部分,配置属性,将 live 代理连接到 ZooKeeper 节点。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <primary>
                          <manager>
                              <class-name>org.apache.activemq.artemis.quorum.zookeeper.CuratorDistributedPrimitiveManager</class-name>
                              <properties>
                                  <property key="connect-string" value="192.168.1.10:6666,192.168.2.10:6667,192.168.3.10:6668"/>
                              </properties>
                          </manager>
                      ...
                      </primary>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      class-name
      ZooKeeper 协调服务的类名称: org.apache.activemq.artemis.quorum.zookeeper.CuratorDistributedPrimitiveManager.如果 Apache Curator 是默认管理器,则此元素是可选的。
      属性

      指定 property 元素,您可以指定一组键值对,以提供 ZooKeeper 节点的连接详情:

      connect-string

      为实时代理指定 ZooKeeper 节点的 IP 地址和端口号的逗号分隔列表。例如,value="192.168.1.10:6666,192.168.2.10:6667,192.168.3.10:6668".

      session-ms

      实时代理在丢失到大多数 ZooKeeper 节点的连接后,等待的持续时间。默认值为 18000 ms。有效值是 ZooKeeper 服务器循环时间的 2 次和 20 倍。

      注意

      垃圾回收的 ZooKeeper 暂停时间必须小于 session-ms 属性的值的 0.33,以便 ZooKeeper heartbeat 能够可靠地工作。如果无法确保暂停时间小于这个限制,请增加每个代理的 session-ms 属性的值,并接受较慢的故障转移。

      重要

      代理复制合作伙伴每 2 秒自动交换"ping"数据包,以确认合作伙伴代理可用。当备份代理没有收到来自 live 代理的响应时,备份会等待响应,直到代理的连接时间到实时(ttl)过期为止。默认 connection-ttl 为 60000 ms,这意味着备份代理会在 60 秒后尝试故障切换。建议您将 connection-ttl 值设置为与 session-ms 属性值类似,以便加快故障转移。要设置新的 connection-ttl,请配置 connection-ttl-override 属性。

      namespace(可选)

      如果代理与其他应用程序共享 ZooKeeper 节点,您可以创建一个 ZooKeeper 命名空间来存储为代理提供协调服务的文件。如果为备份代理指定命名空间,您必须为 live 代理指定相同的命名空间。

    4. 为实时代理配置任何其他 HA 属性。

      这些额外的 HA 属性具有适用于大多数常见用例的默认值。因此,如果不需要默认行为,您只需要配置这些属性。更多信息请参阅 附录 F, 额外的复制高可用性配置元素

  2. 使用 ZooKeeper 协调服务将备份代理配置为使用复制高可用性。

    1. 打开备份代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    2. 配置备份代理以使用复制作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <backup>
                          <manager>
                           ...
                          </manager>
                          <group-name>my-group-1</group-name>
                          <allow-failback>true</allow-failback>
                       </backup>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      backup
      表示此代理在初始配置后作为备份代理启动。
      group-name
      此备份连接的 live 代理的组名称。备份代理仅连接到共享相同组名称的 live 代理。如果您没有指定 group-name,备份代理可以使用任何实时代理复制。
      allow-failback

      如果设置为 true,则允许当前实时代理的备份代理,将实时角色返回至其复制合作伙伴,后者配置为主代理。

      当配置为实时(主)代理的代理启动时,它会检查它是否有最新的数据,并可作为实时代理运行。如果它确定其数据不是最新的,则代理会重启一个空日志,并等待连接当前实时代理来复制最新数据。在代理配置为复制数据的主代理后,它会要求备份代理(当前处于活动状态),以便重启,以便它能够故障转移并再次成为实时代理。

      如果 allow-failback 设为 true,则备份代理会重新启动,以便其复制合作伙伴再次上线。如果将 allow-failback 设为 false,则备份代理不会重启,因此两个代理都保持其当前角色。

    3. manager 部分,配置属性以将备份代理连接到 ZooKeeper 节点。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <backup>
                          <manager>
                              <class-name>org.apache.activemq.artemis.quorum.zookeeper.CuratorDistributedPrimitiveManager</class-name>
                              <properties>
                                  <property key="connect-string" value="192.168.1.10:6666,192.168.2.10:6667,192.168.3.10:6668"/>
                              </properties>
                          </manager>
                      ...
                      </backup>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      class-name
      ZooKeeper 协调服务的类名称: org.apache.activemq.artemis.quorum.zookeeper.CuratorDistributedPrimitiveManager.如果 Apache Curator 是默认管理器,则此元素是可选的。
      属性

      指定 属性 部分,您可以在其中指定一组键值对,以提供 ZooKeeper 节点的连接详情:

      connect-string

      为备份代理指定 ZooKeeper 节点的 IP 地址和端口号的逗号分隔列表。例如,value="192.168.1.10:6666,192.168.2.10:6667,192.168.3.10:6668".

      session-ms

      实时代理在丢失到大多数 ZooKeeper 节点的连接后,等待的持续时间。默认值为 18000 ms。有效值是 ZooKeeper 服务器循环时间的 2 次和 20 倍。

      注意

      垃圾回收的 ZooKeeper 暂停时间必须小于 session-ms 属性的值的 0.33,以便 ZooKeeper heartbeat 能够可靠地工作。如果无法确保暂停时间小于这个限制,请增加每个代理的 session-ms 属性的值,并接受较慢的故障转移。

      重要

      代理复制合作伙伴每 2 秒自动交换"ping"数据包,以确认合作伙伴代理可用。当备份代理没有收到来自 live 代理的响应时,备份会等待响应,直到代理的连接时间到实时(ttl)过期为止。默认 connection-ttl 为 60000 ms,这意味着备份代理会在 60 秒后尝试故障切换。建议您将 connection-ttl 值设置为与 session-ms 属性值类似,以便加快故障转移。要设置新的 connection-ttl,请配置 connection-ttl-override 属性。

      namespace(可选)

      如果代理与其他应用程序共享 ZooKeeper 节点,您可以创建一个 ZooKeeper 命名空间来存储为代理提供协调服务的文件。如果为备份代理指定命名空间,您必须为 live 代理指定相同的命名空间。

    4. 为备份代理配置任何其他 HA 属性。

      这些额外的 HA 属性具有适用于大多数常见用例的默认值。因此,如果不需要默认行为,您只需要配置这些属性。更多信息请参阅 附录 F, 额外的复制高可用性配置元素

  3. 重复步骤 1 和 2 以在集群中配置每个额外的实时备份代理对。

其他资源

14.3.3.4. 配置代理集群以使用嵌入式代理协调复制高可用性

使用嵌入式代理协调复制至少需要三个实时备份对,以减少(但不消除)"脑裂"的风险。

以下流程描述了如何为 6-broker 集群配置复制高可用性(HA)。在此拓扑中,6 个代理被分组到三个 live-backup 对中:三个实时代理都使用专用的备份代理来对。

先决条件

  • 您必须有一个至少 6 个代理的代理集群。

    六个代理配置为三个 live-backup 对。有关在集群中添加代理的更多信息,请参阅 第 14 章 设置代理集群

流程

  1. 将集群中的代理分组到 live-backup 组。

    在大多数情况下,live-backup 组应该包含两个代理:一个实时代理和备份代理。如果集群中有六个代理,则需要三个 live-backup 组。

  2. 创建由一个 live 代理和一个备份代理组成的第一个 live-backup 组。

    1. 打开 live 代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    2. 将实时代理配置为使用复制作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <master>
                          <check-for-live-server>true</check-for-live-server>
                          <group-name>my-group-1</group-name>
                          <vote-on-replication-failure>true</vote-on-replication-failure>
                          ...
                      </master>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      check-for-live-server

      如果 live 代理失败,此属性会控制客户端在重启时是否应该会失败。

      如果将此属性设置为 true,当实时代理在之前的故障切换后重启时,它会搜索集群中具有相同节点 ID 的另一个代理。如果 live 代理发现另一个具有相同节点 ID 的代理,这表示备份代理在实时代理失败时成功启动。在这种情况下,实时代理将其数据与备份代理同步。然后,实时代理请求要关闭备份代理。如果为故障恢复配置了备份代理,如下所示,它会关闭。然后,实时代理恢复其活跃角色,客户端会重新连接它。

      警告

      如果您没有在 live 代理上将 check-for-server 设置为 true,在之前的故障切换后重启 live 代理时可能会遇到重复的消息处理。具体来说,如果您重启了这个属性设置为 false 的 live 代理,则 live 代理不会将数据与备份代理同步。在这种情况下,实时代理可能会处理备份代理已处理的相同信息,从而导致重复。

      group-name
      此 live-backup 组的名称(可选)。要形成 live-backup 组,必须使用相同的组名称和备份代理配置 live-backup 代理。如果您没有指定 group-name,备份代理可以使用任何实时代理复制。
      vote-on-replication-failure

      这个属性控制实时代理在中断复制连接时是否启动了一个称为 实时投票 的仲裁投票。

      实时投票是实时代理以确定其合作伙伴是否是中断复制连接的原因。根据投票结果,实时代理会继续运行或关闭。

      重要

      要使仲裁投票方可成功,集群的大小必须允许实现多数结果。因此,当您使用 replication HA 策略时,您的集群应该 至少有三个 实时备份代理对。

      您在集群中配置的代理对越大,您可以增加集群的整体容错功能。例如,假设您有三个 live-backup 代理对。如果您丢失了到完全 live-backup 对的连接,则两个剩余的实时备份对不再实现多数结果仲裁投票。这种情况意味着,任何后续复制中断都可能会导致实时代理关闭,并阻止备份代理启动。通过使用配置集群(如五个代理对),集群可能会至少出现两个故障,同时仍然保证所有仲裁投票中多数结果。

    3. 为实时代理配置任何其他 HA 属性。

      这些额外的 HA 属性具有适用于大多数常见用例的默认值。因此,如果不需要默认行为,您只需要配置这些属性。更多信息请参阅 附录 F, 额外的复制高可用性配置元素

    4. 打开备份代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    5. 配置备份代理以使用复制作为其 HA 策略。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <slave>
                          <allow-failback>true</allow-failback>
                          <group-name>my-group-1</group-name>
                          <vote-on-replication-failure>true</vote-on-replication-failure>
                          ...
                      </slave>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      allow-failback

      如果发生了故障转移,并且备份代理已接管了实时代理,则此属性会控制备份代理是否在重启并重新连接到集群中时是否应该回退到原始的 live 代理。

      注意

      故障恢复用于实时备份对(一个与单一备份代理进行一对一的代理)。如果 live 代理配置了多个备份,则不会出现问题。如果发生故障转移事件,备份代理将变为 live 状态,下一次备份就成为其备份。当原始 live 代理恢复在线时,它无法启动故障,因为现在已经备份的代理已经有备份。

      group-name
      此 live-backup 组的名称(可选)。要形成 live-backup 组,必须使用相同的组名称和备份代理配置 live-backup 代理。如果您没有指定 group-name,备份代理可以使用任何实时代理复制。
      vote-on-replication-failure

      这个属性控制实时代理在中断复制连接时是否启动了一个称为 实时投票 的仲裁投票。已成为活跃的备份代理被视为实时代理,并可启动实时投票。

      实时投票是实时代理以确定其合作伙伴是否是中断复制连接的原因。根据投票结果,实时代理会继续运行或关闭。

    6. (可选)配置备份代理启动的仲裁投票的属性。

      <configuration>
          <core>
              ...
              <ha-policy>
                  <replication>
                      <slave>
                      ...
                          <vote-retries>12</vote-retries>
                          <vote-retry-wait>5000</vote-retry-wait>
                      ...
                      </slave>
                  </replication>
              </ha-policy>
              ...
          </core>
      </configuration>
      vote-retries
      这个属性控制备份代理重试仲裁投票的次数,以便接收备份代理启动的主要结果。
      vote-retry-wait
      此属性控制每个重试仲裁投票之间等待的时间(以毫秒为单位)。
    7. 为备份代理配置任何其他 HA 属性。

      这些额外的 HA 属性具有适用于大多数常见用例的默认值。因此,如果不需要默认行为,您只需要配置这些属性。更多信息请参阅 附录 F, 额外的复制高可用性配置元素

  3. 对集群中的每个额外的 live-backup 组重复步骤 2。

    如果集群中有六个代理,请多次重复这个过程;对每个剩余的 live-backup 组重复一次。

其他资源

14.3.4. 仅实时配置有限高可用性

通过 Live-only HA 策略,您可以在不丢失任何消息的情况下关闭集群中的代理。使用实时代理时,当实时代理安全停止时,它会将信息及事务状态复制到另一个实时代理,然后关闭。然后,客户端可以重新连接其他代理,以继续发送和接收消息。

仅实时 HA 策略仅在代理安全停止时进行处理。它不处理意外代理失败。

虽然只有实时 HA 会阻止消息丢失,但可能无法保留消息顺序。如果使用 live-only HA 配置的代理停止,则会将其消息附加到另一个代理队列的末尾。

注意

当代理准备缩减时,它会在它们断开连接前向客户端发送一条信息,并通知新代理可以处理它们的消息。但是,只有在初始代理完成缩减后,客户端才应重新连接到新代理。这样可确保在客户端重新连接时,其他代理上可以使用任何状态,如队列或事务。当客户端重新连接时,通常会重新连接设置,因此您应设置足够高的时间来处理缩减所需的时间。

这个步骤描述了如何在集群中配置每个代理来缩减。完成此步骤后,每当代理被安全停止时,它会将信息及事务状态复制到集群中的另一个代理中。

流程

  1. 打开第一个代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 将代理配置为使用仅限实时 HA 策略。

    <configuration>
        <core>
            ...
            <ha-policy>
                <live-only>
                </live-only>
            </ha-policy>
            ...
        </core>
    </configuration>
  3. 配置一个缩减代理集群的方法。

    指定此代理应缩减的代理或代理组。

    将缩减至…​这些以下操作

    集群中的特定代理

    指定要缩减的代理的连接器。

    <live-only>
        <scale-down>
            <connectors>
                <connector-ref>broker1-connector</connector-ref>
            </connectors>
        </scale-down>
    </live-only>

    集群中的任何代理

    指定代理集群的发现组。

    <live-only>
        <scale-down>
            <discovery-group-ref discovery-group-name="my-discovery-group"/>
        </scale-down>
    </live-only>

    特定代理组中的代理

    指定代理组。

    <live-only>
        <scale-down>
            <group-name>my-group-name</group-name>
        </scale-down>
    </live-only>
  4. 对集群中的每个剩余的代理重复此步骤。

其他资源

  • 有关只使用实时缩减集群的代理集群示例,请参阅 缩减示例程序

14.3.5. 使用共存备份配置高可用性

除了配置 live-backup 组外,您还可以将备份代理与另一个实时代理位于同一个 JVM 中。在此配置中,每个实时代理配置为请求另一个实时代理,以在 JVM 中创建并启动备份代理。

图 14.4. 共存和备份代理

HA Colocated

您可以将 colocation 与共享存储或复制用作高可用性(HA)策略。新的备份代理会继承创建它的 live 代理中的配置。备份的名称设置为 colocated_backup_n,其中 n 是创建 live 代理的备份数量。

另外,备份代理会继承其连接器的配置和创建它的 live 代理中的接收器。默认情况下,端口偏移 100 应用于每个端口。例如,如果实时代理具有端口 61616 的接受器,所创建的第一个备份代理将使用端口 61716,第二个备份将使用 61816,以此类推。

日志、大型消息和分页的目录会根据您选择的 HA 策略设置。如果您选择共享存储,请求代理会通知要使用的目标代理。如果选择了复制,则目录将从创建代理继承,并附加新的备份名称。

此流程将集群中的每个代理配置为使用共享存储 HA,并请求创建备份并与集群中的另一个代理在一起。

流程

  1. 打开第一个代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 将代理配置为使用 HA 策略和 colocation。

    在本例中,代理被配置为使用共享存储 HA 和 colocation。

    <configuration>
        <core>
            ...
            <ha-policy>
                <shared-store>
                    <colocated>
                        <request-backup>true</request-backup>
                        <max-backups>1</max-backups>
                        <backup-request-retries>-1</backup-request-retries>
                        <backup-request-retry-interval>5000</backup-request-retry-interval/>
                        <backup-port-offset>150</backup-port-offset>
                        <excludes>
                            <connector-ref>remote-connector</connector-ref>
                        </excludes>
                        <master>
                            <failover-on-shutdown>true</failover-on-shutdown>
                        </master>
                        <slave>
                            <failover-on-shutdown>true</failover-on-shutdown>
                            <allow-failback>true</allow-failback>
                            <restart-backup>true</restart-backup>
                        </slave>
                    </colocated>
                </shared-store>
            </ha-policy>
            ...
        </core>
    </configuration>
    request-backup
    通过将此属性设置为 true,此代理将请求由集群中的另一个实时代理创建备份代理。
    max-backups
    此代理可以创建的备份代理数量。如果将此属性设置为 0,则此代理不接受来自集群中其他代理的备份请求。
    backup-request-retries
    此代理应尝试请求创建备份代理的次数。默认值为 -1,这表示无限尝试。
    backup-request-retry-interval
    在重试请求以创建备份代理前代理应等待的时间(毫秒)。默认值为 5000 或 5 秒。
    backup-port-offset
    用于新备份代理的端口偏移和连接器。如果此代理收到一个请求来为集群中的另一个代理创建备份,它将使用这个数量来创建带有端口偏移的备份代理。默认值为 100
    excludes (可选)
    从备份端口偏移中排除连接器。如果您已经为应从备份端口偏移中排除的外部代理配置了任何连接器,请为每个连接器添加一个 &lt ;connector-ref >。
    master
    此代理的共享存储或复制故障切换配置。
    slave
    此代理备份的共享存储或复制故障转移配置。
  3. 对集群中的每个剩余的代理重复此步骤。

其他资源

  • 有关使用共存备份的代理集群示例,请参阅 HA 示例程序

14.3.6. 将客户端配置为故障切换

在代理集群中配置高可用性后,您可以将客户端配置为故障切换。客户端故障转移可确保代理出现故障,连接到它的客户端可以在最小停机时间的情况下重新连接到集群中的其他代理。

注意

如果出现临时网络问题,AMQ Broker 会自动重新将连接重新连接到同一代理。这和故障转移类似,但客户端会重新连接到同一代理。

您可以配置两种类型的客户端故障切换:

自动客户端故障切换
客户端在第一次连接时接收代理集群的信息。如果连接的代理失败,客户端会自动重新连接到代理的备份,备份代理会在故障切换前重新创建所有存在于会话和使用者。
应用程序级别的客户端故障转移
作为自动客户端故障切换的替代选择,您可以在故障处理程序中使用您自己的自定义重新连接逻辑来编写客户端应用程序。

流程

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.