4.16. 启用消息迁移来支持集群缩减


如果要缩减集群中的代理数量,并将信息迁移到集群中剩余的 Pod,您必须启用消息迁移。

当您缩减启用了消息迁移的集群时,缩减控制器会管理消息迁移过程。

4.16.1. 消息迁移过程中的步骤

消息迁移过程遵循以下步骤:

  1. 当部署中的代理 Pod 因部署的意图缩减而关闭时,Operator 会自动部署 scaledown 自定义资源以准备消息迁移。
  2. 要检查已孤立的持久性卷(PV),缩减控制器将查看卷声明上的异常。控制器将卷声明上的情况与仍在 StatefulSet (即代理集群)中运行的代理 Pod 进行比较。

    如果卷声明上的情况高于代理集群中仍在运行的任何代理 Pod 上的情况,则 scaledown 控制器决定代理 Pod 已关闭,且消息传递数据必须迁移到另一个代理 Pod。

  3. scaledown 控制器启动一个 drainer Pod。drainer Pod 连接到集群中的其他实时代理 Pod,并将信息迁移到该 live 代理 Pod。

下图演示了 scaledown 控制器(也称为 drain controller)如何将消息迁移到正在运行的代理 Pod。

图 4.1. 使用 scaledown 控制器消息迁移

当消息成功迁移到可正常工作的代理 Pod 后,排空器 Pod 会关闭,缩减控制器会删除孤立 PV 的 PVC。PV 会被返回到 "Released" 状态。

注意

如果将 PV 的 reclaim 策略设置为 保留,则 PV 无法供另一个 Pod 使用,直到您删除并重新创建 PV。例如,如果您在缩减后扩展集群,则 PV 将无法供 Pod 启动,直到删除并重新创建 PV。

其他资源

4.16.2. 启用消息迁移

您可以在 ActiveMQArtemis 自定义资源(CR)中启用消息迁移。

先决条件

注意
  • 缩减控制器仅在单一 OpenShift 项目中运行。控制器无法在不同项目中的代理之间迁移消息。
  • 如果您将代理部署缩减为 0 (零),则不会发生消息迁移,因为没有运行代理 Pod 可以迁移到哪些消息传递数据。但是,如果您将部署缩减为零,然后备份到小于原始部署的大小,则会为保持关闭的代理启动排空 Pod。

流程

  1. 编辑代理部署的 CR 实例。

    1. 使用 OpenShift 命令行界面:

      1. 以具有特权的用户身份登录 OpenShift Container Platform,以便在代理部署的项目中部署 CR。
      2. 编辑部署的 CR。

         oc edit ActiveMQArtemis <CR instance name> -n <namespace>
        Copy to Clipboard Toggle word wrap
    2. 使用 OpenShift Container Platform Web 控制台:

      1. 以具有特权的用户身份登录 OpenShift Container Platform,以便在代理部署的项目中部署 CR。
      2. 在左侧窗格中,单击 Administration Custom Resource Definitions
      3. 单击 ActiveMQArtemis CRD。
      4. 实例 选项卡。
      5. 点代理部署的实例。
      6. YAML 标签。

        在控制台中,会打开 YAML 编辑器,供您编辑 CR 实例。

  2. 在 CR 的 deploymentPlan 部分中,添加一个 messageMigration 属性,并设置为 true。如果尚未配置,请添加 persistenceEnabled 属性,并设置为 true。例如:

    spec:
      deploymentPlan:
        messageMigration: true
        persistenceEnabled: true
      ...
    Copy to Clipboard Toggle word wrap

    这些设置意味着,当您稍后缩减集群代理部署的大小时,Operator 会自动启动一个 scaledown 控制器,并将信息迁移到仍然运行的代理 Pod 中。

  3. 保存 CR。
  4. (可选)完成以下步骤来缩减集群并查看消息迁移过程。

    1. 在现有代理部署中,验证哪些 Pod 正在运行。

      $ oc get pods
      Copy to Clipboard Toggle word wrap

      您会看到类似如下的输出。

      activemq-artemis-operator-8566d9bf58-9g25l   1/1   Running   0   3m38s
      ex-aao-ss-0                                  1/1   Running   0   112s
      ex-aao-ss-1                                  1/1   Running   0   8s
      Copy to Clipboard Toggle word wrap

      前面的输出显示有三个 Pod 正在运行;一个用于代理 Operator 本身,以及部署中每个代理有一个单独的 Pod。

    2. 登录到每个 Pod,并将一些信息发送到每个代理。

      1. Pod ex-aao-ss-0 有集群 IP 地址 172.17.0.6,运行以下命令:

        $ /opt/amq/bin/artemis producer --url tcp://172.17.0.6:61616 --user admin --password admin
        Copy to Clipboard Toggle word wrap
    3. Pod ex-aao-ss-1 有集群 IP 地址 172.17.0.7,运行以下命令:

      $ /opt/amq/bin/artemis producer --url tcp://172.17.0.7:61616 --user admin --password admin
      Copy to Clipboard Toggle word wrap

      前面的命令在每个代理上创建一个名为 TEST 的队列,并将 1000 个消息添加到每个队列中。

    4. 将集群从两个代理缩减为一个。

      1. 打开主代理 CR,broker_activemqartemis_cr.yaml
      2. 在 CR 中,将 deploymentPlan.size 设置为 1
      3. 在命令行中应用更改:

        $ oc apply -f deploy/crs/broker_activemqartemis_cr.yaml
        Copy to Clipboard Toggle word wrap

        您会看到 Pod ex-aao-ss-1 开始关闭。scaledown 控制器启动相同名称的新 drainer Pod。这个 drainer Pod 也会在将信息从代理 Pod ex-ao-s-1 中迁移到集群(ex-aao-ss-0)中的其他代理 Pod 中后关闭。

    5. 当 drainer Pod 关闭时,检查代理 Pod ex-aao-ss-0TEST 队列上的消息计数。您会看到队列中的消息数量是 2000,这表示 drainer Pod 已成功从关闭的代理 Pod 中迁移 1000 个信息。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat