跳到主要内容
版本:4.1

备份和恢复

概述

新版本的 RabbitMQ (3.8.0+) 仅支持从磁盘备份恢复,且必须恢复到节点名称与备份数据节点的节点名称完全相同的 RabbitMQ 节点。如果使用了仲裁队列或流,则不支持节点重命名。

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

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

两种类型的节点数据

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

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

定义(拓扑)

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

定义可以作为 JSON 文件导出和导入

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

消息

每个节点都有自己的数据目录,并存储队列和流的消息,这些队列和流的成员托管在该节点上。消息存储在节点数据目录的子目录中。

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

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

数据生命周期

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

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

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

备份定义

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

导出定义

定义导出在专门的定义指南中介绍。

导入定义

定义导入在专门的定义指南中介绍。

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

手动备份定义

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

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

从手动定义备份恢复

要执行恢复,新节点使用备份的目录和原始节点名称启动。然后,节点应根据需要执行升级步骤并继续启动。

备份消息

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

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

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

手动备份消息

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

从手动消息备份恢复

当节点启动时,它将计算其数据目录位置并恢复消息。为了恢复消息,broker 应该已经具备所有定义。未知虚拟主机和队列的消息数据将不会被加载,并且可以被节点删除。因此,当手动备份消息目录时,务必确保定义已在目标节点(正在进行恢复的节点)上可用,可以通过导入定义文件或备份整个节点数据目录来实现。

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

© . All rights reserved.