RabbitMQ集群故障排查與恢復(fù)概述
1. 前言
Hello,大家好。通過上述幾個(gè)小節(jié)的學(xué)習(xí),我們已經(jīng)了解了要搭建 RabbitMQ 集群所需的全部組件,以及一些基本的配置屬性和配置項(xiàng)。
我們已經(jīng)可以使用這些內(nèi)容來搭建屬于我們自己的 RabbitMQ 集群了,但是,考慮到本套課程作為 RabbitMQ 的入門課程,所以,不會介紹搭建 RabbitMQ 集群的詳細(xì)步驟,感興趣的同學(xué)可以自行查閱資料。
本小節(jié)作為本套課程中 RabbitMQ 集群介紹章節(jié)的收尾部分,會給各位同學(xué)介紹一下,在 RabbitMQ 集群運(yùn)行時(shí),當(dāng)我們的集群發(fā)生了故障,或者集群有突發(fā)情況發(fā)生時(shí),我們應(yīng)該如何應(yīng)對,即如何解決這一問題,使我們的集群環(huán)境恢復(fù)到正常運(yùn)行狀態(tài)。
本節(jié)主要內(nèi)容:
-
RabbitMQ 集群常見問題介紹;
-
RabbitMQ 集群出現(xiàn)故障的原因分析;
-
RabbitMQ 集群故障恢復(fù)方案介紹;
2.RabbitMQ 集群常見問題介紹
在我們搭建好 RabbitMQ 集群之后,無論我們采用哪種搭建方式,我們本身都需要知道一些集群中容易出現(xiàn)的問題,這樣我們在遇到集群出現(xiàn)問題的時(shí)候,我們才不會那么慌張。
問題一:集群宕機(jī)
集群宕機(jī)這一問題,是無論搭建什么樣的集群,都是比較容易出現(xiàn)的一種問題,這種問題出現(xiàn)的頻率高,同時(shí),也是最容易修復(fù)的一種問題。
那么什么是集群宕機(jī)呢?
集群宕機(jī)其實(shí)指的就是我們的 RabbitMQ 集群,所在的服務(wù)器節(jié)點(diǎn),由于種種原因?qū)е挛覀兊?RabbitMQ Server 服務(wù)非自然停止,或意外退出的一種現(xiàn)象。
如果我們的 RabbitMQ Server 宕機(jī)了,就表明,我們的 RabbitMQ 集群中有一個(gè)或多個(gè) RabbitMQ Server 服務(wù)節(jié)點(diǎn)不能夠再繼續(xù)提供服務(wù)了,那么所有有關(guān) RabbitMQ Server 服務(wù)的請求都要在正常運(yùn)行的服務(wù)節(jié)點(diǎn)上進(jìn)行處理,可想而知,這種情況下,RabbitMQ 服務(wù)器所承受的壓力有多大。
上述是集群宕機(jī)之后所造成的一個(gè)直接結(jié)果,還有一種間接結(jié)果也是非常致命的,那就是由于集群節(jié)點(diǎn)服務(wù)的宕機(jī),用戶請求只能在可用的集群節(jié)點(diǎn)上進(jìn)行處理,如果這個(gè)節(jié)點(diǎn)的服務(wù)器配置較低,那么很可能由于處理請求數(shù)量的激增,導(dǎo)致這個(gè)節(jié)點(diǎn)的服務(wù)器直接崩掉,也就是直接關(guān)機(jī),或者服務(wù)器不再返回任何響應(yīng),這種情況也是比較嚴(yán)重的。
問題二:集群間通信延遲
集群間通信延遲也是比較容易出現(xiàn)的一種問題,這種問題我們從字面意思上來看,基本上可以知道個(gè)大概。
集群間通信延遲問題,指的就是,RabbitMQ 集群中的一個(gè)節(jié)點(diǎn)向另一個(gè)節(jié)點(diǎn)傳遞數(shù)據(jù),或者從另一個(gè)節(jié)點(diǎn)中獲取數(shù)據(jù)時(shí),目標(biāo)節(jié)點(diǎn)不能及時(shí)將所需數(shù)據(jù)進(jìn)行返回,導(dǎo)致的請求節(jié)點(diǎn)出現(xiàn)長時(shí)間等待的一種現(xiàn)象。
那么集群間通信延遲問題造成的直接影響就是,用戶的數(shù)據(jù)不能同步更新,導(dǎo)致用戶看到的數(shù)據(jù)是不準(zhǔn)確的,這極大影響了用戶的使用體驗(yàn)。
集群間通信延遲問題造成的間接影響就是,如果我們的目標(biāo)節(jié)點(diǎn)遲遲不能返回響應(yīng)數(shù)據(jù),就會導(dǎo)致請求節(jié)點(diǎn)一直等待,那么位于請求節(jié)點(diǎn)上后續(xù)的用戶請求就不能得到處理,這就是請求阻塞現(xiàn)象。
問題三:集群數(shù)據(jù)文件丟失
集群數(shù)據(jù)文件丟失問題相對而言,出現(xiàn)的頻率較低,但是我們應(yīng)該也要進(jìn)行簡單的了解。
集群數(shù)據(jù)文件丟失問題,指的就是,位于服務(wù)器上的 RabbitMQ Server 節(jié)點(diǎn)突然出現(xiàn)的一種服務(wù)器磁盤數(shù)據(jù)丟失現(xiàn)象, 這種問題不出現(xiàn)還好,一旦出現(xiàn),一般都是致命性的問題,往往恢復(fù)的時(shí)間也是最長的。
集群數(shù)據(jù)文件丟失問題的出現(xiàn),會直接影響用戶無法打開我們的項(xiàng)目或應(yīng)用,給用戶造成非常嚴(yán)重的體驗(yàn)問題,同時(shí),也會間接導(dǎo)致用戶關(guān)鍵數(shù)據(jù)的丟失,造成我們的項(xiàng)目或者應(yīng)用用戶的一個(gè)流失。
以上三種問題類型,是 RabbitMQ 集群中比較常見的三種問題類型,無論出現(xiàn)哪種問題,我們都應(yīng)該知道一個(gè)大概的解決措施,或者恢復(fù)方案,下面讓我們先來分析一下產(chǎn)生這三種問題的常見原因。
3 RabbitMQ 集群出現(xiàn)故障的原因分析
問題一:集群宕機(jī)
出現(xiàn)集群宕機(jī)問題的原因,我們可以從服務(wù)器所處的運(yùn)行環(huán)境進(jìn)行考慮,考慮幾種因素:
-
服務(wù)器本身硬件配置較低,不足以支撐我們的集群服務(wù)環(huán)境,導(dǎo)致集群運(yùn)行環(huán)境崩潰。
-
一臺服務(wù)器上同時(shí)部署了超過 3 個(gè)或以上數(shù)量的項(xiàng)目,導(dǎo)致服務(wù)器內(nèi)存被占滿,使我們的集群運(yùn)行環(huán)境不能正常運(yùn)行。
-
由于開發(fā)人員自身技術(shù)問題,在部署集群時(shí),導(dǎo)致集群節(jié)點(diǎn)沒有加入到我們的 RabbitMQ 集群隊(duì)列中去,導(dǎo)致我們在啟動(dòng)集群時(shí),這一集群節(jié)點(diǎn)不能被啟動(dòng)。
問題二:集群間通信延遲
出現(xiàn)集群間通信延遲問題的原因,我們可以從程序本身,以及集群所處的位置來考慮,考慮幾種因素:
-
我們在配置 RabbitMQ 集群時(shí),不同節(jié)點(diǎn)間所設(shè)置的集群配置屬性的數(shù)值不合理,導(dǎo)致配置小的集群節(jié)點(diǎn)需要等待配置大的集群節(jié)點(diǎn)。
-
我們在部署 RabbitMQ 集群時(shí),我們所部署的地理位置區(qū)域之間的間隔過大,例如,我們在北京區(qū)域部署了一個(gè)服務(wù)節(jié)點(diǎn),然后我們又在香港區(qū)域部署了一個(gè)服務(wù)節(jié)點(diǎn),這樣無形之中就會加重我們集群節(jié)點(diǎn)間服務(wù)的響應(yīng)時(shí)間。
-
在處理用戶請求時(shí),用戶請求沒有按照我們之前設(shè)定好的 RabbitMQ 集群分發(fā)策略來進(jìn)行,導(dǎo)致用戶請求被分發(fā)到了非目標(biāo)集群節(jié)點(diǎn)上,導(dǎo)致服務(wù)響應(yīng)緩慢。
問題三:集群數(shù)據(jù)文件丟失
就請你數(shù)據(jù)文件丟失問題的原因,我們可以從運(yùn)維和服務(wù)提供商來考慮,考慮集中因素:
-
服務(wù)運(yùn)維人員主動(dòng)將 RabbitMQ 集群數(shù)據(jù)文件刪除,以報(bào)復(fù)公司或報(bào)復(fù)社會。
-
我們的服務(wù)器服務(wù)提供方?jīng)]有提供集群數(shù)據(jù)備份機(jī)制,或服務(wù)提供方的機(jī)房不穩(wěn)定,由于外界因素導(dǎo)致機(jī)房斷電,RabbitMQ 集群數(shù)據(jù)文件來不及備份而丟失。
-
我們在配置 RabbitMQ 集群時(shí),沒有配置集群數(shù)據(jù)文件備份策略,導(dǎo)致發(fā)生突發(fā)情況時(shí),集群數(shù)據(jù)文件直接丟失。
4. RabbitMQ 集群故障恢復(fù)方案介紹
我們在了解了常見問題,以及常見問題的產(chǎn)生原因之后,我們還需要知道一些常見故障的恢復(fù)方案,這里為大家簡單介紹一下。
由于集群宕機(jī)所引發(fā)的集群故障,我們在恢復(fù)起來時(shí),可以從集群節(jié)點(diǎn)發(fā)生宕機(jī)的先后順序考慮,如果我們的從節(jié)點(diǎn)先發(fā)生了宕機(jī),接著主節(jié)點(diǎn)也發(fā)生了宕機(jī),那么這種情況我們該如何恢復(fù)呢?
這種情況下,我們只需要先啟動(dòng)我們的主節(jié)點(diǎn),接著再啟動(dòng)我們的從節(jié)點(diǎn)就行了,我們的集群也就恢復(fù)到正常運(yùn)行狀態(tài)了。
如果我們主從節(jié)點(diǎn)同時(shí)發(fā)生了宕機(jī),那又該如何恢復(fù)呢?
這種情況下,我們服務(wù)器所在的機(jī)房發(fā)生短暫停電的可能性最大,我們只需要在 30 秒內(nèi)依次啟動(dòng)主節(jié)點(diǎn)、從節(jié)點(diǎn)即可將集群恢復(fù)到正常的運(yùn)行狀態(tài)。
如果我們的從節(jié)點(diǎn)發(fā)生了宕機(jī),接著主節(jié)點(diǎn)也發(fā)生了宕機(jī),但是,我們的從節(jié)點(diǎn)啟動(dòng)不起來了,這種情況我們又該如何恢復(fù)呢?
這種情況我們需要先將主節(jié)點(diǎn)啟動(dòng)起來,然后在主節(jié)點(diǎn)中通過運(yùn)行一下命令來將不能夠啟動(dòng)的從節(jié)點(diǎn)先從集群中剔除掉:
rabbitmqctl forget_cluster_node name(節(jié)點(diǎn)名稱)
然后我們可以啟動(dòng)一個(gè)新的從節(jié)點(diǎn),再將這個(gè)新的從節(jié)點(diǎn)加入到我們的 RabbitMQ 集群中來就可以了。
Tips:
1. 同學(xué)們在對不同集群節(jié)點(diǎn)的配置參數(shù)進(jìn)行配置時(shí),一定要綜合考慮集群所在服務(wù)器的環(huán)境,以及預(yù)估一下本節(jié)點(diǎn)所能扛得住的最高請求數(shù)量,這可以對我們設(shè)置集群配置參數(shù)提供一定的參考;
2. 如果集群發(fā)生了宕機(jī)或者其他突發(fā)問題,同學(xué)們一定不要慌張,一定要結(jié)合本小節(jié)所介紹的內(nèi)容去冷靜的分析問題的原因,然后第一時(shí)間恢復(fù)集群的運(yùn)行狀態(tài)。
5. 小結(jié)

本小節(jié)為同學(xué)們詳細(xì)介紹了 RabbitMQ 集群中較常見的幾種問題,介紹了常見問題對我們的 RabbitMQ 集群所造成直接影響與間接影響。接著,介紹了這幾種問題所產(chǎn)生的原因,詳細(xì)為同學(xué)們分析了常見的問題產(chǎn)生因素。最后,結(jié)合常見的業(yè)務(wù)場景,為同學(xué)們介紹了,場景集群故障的恢復(fù)方案。
通過以上幾部分內(nèi)容的介紹,希望同學(xué)們對 RabbitMQ 中的集群問題有一個(gè)簡單的系統(tǒng)性地了解,這樣,同學(xué)們在實(shí)際工作中如果遇到了這些集群問題,可以第一時(shí)間進(jìn)行修復(fù)。