4.16. 启用消息迁移以支持集群缩减
如果要缩减集群中的代理数量,并将信息迁移到集群中的剩余的 Pod,则必须启用消息迁移。
当您缩减启用了消息迁移的集群时,缩减控制器会管理消息迁移过程。
4.16.1. 消息迁移过程的步骤 复制链接链接已复制到粘贴板!
消息迁移过程遵循以下步骤:
- 当部署中的代理 Pod 因有意缩减部署而关闭时,Operator 会自动部署 scaledown 自定义资源以准备消息迁移。
要检查已孤立的持久性卷(PV),scaledown 控制器会查看卷声明的普通卷(PV)。控制器将卷声明中的普通与仍然在 StatefulSet (即代理集群)中运行的代理 Pod 进行对比。
如果卷声明中的普通对象高于代理集群中仍在运行的任何代理 Pod 上,则缩减控制器决定代理 Pod 已关闭,并且该消息数据必须迁移到另一个代理 Pod。
- 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 节 “启用消息迁移”。
4.16.2. 启用消息迁移 复制链接链接已复制到粘贴板!
您可以在 ActiveMQArtemis
自定义资源(CR)中启用消息迁移。
先决条件
- 您已有基本代理部署。请参阅 第 3.4.1 节 “部署基本代理实例”。
- 您了解消息迁移的工作方式。更多信息请参阅 第 4.16.1 节 “消息迁移过程的步骤”。
- 缩减控制器仅在单一 OpenShift 项目中运行。控制器无法在不同项目中的代理间迁移消息。
- 如果您将代理部署缩减为 0 (零),则不会发生消息迁移,因为没有可迁移消息传递数据的代理 Pod。但是,如果您将部署缩减为零,然后备份到小于原始部署的大小,则会为仍关闭的代理启动排空程序 Pod。
流程
编辑代理部署的 CR 实例。
使用 OpenShift 命令行界面:
- 以有权在代理部署的项目中部署 CR 的用户身份登录 OpenShift Container Platform。
编辑部署的 CR。
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
oc edit ActiveMQArtemis <CR instance name> -n <namespace>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 OpenShift Container Platform Web 控制台:
- 以有权在代理部署的项目中部署 CR 的用户身份登录 OpenShift Container Platform。
-
在左侧窗格中,单击
。 - 单击 ActiveMQArtemis CRD。
- 点 实例 选项卡。
- 点代理部署的实例。
点 YAML 标签。
在控制台中,会打开 YAML 编辑器,允许您编辑 CR 实例。
在 CR 的
deploymentPlan
部分中,添加一个messageMigration
属性,并设置为true
。如果尚未配置,请添加persistenceEnabled
属性,并设置为true
。例如:spec: deploymentPlan: messageMigration: true persistenceEnabled: true ...
spec: deploymentPlan: messageMigration: true persistenceEnabled: true ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这些设置意味着,当您稍后缩减集群代理部署的大小时,Operator 会自动启动一个 scaledown 控制器,并将信息迁移到仍然运行的代理 Pod。
- 保存 CR。
(可选)完成以下步骤来缩减集群并查看消息迁移过程。
在现有代理部署中,验证哪些 Pod 正在运行。
oc get pods
$ oc get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您会看到类似如下的输出:
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
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 Copied! Toggle word wrap Toggle overflow 前面的输出显示,有三个 Pod 正在运行;一个用于代理 Operator 本身,另一个用于部署中每个代理的独立 Pod。
登录到每个 Pod 并将一些消息发送到每个代理。
使用 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
$ /opt/amq/bin/artemis producer --url tcp://172.17.0.6:61616 --user admin --password admin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
使用 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
$ /opt/amq/bin/artemis producer --url tcp://172.17.0.7:61616 --user admin --password admin
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 前面的命令在每个代理上创建一个名为
TEST
的队列,并将 1000 个消息添加到每个队列。将集群从两个代理扩展到一。
-
打开主代理 CR
broker_activemqartemis_cr.yaml
。 -
在 CR 中,将
deploymentPlan.size
设置为1
。 在命令行中应用更改:
oc apply -f deploy/crs/broker_activemqartemis_cr.yaml
$ oc apply -f deploy/crs/broker_activemqartemis_cr.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您会看到 Pod
ex-aao-s-1
启动关闭。scaledown 控制器启动相同名称的新 drainer Pod。这个 drainer Pod 也会在将信息从代理 Podex-ao-s-1
中迁移到集群(ex-aao-ss-0
)中的其他代理 Pod 中后关闭。
-
打开主代理 CR
-
当 drainer Pod 关闭时,检查代理 Pod
ex-aao-ss-0
的TEST
队列中的消息计数。您可以看到,队列中的消息数量为 2000,表示排空程序 Pod 从关闭的代理 Pod 中成功迁移了 1000 个信息。