溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

發(fā)布時(shí)間:2021-10-13 09:47:31 來源:億速云 閱讀:136 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)”,在日常操作中,相信很多人在如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

1、版本升級(jí)的迫切性

說來慚愧,作為RocketMQ社區(qū)優(yōu)秀布道師,筆者所在公司的RocketMQ服務(wù)端版本竟然還是4.1.0,RocketMQ在4.4.0版本之前是不支持ACL(訪問控制),對(duì)應(yīng)生產(chǎn)環(huán)境中任意一臺(tái)機(jī)器都可以訂閱任意topic,在任意一臺(tái)生產(chǎn)應(yīng)用服務(wù)器都可以安裝一個(gè)rocketmq-console,從而控制整個(gè)集群,擁有刪除主題、刪除消費(fèi)組的權(quán)限,想想是不是后背發(fā)涼.

2、升級(jí)方案

2.1 確定升級(jí)到的版本

翻開RocketMQ升級(jí)日志,RocketMQ在4.4.0版本正式引入了ACL機(jī)制,故版本至少要升級(jí)到4.4.0,在業(yè)界使用開源版本有一個(gè)不成文的規(guī)則:通常不要使用最新的版本,不要充當(dāng)小白鼠。

但RocketMQ可以算是一個(gè)特殊。

通過仔細(xì)瀏覽RocketMQ的版本變更記錄,我們不難發(fā)現(xiàn)RocketMQ Client  相關(guān)的變更非常少,即與用戶關(guān)系緊密的消息發(fā)送、消息消費(fèi)這塊的代碼非常的穩(wěn)定,理論上基本不存在兼容性問題。并且每一個(gè)版本都修復(fù)了一些重大的BUG,性能提升也比較明顯,故筆者這次決定“冒天下之大不韙”,決定將幫升級(jí)到最新版本4.8.0。

在這里在啰嗦一些,簡(jiǎn)單介紹一下RocketMQ幾個(gè)具有里程杯意義的版本。

  • RocketMQ4.3.0正式引入了事務(wù)消息,如果大家希望使用事務(wù)消息,其版本最低建議為 4.6.1。

  • RocketMQ4.4.0引入了ACL、消息軌跡,如果需要使用這些功能,其版本最低建議為 4.7.0。

  • RocketMQ4.5.0引入了多副本(主從切換),其版本建議使用4.7.0。

  • RocketMQ4.6.0引入了請(qǐng)求-響應(yīng)模型。

2.2 升級(jí)思路

版本升級(jí)的基本要求:業(yè)務(wù)不能停機(jī),即要做到對(duì)業(yè)務(wù)無感知的升級(jí)。

如果機(jī)器足夠的備用機(jī)器,最佳的版本遷移方案應(yīng)該是先擴(kuò)容再縮容,其示例圖如下:

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

其主要的思路是先對(duì)Broker進(jìn)行擴(kuò)容,加入兩臺(tái)高版本的Broker服務(wù)器,加入到集群中,然后關(guān)閉低版本Broker的寫權(quán)限,待消息過期后,將低版本移除,最后升級(jí)NameServer,完成不停機(jī)的在線遷移。

由于此次升級(jí)需要在半個(gè)月左右的時(shí)間內(nèi)將RocketMQ集群所有的節(jié)點(diǎn)全部升級(jí),無法提供這么多冷備節(jié)點(diǎn),故先擴(kuò)容、再縮容無法滿足本次需求,本次只能基于已有的機(jī)器進(jìn)行升級(jí)。

能否直接升級(jí)Broker端代碼,但高版本的Broker直接使用低版本的Broker存儲(chǔ)目錄,即直接升級(jí)軟件,其示例圖如下:

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

核心思想是先停止老版本的Broker,然后使用新版本啟動(dòng)Broker,但使用舊的配置文件。

有了思路,接下來就是要驗(yàn)證方案的可行性。

2.3 方案驗(yàn)證

理論歸理論,在生產(chǎn)環(huán)境做任何變更之前,必須有充分的測(cè)試驗(yàn)證,版本升級(jí)重點(diǎn)需要驗(yàn)證兼容性問題。

2.2.1 服務(wù)端版本兼容性驗(yàn)證

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

搭建一個(gè)上述MQ集群,其核心要點(diǎn):

  • 高版本的Broker是否能向低版本的NameServer注冊(cè)路由

  • 低版本的Broker是否能向高版本的NameServer注冊(cè)路由

通過rocketmq-console,去創(chuàng)建多個(gè)個(gè)topic,看看其路由信息是否正確,經(jīng)驗(yàn)證,符合預(yù)期。

2.2.2 客戶端與服務(wù)端兼容性驗(yàn)證

RocketMQ的客戶端API其實(shí)比較單一,無非就是消息發(fā)送、批量發(fā)送,消息消費(fèi),由于4.1版本不支持事務(wù)消息,這次升級(jí)甚至都無需驗(yàn)證事務(wù)消息,驗(yàn)證的要點(diǎn):

  • 低版本的客戶端是否能正常向高版本Broker發(fā)送消息,消費(fèi)消息

  • 高版本的客戶端是否能向低版本的Broker發(fā)送消息,消費(fèi)消息

測(cè)試案例來自哪,其實(shí)都不需要我們自己寫,直接用官方的Demo即可,其代碼截圖如下:

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

