模拟RabbitMQ网络分区
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/simulate-rabbitmq-network-partition/
1. 概述
正常情況下,很難觀察到RabbitMQ網絡分區的發生。為了更好的理解網絡分區,需要某些手段將其模擬出來,以便對其做相應的分析處理,進而在正式應用環境中遇到類似情形可以處理的游刃有余。往長遠方面講,也可以采取一些必要的手段去避免網絡分區的發生,或者可以監控網絡分區以便對其迅速處理。
模擬網絡分區的方式有多種,主要分為以下3大類:
下面對這3大類做詳細分析。
2. iptables的方式
由于RabbitMQ集群內部節點通信端口默認為25672,可以封禁這個端口來模擬出net_tick_timeout,然后再開啟此端口讓集群判斷出網絡分區的發生。舉例說明,整個RabbitMQ集群由3個節點組成,分別為node1, node2, node3。此時我們要模擬node2節點被剝離出當前分區的情形,即模擬[node1, node3]和[node2]兩個分區。可以在node2上執行如下命令以封禁25672端口。如果在配置中修改過這個端口號,可以將下面的命令改成相應的端口號即可。
iptables -A INPUT -p tcp --dport 25672 -j DROP iptables -A OUTPUT -p tcp --dport 25672 -j DROP同時需要監測各個節點的服務日志,當有如下相似信息出現時即為已經判定出net_tick_timeout:
=INFO REPORT==== 10-Oct-2017::11:53:03 === rabbit on node rabbit@node2 down=INFO REPORT==== 10-Oct-2017::11:53:03 === node rabbit@node2 down: net_tick_timeout當然,如果不想去監測各個節點的服務日志,也可以等待75秒以確保出現net_tick_timeout。注意此時只判定出net_tick_timeout,要等node2網絡恢復之后,即解封25672端口之后才會判定出現網絡分區。解封命令如下:
iptables -D INPUT 1 iptables -D OUTPUT 1至此,node2節點與其他節點的內部通信已經恢復,如果此時查看集群的狀態可以發現[node1, node3]和[node2]已形成兩個獨立的分區。
還可以使用iptables封禁IP地址的方法模擬網絡分區。假設整個RabbitMQ集群的節點名稱與其IP地址對應如下:
node1 192.168.0.2 node2 192.168.0.3 node3 192.168.0.4如果要模擬出[node1, node3]和[node2]兩個分區的情形,可以在node2節點上執行:
iptables -I INPUT -s 192.168.0.2 -j DROP iptables -I INPUT -s 192.168.0.4-j DROP對應的解封命令為:
iptables -D INPUT 1 iptables -D INPUT 1或者也可以分別在node1, node3節點上執行:
iptables -I INPUT -s 192.168.0.3 -j DROP與其對應的解封命令為:
iptables -D INPUT 1如果集群的節點部署有跨網絡分段的話,可以采取禁用整個網絡段的方式模擬網絡分區。假設RabbitMQ集群中3個節點和其對應的IP關系如下:
node1 192.168.0.2 node2 192.168.1.3 node3 192.168.0.4如果要模擬出[node1, node3]和[node2]兩個分區的情形,可以在node2節點上執行:
iptables -I INPUT -s 192.168.0.0/24 -j DROP對應的解封命令也是:iptables -D INPUT 1。
3. 封禁/解封網卡的方式
操作網卡的方式和iptables的方式有相似之處,都是模擬網絡故障來產生網絡分區。首先需要使用ifconfig命令來查詢出當前的網卡編號,如下所示,一般情況下單臺機器只有一個網卡。(這里暫時不考慮多網卡的情形,因為對于RabbitMQ來說,多網卡的情況造成的網絡分區異常復雜。)
[root@node1 rabbit@node1]# ifconfig eth0 Link encap:Ethernet HWaddr FA:16:3E:A8:FF:31 inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.224.0inet6 addr: fe80::f816:3eff:fea8:ff31/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1RX packets:547632449 errors:0 dropped:0 overruns:0 frame:0TX packets:5745162 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000 RX bytes:82813557343 (77.1 GiB) TX bytes:3099664440 (2.8 GiB)lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING MTU:65536 Metric:1RX packets:111152 errors:0 dropped:0 overruns:0 frame:0TX packets:111152 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0 RX bytes:5401343 (5.1 MiB) TX bytes:5401343 (5.1 MiB)假設在node1, node2, node3三個節點的RabbitMQ集群中,node2的網卡編號為eth0,此時要模擬網絡分區[node1, node3]和[node2]的情形,需要在node2上執行以下命令關閉網卡:
ifdown eth0待判定出net_tick_timeout之后,再開啟網卡:
ifup eth0這樣就可以模擬出網絡分區的情形。當然也可以使用service network stop和service network start兩個命令來模擬網絡分區,原理同ifdown/ifup eth0的方式。
4. 掛起/恢復操作系統的方式
除了模擬網絡故障的方式,操作系統的掛起和恢復操作也會導致集群內節點的網絡分區。因為發生掛起的節點不會認為自身已經失敗或者停止工作,但是集群內的其他節點會這么認為。如果集群中的一個節點運行在一臺筆記本上,然后你合上了筆記本,那么這個節點就掛起了。或者一個更常見的現象,集群中的一個節點運行在某臺虛擬機上,然后虛擬機的管理程序掛起了這個虛擬機節點,這樣節點就被掛起了。待(0.75net_ticktime, 1.25net_ticktime)時間之后,判斷出net_tick_timeout,再恢復掛起的節點即可以模擬出網絡分區的情形。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/simulate-rabbitmq-network-partition/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的模拟RabbitMQ网络分区的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学会查看 RabbitMQ日志
- 下一篇: RabbitMQ消息追踪之Firehos