原文:https://blog.51cto.com/11134648/2155934
RabbiMQ簡介
RabbiMQ是用Erang開發的,集群非常方便,因為Erlang天生就是一門分布式語言,但其本身並不支持負載均衡。
RabbiMQ模式
RabbitMQ模式大概分為以下三種:
(1)單一模式。
(2)普通模式(默認的集群模式)。
(3) 鏡像模式(把需要的隊列做成鏡像隊列,存在於多個節點,屬於RabbiMQ的HA方案,在對業務可靠性要求較高的場合中比較適用)。
要實現鏡像模式,需要先搭建一個普通集群模式,在這個模式的基礎上再配置鏡像模式以實現高可用。
RabbiMQ特點
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集群節點必須在同一網段里,如果是跨廣域網,效果會變差。
RabbitMQ普通集群配置
1. 配置hosts文件
更改三台MQ節點的計算機名分別為mq01、mq02 和mq03,然后修改hosts配置文件
vim /etc/hostname //其他兩台相同 mq01.localdomain vi /etc/hosts 192.168.100.143 mq01 //注意不能帶.注意-主機名稱也要更改 192.168.100.144 mq02 192.168.100.145 mq03
2.三個節點配置yum源,安裝rabbitmq軟件
yum install -y epel-release yum install -y rabbitmq-server
3.拷貝erlang.cookie
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 root@192.168.100.144:/var/lib/rabbitmq/.erlang.cookie scp /var/lib/rabbitmq/.erlang.cookie root@192.168.100.145:/var/lib/rabbitmq/.erlang.cookie
4.分別查看三個節點並添加管理服務,最后啟動rabbitmq服務
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
5.查看監聽端口(插件監控的端口是15672)
6.將mq02、mq03作為內存節點加入mq01節點集群中
在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應用
7.查看集群狀態
8.登錄rabbitmq web管理控制台,創建新的隊列
打開瀏覽器輸入http://192.168.100.143:15672, 輸入默認的Username:guest,輸入默認的Password:guest ,登錄后出現如圖所示的界面。
根據界面提示創建一條隊列
在RabbitMQ集群集群中,必須至少有一個磁盤節點,否則隊列元數據無法寫入到集群中,當磁盤節點宕掉時,集群將無法寫入新的隊列元數據信息。
RabbitMQ鏡像集群配置
上面已經完成RabbitMQ默認集群模式,但並不保證隊列的高可用性,盡管交換機、綁定這些可以復制到集群里的任何一個節點,但是隊列內容不會復制。雖然該模式解決一項目組節點壓力,但隊列節點宕機直接導致該隊列無法應用,只能等待重啟,所以要想在隊列節點宕機或故障也能正常應用,就要復制隊列內容到集群里的每個節點,必須要創建鏡像隊列。
鏡像隊列是基於普通的集群模式的,然后再添加一些策略,所以你還是得先配置普通集群,然后才能設置鏡像隊列,我們就以上面的集群接着做。
設置的鏡像隊列可以通過開啟的網頁的管理端,也可以通過命令,這里說的是其中的網頁設置方式。
1.創建rabbitmq策略
在mq01節點的控制台上創建策略
(1)點擊admin菜單–>右側的Policies選項–>左側最下下邊的Add/update a policy。
(2)按照圖中的內容根據自己的需求填寫。
- Name:策略名稱
- Pattern:匹配的規則,這里表示匹配a開頭的隊列,如果是匹配所有的隊列,那就是^.
- Definition:使用ha-mode模式中的all,也就是同步所有匹配的隊列。問號鏈接幫助文檔。
(3)點擊Add policy添加策略
此時分別登陸mq02、mq03兩個節點的控制台,可以看到上面添加的這個策略,如圖所示:
2.添加隊列
在mq01節點的控制台上添加隊列
(1)點擊Queues菜單–>左側下邊的Add a new queue
(2)輸入Name和Arguments參數的值,別的值默認即可
- Name:隊列名稱
- Durability:隊列是否持久化
- Node:消息隊列的節點
- Auto delete:自動刪除
- Arguments:使用的策略類型
(3)點擊Add queue
將鼠標指向+2可以顯示出另外兩台消息節點。
3.創建消息
(1)點擊ab隊列按鈕
(2)拖動滾動條,點擊publish message
(3)填寫相關內容
- 2-Persistent:表示持久化
- Headers:隨便填寫即可
- Properties:點擊問號,選擇一個消息ID號
- Payload:消息內容
(4)點擊Publish message按鈕
點擊queue按鈕,發現ab隊列的Ready和Total中多了一條消息記錄。
4.做破壞性測試
(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集群的破壞性測試,說明集群配置成功。