客戶端驗(yàn)證在真正實(shí)施過程中,其實(shí)比服務(wù)端之間的驗(yàn)證要復(fù)雜的多,由于各個(gè)項(xiàng)目組使用的客戶端版本不一,甚至有些項(xiàng)目組會(huì)使用c++、Python等其他非Java客戶端,如何精確找到該集群中所有客戶端的連接信息(客戶端版本、語言類型)至關(guān)重要。

官方提供的版本,對(duì)消費(fèi)組的連接信息還是支持的比較友好,我們可以通過寫腳本,先查詢系統(tǒng)中所有的消費(fèi)組,然后遍歷每一個(gè)消費(fèi)組,可以查詢這些消費(fèi)組的IP地址、客戶端版本、使用的語言等信息,但開源版本對(duì)生產(chǎn)者支持的不友好,沒有一個(gè)可獲取所有發(fā)送者相關(guān)的接口。

獲取消費(fèi)組消費(fèi)端的連接方式如下圖所示:

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

故我們采取的方式,主要是基于消費(fèi)組失敗客戶端類型,本次升級(jí)過程中,我也對(duì)RocketMQ做了一些定制化開發(fā),可方便獲取所有發(fā)送方的鏈接信息,后續(xù)會(huì)已提交PR的方式貢獻(xiàn)給官方。

2.2.3 Broker端存儲(chǔ)格式驗(yàn)證

由于沒有空閑資源,本次要使用的升級(jí)方式是直接升級(jí)軟件,但新老版本共用存儲(chǔ)目錄,基于RocketMQ的消息存儲(chǔ)協(xié)議,從4.0.0版本之后就一直沒有變化,其驗(yàn)證的關(guān)鍵點(diǎn)如下:

  • 4.8.0版本是否可以直接使用4.1.0生成的存儲(chǔ)文件(commitlog等文件)

  • 4.1.0版本是否可以直接使用4.8.0生成的存儲(chǔ)文件

為什么需要驗(yàn)證4.1.0版本能兼容4.8.0呢?因?yàn)槿绻?jí)失敗,需要回滾,如果4.1.0版本不能兼容4.8.0的話,會(huì)讓你沒有退路,這在架構(gòu)設(shè)計(jì)中是絕對(duì)不允許的。

經(jīng)過驗(yàn)證發(fā)現(xiàn),存儲(chǔ)文件是相互兼容的。

2.2.4 測(cè)試環(huán)境驗(yàn)證

經(jīng)過上面三步的驗(yàn)證,已經(jīng)可以進(jìn)行升級(jí)了,但升級(jí)之前,還要在測(cè)試環(huán)境穩(wěn)定運(yùn)行一天,可以將測(cè)試環(huán)境升級(jí)成如下架構(gòu):

如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)

即不同版本的混搭模式,接受測(cè)試環(huán)境所有應(yīng)用服務(wù)器的驗(yàn)證,如果測(cè)試環(huán)境運(yùn)行沒有問題,即可在生產(chǎn)環(huán)境進(jìn)行升級(jí)。

2.4 實(shí)施方案

有了上面升級(jí)方案,并且已經(jīng)做了充分的驗(yàn)證,是可以在生產(chǎn)環(huán)境執(zhí)行了,在執(zhí)行之前,需要對(duì)理論設(shè)計(jì)輸出可執(zhí)行可落地的實(shí)施方案,實(shí)施方案必須要包括回滾操作,并且這個(gè)回滾操作一定要比較容易執(zhí)行,否則你的方案一定是不那么可靠的。

接下來重點(diǎn)闡述一下實(shí)施過程中一些關(guān)鍵步驟,整個(gè)升級(jí)步驟才有滾動(dòng)升級(jí),即逐臺(tái)升級(jí)。

1、關(guān)閉一個(gè)Broker的寫權(quán)限

關(guān)閉Broker寫權(quán)限,讓應(yīng)用將流量平滑遷移到其他節(jié)點(diǎn),這樣可以有效避免在對(duì)該機(jī)器進(jìn)行重啟時(shí)對(duì)業(yè)務(wù)造成的影響。

sh ./mqadmin updateBrokerConfig -b 192.168.x.x:10911 -n 192.168.xx.xx:9876 -k brokerPermission -v 4

2、帶Broker寫入、消費(fèi)tps接近0時(shí),關(guān)閉broker

ps -ef | grep java kill pid

3、使用新版本啟動(dòng)Broker

注意,此過程使用的配置文件為老版本的配置,故此時(shí)并沒有開啟寫權(quán)限,啟動(dòng)并不會(huì)對(duì)客戶端消息寫入造成影響。

4、開啟寫權(quán)限

待新版本啟動(dòng)成功后,既可以開啟寫權(quán)限

sh ./mqadmin updateBrokerConfig -b 192.168.xx.xx:10911 -n 192.168.xx.xx:9876 -k brokerPermission -v 6

觀察流量。

重復(fù)上述步驟即可完成Broker的升級(jí)。

關(guān)于Nameserver的升級(jí)就更加容易了,采用滾動(dòng)升級(jí),kill掉老版本的nameserver,在原機(jī)器上啟動(dòng)新版本的nameserver即可。

到此,關(guān)于“如何實(shí)現(xiàn)線上環(huán)境大規(guī)模RocketMQ集群不停機(jī)升級(jí)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI