[RocketMQ]一次RocketMQ的平滑迁移方案 有更新!

  |   4 评论   |   8,679 浏览

一.目标:

把A机房中的MQ迁移到B机房,并保证在全过程中,RocketMQ不停止提供服务.
其中特殊的地方在于,A机房中有服务在线,B机房中也有服务在线,所以要考虑A/B两机房的服务都可正常使用MQ.

二.注意事项:

1.所有应用服务至少使用两个broker master.
2.应用服务要开启setRetryAnotherBrokerWhenNotStoreOK(true)保证其中一个broker 生产消息失败向另一个broker进行生产消息
3.A/B两机房中的服务使用的mq namesrv地址必须是用域名解析,不要使用ip(非必选项,本文使用域名)

三.环境介绍:

A机房的部署架构图
namesrv:两个节点1/2
broker: a-master/a-slave/b-master/b-slave
411d235d9371492598e5c1ddb33e43ec-image.png

B机房的最终部署架构图
namesrv:两个节点3/4
broker:m-master/m-slave/n-master/n-slave
a1a91d9be9f7460584fa7e3cbffd8842-image.png

四.操作步骤

  1. B机房建立NAMESRV两个节点
  2. B机房建立broker-m/n master/slave 4个节点,并指定namesrv A机房和B机房的4个namesrv
  3. 对B机房的broker-m/n创建A机房相同的topic
    3.1.获取topic列表: sh /bin/mqadmin topicList -n 'namesrv3:9876;namesrv4:9876' |grep -v '%RETRY%'|grep -v '%DLQ%'|grep -v 'BenchmarkTest' |grep -v 'SELF_TEST_TOPIC' |grep -v 'ZTEExample' |grep -v 'OFFSET_MOVED_EVENT'
  4. 等待30s~40s,等待应用服务重新向namesrv获取broker路由列表到本地,至此已完成broker扩容.此时所有所有broker master 都拥有写权限.并Produce Massage TPS 平均持平
  5. 对A机房中的broker-a发送禁写命令
    5.1.sh mqadmin wipeWritePerm -n "namesrv1:9876;namesrv2:9876" -b broker-a
    5.2. broker-a Produce TPS会递减至0
  6. 待5.2完成时,kill broker-a master节点,注意slave节点不处理,并且注意机房B中的m/n master的Produce Massage TPS有所升高
  7. 对A机房中的broker-b发送禁写命令(此步骤与前面第五步相同)
    7.1.sh mqadmin wipeWritePerm -n "namesrv1:9876;namesrv2:9876" -b broker-b
    7.2. broker-b Produce TPS会递减至0
  8. 待7.2完成时,kill broker-b master节点,注意slave节点不处理,并且注意机房B中的m/n master的Produce Massage TPS有所升高
  9. 以下步骤为:迁移namesrv.
    9.1. 修改A机房中的的namesrv域名解析从A机房改为B机房的IP(不想一个一个手工改使用ansible工具)
  10. kill A机房中的namesrv 1 /2 即可
    10.1. 此步骤注意下应用服务之前使用A机房的namesrv tcp连接是否还存在,应为B机房的namesrv是为成功
  11. A机房的slave 节点当Consumer Massage TPS 为0时即可kill
    至此完成迁移

RocketMQ-迁移方案.pptx

评论

发表评论

validate