管理 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 范围导出:

范围包含内容适用场景
集群级导出virtual hosts、用户、权限、exchanges、queues、bindings、policies、运行时参数以及相关的 broker 定义。您正在准备一个必须同时包含拓扑和访问控制定义的新环境或 DR 集群。
单 virtual host 导出仅限一个 virtual host 范围内的定义,例如 exchanges、queues、bindings、policies 和参数。用户、权限以及目标 virtual host 已经存在,您只需要为该 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

相关信息