迁移RabbitMQ业务
RabbitMQ业务迁移主要涉及到以下两个场景:
- 将线下单机或集群实例迁移到线上RabbitMQ实例。
- 将低版本的RabbitMQ实例迁移到高版本的RabbitMQ实例,例如将3.7.17版本的RabbitMQ实例迁移到3.8.35版本的RabbitMQ实例。
当业务规模增长需要更高可用性,或原版本存在安全漏洞需要升级时,可进行实例迁移。直接迁移会导致消息丢失和业务中断,通过双读模式可以实现业务无感迁移,确保迁移过程中消息不丢失、业务不中断。本文档适用于需要迁移RabbitMQ业务的运维人员和开发者。
迁移原理
在实际业务场景中,RabbitMQ实例存在多个生产者和消费者,在业务迁移时,不会迁移数据,只是通过逐个增加/关闭消费者、生产者的方式迁移实例,这种迁移方式可以实现业务无感迁移。整体迁移架构如图1 整体迁移架构图所示:
- 双读模式说明
双读模式是指在迁移过程中,新旧两个RabbitMQ实例同时对外提供消费服务,详细说明如下:
- 旧实例继续提供消费:旧消费者保持与原实例的连接不变,继续消费原实例队列中尚未处理完的存量消息。只要连接不断开,队列和消息持续存在,旧消费者可以安全地消费完队列中的剩余消息。
- 新实例接收新消息:生产者逐步将新消息发送到目标实例,新消费者连接目标实例消费新到达的消息。
- 旧消费者自动退出:当原实例队列中的消息全部被消费确认后,旧消费者确认队列为空,主动关闭连接并下线。此时原实例不再有消息积压,可安全释放资源。
- 元数据说明
RabbitMQ的元数据是描述系统结构、配置和权限的信息,包括VHost、Exchange、Queue、用户、绑定和策略等。元数据不是消息的具体内容。
前提条件
- 已创建目标RabbitMQ实例,具体请参考购买RabbitMQ实例。
- 已确认业务使用的队列不是排他队列,排他队列因与连接绑定无法完成元数据迁移。
双读模式迁移实例
- 将原RabbitMQ实例的元数据迁移到目标RabbitMQ实例。 图2 迁移元数据
迁移步骤如下:
- 登录原RabbitMQ的WebUI页面,在“Overview”页签中,单击“Download broker definitions”,导出元数据。 图3 导出元数据
- 登录目标RabbitMQ的WebUI页面,在“Overview”页签中,单击“选择文件”,选择上一步中导出的元数据,单击“Upload broker definitions”,上传元数据。 图4 导入元数据
- 登录原RabbitMQ的WebUI页面,在“Overview”页签中,单击“Download broker definitions”,导出元数据。
- 为目标RabbitMQ实例添加新的消费者,准备消费目标实例的消息。 图5 添加新消费者
- 为目标RabbitMQ实例添加新的生产者,下线原RabbitMQ实例的生产者,旧的消费者继续消费原RabbitMQ实例中的消息。 图6 迁移生产者
- 确认原RabbitMQ实例的全部消息是否消费完成。确认方法如下:
- 在原RabbitMQ实例的WebUI页面查看,如图7所示。
Overview视图中,可消费消息数(Ready)以及未确认的消息数(Unacked)都为0时,说明消费完成。
- 调用API查看。
curl -s -u username:password -XGET http://ip:port/api/overview
表1 参数说明 参数名称
说明
username
原实例登录RabbitMQ WebUI的账号。
password
原实例登录RabbitMQ WebUI的密码。
ip
原实例登录RabbitMQ WebUI的IP地址。
port
原实例登录RabbitMQ WebUI的端口号。
回显信息中“messages_ready”和“messages_unacknowledged”都为0时,说明消费完成。
图8 回显信息
- 在原RabbitMQ实例的WebUI页面查看,如图7所示。
- 确认旧的消费者消费完原RabbitMQ实例的全部消息后,下线旧的消费者和原RabbitMQ实例。
下线旧消费者并释放原实例资源前请务必确认以下事项:
- 原实例所有队列中的消息已全部消费完毕,即messages_ready和messages_unacknowledged均为0。
- 所有生产者已切换到目标实例,原实例不再有新消息到达(Publish rate为0)。
- 已确认原实例中无需保留的消息或已完成数据备份。
- 误操作可能导致未消费的消息永久丢失,且无法恢复。
图9 下线旧的消费者和原RabbitMQ实例
- 确认所有业务消息正常通过目标实例流转,则迁移完成。

