RabbiMQ是用Erang開發的,叢集非常方便,因爲Erlang天生就是一門分佈式語言,但其本身並不支援負載均衡。
RabbitMQ模式大概分爲以下三種:
(1)單一模式。
(2)普通模式(預設的叢集模式)。
(3) 映象模式(把需要的佇列做成映象佇列,存在於多個節點,屬於RabbiMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)。
要實現映象模式,需要先搭建一個普通叢集模式,在這個模式的基礎上再設定映象模式以實現高可用。
RabbitMQ的叢集節點包括記憶體節點、磁碟節點。RabbitMQ支援訊息的持久化
也就是數據寫在磁碟上,最合適的方案就是既有記憶體節點,又有磁碟節點。
IP地址 | 主機名 | 操作系統 | 防火牆和SELinux | 用途 |
---|---|---|---|---|
192.168.100.143 | mq01 | CentOS7.4(64位元) | 關閉 | 磁碟節點 |
192.168.100.144 | mq02 | CentOS7.4(64位元) | 關閉 | 記憶體節點 |
192.168.100.145 | mq03 | CentOS7.4(64位元) | 關閉 | 記憶體節點 |
注意,這裏三臺伺服器都連線上網際網路,另外RabbitMQ叢集節點必須在同一網段裡,如果是跨廣域網,效果會變差。
更改三臺MQ節點的計算機名分別爲mq01、mq02 和mq03,然後修改hosts組態檔
# vim /etc/hostname //其他兩臺相同
mq01.localdomain
# vim /etc/hosts
192.168.100.143 mq01 //注意不能帶.注意-主機名稱也要更改
192.168.100.144 mq02
192.168.100.145 mq03
# yum install -y epel-release
# yum install -y rabbitmq-server
Rabbitmq的叢集是依附於erlang的叢集來工作的,所以必須先構建起erlang的叢集景象。Erlang的叢集中各節點是經由過程一個magic cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中,檔案是400的許可權。所以必須保證各節點cookie一致,不然節點之間就無法通訊。
[root@mq01 ~]# cat /var/lib/rabbitmq/.erlang.cookie
XAHPZVPYUQDWWJIOHUPQ
用scp的方式將mq01節點的.erlang.cookie的值複製到其他兩個節點中。
# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
# scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/.erlang.cookie
RabbitMQ提供了一個非常友好的圖形化監控頁面外掛(rabbitmq_management),讓我們可以一目瞭然看見Rabbit的狀態或叢集狀態。
# /usr/lib/rabbitmq/bin/rabbitmq-plugins list //檢視外掛安裝情況
# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management //啓用rabbitmq_management服務
# service rabbitmq-server start
在mq02、mq03執行如下命令:
# rabbitmqctl stop_app //停掉rabbit應用
# rabbitmqctl join_cluster --ram rabbit@mq01 //加入到磁碟節點
# rabbitmqctl start_app //啓動rabbit應用
(1)預設rabbitmq啓動後是磁碟節點,在這個cluster命令下,mq02和mq03是記憶體節點,mq01是磁碟節點。
(2)如果要使mq02、mq03都是磁碟節點,去掉--ram參數即可。
(3)如果想要更改節點型別,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必須停掉rabbit應用
開啓瀏覽器輸入http://192.168.100.143:15672, 輸入預設的Username:guest,輸入預設的Password:guest ,登錄後出現如圖所示的介面。
根據介面提示建立一條佇列
在RabbitMQ叢集叢集中,必須至少有一個磁碟節點,否則佇列元數據無法寫入到叢集中,當磁碟節點宕掉時,叢集將無法寫入新的佇列元數據資訊。
上面已經完成RabbitMQ預設叢集模式,但並不保證佇列的高可用性,儘管交換機、系結這些可以複製到叢集裡的任何一個節點,但是佇列內容不會複製。雖然該模式解決一專案組節點壓力,但佇列節點宕機直接導致該佇列無法應用,只能等待重新啓動,所以要想在佇列節點宕機或故障也能正常應用,就要複製佇列內容到叢集裡的每個節點,必須要建立映象佇列。
映象佇列是基於普通的叢集模式的,然後再新增一些策略,所以你還是得先設定普通叢集,然後才能 纔能設定映象佇列,我們就以上面的叢集接着做。
設定的映象佇列可以通過開啓的網頁的管理端,也可以通過命令,這裏說的是其中的網頁設定方式。
在mq01節點的控制檯上建立策略
(1)點選admin選單–>右側的Policies選項–>左側最下下邊的Add/update a policy。
(2)按照圖中的內容根據自己的需求填寫。
- Name:策略名稱
- Pattern:匹配的規則,這裏表示匹配a開頭的佇列,如果是匹配所有的佇列,那就是^.
- Definition:使用ha-mode模式中的all,也就是同步所有匹配的佇列。問號鏈接幫助文件。
(3)點選Add policy新增策略
此時分別登陸mq02、mq03兩個節點的控制檯,可以看到上面新增的這個策略,如圖所示:
在mq01節點的控制檯上新增佇列
(1)點選Queues選單–>左側下邊的Add a new queue
(2)輸入Name和Arguments參數的值,別的值預設即可
- Name:佇列名稱
- Durability:佇列是否持久化
- Node:訊息佇列的節點
- Auto delete:自動刪除
- Arguments:使用的策略型別
(3)點選Add queue
將滑鼠指向+2可以顯示出另外兩臺訊息節點。
(1)點選ab佇列按鈕
(2)拖動卷軸,點選publish message
(3)填寫相關內容
- 2-Persistent:表示持久化
- Headers:隨便填寫即可
- Properties:點選問號,選擇一個訊息ID號
- Payload:訊息內容
(4)點選Publish message按鈕
點選queue按鈕,發現ab佇列的Ready和Total中多了一條訊息記錄。
(1)將mq01節點的服務關閉,再通過mq02和mq03檢視訊息記錄是否還存在。
# rabbitmqctl stop_app //停掉mq01的rabbit應用
從中可以看到ab佇列已經從之前的+2顯示成+1了,而且訊息記錄是存在的。
(2)再將mq02節點的服務關閉,通過mq03檢視訊息記錄是否還存在。
# rabbitmqctl stop_app //停掉mq02的rabbit應用
從中可以看到ab佇列和訊息記錄還是存在的,只是變成了一個節點了。
(3)將mq01和mq02的服務再啓動起來
# rabbitmqctl start_app //啓動mq01、mq02的rabbit應用
從中可以看到ab佇列後面+2變成了粉色,滑鼠指上去顯示映象無法同步。如果這時候停掉mq03節點的服務,那麼佇列裏面的訊息將會丟失。
採取的解決辦法是選擇在mq02節點上執行同步命令。
# rabbitmqctl sync_queue ab //同步ab佇列
同步完成後,+2又變成了藍色。
這樣,我們就測試了rabbitmq叢集的破壞性測試,說明叢集設定成功。