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

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