跳到主要内容
版本:4.1

Schema 定义导出和导入

概述

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

定义可以 导出 到文件,然后 导入 到另一个集群中,或用于 schema 备份 或数据播种。

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

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 http://{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 http://{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 http://{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

启动时定义导入的细微之处

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

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

如果空白(未初始化)节点导入定义文件,它将不会创建默认虚拟主机和用户。在 测试或 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
© . All rights reserved.