管理 RabbitMQ 定义
RabbitMQ 定义描述了 broker 配置,例如 virtual hosts、用户、权限、exchanges、queues、bindings、policies、运行时参数和 operator policies。使用定义来在不同环境之间审查、提升或初始化拓扑和安全配置。
定义管理不是完整的备份和恢复机制。定义不包含 queue 内容、持久消息存储、stream 数据、Kubernetes 资源、存储在 RabbitMQ 之外的 TLS 私钥,或应用程序配置。
适用场景
当您需要以下操作时,请使用定义管理:
- 在不同环境之间迁移经过审核的拓扑和访问控制定义。
- 使用相同的 virtual hosts、用户、权限、exchanges、queues、bindings、policies 和运行时参数初始化灾难恢复集群。
- 将经过脱敏的 RabbitMQ 拓扑存储为可审计的配置制品。
- 将当前 broker 拓扑与预期拓扑进行比较。
不要将定义导出和导入用作恢复排队消息的方式。
选择导出范围
Definitions 导出可以是集群级或按 virtual host 范围导出:
导出文件中的具体键取决于 RabbitMQ 版本和导出范围。在导入之前,请始终检查生成的 JSON。
导出定义
集群级导出
当您需要同时导出拓扑和访问控制定义时,请执行集群级导出:
rabbitmqadmin \
--host <management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
export rabbitmq-definitions.json
您也可以从 RabbitMQ Pod 中导出:
kubectl -n <namespace> exec <instance-name>-server-0 -- \
rabbitmqctl export_definitions /tmp/rabbitmq-definitions.json
仅当您的运维流程需要本地副本时,才从 Pod 中复制该文件:
kubectl -n <namespace> cp \
<instance-name>-server-0:/tmp/rabbitmq-definitions.json \
./rabbitmq-definitions.json
单 virtual host 导出
当目标 virtual host、用户和权限已分别管理时,请使用单 virtual host 导出:
rabbitmqadmin \
--host <management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
--vhost payments \
export payments-topology.json
在 RabbitMQ 3.8.16 中,按 vhost 范围导出的内容包含诸如 exchanges、queues、bindings、parameters 和 policies 等拓扑键,但不包括用户、权限或 virtual host 记录。在依赖该文件之前,请先验证您环境中的输出。
导入前审查定义
在将定义导入到另一个集群之前,请检查文件是否包含以下内容:
- 特定于站点的上游 URI、Shovel 参数、Federation 参数或 policies。
- 不应存在于目标环境中的用户或权限。
- 在不同环境之间应有所区别的 queue 参数,例如消息 TTL 或 queue 长度限制。
- 引用主站点主机名的运行时参数。
- 必须受保护的密码哈希和其他敏感值。
将审查后的文件存储在受控位置。如果您将定义提交到 Git,请先移除环境相关值和密钥。
导入定义
将审查后的文件导入到目标 RabbitMQ 集群:
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
import rabbitmq-definitions.json
如果该文件是为单个 virtual host 导出的,请在导入时包含相同的目标 virtual host:
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
--vhost payments \
import payments-topology.json
从 Pod 内部导入时,请先将文件放入 Pod,然后运行:
kubectl -n <namespace> exec <instance-name>-server-0 -- \
rabbitmqctl import_definitions /tmp/rabbitmq-definitions.json
验证已导入的定义
验证拓扑:
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
--vhost payments \
list exchanges name type durable
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
--vhost payments \
list queues name durable policy arguments
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
--vhost payments \
list bindings source_name destination_name routing_key
如果您导入的是集群级定义,还需要验证访问控制对象:
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
list vhosts name
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
list users name tags
rabbitmqadmin \
--host <target-management-host> \
--port 15672 \
--username <admin-user> \
--password <admin-password> \
list permissions user vhost configure write read
相关信息