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


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

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

4.16.1. 消息迁移过程的步骤

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

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

    如果卷声明中的普通对象高于代理集群中仍在运行的任何代理 Pod 上,则缩减控制器决定代理 Pod 已关闭,并且该消息数据必须迁移到另一个代理 Pod。

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

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

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

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

注意

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

其他资源

4.16.2. 启用消息迁移

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

先决条件

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

流程

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

    1. 使用 OpenShift 命令行界面:

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

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

      1. 以有权在代理部署的项目中部署 CR 的用户身份登录 OpenShift Container Platform。
      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-s-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-s-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-s-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,表示排空程序 Pod 从关闭的代理 Pod 中成功迁移了 1000 个信息。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat