一、背景
1阔拳、各業(yè)務(wù)系統(tǒng)持續(xù)迭代過(guò)程中崭孤,JDK、SpringBoot糊肠、RocketMQ Client 等框架也進(jìn)行了升級(jí)辨宠,高版本的 RocketMQ Client 發(fā)送的消息到低版本中,在控制臺(tái)中午無(wú)法查看消息明細(xì)货裹,致使業(yè)務(wù)日常排查問(wèn)題等相當(dāng)困難嗤形。
2、原業(yè)務(wù)端發(fā)送消息與本地事務(wù)很難做到一致性弧圆,要保障不丟失數(shù)據(jù)和數(shù)據(jù)不一致開發(fā)成本非常高派殷,RocketMQ V4.4 版本增加了事務(wù)消息还最,引入事務(wù)消息后可大大降低實(shí)現(xiàn)這一特性的難度。
3毡惜、我們對(duì) MQ 的依賴越來(lái)越強(qiáng)拓轻,MQ 的重要性和穩(wěn)定性都已經(jīng)可以和 DB 相當(dāng)了,而 V4.x 版本增加了更多的新特性和監(jiān)控手段经伙,可以使我們更好的監(jiān)控 MQ 的使用情況扶叉。
4、V4.x 版本由 Alibaba 維護(hù)移交到了 Apache 社區(qū)并有他進(jìn)行維護(hù)帕膜,促使使用范圍更廣枣氧,也有更多的參與者參與進(jìn)來(lái),可靠性和及時(shí)響應(yīng)性有了更高的保障垮刹。
5达吞、新版本在吞吐率和對(duì)新的技術(shù)有了更好的支持,基于上述這些因素荒典,我們考慮將 MQ 進(jìn)行版本升級(jí)與改造酪劫。
6、RocketMQ (V3_2_6 -> V4.6.0)線上平滑升級(jí)
二寺董、流程
因業(yè)務(wù)特性需求覆糟,對(duì)當(dāng)前RocketMQ 集群進(jìn)行不停機(jī)版本迭代升級(jí),步驟如下遮咖。
請(qǐng)升級(jí)的架構(gòu)師詳細(xì)查看文檔滩字,進(jìn)行查漏補(bǔ)缺以免造成不可挽回的事故
下面是此次升級(jí)使用的基礎(chǔ)資料:
官方文檔
https://rocketmq.apache.org/docs/quick-start/
https://rocketmq.apache.org/dowloading/releases/
Dledger 快速搭建指南:
https://github.com/apache/rocketmq/blob/master/docs/cn/dledger/quick_start.md
Apache RocketMQ 開發(fā)者指南:
https://github.com/apache/rocketmq/tree/master/docs/cn
升級(jí)前一定要熟讀的兩個(gè)架構(gòu)圖:
1、消息存儲(chǔ)
2御吞、消息刷盤
三麦箍、前期準(zhǔn)備
1、當(dāng)前環(huán)境版本狀態(tài)
DEV: http://10.0.254.191:7080/ V3_5_8 2m
TEST: http://10.185.240.76:8081/ V3_5_8 2m
PRO:http://rocketmq.pro.siku.cn/ admin/secoo V3_2_6 2m
2陶珠、每個(gè)版本組件支持的jre環(huán)境
Version | Client | Broker | NameServer |
---|---|---|---|
4.0.0-incubating | >=1.7 | >=1.8 | >=1.8 |
4.1.0-incubating >=1.6 >=1.8 >=1.8 | |||
4.2.0 | >=1.6 | >=1.8 | >=1.8 |
4.3.x | >=1.6 | >=1.8 | >=1.8 |
4.4.x | >=1.6 | >=1.8 | >=1.8 |
4.5.x | >=1.6 | >=1.8 | >=1.8 |
4.6.x | >=1.6 | >=1.8 | >=1.8 |
4挟裂、升級(jí)時(shí)使用到的命令集合
啟動(dòng)
nohup sh bin/mqnamesrv &
nohup sh bin/mqbroker -c conf/2m-noslave/broker-b.properties &
broker的寫權(quán)限關(guān)閉
bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 4
恢復(fù)該節(jié)點(diǎn)的寫權(quán)限
bin/mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.x.x:9876 -k brokerPermission -v 6
停止
bin/mqshutdown broker
bin/mqshutdown namesrv
查看集群信息,集群背率、BrokerName、BrokerId嫩与、TPS等信息
./bin/mqadmin clusterList -n localhost:9876
獲取全部topic
./bin/mqadmin topicList -n localhost:9876 -c DevCluster > topiclist
獲取topic 路由信息
./bin/mqadmin topicRoute -t demo-cluster -n localhost:9876
獲取topic offset
./bin/mqadmin topicStatus -t demo-cluster -n localhost:9876
打印Topic訂閱關(guān)系寝姿、TPS、積累量划滋、24h讀寫總量等信息
./bin/mqadmin statsAll -n localhost:9876
修改broker 參數(shù)
./bin/mqadmin updateBrokerConfig -n localhost:9876 -b 10.0.xxx.2:10911 -k waitTimeMillsInSendQueue -v 500 -c TestCluster
發(fā)送消息
./bin/mqadmin sendMessage -n localhost:9876 -t lqtest -p "this is test"
消費(fèi)
./bin/mqadmin consumeMessage -n localhost:9876 -t lqtest
5饵筑、官方版本特性收集
這里只標(biāo)注了下重要的特性,有興趣的可以查看 http://rocketmq.apache.org/release_notes/
4.0.0 (INCUBATING) 變?yōu)锳pache
4.4.0 支持消息軌跡 处坪、支持ACL
4.5.0 引入Dledger 的多副本技術(shù)
6根资、新集群4.6.0 集群模型選擇
-
單Master模式
這種方式風(fēng)險(xiǎn)較大架专,一旦Broker重啟或者宕機(jī)時(shí),會(huì)導(dǎo)致整個(gè)服務(wù)不可用玄帕。不建議線上環(huán)境使用,可以用于本地測(cè)試部脚。
-
多Master模式
一個(gè)集群無(wú)Slave,全是Master裤纹,例如2個(gè)Master或者3個(gè)Master委刘,這種模式的優(yōu)缺點(diǎn)如下:
優(yōu)點(diǎn):配置簡(jiǎn)單,單個(gè)Master宕機(jī)或重啟維護(hù)對(duì)應(yīng)用無(wú)影響鹰椒,在磁盤配置為RAID10時(shí)锡移,即使機(jī)器宕機(jī)不可恢復(fù)情況下,由于RAID10磁盤非称峒剩可靠淆珊,消息也不會(huì)丟(異步刷盤丟失少量消息,同步刷盤一條不丟)奸汇,性能最高施符;
缺點(diǎn):?jiǎn)闻_(tái)機(jī)器宕機(jī)期間,這臺(tái)機(jī)器上未被消費(fèi)的消息在機(jī)器恢復(fù)之前不可訂閱茫蛹,消息實(shí)時(shí)性會(huì)受到影響操刀。
-
多Master多Slave模式-異步復(fù)制
每個(gè)Master配置一個(gè)Slave,有多對(duì)Master-Slave婴洼,HA采用異步復(fù)制方式骨坑,主備有短暫消息延遲(毫秒級(jí)),這種模式的優(yōu)缺點(diǎn)如下:
優(yōu)點(diǎn):即使磁盤損壞柬采,消息丟失的非常少欢唾,且消息實(shí)時(shí)性不會(huì)受影響,同時(shí)Master宕機(jī)后粉捻,消費(fèi)者仍然可以從Slave消費(fèi)礁遣,而且此過(guò)程對(duì)應(yīng)用透明,不需要人工干預(yù)肩刃,性能同多Master模式幾乎一樣祟霍;
缺點(diǎn):Master宕機(jī),磁盤損壞情況下會(huì)丟失少量消息盈包。
-
多Master多Slave模式-同步雙寫(參考當(dāng)前業(yè)務(wù)與并發(fā)度沸呐,選擇此集群模式)
每個(gè)Master配置一個(gè)Slave,有多對(duì)Master-Slave呢燥,HA采用同步雙寫方式崭添,即只有主備都寫成功,才向應(yīng)用返回成功叛氨,這種模式的優(yōu)缺點(diǎn)如下:
優(yōu)點(diǎn):數(shù)據(jù)與服務(wù)都無(wú)單點(diǎn)故障呼渣,Master宕機(jī)情況下棘伴,消息無(wú)延遲,服務(wù)可用性與數(shù)據(jù)可用性都非常高屁置;
缺點(diǎn):性能比異步復(fù)制模式略低(大約低10%左右)焊夸,發(fā)送單個(gè)消息的RT會(huì)略高,且目前版本在主節(jié)點(diǎn)宕機(jī)后缰犁,備機(jī)不能自動(dòng)切換為主機(jī)
請(qǐng)結(jié)合自己的集群特點(diǎn)和穩(wěn)定性進(jìn)行選擇升級(jí)淳地,不一定最新的集群模式就是最適合你們得。一定要把平滑升級(jí)放在首位帅容。
7颇象、TOPIC 整理
可以寫個(gè)腳本整理現(xiàn)有topic 目錄,在升級(jí)完成后對(duì)topic 列表和分區(qū)進(jìn)行整理校對(duì)并徘。
因?yàn)閠opic在rocketmq的設(shè)計(jì)思想里遣钳,是作為同一個(gè)業(yè)務(wù)邏輯消息的組織形式,它僅僅是一個(gè)邏輯上的概念麦乞,而在一個(gè)topic下又包含若干個(gè)邏輯隊(duì)列蕴茴,即消息隊(duì)列,消息內(nèi)容實(shí)際是存放在隊(duì)列中姐直,而隊(duì)列又存儲(chǔ)在broker中
一定要進(jìn)行特殊業(yè)務(wù)場(chǎng)景梳理
1)順序消費(fèi)
2)topic單broker配置
以免出現(xiàn)一個(gè)Topic只有一個(gè)queue的情況出現(xiàn)倦淀,導(dǎo)致消息丟失。隨便找了個(gè)圖声畏,大家可以看下
8撞叽、新集群配置
brokerClusterName=MQCluster
brokerName=broker-ali-76
brokerId=0
deleteWhen=04
fileReservedTime=360
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumerQueue=/data/rocketmq/store/consumequeue
storePathRootDir=/data/rocketmq/store
autoCreateSubscriptionGroup=true
## if msg tracing is open,the flag will be true
traceTopicEnable=true
listenPort=10911
namesrvAddr=10.48.xx.76:9876;10.48.xx.77:9876
四、升級(jí)步驟
當(dāng)攻略做完以后插龄,我們就可以開始搞起了愿棋。我選擇的最終架構(gòu)模式:多Master多Slave模式-同步雙寫
流程概述:
修改2m-2s-sync 、runbroker均牢、runserver 配置參數(shù)
停掉3.2.6 nameserver 原IP PORT 啟動(dòng)4.6.0 nameserver糠雨,逐級(jí)替換完畢
停掉3.2.6 broker 啟動(dòng)4.6.0 broker(查看是否有單機(jī)topic問(wèn)題),逐級(jí)替換完畢
測(cè)試集群穩(wěn)定性徘跪,為新集群增加slave,升級(jí)完成
詳細(xì)步驟:
準(zhǔn)備操作
1甘邀、下載最新4.6.0版本部署包
cd /data/xxx_tomcat
wget http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.6.0/rocketmq-all-4.6.0-bin-release.zip
unzip rocketmq-all-4.6.0-bin-release
2、修改配置
cd /data/xxx_tomcat/rocketmq-4.6.0/conf/2m-2s-sync
修改51垮庐、50 機(jī)器broker配置
修改配置 2m-2s-sync
修改 runbroker JVM配置松邪,以免使用了默認(rèn)配置導(dǎo)致內(nèi)存不夠
3、兩臺(tái)M配置如下:
兩臺(tái)差別只在brokerName
brokerClusterName=MQCluster
brokerName=broker-60-50
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
storePathCommitLog=/data/alibaba-rocketmq/store/commitlog
storePathConsumerQueue=/data/rocketmq/store/consumequeue
storePathRootDir=/data/alibaba-rocketmq/store
autoCreateSubscriptionGroup=true
## if msg tracing is open,the flag will be true
traceTopicEnable=true
listenPort=10911
namesrvAddr=192.168.xxx.50:9876;192.168.xxx.51:9876
4突硝、替換nameserver
jps -l
sh bin/mqshutdown namesrv
cd /data/xxx_tomcat/rocketmq-4.6.0
nohup sh bin/mqnamesrv &
./bin/mqadmin clusterList -n localhost:9876
5测摔、替換broker
jps -l
sh bin/mqshutdown broker
cd /data/xxx_tomcat/rocketmq-4.6.0
ps -ef|grep mq //檢查使用的配置文件
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &
./bin/mqadmin clusterList -n localhost:9876
最后我們來(lái)發(fā)個(gè)消息測(cè)試下
./bin/mqadmin sendMessage -n localhost:9876 -t lqtest -p "this is test"
./bin/mqadmin consumeMessage -n localhost:9876 -t lqtest
恭喜你到此你的集群就升級(jí)完畢了V眉谩=馇 锋八!