更新时间:2024-04-17 GMT+08:00

RocketMQ业务迁移

应用场景

RocketMQ业务迁移主要涉及以下场景:

  • 将其他厂商的RocketMQ迁移到云上RocketMQ实例
  • 将自建的RocketMQ迁移到云上RocketMQ实例
  • 将云上一个RocketMQ实例迁移到云上另一个RocketMQ实例

迁移元数据时,主要提供以下两种迁移方法,请根据实际情况选择:

  • 方法一:通过mqadmin命令导出源实例的元数据,然后在云上RocketMQ实例中创建迁移任务
  • 方法二:导出源实例的Topic和消费组列表,然后通过脚本将Topic和消费组列表导入到云上RocketMQ实例中(适用于不支持通过mqadmin命令导出元数据的场景)

前提条件

  1. 配置网络环境

    分布式消息服务RocketMQ版实例分内网地址以及公网地址两种网络连接方式。如果使用公网地址,则消息生产与消费客户端需要有公网访问权限,并配置如下安全组。

    表1 安全组规则

    方向

    协议

    端口

    源地址

    说明

    入方向

    TCP

    8200

    0.0.0.0/0

    公网访问元数据节点的端口

    入方向

    TCP

    10100-10199

    0.0.0.0/0

    访问业务节点的端口

  2. 购买分布式消息服务RocketMQ版实例

    具体请参考购买RocketMQ实例

  3. 准备一台Linux系统的主机,在主机中安装Java Development Kit 1.8.111或以上版本,并完成环境变量配置。

实施步骤(通过mqadmin命令导出源实例的元数据)

  1. 迁移元数据至分布式消息服务RocketMQ版实例。

    1. 获取其他厂商或自建RocketMQ实例的元数据。
      1. 登录主机,下载RocketMQ软件包。
        wget https://archive.apache.org/dist/rocketmq/4.9.8/rocketmq-all-4.9.8-bin-release.zip
      2. 解压软件包。
        unzip rocketmq-all-4.9.8-bin-release.zip
      3. (可选)如果RocketMQ实例开启了ACL访问控制,执行mqadmin命令时,需要鉴权。
        切换到解压后的软件包目录下,在“conf/tools.yml”文件中,增加如下内容。
        accessKey:*******
        secretKey:*******

        accessKey和secretKey表示在控制台“用户管理”页面,创建的用户名和密钥。

      4. 进入解压后的软件包目录下,执行以下命令,查询集群名称。
        sh ./bin/mqadmin clusterList -n {nameserver地址及端口号}

        例如:“nameserver地址及端口号”为“192.168.0.65:8100”。

        sh ./bin/mqadmin clusterList -n 192.168.0.65:8100
      5. 执行以下命令,导出元数据。
        • 未开启SSL的实例,执行以下命令。
          sh ./bin/mqadmin exportMetadata -n {nameserver地址及端口号} -c {RocketMQ集群名称} -f {导出的元数据文件的存放路径}

          例如:“nameserver地址及端口号”为“192.168.0.65:8100”,“RocketMQ集群名称”为“DmsCluster”,“导出的元数据文件的存放路径”为“/tmp/rocketmq/export”。

          sh ./bin/mqadmin exportMetadata -n 192.168.0.65:8100 -c DmsCluster -f /tmp/rocketmq/export
        • 已开启SSL的实例,执行以下命令。
          JAVA_OPT=-Dtls.enable=true sh ./bin/mqadmin exportMetadata -n {nameserver地址及端口号} -c {RocketMQ集群名称} -f {导出的元数据文件的存放路径}

          例如:“nameserver地址及端口号”为“192.168.0.65:8100”,“RocketMQ集群名称”为“DmsCluster”,“导出的元数据文件的存放路径”为“/tmp/rocketmq/export”。

          JAVA_OPT=-Dtls.enable=true sh ./bin/mqadmin exportMetadata -n 192.168.0.65:8100 -c DmsCluster -f /tmp/rocketmq/export
    2. 在控制台迁移元数据。
      1. 登录分布式消息服务RocketMQ版控制台。
      2. 单击RocketMQ实例的名称,进入实例详情页面。
      3. 在左侧导航栏,选择“元数据迁移”,进入迁移任务列表页面。
      4. 单击“创建迁移任务”,弹出“创建迁移任务”对话框。
      5. 参考表2,设置迁移任务的参数。
        表2 迁移任务参数说明

        参数

        说明

        任务名称

        您可以自定义迁移任务的名称,用于区分不同的迁移任务。

        是否同名覆盖

        • 如果开启同名覆盖,会对已有的同名元数据的配置进行修改。

          例如:原实例Topic01的读队列个数为3,云上实例Topic01的读队列个数为2,开启同名覆盖后,云上实例Topic01的读队列个数变为3。

        • 如果不开启同名覆盖,同名元数据的迁移将失败。

          例如:原实例的Topic包含Topic01和Topic02,云上实例的Topic包含Topic01和Topic03,不开启同名覆盖,原实例Topic01的迁移将失败。

        元数据

        上传获取其他厂商或自建RocketMQ实例的元数据

      6. 单击“确定”。

        迁移完成后,在迁移任务列表页面查看“任务状态”。

        • 当“任务状态”为“迁移完成”,表示所有元数据都已成功迁移。
        • 当“任务状态”为“迁移失败”,表示元数据中部分或全部元数据迁移失败。单击迁移任务名称,进入迁移任务详情页,在“迁移结果”中查看迁移失败的Topic/消费组名称,以及失败原因。

  2. 迁移生产消息至分布式消息服务RocketMQ版实例。

    将生产客户端的元数据连接地址改为分布式消息服务RocketMQ版实例的元数据连接地址,重启生产业务,使得生产者将新的消息发送到分布式消息服务RocketMQ版实例中。

  3. 迁移消费消息至分布式消息服务RocketMQ版实例。

    待消费组中的消息消费完之后,将消费客户端的元数据连接地址改为分布式消息服务RocketMQ版实例的元数据连接地址,重启消费业务,使得消费者从分布式消息服务RocketMQ版实例中消费消息。

  4. 如果有多个RocketMQ实例需要迁移到同一个分布式消息服务RocketMQ版实例中,请依次进行迁移。

