場景
現(xiàn)在有Rabbitmq普通模式架構(gòu)服務A和服務B ,由于業(yè)務需要,要求把服務A上mq的數(shù)據(jù)遷移到服務B上,rabbitmq的數(shù)據(jù)包括元數(shù)據(jù)(RabbitMQ用戶、vhost、隊列、交換和綁定)和消息數(shù)據(jù),而消息數(shù)據(jù)存儲在單獨的消息存儲庫中。
操作步驟一共三步
- 元數(shù)據(jù)備份和還原
- 消息數(shù)據(jù)備份&還原
- 核驗
普通模式的數(shù)據(jù)遷移,請先定位到 服務A&服務B的 主節(jié)點;
這里以 docker-compose 部署的為服務A
172.16.123.111:5672、172.16.123.112:5672、172.16.123.113:5672
CNCP管理臺頁面快速構(gòu)建的rabbitmq為服務B
172.16.123.52:5672、172.16.123.53:5672、172.16.123.54:5672
操作
步驟一 元數(shù)據(jù)備份和還原
1、操作
在服務B上搭建rabbitmq服務 (這里是在CNCP的管理臺頁面新建一個rabbitmq)
元數(shù)據(jù)遷移,登錄 UI 管理界面,默認為 ip:15672, 選擇 Export definitions,download 元數(shù)據(jù)信息 json文件,然后在新的集群上選擇 Import definitions,upload 上傳元數(shù)據(jù)信息(注意隊列可能在不同節(jié)點的情況)
2、登陸服務A導出元數(shù)據(jù)

3、登陸服務B導入上面導出的元數(shù)據(jù)

4、驗證數(shù)據(jù)
刷新頁面,查看元數(shù)據(jù) 等信息是否存在
步驟二 消息數(shù)據(jù)備份&還原
這里的實現(xiàn)方案是用的 rabbitmq 的 Shovel 插件
1.為什么需要使用 shovel 插件?
答:當業(yè)務需要可靠且連續(xù)地將消息從一個 broker 的 queue 里搬運(轉(zhuǎn)發(fā))到另一個 broker 的 exchange 時(最終達到某個 queue 里 )使用;作為 source 的 queue 和作為 destination 的 exchange 可以位于同一個 broker 上(通常要求處于不同的 vhost 下),也可以位于不同的 broker 上。
2.使用 shovel 插件的好處?
答:shovel 基于 RabbitMQ 的 Erlang 客戶端實現(xiàn),且作為 built-in 插件被使用,故可以隨 broker 的啟動而自動啟動;shovel 具有松耦合特性:通過該插件可以在分屬不同管理域下的 broker 或 cluster 之間進行消息的搬運;shovel 具有 WAN 友好特性:基于 AMQP 0-9-1 協(xié)議實現(xiàn),并設(shè)計成能夠保證在不穩(wěn)定網(wǎng)絡(luò)場景下不丟失消息;shovel 具有高度可定制性:允許在 shovel 建立連接后,立即執(zhí)行指定的 AMQP 方法進行定制化操作(例如聲明 queue 的動作);
注意:因為 docker-compose 之前給到用戶的版本并沒有默認開啟,本次
消息數(shù)據(jù)遷移所依賴的文件,這里需要先開啟插件
- 開啟服務A 的兩個插件
rabbitmq_shovel&rabbitmq_shovel_management
# 創(chuàng)建一個插件配置文件
vi /tmp/rabbitmq-db-2/etc/enabled_plugins
# 寫入內(nèi)容
[rabbitmq_management,rabbitmq_prometheus,rabbitmq_shovel,rabbitmq_shovel_management].
# 修改 docker-compose.yaml 添加一行 volumes
vi /root/rabbitmq_cluster/rabbitmq/rabbitmq03/docker-compose.yaml
# 添加一行
- /tmp/rabbitmq-db-2/etc:/rabbitmq_server-3.8.5/etc/rabbitmq

# 進入指定目錄停止 rabbitmq ,執(zhí)行
docker-compose down
# 進入指定目錄啟動 rabbitmq ,執(zhí)行
docker-compose up
注 上面開啟插件那么復雜的原因是,筆者在 docker 內(nèi)重啟 rabbitmq 失敗,無奈之下通過修改掛初始化插件的方式,重啟 docker-compose,如果操作者可以在
rabbitmq-plugins enable rabbitmq_shovel&rabbitmq-plugins enable rabbitmq_shovel_management后可以重啟rabbtimq 那就不用上面那么復雜的又是掛卷又是重啟docker
登陸服務A 的UI界面 新增插件如下

- 配置插件
登陸UI -> admin -> Shovel Management -> Add a new shovel
配置 數(shù)據(jù)源 & 數(shù)據(jù)目標

注:這里的適用于我們平臺的 url 格式為 amqp://user:password@server-name/my-vhost
connect to server-name, with credentials and overridden virtual host
例如 amqp://rmq:rmq123@172.16.123.111:5672
-
效果
image.png
步驟三 核驗
筆者使用 postman 發(fā)送200個消息到 rabbitmq,會發(fā)現(xiàn)服務A中消息都為0,查看服務B,發(fā)現(xiàn)服務B新增了200條消息,即數(shù)據(jù)實時遷移成功;


結(jié)束
當服務A 不再接受業(yè)務后,可以徹底停止 服務A;
注意:上訴動作中,因為是不停服操作,需要和用戶核驗 元數(shù)據(jù)是否增加。以免反復同步 元數(shù)據(jù)。以及新增 shovel。
