备份与恢复
概述
RabbitMQ 的现代版本(3.8.0+)仅支持从磁盘备份恢复到与备份数据节点完全相同的节点名称的 RabbitMQ 节点。如果使用了仲裁队列或流,则不支持节点重命名。
最好依赖其他灾难恢复解决方案,或使用单独的备用集群进行灾难恢复。VMware Tanzu RabbitMQ 提供了许多扩展功能,用于将数据热备复制到专用的灾难恢复集群。
本指南涵盖了 RabbitMQ 节点可能包含的各种类型数据的备份和恢复过程。
两种节点数据类型
每个 RabbitMQ 节点都有一个数据目录,用于存储驻留在该节点上的所有信息。
数据目录包含两种类型的数据:定义(元数据、模式/拓扑)和消息。
定义(拓扑)
节点和集群存储可以视为模式、元数据或拓扑的信息。用户、虚拟主机、队列、交换机、绑定、运行时参数都属于此类。
定义可以导出和导入为 JSON 文件。
定义存储在内部数据库中,并在所有集群节点之间复制。集群中的每个节点都有其自身的所有定义副本。当定义的一部分发生更改时,更新将在所有节点上以单个事务执行。在备份的上下文中,这意味着实际上可以从任何集群节点导出定义,结果相同。
消息
每个节点都有自己的数据目录,并存储在该节点上托管成员的队列和流的消息。消息存储在节点数据目录的子目录中。
每种队列类型都有自己的子目录
msg_stores
包含经典队列消息。quorum
包含仲裁队列消息。stream
包含流消息。
数据生命周期
定义通常大多是静态的,而消息则不断地从发布者流向消费者。
执行备份时,第一步是确定是否仅备份定义或也备份消息存储。由于消息通常是短暂的,并且可能是瞬态的,因此强烈建议不要在正在运行的节点下备份它们,因为这可能导致数据快照不一致。
定义只能从正在运行的节点备份。
备份定义
定义可以导出到 JSON 文件。这是推荐的备份方法。
导出定义
定义导出在专门的定义指南中介绍。
导入定义
定义导入在专门的定义指南中介绍。
导入定义文件足以创建具有相同定义集(例如用户、虚拟主机、权限、策略、拓扑等)的代理。
手动备份定义
定义存储在位于节点数据目录中的内部数据库中。要获取目录路径,请对正在运行的 RabbitMQ 节点运行以下命令
rabbitmq-diagnostics status | grep -A 2 -B 2 "Node data directory"
如果节点未运行,则可以检查默认数据目录。
- 对于 Debian 和 RPM 软件包:
/var/lib/rabbitmq/mnesia
- 对于 Windows:
%APPDATA%\RabbitMQ\db
- 对于通用二进制构建:
{installation_root}/var/lib/rabbitmq/mnesia
上述数据目录还将在子目录中包含消息存储数据。如果您不想复制消息,请跳过复制消息目录。
从手动定义备份恢复
要执行恢复,新节点将使用备份目录和原始节点名称启动。然后,节点应根据需要执行升级步骤并继续引导。
备份消息
要备份节点上的消息,它**必须先停止**。
对于具有复制队列的集群,强烈建议在一段时间内停止整个集群以进行备份。如果改为一次停止一个节点,队列可能会累积重复项,就像备份单个正在运行的节点时一样。
如果大部分集群节点快速停止,仲裁队列可能会失去可用性,从而导致错过一小部分最近发布到它们的消息。
手动备份消息
目前,这是备份消息的唯一方法。您可以复制上面提到的文件夹。
从手动消息备份恢复
当节点引导时,它将计算其数据目录位置并恢复消息。要恢复消息,代理应已准备好所有定义。未知虚拟主机和队列的消息数据将不会加载,并且可以由节点删除。因此,在手动备份消息目录时,务必确保目标节点(正在进行恢复的节点)上已准备好定义,这可以通过导入定义文件或备份整个节点数据目录来实现。
如果节点的数据目录已手动备份(复制),则该节点应启动所有定义和消息。无需先导入定义。