(二)RabbitMQ 普通叢集 & 映象叢集 搭建(含 踩過的坑......)
上一篇主要總結了 在CentOS7上 如何安裝 RabbitMQ v3.5.6
這一篇總結一下:RabbitMQ 2種叢集模式的搭建
一:準備工作
- 準備3臺虛擬機器,均安裝rabbitmq-server,分別對應node1,node2,node3
(參照上一篇:在CentOS7上 如何安裝 RabbitMQ v3.5.6) - 分別 配置靜態 IP為:
10.200.37.201
10.200.37.202
10.200.37.203 - 修改hosts檔案,新增如下內容:
-
【!重要】修改3臺虛擬機器對應的hostnamermq-n1 10.200.37.201 rmq-n2 10.200.37.202 rmq-n3 10.200.37.203
分別 修改為:rmq-n1、rmq-n2、rmq-n3vi /etc/hostname
(第2、3、4步可參照:CentOS7 基礎設定(eg:靜態IP,hosts檔案,防火牆,主機名......))
二:普通叢集 搭建
-
說明:
rabbitmq的叢集是依附於erlang的叢集來工作的,所以必須先構建起erlang的叢集映象。
(.erlang.cookie是erlang分散式的token檔案,叢集內所有的裝置要持有相同的.erlang.cookie檔案才允許彼此通訊)。 -
查詢.erlang.cookie檔案
find / -name *.cookie
-
將查詢到的.erlang.cookie檔案,分別複製到另外兩臺虛擬機器中。(過程中要輸入另外兩臺虛擬機器的密碼)
scp /var/lib/rabbitmq/.erlang.cookie 10.200.37.202:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie 10.200.37.203:/var/lib/rabbitmq/
-
複製完成後,需要修改檔案許可權為400
chmod 400 /var/lib/rabbitmq/.erlang.cookie
-
erlang.cookie複製完成後,逐個重啟節點服務:
-
systemctl restart rabbitmq-server.service systemctl status rabbitmq-server.service
將[email protected]作為叢集主節點,在節點[email protected]和節點[email protected]上面分別執行如下命令,以加入叢集中
(--ram 指定記憶體節點型別,--disc指定磁碟節點型別) -
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram [email protected] rabbitmqctl start_app
3節點都可檢視叢集狀態
rabbitmqctl cluster_status
-
訪問web管理介面:
-
至此,rabbitmq普通叢集搭建完成。
說明:
鑑於很多人,在完成“複製.erlang.cookie檔案”這一步後,將rmq-n2和rmq-n3節點加入到rmq-n1時,報如下錯誤:
Error:unable to connect to nodes ['[email protected]']:nodedown
Segmentation fault
為此,我專門模擬了一遍,最後發現是由於節點間用於elang分散式節點通訊的指定埠未開啟,而造成節點間無法通訊!
檢視:
【原創】叢集搭建報“Error unable to connect to nodes ['[email protected]']:nodedown Segmentation fault” 錯的解決
-
從叢集中移除節點:
-
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app
修改節點型別:
-
rabbitmqctl stop_app rabbitmqctl change_cluster_node_type disc rabbitmqctl start_app
停止所有節點 RabbitMQ 服務,然後使用 detached 引數獨立執行,這步很關鍵,尤其增加節點停止節點後再次啟動遇到無法啟動都可以參照這個順序
rabbitmqctl stop rabbitmq-server -detached rabbitmqctl cluster_status
三、映象叢集 搭建
- 說明:
上面配置RabbitMQ預設叢集模式,但並不保證佇列的高可用性,儘管交換機、繫結這些可以複製到叢集裡的任何一個節點,但是佇列內容不會複製,雖然該模式解決一部分節點壓力,但佇列節點宕機直接導致該佇列無法使用,只能等待重啟,所以要想在佇列節點宕機或故障也能正常使用,就要複製佇列內容到叢集裡的每個節點,需要建立映象佇列。
使用Rabbit映象功能,需要基於rabbitmq策略來實現,策略是用來控制和修改群集範圍的某個Vhost佇列行為和Exchange行為 - 在cluster中任意節點啟用策略,策略會自動同步到叢集節點:
rabbitmqctl set_policy -p my-vhosts my-policy"^" '{"ha-mode":"all"}'
命令說明:
在vhost名稱為“my-vhosts” 上建立了一個策略,策略名稱為my-policy,
策略正則表示式為 “^” 表示所有匹配所有佇列名稱,
策略模式為 all 即複製到所有節點,包含新增節點。 -
客戶端連線任一節點,建立名稱為“test-queue”的佇列,訪問任一管理介面,可以看到佇列已經複製到其它2節點
-
至此,rabbitmq映象叢集 搭建完成。