跳至主要内容
版本:4.0

备份与恢复

概述

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

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

从手动定义备份恢复

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

备份消息

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

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

如果大部分集群节点快速停止,仲裁队列可能会失去可用性,从而导致错过一小部分最近发布到它们的消息。

手动备份消息

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

从手动消息备份恢复

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

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

© 2024 RabbitMQ. All rights reserved.