RabbitMQ集群搭建
rabbitmq集群是通過erlang的分布式特性進行rabbitmq集群,各個rabbitmq的服務為相應的節點,每個節點都提供給客戶端連接,進行消息的發送與接收。
環境:CentOS 6.8 64位
服務器:192.168.179.128 wangwq01
192.168.179.129 wangwq02
192.168.179.130 wangwq03
1. 主機域名解析
rabbitmq各節點之間通信使用域名,所以集群成員中所有主機名都要可解析,這裏使用修改hosts文件來實現解析。
2. 集群的幾種實現方法及特性
1)手動使用rabbitmqctl創建
2)通過配置文件來列舉出集群的節點
3)使用rabbitmq-autocluster來實現(此為一個插件)
4)使用rabbitmq-cluster來實現(這也是個插件)
集群可以動態構建與修改,即可以動態添加也可以動態脫離。集群中的節點可以隨時關閉和啟動,也可以允許個別節點出現故障,只要在整個集群中有正常節點即可。
節點可以是磁盤節點,也可以是內存節點,兩者之間可以互換使用,一般情況都是磁盤節點,特殊情況下使用內存節點可用於提高隊列、交換器或綁定的性能。
3. 設置cookie文件
rabbitmq集群的節點間是使用
每個rabbitmq啟動時,erlang會自動創建一個cookie文件,為了使每個節點的cookie保持一致,可以先讓其中一個節點來創建,然後將這個文件拷貝到其他節點的相應位置。默認cookie文件位於/var/lib/rabbitmq/.erlang.cookie
例:192.168.179.130創建了cookie文件,在192.168.179.129上
cd /var/lib/rabbitmq/
如果已經有了該文件,則刪除:
rm -rf .erlang.cookie scp [email protected]
查看文件所屬用戶和組以及權限是否滿足要求,不滿足則修改,否則會報錯:
Error when reading /var/lib/rabbitmq/.erlang.cookie: eacces
chown rabbitmq:rabbitmq .erlang.cookie chmod 400 .erlang.cookie
4. 啟動單個節點
運行命令:
rabbitmq-server -detached
可能會出錯:ERROR: node with name "rabbit" already running on "hostname"
這是因為已經有一個運行的rabbitmq進程,停止即可:
ps aux|grep rabbitmq kill -15 PID
然後再次運行啟動命令。
這三個獨立的節點可以通過如下命令來驗證:
rabbitmqctl cluster_status
會看到:
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]},
{running_nodes,[[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[[email protected],[]}]}]
5. 創建集群
要把單獨的節點構建到一個集群中,可以暫定其中一個節點為集群中的第一個節點。然後依次將別的節點加入到集群中(只要是已經成為集群中的節點,其他節點就可以通過該節點加入)。舉如下例子:
可以暫定[email protected]為集群的第一個節點,先將[email protected]加入到[email protected]的集群中,加入之前必須先停止rabbit02的rabbitmq應用程序,加入之後再啟動,[email protected]@rabbit01加入,[email protected]
在[email protected]上:
rabbitmqctl stop_app rabbitmqctl join_cluster [email protected] rabbitmqctl start_app
加入過程中可能會遇到錯誤,如:Error: unable to connect to nodes [[email protected]]: nodedown 這是因為端口未開通導致無法連接到主機,可能是iptables沒有設置或者設置不當。
註:加入集群時有兩種不同的節點類型:磁盤節點和內存節點。一個集群中至少要有一個磁盤節點,當有節點加入或者離開時,必須要將變更通知到至少一個磁盤節點。如果集群中只有一個磁盤節點或者只剩一個磁盤節點可用,這個磁盤節點崩潰之後,集群扔可保持運行,但無法進行其他操作(增刪改查),直到節點恢復。所以集群中最好設置兩個或以上的磁盤節點。
默認創建的為磁盤節點,創建內存節點只需要加一個參數[--ram]:
rabbitmqctl join_cluster --ram [email protected]
改變節點類型,如將內存節點更改為磁盤節點:
rabbitmqctl stop_app rabbitmqctl change_cluster_node_type disc rabbitmqctl start_app
如果是開啟iptables的,添加如上端口的規則:
vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4369 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 25672 -j ACCEPT :wq保存退出 /etc/init.d/iptables restart
這樣[email protected]加加入到集群中了,可以通過cluster_status命令查看:
rabbitmqctl cluster_status
如果正常 可看到:
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[[email protected],[]},[email protected],[]}]}]
在[email protected]上也可查看到相同的信息。
然後將[email protected]加入到集群,這時它既可以選擇通過[email protected]來加入,也可以選擇[email protected]來加入,因為01和02都是集群的成員了。
在[email protected]上:
rabbitmqctl stop_app rabbitmqctl join_cluster [email protected] rabbitmqctl start_app
在三個節點上分別使用cluster_status命令查看,可看到三個節點都在集群裏了。
修改集群的名字:
rabbitmqctl set_cluster_name new_mqname
6. 重啟集群節點
加入到集群中的節點,任何時候都允許停止,剩余的節點不受影響繼續工作,重新啟動停止的節點會再次自動工作
如:停止[email protected]
在rabbit01上:
rabbitmqctl stop
然後在集群的某個節點中查看:
rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected],[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[[email protected],[]},[email protected],[]}]}]
可看到運行的節點中少了[email protected],再次啟動rabbit01
rabbitmq-server -detached rabbitmqctl cluster_status
Cluster status of node rabbit@ rabbit01 ...
[{nodes,[{disc,[rabbit@ rabbit01,rabbit@ rabbit02,rabbit@ rabbit03]}]},
{running_nodes,[rabbit@ rabbit02,rabbit@ rabbit03,rabbit@ rabbit01]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[{rabbit@ rabbit02,[]},{rabbit@ rabbit03,[]},{rabbit@ rabbit01,[]}]}]
註意:
1. 當整個集群關閉時,最後一個關閉的節點必須要在下次第一個啟動,否則,節點會等待最後一個磁盤節點30s來確認重新連接,連接不到就會失敗。如果最後一個關閉的節點無法恢復,可以使用以下命令從集群中刪除:
rabbitmqctl forget_cluster_node
2. 如果所有節點都在同一時間關閉(如斷電的情況),這會讓所有節點都認為其他節點在自己之後,這種情況時,可以在其中的一個節點上執行以下命令使其成為可啟動的:
rabbitmqctl force_boot
7. 脫離集群
要刪除集群中的節點,首先要停止rabbitmq應用程序,然後重設節點,完成之後再次啟動。刪除後的節點又會變為獨立的節點。
例:將[email protected]從節點中刪除
a. 在本節點刪除
在rabbit03上:
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app
然後在節點上執行cluster_status命令來確認是否成功
在rabbit01上:
rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[[email protected],[]},[email protected],[]}]}]
在rabbit03上查看:
rabbitmqctl cluster_status
Cluster status of node [email protected] ...
[{nodes,[{disc,[[email protected]]}]},
{running_nodes,[[email protected]]},
{cluster_name,<<"[email protected]">>},
{partitions,[]},
{alarms,[[email protected],[]}]}]
b. 遠程刪除
如在rabbit02上刪除rabbit03(依然要先停止應用程序)
在rabbit03上停止:
rabbitmqctl stop_app
在rabbit02上刪除:
rabbitmqctl forget_cluster_node [email protected]
這時集群中已經將rabbit03刪除了,但是rabbit03本身還不知道,依然認為自己是集群中的一員,所以啟動時會報錯:
Error description:
{error,{inconsistent_cluster,"Node [email protected] thinks it‘s clustered with node [email protected], but [email protected] disagrees"}}
想要讓rabbit03再次成為單獨可使用的節點,需要進行重置。
在rabbit03上:
rabbitmqctl reset
然後再次啟動:
rabbitmqctl start_app
本文出自 “我不是我” 博客,請務必保留此出處http://wangwq.blog.51cto.com/8711737/1951185
RabbitMQ集群搭建