14.3. 实施高可用性


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

实现 HA 涉及几个步骤:

  1. 为您的 HA 实现配置代理集群,如 第 14.2 节 “创建代理集群” 所述。
  2. 您应该了解 live-backup 组是什么,然后选择最适合您的要求的 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 代理服务客户端请求,而备份代理则以被动模式等待。如果 live 代理失败,备份代理替换了 live 代理,使客户端能够重新连接并继续其工作。

14.3.1.2. 高可用性策略

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

共享存储(推荐)

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

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

图 14.4. 共享存储高可用性

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

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

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

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

图 14.5. 复制高可用性

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

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

图 14.6. 仅实时高可用性

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

其他资源

14.3.1.3. 复制策略限制

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

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

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

    如果您希望代理使用 ZooKeeper Coordination 服务来协调代理,请在至少三个节点上部署 ZooKeeper。如果代理丢失了与一个 ZooKeeper 节点的连接,至少三个节点可确保在实时备份代理对遇到复制中断时,大多数节点可以协调代理。

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

使用复制 HA 策略时还有一些额外的注意事项,如下所述:

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

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

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

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

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

注意

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

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 客户端会尝试每个请求三次。
重要

在配置 timeo 和 重新传输选项时,务必要使用合理的值。一个默认的 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 和 backup 代理都可以连接到同一数据库,并在 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
      此属性控制备份代理在备份代理失败后是否自动重启。此属性的默认值为 true
  3. 对集群中的每个剩余的 live-backup 组重复步骤 2。

14.3.3. 配置复制高可用性

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

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

注意

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

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

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

14.3.3.1. 选择协调方法

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

基础架构要求

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

数据一致性

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

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

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

使用 ZooKeeper 协调服务

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

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

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

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

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

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

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

使用嵌入的代理协调

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

表 14.1. 仲裁投票
vote 类型描述initiator所需的配置参与者基于投票结果的操作

备份投票

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

备份代理

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

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

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

集群中的其他实时代理

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

实时投票

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

实时代理

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

集群中的其他实时代理

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

重要

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

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

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

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

先决条件

  • 至少 3 个 Apache ZooKeeper 节点,确保在代理丢失与一个节点的连接时可以继续运行。
  • 代理机器具有类似的硬件规格,即,您没有首选哪个机器运行 live 代理,并在任何时间点运行备份代理。
  • ZooKeeper 必须有足够的资源来确保暂停时间明显低于 ZooKeeper 服务器 tick 时间。根据代理的预期负载,请考虑代理和 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 中尝试获取锁定。第一个获取锁定并有最新数据的代理作为 live 代理启动,其他代理变为备份。
    属性

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

    表 14.2. 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 服务器 tick 时间的 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 属性。

    命名空间(可选)

    如果代理与其他应用程序共享 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 代理失败时成功启动备份代理。在这种情况下,live 代理将其数据与备份代理同步。然后,实时代理会请求备份代理关闭。如果为故障恢复配置了备份代理,如下所示,它会关闭。然后,实时代理恢复其活跃角色,客户端会重新连接它。

      警告

      如果您没有在 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 代理对。如果您丢失了与完整的 live-backup 对的连接,剩余的两个 live-backup 对无法再实现大部分的仲裁投票。这种情况意味着后续复制中断都可能会导致实时代理关闭,并阻止其备份代理启动。通过配置集群(例如 5 个代理对),集群可以至少遇到两个故障,同时仍然确保任何仲裁投票中的大多数结果。

    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. 使用实时配置有限的高可用性

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

仅限实时 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. 配置缩减代理集群的方法。

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

    表 14.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. 使用 colocated 备份配置高可用性

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

图 14.7. colocated live 和 backup 代理

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

其他资源

  • 有关使用 colocated 备份的代理集群示例,请参阅 HA 示例

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

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

注意

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

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

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

流程

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.