跳至主内容
版本:4.2

备份与恢复

概述

RabbitMQ 的现代版本(3.8.0+)仅支持在与备份时完全相同的节点名下从磁盘进行备份恢复。如果使用了仲裁队列或流,则不支持节点重命名。

最好依赖其他灾难恢复解决方案,或使用单独的备用集群进行灾难恢复。 VMware Tanzu RabbitMQ 提供了许多用于热备副本到专用灾难恢复集群的扩展。

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

节点数据的两种类型

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

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

定义(拓扑)

节点和集群存储的信息可以被认为是模式、元数据或拓扑。用户、vhost、队列、交换器、绑定、运行时参数都属于此类。

定义可以以 JSON 文件格式 导出和导入

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

消息

每个节点都有自己的数据目录,并存储在其上承载成员的队列和流的消息。消息存储在节点数据目录的子目录中。

每种队列类型都有自己的子目录

  • msg_stores 包含经典队列的消息。
  • quorum 包含仲裁队列的消息。
  • stream 包含流的消息。

数据生命周期

定义通常是相对静态的,而消息则不断地从发布者流向消费者。

执行备份时,第一步是决定是仅备份定义还是同时备份消息存储。由于消息通常是短暂的且可能是暂时的,因此强烈建议不要在运行的节点下备份它们,这可能导致数据快照不一致。

定义只能从正在运行的节点备份。

备份定义

定义可以导出到 JSON 文件。这是推荐的备份方式。

导出定义

定义导出涵盖在专门的 定义指南 中。

导入定义

定义导入涵盖在专门的 定义指南 中。

导入定义文件足以创建一个具有相同定义集(例如,用户、vhost、权限、策略、拓扑等)的代理。

手动备份定义

定义存储在节点数据目录中的内部数据库中。要获取目录路径,请针对正在运行的 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

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

从手动定义备份恢复

要执行恢复,新节点将以备份的目录和原始节点名启动。然后,节点应执行必要的升级步骤并继续启动。

备份消息

要在节点上备份消息,必须先停止该节点

对于带有 复制队列 的集群,强烈建议在一段时间内停止整个集群以进行备份。如果一次只停止一个节点,队列可能会累积重复项,就像备份单个运行节点一样。

如果集群节点的大多数被快速停止,仲裁队列可能会失去可用性,并因此丢失少量最近发布到它们的消息。

手动备份消息

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

从手动消息备份恢复

当节点启动时,它将计算其数据目录位置并恢复消息。要恢复消息,代理应该已经拥有所有定义。未知 vhost 和队列的消息数据将不会被加载,并且可以被节点删除。因此,在手动备份消息目录时,确保目标节点(正在恢复的节点)上已提供定义非常重要,这可以通过导入定义文件或备份整个节点数据目录来实现。

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

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