模式定义导出和导入
概述
节点和集群存储的信息可以被认为是模式、元数据或拓扑。用户、虚拟主机、队列、交换机、绑定、运行时参数都属于此类。在 RabbitMQ 的术语中,此元数据称为**定义**。
定义可以导出到文件,然后导入到另一个集群,或用于模式备份或数据填充。
定义存储在内部数据库中,并在所有集群节点之间复制。集群中的每个节点都拥有所有定义的自己的副本。当定义的一部分发生更改时,更新将在所有节点上以单个事务执行。这意味着在实践中,可以从任何集群节点导出定义并获得相同的结果。
VMware Tanzu RabbitMQ 支持温备复制到远程集群,这使得运行一个用于灾难恢复的温备集群变得容易。
建议在节点启动时导入定义,以此方式在部署时预配置节点。
定义导出
定义以 JSON 文件的形式导出,有多种方法。
rabbitmqctl export_definitions
是唯一一个不需要启用管理插件的选项GET /api/definitions
API 端点rabbitmqadmin export
使用上述 HTTP API 端点- 概述页面上有一个定义面板
可以为特定的虚拟主机或整个集群(所有虚拟主机)导出定义。当仅为一个虚拟主机导出定义时,某些信息(其他虚拟主机的内容或任何用户对目标虚拟主机都没有权限的用户)将从导出的文件中排除。
导出的用户数据包含密码哈希以及密码哈希函数信息。虽然使用 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_backend
和 definitions.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