更新时间:2026-10-28 GMT+08:00
分享

迁移RabbitMQ业务

RabbitMQ业务迁移主要涉及到以下两个场景:

  • 将线下单机或集群实例迁移到线上RabbitMQ实例。
  • 将低版本的RabbitMQ实例迁移到高版本的RabbitMQ实例,例如将3.7.17版本的RabbitMQ实例迁移到3.8.35版本的RabbitMQ实例。

当业务规模增长需要更高可用性,或原版本存在安全漏洞需要升级时,可进行实例迁移。直接迁移会导致消息丢失和业务中断,通过双读模式可以实现业务无感迁移,确保迁移过程中消息不丢失、业务不中断。本文档适用于需要迁移RabbitMQ业务的运维人员和开发者。

迁移原理

在实际业务场景中,RabbitMQ实例存在多个生产者和消费者,在业务迁移时,不会迁移数据,只是通过逐个增加/关闭消费者、生产者的方式迁移实例,这种迁移方式可以实现业务无感迁移。整体迁移架构如图1 整体迁移架构图所示:

图1 整体迁移架构图
  • 双读模式说明

    双读模式是指在迁移过程中,新旧两个RabbitMQ实例同时对外提供消费服务,详细说明如下:

    1. 旧实例继续提供消费:旧消费者保持与原实例的连接不变,继续消费原实例队列中尚未处理完的存量消息。只要连接不断开,队列和消息持续存在,旧消费者可以安全地消费完队列中的剩余消息。
    2. 新实例接收新消息:生产者逐步将新消息发送到目标实例,新消费者连接目标实例消费新到达的消息。
    3. 旧消费者自动退出:当原实例队列中的消息全部被消费确认后,旧消费者确认队列为空,主动关闭连接并下线。此时原实例不再有消息积压,可安全释放资源。
  • 元数据说明

    RabbitMQ的元数据是描述系统结构、配置和权限的信息,包括VHost、Exchange、Queue、用户、绑定和策略等。元数据不是消息的具体内容。

前提条件

  • 已创建目标RabbitMQ实例,具体请参考购买RabbitMQ实例。
  • 已确认业务使用的队列不是排他队列,排他队列因与连接绑定无法完成元数据迁移。

双读模式迁移实例

  1. 将原RabbitMQ实例的元数据迁移到目标RabbitMQ实例。

    图2 迁移元数据

    迁移步骤如下:

    1. 登录原RabbitMQ的WebUI页面,在“Overview”页签中,单击“Download broker definitions”,导出元数据。
      图3 导出元数据
    2. 登录目标RabbitMQ的WebUI页面,在“Overview”页签中,单击“选择文件”,选择上一步中导出的元数据,单击“Upload broker definitions”,上传元数据。
      图4 导入元数据

  2. 为目标RabbitMQ实例添加新的消费者,准备消费目标实例的消息。

    图5 添加新消费者

  3. 为目标RabbitMQ实例添加新的生产者,下线原RabbitMQ实例的生产者,旧的消费者继续消费原RabbitMQ实例中的消息。

    图6 迁移生产者

  4. 确认原RabbitMQ实例的全部消息是否消费完成。确认方法如下:

    • 在原RabbitMQ实例的WebUI页面查看,如图7所示。

      Overview视图中,可消费消息数(Ready)以及未确认的消息数(Unacked)都为0时,说明消费完成。

      图7 RabbitMQ WebUI
    • 调用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 回显信息

  5. 确认旧的消费者消费完原RabbitMQ实例的全部消息后,下线旧的消费者和原RabbitMQ实例。

    下线旧消费者并释放原实例资源前请务必确认以下事项:

    • 原实例所有队列中的消息已全部消费完毕,即messages_ready和messages_unacknowledged均为0。
    • 所有生产者已切换到目标实例,原实例不再有新消息到达(Publish rate为0)。
    • 已确认原实例中无需保留的消息或已完成数据备份。
    • 误操作可能导致未消费的消息永久丢失,且无法恢复。
    图9 下线旧的消费者和原RabbitMQ实例

  6. 确认所有业务消息正常通过目标实例流转,则迁移完成。

相关文档