rabbitmq集群網路分割槽模擬與恢復

2021-08-21 15:50:10 字數 3201 閱讀 6318

網路分割槽出現的原因是集群節點之間通訊出現異常,導致各節點之間資料不同步,節點之間通訊異常恢復後集群會**成多個網路分割槽(小集群)各自為政。

配置檔案包含中cluster_partition_handling的配置為ignore

乙個正常執行的3節點集群,集群狀態如下

[root@test-192-168-1-41 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-41' ...

}, ,

, ,,          ,

]}]

關閉41節點的25672埠(集群間通訊使用的埠),在41節點檢視集群狀態,發現集群不可用。

[root@test-192-168-1-41 ~]# iptables -i input -p tcp --dport 25672 -j reject

[root@test-192-168-1-41 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-41' ...

error: unable to connect to node 'rabbit@test-192-168-1-41': nodedown

diagnostics

**********=

attempted to contact: ['rabbit@test-192-168-1-41']

rabbit@test-192-168-1-41:

* connected to epmd (port 4369) on test-192-168-1-41

* epmd reports node 'rabbit' running on port 25672

* can't establish tcp connection, reason: econnrefused (connection refused)

* suggestion: blocked by firewall?

current node details:

- node name: 'rabbitmq-cli-80@test-192-168-1-41'

- home dir: /var/lib/rabbitmq

- cookie hash: 1kspxc9hxkazvthkao5b5q==

在47節點檢視集群狀態,發現alarms中顯示41節點為nodedown

[root@test-192-168-1-47 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-47' ...

}, ,

, ,,          ,

]}]

在41節放開25672埠,在41檢視集群狀態,發現runnint_nodes和alarms中均只有41節點

[root@test-192-168-1-41 ~]# iptables -d input -p tcp --dport 25672 -j reject

[root@test-192-168-1-41 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-41' ...

}, ,

, ,]}]

在47節點檢視集群狀態,發現partitions中出現了資訊,說明此時集群出現了網路分割槽

[root@test-192-168-1-47 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-47' ...

}, ,

, ,]},

,      ]}]

分別在47節點和48節點執行重新加入集群命令

stopping node 'rabbit@test-192-168-1-41' ...

starting node 'rabbit@test-192-168-1-41' ...

檢視集群狀態,已經恢復

[root@test-192-168-1-41 ~]# rabbitmqctl cluster_status

cluster status of node 'rabbit@test-192-168-1-41' ...

}, ,

, ,,          ,

]}]

autoheal:此模式下,rabbitmq將在發生網路分割槽時,自動決定出乙個勝出分割槽(獲勝分割槽是獲得最多客戶端連線的那個分割槽;如果產生平局,則選擇擁有最多節點的分割槽;如果仍是平局,則隨機選擇),並重啟不在該分割槽中的所有節點。與pause_minority模式不同的是,autoheal 模式是在分割槽結束階段(已經形成穩定的分割槽)時起作用,而不是在分割槽開始階段(剛剛開始分割槽)。此模式適合更看重服務的可持續行勝於資料完整性的場景。

pause_minority:此模式下,如果發現有節點失效,rabbitmq將會自動停止少數派集群(即少於或等於半數節點數)中的所有節點。這種策略選擇了cap 理論中的分割槽容錯性(p),而放棄了可用性(a),保證了在發生網路分割槽時,最多只有乙個分割槽中的節點會繼續工作;而處於少數派集群中的節點將在分割槽發生的開始就被停止,在分割槽恢復後重新啟動(繼續執行但不監聽任何埠或做其他工作,其將每秒檢測一次集群中的其他節點是否可見,若可見則從pause狀態喚醒)。對於節點掛起引起的網路分割槽,此模式無效,因為掛起節點不能看到其餘節點是否恢復"可見",因而不能觸發從cluster中斷開。

pause_if_all_down:此模式下,rabbitmq會自動停止集群中的節點,只要某節點與列舉出來的任何節點之間無法通訊。這與pause-minority模式比較接近,但該模式允許管理員來決定採用哪些節點做判定;可能存在列舉出來的多個節點本身就處於無法通訊的不同分割槽中,此時不會有任何節點被停掉。

ignore:對分割槽不做任何處理。

這裡建議使用autohel模式,可以很好的保證集群的可用性,如果你的集群出現過3節點down了2節點以後,最後乙個正常的節點自動down掉,你可能使用了pause_minority模式。

rabbitmq集群配置

rabbitmq是乙個輕量級的訊息服務系統,切記它只是乙個類似信件郵遞員的功能,而不是快遞,不用把它當成redis在用。一 rabbitmq軟體安裝 1.erlang安裝 安裝erlang,載入官方提供的yum源,然後直接安裝。最新版本的rabbitmq直接依賴erlang,安裝esl erlang...

Rabbitmq 建立集群

更改host 兩台主機rabbit1 192.168.1.112,rabbit2 192.168.1.113 host配置如下 rabbit1 192.168.1.112 rabbit2 192.168.1.113 同步erlang.cookie 將rabbit1 c users erlang.co...

安裝rabbitmq集群

一.安裝 erlang rabbitmq 在10.0.0.45 10.0.0.57 10.0.0.58三個節點上安裝,然後開啟 rabbitmq 監控外掛程式 以下在root使用者操作 1.etc hosts增加 10.0.0.45 node1 10.0.0.57 node2 10.0.0.58 n...