14.3. 实现高可用性


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

实施 HA 涉及几个步骤:

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

  4. 将您的客户端应用程序配置为使用故障转移
注意

在稍后需要为高可用性配置代理集群进行故障排除时,建议您为集群中运行的每个 Java 虚拟机(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 组 来实现高可用性(HA)。在 live-backup 组中,实时代理链接到备份代理,如果失败,它会接管实时代理。AMQ Broker 还为 live-backup 组中的故障转移(称为 HA 策略)提供了几种不同的策略。

14.3.1.1. live-backup 组如何提供高可用性

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

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

14.3.1.2. 高可用性策略

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

共享存储(推荐)

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

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

在共享存储 HA 策略中,live 和 backup 代理都从共享位置访问日志。
复制

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

live 和 backup 代理之间的数据同步可确保如果 live 代理失败,不会丢失消息传递数据。当 live 和 backup 代理最初接合在一起时,实时代理会通过网络将其所有现有的数据复制到备份代理中。完成此初始阶段后,实时代理会在实时代理接收时将持久数据复制到备份代理中。这意味着,如果 live 代理关闭网络,备份代理具有实时代理接收的所有持久数据。

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

在复制 HA 策略中,live 和 backup 代理通过网络将其日志相互同步。
只读(限制 HA)

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

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

其他资源

14.3.1.3. 复制策略限制

当您使用复制来提供高可用性时,存在实时和备份代理可能会同时变为活跃的风险,这称为"脑裂"。

如果实时代理及其备份丢失其连接,则可能会出现脑裂。在这种情况下,实时代理及其备份可以同时激活。由于在这种情况下,代理之间没有消息复制,所以它们各自为客户端和进程消息提供服务,而无需其他知道它。在这种情况下,每个代理都有一个完全不同的日志。从这种情况中恢复可能比较困难,在某些情况下无法进行。

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

    如果您希望代理使用 ZooKeeper Coordination Service 来协调代理,请在至少三个节点上部署 ZooKeeper。如果代理丢失一个 ZooKeeper 节点,则至少有三个节点可确保当 live-backup 代理对出现复制中断时,大多数节点都可用协调代理。

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

使用复制 HA 策略时,介绍了一些额外的注意事项:

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

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

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

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

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

注意

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

14.3.2.1. 配置 NFS 共享存储

在使用共享存储高可用性时,您必须将 live 和 backup 代理配置为使用共享文件系统的通用目录。通常,您使用存储区域网络(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. 提供共享存储的网络文件系统,验证 live 代理的分页、绑定、日志和大型消息目录是否指向备份代理也可以访问的共享位置。

        <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. 将 live 代理配置为使用共享存储进行 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
      此属性控制备份代理在返回到 live 代理后是否自动重启。此属性的默认值为 true
  3. 对集群中的每个剩余的 live-backup 组重复步骤 2。

14.3.3. 配置复制高可用性

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

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

注意

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

如果 live-backup 代理对之间的复制连接中断,代理需要一种协调来确定实时代理是否仍然处于活跃状态,或者是否需要对备份代理进行故障转移。要提供此协调,您可以将代理配置为使用以下协调方法之一。

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

14.3.3.1. 选择协调方法

红帽建议您使用 Apache ZooKeeper 协调服务来协调代理激活。在选择协调方法时,了解基础架构要求的不同以及两个协调方法之间的数据一致性管理非常有用。

基础架构要求

  • 如果使用 ZooKeeper 协调服务,您可以处理单个 live-backup 代理对。但是,您必须将代理连接到至少 3 个 Apache ZooKeeper 节点,以确保如果代理丢失到一个节点,则代理可以继续正常工作。要为代理提供协调的服务,您可以共享其他应用程序使用的现有 ZooKeeper 节点。有关设置 Apache ZooKeeper 的更多信息,请参阅 Apache ZooKeeper 文档。
  • 如果要使用嵌入式代理协调,它使用集群中的其他可用代理来提供仲裁投票,您必须至少有三个 live-backup 代理对。至少使用三个 live-backup 对可确保在实时备份代理对遇到复制中断时,可在任何仲裁投票中达到大多数结果。

数据一致性

  • 如果您使用 Apache ZooKeeper 协调服务,ZooK 会跟踪每个代理上的数据版本,因此只有具有最新日志数据的代理才能作为实时代理激活,无论代理是否配置为复制目的的主或备份代理。版本跟踪消除了代理可以使用最新日志激活并开始服务客户端的可能性。
  • 如果您使用嵌入式代理协调,则不存在机制来跟踪每个代理上数据的版本,以确保只有具有最新日志的代理才能成为实时代理。因此,具有过时日志的代理可能会变为实时并启动服务客户端,这会导致日志中有区别。

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

本节介绍在复制连接中断后两个协调方法的工作方式。

使用 ZooKeeper 协调服务

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

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

ZooKeeper 使用以下控制机制来管理故障转移过程:

  • 共享租期锁定,可以随时归单个实时代理所有。
  • 跟踪代理数据的最新版本的激活序列计数器。每个代理都会在其服务器锁定文件中跟踪其日志数据的版本,以及它们的 NodeID。live 代理也在 ZooKeeper 上的协调激活序列计数器中共享其版本。

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

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

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

使用嵌入式代理协调

如果 live-backup 代理对使用嵌入式代理协调来协调复制中断,则可以启动以下两种类型的仲裁投票。

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

备份投票

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

备份代理

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

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

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

集群中的其他实时代理

如果备份代理从集群中的其他实时代理收到大多数(即 仲裁)投票,则备份代理会启动,表示其复制合作伙伴不再可用。

实时投票

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

live 代理

当实时代理丢失与复制合作伙伴的连接,并且 vote-on-replication-failure 设置为 true 时,会发生实时投票。已激活的备份代理被视为实时代理,并可启动实时投票。

集群中的其他实时代理

如果没有从集群中的其他实时代理接收大多数投票,则 live 代理会关闭,这表示其集群连接仍处于活动状态。

重要

下面是一些重要事项,请注意代理集群配置如何影响仲裁 voting 的行为。

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

14.3.3.3. 使用 ZooKeeper 协调服务为代理集群配置复制

您必须在使用 Apache ZooKeeper 协调服务的 live-backup 对中为两个代理指定相同的复制配置。然后代理会协调,以确定哪个代理是主代理,它是备份代理。

先决条件

  • 至少 3 个 Apache ZooKeeper 节点,以确保代理在丢失到一个节点的连接时可以继续运行。
  • 代理机器具有类似的硬件规格,即您没有首选运行实时代理的机器,并在任何时间点上运行备份代理。
  • ZooKeeper 必须有足够的资源,以确保暂停时间比 ZooKeeper 服务器选择时间要低。根据代理的预期负载,如果代理和 ZooKeeper 节点可以共享同一节点,请仔细考虑。如需更多信息,请参阅 https://zookeeper.apache.org/

流程

  1. 为 live-backup 对中的两个代理打开 <broker_instance_dir> /etc/broker.xml 配置文件。
  2. 为对中的两个代理配置配置相同的复制配置。例如:

    <configuration>
        <core>
            ...
            <ha-policy>
               <replication>
                  <primary>
                    <coordination-id>production-001</coordination-id>
                    <manager>
                       <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>
    primary
    将复制类型配置为 primary,以指示任一代理可以是主代理,具体取决于代理协调的结果。
    coordination-id
    为 live-backup 对中的两个代理指定一个通用字符串值。具有相同 Coordination-id 字符串的代理协调激活。在协调过程中,两个代理都使用 Coordination-id 字符串作为节点 Id,并尝试在 ZooKeeper 中获取锁定。获取锁定且有最新数据的第一个代理作为实时代理启动,另一个代理则变为备份。
    属性

    指定 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-backup 对中为两个代理指定相同的命名空间。

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

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

  4. 重复步骤 1 到 3,在集群中配置每个额外的 live-backup 代理对。

其他资源

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

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

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

先决条件

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

    6 个代理被配置为三个实时备份对。有关在集群中添加代理的详情,请参考 第 14 章 设置代理集群

流程

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

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

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

    1. 打开 live 代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
    2. 配置 live 代理,使其 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,则当 live 代理在上一个故障切换后重启时,它会搜索具有相同节点 ID 的集群中的另一个代理。如果 live 代理找到具有相同节点 ID 的另一个代理,这表示备份代理在实时代理失败时成功启动。在这种情况下,实时代理将其数据与备份代理同步。然后,实时代理会请求备份代理关闭。如果为故障恢复配置了备份代理,如下所示,它会关闭。然后,实时代理恢复其活动角色,并且客户端重新连接到它。

      警告

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

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

      此属性控制实时代理是否在发生中断复制连接时启动名为 live vote 的仲裁投票。

      实时投票是一种实时代理来确定它还是合作伙伴是复制连接中断的原因。根据投票的结果,实时代理将保持运行或关闭。

      重要

      要使仲裁投票成功,集群的大小必须允许大多数结果实现。因此,当您使用复制 HA 策略时,您的集群应 至少有三个 live-backup 代理对。

      您在集群中配置的代理对越多,您可以提高集群的整体容错能力。例如,假设您有三个 live-backup 代理对。如果您丢失了到完整的实时备份对的连接,则剩余的两个实时备份对将不再实现仲裁投票。在这种情况下,任何后续复制中断都可能会导致实时代理关闭,并防止其备份代理启动。通过配置集群,假设五个代理对,集群至少可能会出现两个故障,同时仍确保大多数来自仲裁投票的结果。

    3. 为 live 代理配置任何其他 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,备份代理可以使用任何 live 代理复制。
      vote-on-replication-failure

      此属性控制实时代理是否在发生中断复制连接时启动名为 live vote 的仲裁投票。已激活的备份代理被视为实时代理,并可启动实时投票。

      实时投票是一种实时代理来确定它还是合作伙伴是复制连接中断的原因。根据投票的结果,实时代理将保持运行或关闭。

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

live-only HA 策略仅在代理安全停止时处理情况。它无法处理意外的代理失败。

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

注意

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

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

流程

  1. 打开第一个代理的 < broker_instance_dir&gt; /etc/broker.xml 配置文件。
  2. 将代理配置为使用 live-only 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. 对集群中的每个剩余的代理重复此步骤。

其他资源

  • 有关使用 live-only 进行缩减集群的代理集群示例,请参阅 缩减示例程序

14.3.5. 使用并置备份配置高可用性

您可以在与另一个实时代理相同的 JVM 中并置备份代理,而不是配置 live-backup 组。在此配置中,每个 live 代理都配置为请求另一个 live 代理,在其 JVM 中创建并启动备份代理。

图 14.4. 并置实时和备份代理

HA Colocated

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

另外,备份代理会继承其连接器的配置,并从创建它的 live 代理继承接受器。默认情况下,端口偏移 100 会应用到每个端口。例如,如果 live 代理具有端口 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
    用于新备份代理的 acceptors 和 connector 的端口偏移。如果此代理收到为集群中的另一个代理创建备份的请求,它将按这个数量使用端口偏移创建备份代理。默认值为 100
    excludes (可选)
    从备份端口偏移中排除连接器。如果您已经为应该从备份端口偏移中排除的外部代理配置了任何连接器,请为每个连接器添加一个 &lt ;connector-ref >。
    master
    此代理的共享存储或复制故障转移配置。
    slave
    此代理的备份的共享存储或复制故障转移配置。
  3. 对集群中的每个剩余的代理重复此步骤。

其他资源

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

14.3.6. 将客户端配置为故障转移

在代理集群中配置了高可用性后,您要将客户端配置为故障转移。客户端故障转移可确保如果代理失败,连接的客户端可以在最少的停机时间的情况下重新连接到集群中的另一个代理。

注意

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

您可以配置两种不同类型的客户端故障转移:

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

流程

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.