解決RabbitMQ鏡像集群腦裂問題
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達(dá)
76套java從入門到精通實(shí)戰(zhàn)課程分享
1、現(xiàn)象:
項目中使用了rabbitmq的鏡像模式集群,兩個節(jié)點(diǎn),昨天出現(xiàn)MQ集群不能正常消息通信,打開web管理界面:

Network partition detected
Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data. Please read RabbitMQ documentation about network partitions and the possible solutions.
原來是集群出現(xiàn)腦裂現(xiàn)象,網(wǎng)絡(luò)分區(qū)中一個節(jié)點(diǎn)在一分鐘(或者一個net_ticktime時間)內(nèi)不能連接上另一個節(jié)點(diǎn),那么Mnesia會認(rèn)為另一個節(jié)點(diǎn)已經(jīng)掛了。就算之后兩個節(jié)點(diǎn)連通,但是這兩個節(jié)點(diǎn)都認(rèn)為對方已經(jīng)掛了,Mnesia此時認(rèn)定發(fā)生了網(wǎng)絡(luò)分區(qū)的情況。rabbitmq出錯日志如下:
=INFO REPORT==== 11-Jun-2019::19:11:57 ===
node 'rabbit@lg-mq01' up
=ERROR REPORT==== 11-Jun-2019::19:11:57 ===
Mnesia('rabbit@lg-mq02'): ** ERROR ** mnesia_event got {inconsistent_database, running_partitioned_network, 'rabbit@lg-mq01'}
=INFO REPORT==== 11-Jun-2019::19:12:09 ===
accepting AMQP connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672)
=INFO REPORT==== 11-Jun-2019::19:12:09 ===
connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'
=INFO REPORT==== 11-Jun-2019::19:12:14 ===
accepting AMQP connection <0.22202.1484> (10.200.66.115:56686 -> 10.200.66.115:5672)
=INFO REPORT==== 11-Jun-2019::19:12:14 ===
connection <0.22202.1484> (10.200.66.115:56686 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'
=WARNING REPORT==== 11-Jun-2019::19:12:17 ===
closing AMQP connection <0.15728.1484> (10.200.66.115:56670 -> 10.200.66.115:5672):
client unexpectedly closed TCP connection
=INFO REPORT==== 11-Jun-2019::19:12:18 ===
accepting AMQP connection <0.20778.1484> (10.200.66.115:56700 -> 10.200.66.115:5672)
=INFO REPORT==== 11-Jun-2019::19:12:18 ===
connection <0.20778.1484> (10.200.66.115:56700 -> 10.200.66.115:5672): user 'xxxxx' authenticated and granted access to vhost 'leboGame'
=INFO REPORT==== 11-Jun-2019::19:54:58 ===
accepting AMQP connection <0.23143.1484> (10.200.66.115:61598 -> 10.200.66.115:5672)
2、解決辦法:
原因是rabbitmq集群在配置時未設(shè)置出現(xiàn)網(wǎng)絡(luò)分區(qū)處理策略,先要將集群恢復(fù)正常,再設(shè)置出現(xiàn)網(wǎng)絡(luò)分區(qū)處理策略,步驟如下:
(1)首先需要挑選一個信任的分區(qū),這個分區(qū)才有決定Mnesia內(nèi)容的權(quán)限,發(fā)生在其他分區(qū)的改變將不被記錄到Mnesia中而直接丟棄。
(2)停止(stop)其他分區(qū)的節(jié)點(diǎn),然后啟動(start)這些節(jié)點(diǎn),之后重新將這些節(jié)點(diǎn)加入到當(dāng)前信任的分區(qū)之中。
rabbitmqctl stop_app
rabbitmqctl start_app
(3)最后,你應(yīng)該重啟(restart)信任的分區(qū)中所有的節(jié)點(diǎn),以去除告警。
你也可以簡單的關(guān)閉整個集群的節(jié)點(diǎn),然后再啟動每一個節(jié)點(diǎn),當(dāng)然,你要確保你啟動的第一個節(jié)點(diǎn)在你所信任的分區(qū)之中。
(4)設(shè)置出現(xiàn)網(wǎng)絡(luò)分區(qū)處理策略,這里設(shè)置為autoheal,下面會詳細(xì)說明其它策略
在/etc/rabbitmq下新建rabbitmq.conf,加入:
[
{rabbit,
[{tcp_listeners,[5672]},
{cluster_partition_handling, autoheal}
]}
].
3、網(wǎng)絡(luò)分區(qū)處理策略:
有以下3種處理策略:
(1)ignore
默認(rèn)類型,不處理。
要求你所在的網(wǎng)絡(luò)環(huán)境非常可靠。例如,你的所有 node 都在同一個機(jī)架上,通過交換機(jī)互聯(lián),并且該交換機(jī)還是與外界通信的必經(jīng)之路。
(2)pause_minority
rabbitmq節(jié)點(diǎn)感知集群中其他節(jié)點(diǎn)down掉時,會判斷自己在集群中處于多數(shù)派還是少數(shù)派,也就是判斷與自己形成集群的節(jié)點(diǎn)個數(shù)在整個集群中的比例是否超過一半。如果是多數(shù)派,則正常工作,如果是少數(shù)派,則會停止rabbit應(yīng)用并不斷檢測直到自己成為多數(shù)派的一員后再次啟動rabbit應(yīng)用。注意:這種處理方式集群通常由奇數(shù)個節(jié)點(diǎn)組成。在CAP中,優(yōu)先保證了CP。
注意:pause_minority適用情形有限制,如3個節(jié)點(diǎn)集群,每次只down1個時,此模式適用。但如果網(wǎng)絡(luò)都出問題,3節(jié)點(diǎn)會獨(dú)立形成3個集群。
(3)autoheal
你的網(wǎng)絡(luò)環(huán)境可能是不可靠的。你會更加關(guān)心服務(wù)的可持續(xù)性,而非數(shù)據(jù)完整性。你可以構(gòu)建一個包含2個node的集群。
當(dāng)網(wǎng)絡(luò)分區(qū)恢復(fù)后,rabbitmq各分區(qū)彼此進(jìn)行協(xié)商,分區(qū)中客戶端連接數(shù)最多的為勝者,其余的全部會進(jìn)行重啟,恢復(fù)到同步狀態(tài)。
————————————————
版權(quán)聲明:本文為CSDN博主「賀群」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/hhq163/article/details/92584790
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
