天天看點

記一次RabbitMQ的腦裂(網絡分區)問題

記一次RabbitMQ的腦裂(網絡分區)問題

1、問題描述

Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data

記一次RabbitMQ的腦裂(網絡分區)問題

一、什麼是MQ腦裂?

  • 網絡分區

如果另一個節點在一段時間内(預設為 60 秒)無法與其聯系,則節點會确定其對等方是否關閉。如果兩個節點重新接觸,并且都認為另一個節點已關閉,則節點将确定發生了分區。

當網絡分區就位時,叢集的兩個(或更多!)方可以獨立發展,雙方都認為對方已經崩潰。這種情況被稱為裂腦。隊列、綁定、交換可以單獨建立或删除。

  • 跨分區拆分的經典鏡像隊列最終将在分區的每一側都有一個上司者,同樣雙方獨立行動。仲裁隊列将在多數方選舉一個新的上司者。少數方的仲裁隊列副本将不再有進展(即接受新消息、傳遞給消費者等),所有這些工作都将由新的上司者完成。
  • 除非将分區處理政策(例如pause_minority)配置為使用,否則即使在網絡連接配接恢複後,拆分仍将繼續

二、 什麼原因造成腦裂,怎樣檢視?

這是由于網絡問題導緻叢集出現了腦裂。

正常情況下,通過rabbitmqctl cluster_status指令檢視到的資訊中partitions那一項是空的,就像這樣:

# rabbitmqctl cluster_status
Cluster status of node rabbit@smacmullen ...
[{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
{running_nodes,[rabbit@smacmullen,hare@smacmullen]},
{partitions,[]}]
...done.      

然而當網絡分區發生時,會變成這樣:

# rabbitmqctl cluster_status
Cluster status of node rabbit@smacmullen ...
[{nodes,[{disc,[hare@smacmullen,rabbit@smacmullen]}]},
{running_nodes,[rabbit@smacmullen,hare@smacmullen]},
{partitions,[{rabbit@smacmullen,[hare@smacmullen]},
              {hare@smacmullen,[rabbit@smacmullen]}]}]
...done.      

三、怎麼解決MQ腦裂?

原因是rabbitmq叢集在配置時未設定出現網絡分區處理政策,先要将叢集恢複正常,再設定出現網絡分區處理政策,步驟如下:

  • (1)首先需要挑選一個信任的分區,這個分區才有決定Mnesia内容的權限,發生在其他分區的改變将不被記錄到Mnesia中而直接丢棄。
  • (2)停止(stop)其他分區的節點,然後啟動(start)這些節點,之後重新将這些節點加入到目前信任的分區之中。
rabbitmqctl stop_app
rabbitmqctl start_app      
  • (3)最後,你應該重新開機(restart)信任的分區中所有的節點,以去除告警。你也可以簡單的關閉整個叢集的節點,然後再啟動每一個節點,當然,你要確定你啟動的第一個節點在你所信任的分區之中。
注意:mq叢集不能采用kill -9 殺死程序,否則生産者和消費者不能及時識别mq的斷連,會影響生産者和消費者正常的業務處理      
  • (4)設定出現網絡分區處理政策,這裡設定為autoheal,下面會詳細說明其它政策

在/etc/rabbitmq下建立rabbitmq.conf,加入:

[
{rabbit,
  [{tcp_listeners,[5672]},
   {cluster_partition_handling, autoheal}
]}
].      

網絡分區處理政策:

有以下3種處理政策:

  • (1)ignore

預設類型,不處理。

要求你所在的網絡環境非常可靠。例如,你的所有 node 都在同一個機架上,通過交換機互聯,并且該交換機還是與外界通信的必經之路。

  • (2)pause_minority

rabbitmq節點感覺叢集中其他節點down掉時,會判斷自己在叢集中處于多數派還是少數派,也就是判斷與自己形成叢集的節點個數在整個叢集中的比例是否超過一半。如果是多數派,則正常工作,如果是少數派,則會停止rabbit應用并不斷檢測直到自己成為多數派的一員後再次啟動rabbit應用。

注意:這種處理方式叢集通常由奇數個節點組成。在CAP中,優先保證了CP。

注意:pause_minority适用情形有限制,如3個節點叢集,每次隻down1個時,此模式适用。但如果網絡都出問題,3節點會獨立形成3個叢集。

  • (3)autoheal

你的網絡環境可能是不可靠的。你會更加關心服務的可持續性,而非資料完整性。你可以建構一個包含2個node的叢集。

當網絡分區恢複後,rabbitmq各分區彼此進行協商,分區中用戶端連接配接數最多的為勝者,其餘的全部會進行重新開機,恢複到同步狀态

繼續閱讀