跳至主内容
版本:4.3

备份与恢复

概述

现代版本的 RabbitMQ (3.8.0+) 仅支持将磁盘备份恢复到节点名称与备份来源节点完全相同的 RabbitMQ 节点上。如果使用了仲裁队列(Quorum Queues)或流(Streams),则不支持节点重命名。

建议优先采用其他灾难恢复解决方案,或使用独立的备用集群进行灾难恢复。VMware Tanzu RabbitMQ 提供了一系列扩展功能,可实现向专用灾难恢复集群的热备复制。

本指南涵盖了 RabbitMQ 节点可能包含的各类数据的备份与恢复流程。

两类节点数据

每个 RabbitMQ 节点都有一个数据目录,用于存储该节点上的所有信息。

数据目录包含两类数据:定义(元数据、模式/拓扑)和消息。

定义(拓扑)

节点和集群存储的信息可以看作是模式、元数据或拓扑。用户、虚拟主机(vhosts)、队列、交换机、绑定、运行时参数等都属于此类。

定义可以作为 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

上述数据目录还将在子目录中包含消息存储数据。如果您不想复制消息,请跳过复制消息目录

从手动定义备份中恢复

要执行恢复,需让新节点使用备份的目录及原始节点名称启动。随后节点应按需执行升级步骤并继续引导。

备份消息

要备份节点上的消息,**必须先停止该节点**。

对于具有复制队列的集群,强烈建议停止整个集群一段时间以进行备份。如果一次只停止一个节点,队列可能会累积重复数据,这与备份单个运行中节点的情况完全一样。

如果集群中大多数节点被迅速停止,仲裁队列可能会失去可用性,从而导致丢失一小部分最近向其发布的消息。

手动备份消息

目前这是备份消息的唯一方法。您可以复制上述文件夹

从手动消息备份中恢复

当节点启动时,它会计算其数据目录位置并恢复消息。为了使消息能够恢复,代理服务器应已具备所有定义。未知虚拟主机和队列的消息数据将不会被加载,并可能被节点删除。因此,手动备份消息目录时,务必确保目标节点(执行恢复的节点)上已存在相关定义,无论是通过导入定义文件还是备份整个节点数据目录。

如果手动备份(复制)了节点的数据目录,则节点启动时应包含所有定义和消息。无需先导入定义。

© . This site is unofficial and not affiliated with VMware.