实施步骤(不支持通过mqadmin命令导出元数据)

  1. 登录其他厂商控制台,导出源实例的Topic和消费组列表。
  2. 将Topic和消费组列表分别放入“topics.txt”和“groups.txt”中,格式为每行一个Topic名称/消费组名称,例如:

    topic-01
    topic-02
    ...
    topic-n

    注意:在“groups.txt”中不能存在空行(例如在消费组名称后多增加了一个换行符),否则导入云上RocketMQ实例时,会多创建名称为空的消费组。

  3. 登录主机,下载RocketMQ软件包。

    wget https://archive.apache.org/dist/rocketmq/4.9.8/rocketmq-all-4.9.8-bin-release.zip

  4. 解压软件包。

    unzip rocketmq-all-4.9.8-bin-release.zip

  5. (可选)如果RocketMQ实例开启了ACL访问控制,执行mqadmin命令时,需要鉴权。

    切换到解压后的软件包目录下,在“conf/tools.yml”文件中,增加如下内容。
    accessKey:*******
    secretKey:*******

    accessKey和secretKey表示在控制台“用户管理”页面,创建的用户名和密钥。

  6. 进入解压后软件包的bin目录下,将“topics.txt”和“groups.txt”上传到此目录中。
  7. 执行以下脚本,将Topic和消费组列表导入到云上RocketMQ实例中。

    #!/bin/bash
    
    # Read groups from groups.txt file
    groups=()
    while read -r group; do
      groups+=("$group")
    done < "groups.txt"
    
    # Read topics from topic.txt file
    topics=()
    while read -r topic; do
      topics+=("$topic")
    done < "topics.txt"
    
    # Add topics
    for topic in "${topics[@]}"; do
      echo "Adding topic: $topic"
      sh mqadmin updateTopic -n <namesrvIp:8100> -c DmsCluster -t "$topic"
    done
    
    # Add consumer groups
    for group in "${groups[@]}"; do
      echo "Adding consumer group: $group"
      sh mqadmin updateSubGroup -n <namesrvIp:8100> -c DmsCluster -g "$group"
    done

    其中“namesrvIp:8100”为云上RocketMQ实例的连接地址。

  8. 登录RocketMQ控制台,分别进入“Topic管理”和“消费组管理”页面,查看Topic和消费组列表是否成功导入。
  9. 迁移生产消息至分布式消息服务RocketMQ版实例。

    将生产客户端的元数据连接地址改为分布式消息服务RocketMQ版实例的元数据连接地址,重启生产业务,使得生产者将新的消息发送到分布式消息服务RocketMQ版实例中。

  10. 迁移消费消息至分布式消息服务RocketMQ版实例。

    待消费组中的消息消费完之后,将消费客户端的元数据连接地址改为分布式消息服务RocketMQ版实例的元数据连接地址,重启消费业务,使得消费者从分布式消息服务RocketMQ版实例中消费消息。

  11. 如果有多个RocketMQ实例需要迁移到同一个分布式消息服务RocketMQ版实例中,请依次进行迁移。