跳至主要内容
版本:4.0

模式定义导出和导入

概述

节点和集群存储的信息可以被认为是模式、元数据或拓扑。用户、虚拟主机、队列、交换机、绑定、运行时参数都属于此类。在 RabbitMQ 的术语中,此元数据称为**定义**。

定义可以导出到文件,然后导入到另一个集群,或用于模式备份或数据填充。

定义存储在内部数据库中,并在所有集群节点之间复制。集群中的每个节点都拥有所有定义的自己的副本。当定义的一部分发生更改时,更新将在所有节点上以单个事务执行。这意味着在实践中,可以从任何集群节点导出定义并获得相同的结果。

VMware Tanzu RabbitMQ 支持温备复制到远程集群,这使得运行一个用于灾难恢复的温备集群变得容易。

建议在节点启动时导入定义,以此方式在部署时预配置节点

定义导出

定义以 JSON 文件的形式导出,有多种方法。

可以为特定的虚拟主机或整个集群(所有虚拟主机)导出定义。当仅为一个虚拟主机导出定义时,某些信息(其他虚拟主机的内容或任何用户对目标虚拟主机都没有权限的用户)将从导出的文件中排除。

导出的用户数据包含密码哈希以及密码哈希函数信息。虽然使用 SHA-256 或 SHA-512 等哈希函数暴力破解密码并非一项完全微不足道的任务,但用户记录应被视为敏感信息

要使用rabbitmqctl导出定义,请使用 rabbitmqctl export_definitions

# Does not require management plugin to be enabled
rabbitmqctl export_definitions /path/to/definitions.file.json

rabbitmqadmin export 非常相似,但它使用 HTTP API 并且与旧版本兼容

# Requires management plugin to be enabled
rabbitmqadmin export /path/to/definitions.file.json

在此示例中,GET /api/definitions 端点直接用于导出集群中所有虚拟主机的定义

# Requires management plugin to be enabled,
# placeholders are used for credentials and hostname.
# Use HTTPS when possible.
curl -u {username}:{password} -X GET https://{hostname}:15672/api/definitions

上述 API 端点的响应可以传递给jq和类似工具,以获得更人性化的格式

# Requires management plugin to be enabled,
# placeholders are used for credentials and hostname.
# Use HTTPS when possible.
#
# jq is a 3rd party tool that must be available in PATH
curl -u {username}:{password} -X GET https://{hostname}:15672/api/definitions | jq

定义导入

要使用rabbitmqctl导入定义,请使用 rabbitmqctl import_definitions

# Does not require management plugin to be enabled
rabbitmqctl import_definitions /path/to/definitions.file.json

rabbitmqadmin import 是其 HTTP API 等效项

# Requires management plugin to be enabled
rabbitmqadmin import /path/to/definitions.file.json

也可以直接使用 POST /api/definitions API 端点

# Requires management plugin to be enabled,
# placeholders are used for credentials and hostname.
# Use HTTPS when possible.
curl -u {username}:{password} -H "Content-Type: application/json" -X POST -T /path/to/definitions.file.json https://{hostname}:15672/api/definitions

节点启动时导入定义

可以在节点启动期间或之后导入定义文件。在多节点集群中,启动时导入可能会导致节点在启动时执行重复的工作。对于较小的定义文件,这无关紧要,但对于较大的文件,建议在集群部署(形成)后在节点启动后导入定义

现代版本支持直接在核心导入定义,而无需预配置管理插件

要在节点启动时从本地文件导入定义,请将 definitions.local.path 配置键指向之前导出的包含定义的 JSON 文件的路径。

# Does not require management plugin to be enabled.
definitions.import_backend = local_filesystem
definitions.local.path = /path/to/definitions/defs.json

可以在节点启动时从通过 HTTPS 可访问的 URL 导入定义。将 definitions.import_backenddefinitions.https.url 配置键设置为 https 和 JSON 定义所在的有效 URL。

# Does not require management plugin to be enabled.
definitions.import_backend = https
definitions.https.url = https://raw.githubusercontent.com/rabbitmq/sample-configs/main/queues/5k-queues.json
# client-side TLS options for definition import
definitions.tls.versions.1 = tlsv1.2

启动时导入定义的细微差别

定义导入发生在插件激活之后。这意味着与插件相关的定义(例如动态铲子、自定义类型的交换机等)可以在启动时导入。

文件中的定义不会覆盖代理中已有的任何内容。

如果一个空白(未初始化)节点导入定义文件,它将不会创建默认的虚拟主机和用户。在测试或 QA环境中,可以通过同一个定义文件创建等效的默认用户。

对于生产系统,必须创建一个具有唯一凭据的新用户并使用它。

以下代码段演示了如何修改定义文件以“重新创建”默认用户,该用户默认情况下只能从 localhost 连接

    "users": [
{
"name": "guest",
"password_hash": "9/1i+jKFRpbTRV1PtRnzFFYibT3cEpP92JeZ8YKGtflf4e/u",
"tags": ["administrator"]
}
],
"permissions":[
{
"user":"guest",
"vhost":"/",
"configure":".*",
"read":".*",
"write":".*"}
],

如果定义内容未更改,请避免启动时导入

默认情况下,每个集群节点都会无条件地导入定义。在许多环境中,定义文件很少更改。在这种情况下,只有当定义文件内容实际发生更改时才执行导入才有意义。

这可以通过将 definitions.skip_if_unchanged 配置键设置为 true 来完成

# when set to true, definition import will only happen
# if definition file contents change
definitions.skip_if_unchanged = true

definitions.import_backend = local_filesystem
definitions.local.path = /path/to/definitions/defs.json

此功能适用于单个文件和目录

# when set to true, definition import will only happen
# if definition file contents change
definitions.skip_if_unchanged = true

definitions.import_backend = local_filesystem
definitions.local.path = /path/to/definitions/conf.d/

HTTPS 端点导入机制也支持它

# when set to true, definition import will only happen
# if definition file contents change
definitions.skip_if_unchanged = true

definitions.import_backend = https
definitions.https.url = https://some.endpoint/path/to/rabbitmq.definitions.json

definitions.tls.verify = verify_peer
definitions.tls.fail_if_no_peer_cert = true

definitions.tls.cacertfile = /path/to/ca_certificate.pem
definitions.tls.certfile = /path/to/client_certificate.pem
definitions.tls.keyfile = /path/to/client_key.pem

节点启动后导入定义

使用较早版本(不提供内置定义导入)的安装可以在节点启动后立即使用两个 CLI 命令的组合导入定义

# await startup for up to 5 minutes
rabbitmqctl await_startup --timeout 300

# import definitions using rabbitmqctl
rabbitmqctl import_definitions /path/to/definitions.file.json

# OR, import using rabbitmqadmin
# Requires management plugin to be enabled
rabbitmqadmin import /path/to/definitions.file.json
© 2024 RabbitMQ. All rights reserved.