1. 程式人生 > >RabbitMQ集群搭建

RabbitMQ集群搭建

rabbitmq mq 隊列

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集群的節點間是使用

cookie來確認通信的,所以集群中的每個節點都必須有相同的erlang.cookie,同時保證文件權限是400且所屬用戶和組都一致

每個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]
/* */:/var/lib/rabbitmq/.erlang.cookie ./


查看文件所屬用戶和組以及權限是否滿足要求,不滿足則修改,否則會報錯:

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]的集群中,加入之前必須先停止rabbit02rabbitmq應用程序,加入之後再啟動,[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]來加入,因為0102都是集群的成員了。

[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集群搭建