4.24. 为灾难恢复配置数据镜像


镜像是将数据从代理复制到一个或多个其他代理以进行灾难恢复的过程。镜像中的源和目标代理可以在不同数据中心的独立的 OpenShift 集群中,以防止数据中心中断。镜像也可用于数据备份,或创建用于在维护窗口期间使用的故障转移代理。

注意

创建镜像前存在的消息不会被镜像(mirror)。

流程

  1. 配置两个 ActiveMQArtemis 自定义资源(CR)实例,为镜像的数据创建源代理和目标代理。为每个名称指定一个唯一名称。例如:

    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: production-broker
      namespace: production
    spec:
      deploymentPlan:
        size: 1
    Copy to Clipboard Toggle word wrap
    apiVersion: broker.amq.io/v1beta1
    kind: ActiveMQArtemis
    metadata:
      name: mirror-broker
      namespace: dr
    spec:
      deploymentPlan:
        size: 1
    Copy to Clipboard Toggle word wrap
  2. 在目标代理的 CR 中,为镜像连接添加 acceptor。例如:

    metadata:
      name: mirror-broker
      namespace: dr
    spec:
      ...
      acceptors:
      - expose: true
        name: amqp
        port: 5672
        protocols: amqp
      ...
    Copy to Clipboard Toggle word wrap

    创建 acceptor 后,会以以下格式为 acceptor 公开路由:

    <broker name>-<acceptor name>-<ordinal>-svc-rte.<namespace>.<hostname>

    当您稍后将镜像配置添加到源代理时,您可以使用此路由创建到目标代理的连接。

    <ordinal> 是 StatefulSet 分配给代理 pod 的普通者。集群中的第一个代理 pod 被分配为 0。第二个 pod 被分配为 1 的部分,以此类推。pod 的 ordinal 值存储在 STATEFUL_SET_ORDINAL 变量中。您可以在源代理的 mirror 连接详情中使用此变量而不是 ordinal 值。例如:

    <broker name>-<acceptor name>-${STATEFUL_SET_ORDINAL}-svc-rte.<namespace>.<hostname>

    通过使用 STATEFUL_SET_ORDINAL 变量,如果您扩展源和目标集群中的代理数量,请确保源会创建一个具有相同普通目标的镜像连接。

  3. 如果要通过镜像连接安全地发送数据,请为连接配置传输层安全(TLS)。根据您的要求,您可以使用各种方法生成 SSL/TLS 证书。例如,您可以使用可信证书颁发机构(CA)、cert-manager Operator 用于 OpenShift 或安全套接字层(SSL)工具。

    以下示例提供了使用 SSL/TLS 工具在代理间配置 mutual TLS 身份验证(mTLS)的步骤概述,以手动生成自签名证书。

    1. 为目标代理生成自签名 SSL/TLS 证书。例如:

      keytool -genkey -trustcacerts -alias broker -keyalg RSA -keystore broker.ks -keypass password -storepass password

    2. 将您创建的 SSL/TLS 证书的公钥导出到文件,以便您可以将密钥导入到供源代理使用的信任存储文件中。例如:

      keytool -export -noprompt -alias broker -keystore broker.ks -file for_source_truststore -storepass password

    3. 将您导出的 SSL/TLS 证书的公钥导入到信任存储文件中,以便在源代理中使用。例如:

      keytool -import -noprompt -trustcacerts -alias broker -keystore client.ts -file for_source_truststore -storepass password

    4. 为源代理生成自签名 SSL/TLS 证书。例如:

      keytool -genkey -trustcacerts -alias broker -keyalg RSA -keystore broker.ks -keypass password -storepass password

    5. 导出您创建的 SSL/TLS 证书的公钥,以便您可以将密钥导入到用于在目标代理上使用的信任存储文件中。

      keytool -export -noprompt -alias broker -keystore broker.ks -file for_target_truststore -storepass password

    6. 将您导出的 SSL/TLS 证书的公钥导入到信任存储文件中,以便在目标代理中使用。例如:

      keytool -import -noprompt -trustcacerts -alias broker -keystore client.ts -file for_target_truststore -storepass password

    7. 将您为源代理创建的密钥存储和信任存储文件添加到源代理命名空间中的 secret 中。例如:

      oc create secret generic mirror --from-file=broker.ks=broker.ks --from-file=client.ts=client.ts --from-literal=keyStorePassword=password --from-literal=trustStorePassword=password

      重复此步骤,将您为目标代理创建的密钥存储和信任存储文件添加到目标代理命名空间中的 secret 中。

    8. 在为目标代理配置的 acceptor 中,将 sslEnabled 属性设置为 true,并指定您在目标代理命名空间中创建的 secret 的名称。例如:

      metadata:
        name: mirror-broker
        namespace: dr
      spec:
        ...
        acceptors:
        - expose: true
          name: amqp
          port: 5672
          protocols: amqp
          sslEnabled: true
          sslSecret: mirror
        ...
      Copy to Clipboard Toggle word wrap
    9. 在源代理的 CR 中,将对源代理命名空间中创建的 secret 的引用添加到 extraMounts 属性。此步骤是必需的,以便 Operator 在每个代理 pod 上的 secret 中挂载密钥存储和信任存储文件。例如:

      spec:
        ...
        deploymentPlan:
          extraMounts:
            secrets:
            - mirror
        ...
      Copy to Clipboard Toggle word wrap

      secret 中的 keystore 和 truststore 文件挂载到代理 pod 上的 /amq/extra/secrets/<secret name > 目录中。

  4. 在源代理的 CR 中,在 brokerProperties 属性下,配置镜像连接详情。对于连接 URI,指定在目标代理中创建的 acceptor 公开的路由。如果要使用 SSL/TLS 来保护镜像连接,请在 URI 中包括以下内容:

    • 端口号 443
    • sslEnabled=true 启用 SSL/TLS
    • 密钥和信任存储文件的路径和凭证

    例如:

    spec:
      ...
      brokerProperties:
      - AMQPConnections.datacenter1.uri=tcp://broker-dr-amqp-${STATEFUL_SET_ORDINAL}-svc-rte-dr.apps.lab.redhat.com:443?;sslEnabled=true;trustStorePath=/amq/extra/secrets/mirror/client.ts;trustStorePassword=password;keyStorePath=/amq/extra/secrets/mirror/broker.ks;keyStorePassword=password
      - AMQPConnections.datacenter1.connectionElements.mirror.type=MIRROR
      ...
    Copy to Clipboard Toggle word wrap
    注意

    如果需要,您可以为源代理配置多个镜像目标。例如:

    spec:
      ...
      brokerProperties:
      - AMQPConnections.datacenter1.uri=tcp://primary-mirror-broker-amqp-${STATEFUL_SET_ORDINAL}-svc.dr.svc.cluster.local:61616
      - AMQPConnections.datacenter1.connectionElements.mirror.type=MIRROR
      - AMQPConnections.datacenter2.uri=tcp://backup-mirror-broker-amqp-${STATEFUL_SET_ORDINAL}-svc.dr.svc.cluster.local:61616
      - AMQPConnections.datacenter2.connectionElements.mirror.type=MIRROR
      ...
    Copy to Clipboard Toggle word wrap
  5. 在源代理的 CR 中,根据需要配置额外的镜像配置属性。例如:

    - AMQPConnections.datacenter1.user=admin
    - AMQPConnections.datacenter1.password=admin
    - AMQPConnections.datacenter1.retryInterval=5000
    - AMQPConnections.datacenter1.connectionElements.mirror.messageAcknowledgements=true
    - AMQPConnections.datacenter1.connectionElements.mirror.queueCreation=true
    - AMQPConnections.datacenter1.connectionElements.mirror.queueRemoval=true
    - AMQPConnections.datacenter1.connectionElements.mirror.addressFilter=addresses
    Copy to Clipboard Toggle word wrap
    注意

    您可以使用任何字母数字字符的字符串来命名 AMQP 连接。在上例中,AMQP 连接名称为 datacenter1

    AMQPConnections.<name>.user
    目标代理中具有镜像所需事件权限的用户名称。
    AMQPConnections.<name>.password
    目标代理中的用户密码。
    AMQPConnections.<name>.retryInterval
    在重试尝试连接到目标代理之间的间隔(以毫秒为单位)。
    AMQPConnections.<name>.connectionElements.mirror.messageAcknowledgements
    指定消息确认是否被镜像。默认值为 true
    AMQPConnections.<name>.connectionElements.mirror.queueCreation
    指定是否镜像队列或地址创建事件。默认值为 true
    AMQPConnections.<name>.connectionElements.mirror.queueRemoval
    指定队列或地址删除事件是否被镜像。默认值为 true
    AMQPConnections.<name>.connectionElements.mirror.addressFilter

    源代理可用于包含或排除事件要镜像的地址的过滤器。例如,您可能希望将临时队列排除在被镜像之外。

    您可以将过滤器指定为以逗号分隔的地址列表。如果要指定要排除的地址列表,请使用感叹号(!)为每个地址添加前缀。在以下示例中,开头为 us.europe. 的地址的事件不会被镜像。

    AMQPConnections.<name>.connectionElements.mirror.addressFilter=!us.,!europe.

    注意

    如果您指定要包含的一个或多个地址,则不会镜像所有其他地址的事件。如果您指定要排除的一个或多个地址,则所有其他地址的事件都会被镜像。

  6. 在源代理的 CR 的 status 部分中,验证 BrokerPropertiesApplied 条件的状态为 true,以确认是否应用了您在 CR 中指定的所有属性。如需更多信息,请参阅 第 3.7 节 “查看代理部署的状态信息”
  7. 检查源代理 pod 的日志,以查找类似如下的行,以确认已建立镜像连接。

    broker-prod-ss-0 broker-prod-container Connected on Server AMQP Connection dr on broker-dr-amqp-0-svc-rte-dr.lab.redhat.com:443 after 0 retries

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat