RabbitMQ 数据迁移¶
RabbitMQ 的数据包括元数据(RabbitMQ 用户、vhost、队列、交换和绑定)和消息数据,其中消息数据存储在单独的消息存储库中。
由于业务需要,要求把 rabbitmq-cluster-a 集群上的数据迁移到 rabbitmq-cluster-b 集群上。
数据迁移步骤¶
Info
从 V3.7.0 开始,RabbitMQ 将所有消息数据存储在 msg_stores/vhosts 目录中,并存储在每个 vhost 的子目录中。 每个 vhost 目录都以哈希命名,并包含一个带有 vhost 名称的 .vhost 文件,因此可以单独备份特定 vhost 的消息集。 了解更多信息。
RabbitMQ 数据迁移,可以采用如下两种方案:
- 方案一:不迁移数据,先切换生产端,再切换消费端。
- 方案二:先迁移数据,然后同时切换生产端和消费端。
方案一¶
不迁移数据,先切换生产端,再切换消费端。
操作流程¶
- 将消息生产端切换到集群 rabbitmq-cluster-b ,不再生产消息到 rabbitmq-cluster-a 集群中。
- 消费端同时消费 rabbitmq-cluster-a 和 rabbitmq-cluster-b 集群中的消息。当 rabbitmq-cluster-a 集群中消息全部消费完后,将消息消费端切换到 rabbitmq-cluster-b 集群中,完成数据迁移。
验证方法¶
-
在 RabbitMQ Management Web UI 页面查看。
-
调用 API 查看
参数说明:
- username:使用 rabbitmq-cluster-a 集群的 RabbitMQ Management WebUI 的帐号
- password:使用 rabbitmq-cluster-a 集群的 RabbitMQ Management WebUI 的密码
- ip:使用 rabbitmq-cluster-a 集群的 RabbitMQ Management WebUI 的 IP 地址
- port:使用 rabbitmq-cluster-a 集群的 RabbitMQ Management WebUI 的端口号
-
在 Overview 视图中,消费消息数(Ready)以及未确定的消息数(Unacked)都为 0,说明消费完成。
方案二¶
先迁移数据,然后同时切换生产端和消费端。借助 shove 插件完成数据迁移。
shovel 迁移数据的原理是消费 rabbitmq-cluster-a 集群中的消息,将消息生产到 rabbitmq-cluster-b 集群中,迁移后 rabbitmq-cluster-a 集群中的消息被清空,建议离线迁移,业务会出现中断。
rabbitmq-cluster-a 和 rabbitmq-cluster-b 均需要开启并配置 shovel 插件。
启用 shovel¶
开启插件¶
-
进入 中间件 -> RabbitMQ 的实例列表,进入 rabbitmq-cluster-a 的概览页面点击 控制台 按钮;
-
执行以下命令,该过程可能会持续一两分钟:
-
进入 RabbitMQ 管理平台,在 admin 页签下可以看到 shovel 相关的插件信息。
进入实例 rabbitmq-cluster-b 的概览页面,再次执行以上操作。
基本配置¶
参数说明:
- Name: 配置 shovel 的名称。
- Source: 指定协议类型、连接的源集群地址,源端的类型。
- Prefech count: 表示 shovel 内部缓存(从源端集群到目的实例之间的缓存部分)的消息条数。
- Auto-delete: 默认为 Never,表示不删除本集群消息,如果设置为 After initial length transferred ,则在消息转移完成后删除。
- Destination: 指定协议类型,连接目标集群地址,目标端的类型。
- Add forwarding headers: 设置为 true ,则会在转发的消息内添加 x-shovelled 的 header 属性。
- Reconnect delay:指定在 Shovel link 失效的情况下,重新建立连接前需要等待的时间,单位为秒。如果设置为 0,则不会进行重连动作,即 Shovel 会在首次连接失效时停止工作。默认为 5 秒。
-
Acknowledgement mode:参考 Federation 的配置。
- no ack 表示无须任何消息确认行为;
- on publish 表示 Shovel 会把每一条消息发送到目的端之后再向源端发送消息确认;
- on confirm 表示 Shovel 会使用 publisher confirm 机制,在收到目的端的消息确认之后再向源端发送消息确认。
Note
服务地址(图中的 3 和 4)设置格式:amqp://用户名:密码@{rabbitmq服务地址}
下图是一个简单的配置示例
启动迁移¶
迁移任务将自动启动,当 shovel 状态为 running 时,表示迁移开始,如下图所示。
迁移前后观察两个集群的队列状态,可明显看到数据迁移变化:
-
迁移启动前 rabbitmq-cluster-a 集群消息情况。
-
迁移启动后 rabbitmq-cluster-a 集群消息情况,可见队列消息已迁出。
-
迁移启动后 rabbitmq-cluster-b 集群消息情况,可见队列消息已迁入该集群。
数据迁移完成后,即可将生产端、消费端切换至 rabbitmq-cluster-b 集群中,完成迁移过程。