4.9.2. 消息迁移
当集群部署中的代理因为部署失败或有意缩减而关闭时,消息迁移可确保消息传递数据的完整性。这个过程也称为 Pod 排空,指的是从已关闭的代理 Pod 中移除和重新发布信息。
- 用于执行消息迁移的 scaledown 控制器只能在单个 OpenShift 项目中运行。控制器无法在单独的项目中的代理之间迁移消息。
- 要使用消息迁移,在部署中必须至少有两个代理。默认情况下,带有两个或多个代理的代理会被集群。
对于基于 Operator 的代理部署,您可以通过在部署的主代理自定义资源中将 messageMigration
设置为 true
来启用消息迁移。
消息迁移过程按照以下步骤执行:
- 当部署中的代理 Pod 因部署失败或有意缩减而关闭时,Operator 会自动启动缩减控制器来准备消息迁移。scaledown 控制器在与代理集群相同的 OpenShift 项目名称中运行。
- scaledown controller 注册自己,并侦听与项目中持久性卷声明(PVC)相关的 Kubernetes 事件。
要检查卷声明中孤立的持久性卷(PV),scaledown 控制器会查看卷声明的ordinal。控制器将卷声明中的序数与仍在项目中 StatefulSet(即代理集群)中运行的代理 Pod 的序数进行比较。
如果卷声明中的序数大于仍在代理集群中运行的任何代理 Pod 的ordinal,缩减控制器会决定该序上的代理 Pod 已关闭,且该消息必须迁移到另一个代理 Pod。
scaledown 控制器启动一个排空程序 Pod。drainer Pod 运行代理并执行消息迁移。然后,drainer Pod 会识别一个可迁移孤立消息的替代代理 Pod。
注意您的部署中必须至少有一个代理 Pod 运行,才能进行消息迁移。
下图演示了扩展控制器(也称为 排空控制器)如何将消息迁移到正在运行的代理 Pod。
成功将消息迁移到操作代理 Pod 后,drainer Pod 会关闭,缩减控制器会删除孤立 PV 的 PVC。PV 返回到"Released"状态。
如果您将代理部署缩减为 0(零),则不会进行消息迁移,因为没有正在运行的代理 Pod 可以迁移到哪些消息传递数据。但是,如果您将部署缩减到零,然后备份到小于原始部署的大小,则会为保持关闭的代理启动排空 Pod。
其它资源
- 有关在缩减代理部署时的消息迁移示例,请参阅 在缩减时迁移消息。