上一篇主要總結了 在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文件,添加如下內容:
-
rmq-n1 10.200.37.201 rmq-n2 10.200.37.202 rmq-n3 10.200.37.203
vi /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
將rabbit@rmq-n1作爲集羣主節點,在節點rabbit@rmq-n2和節點rabbit@rmq-n3上面分別執行如下命令,以加入集羣中
(--ram 指定內存節點類型,--disc指定磁盤節點類型) -
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rmq-n1 rabbitmqctl start_app
3節點都可查看集羣狀態
rabbitmqctl cluster_status
-
訪問web管理界面:
-
至此,rabbitmq普通集羣搭建完成。
說明:
鑑於很多人,在完成“複製.erlang.cookie文件”這一步後,將rmq-n2和rmq-n3節點加入到rmq-n1時,報如下錯誤:
Error:unable to connect to nodes ['rabbit@rmq-n1']:nodedown
Segmentation fault
爲此,我專門模擬了一遍,最後發現是由於節點間用於elang分佈式節點通信的指定端口未打開,而造成節點間無法通信!
查看:
【原創】集羣搭建報“Error unable to connect to nodes ['rabbit@rmq-n1']: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鏡像集羣 搭建完成。