在CentOS7上部署Rabbitmq集群配置
RabbitMQ是目前流行的開源消息隊列系統。MQ(消息隊列)是一種應用程序對應用程序的通信方法。
RabbitMQ的結構圖如圖所示:
實現步驟
在一個集群裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點無疑速度更快,因此通過客戶端連接訪問它們。但是客戶端不可能分別連接兩個內存節點,肯定是通過前端反向代理去輪詢分發請求如果擔心前端反向代理服務器故障,可以通過Keepalived軟件做一個高可用架構。而磁盤模式的節點,由於磁盤IO相對較慢,因此僅作數據備份使用。
註意:將三臺服務器都連接上互聯網並安裝軟件包。另外RabbitMQ集群節點必須在同一個網段裏,如果是跨廣域網,效果就會變差。
RabbitMQ集群配置信息如表所示表:
實驗步驟
1.配置三個節點的host文件,將以下內容分別加入到三臺服務器上。
rabbitmq01: [root@localhost ~]# vim /etc/hostname mq01.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 #註意-主機名稱也要更改 192.168.126.133 mq02 192.168.126.141 mq03 rabbitmq02: [root@localhost ~]# vim /etc/hostname mq02.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 192.168.126.133 mq02 192.168.126.141 mq03 rabbitmq03: [root@localhost ~]# vim /etc/hostname mq03.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 192.168.126.133 mq02 192.168.126.141 mq03
2.關閉三臺服務器的防火墻並且重啟虛擬機便於系統識別
[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0
[root@localhost ~]# init 6 #重啟
3.準備好YUM源之後,就可以直接使用yum命令安裝rabbitmq到三臺服務器上。
[root@mq01 ~]# yum install epel-release -y [root@mq01 ~]# yum install rabbitmq-server -y [root@mq01 ~]# ln -s /usr/lib/rabbitmq/bin/* /usr/bin/
4.分別查看三個節點並添加管理服務
[root@mq01 ~]# cd /usr/lib/rabbitmq/bin/
[root@mq01 bin]# ls
rabbitmqctl rabbitmq-env rabbitmq-server
rabbitmq-defaults rabbitmq-plugins
[root@mq01 bin]# rabbitmq-plugins list #查看插件安裝情況
[ ] amqp_client 3.3.5
[ ] cowboy 0.5.0-rmq3.3.5-git4b93c2d
[ ] eldap 3.3.5-gite309de4
[ ] mochiweb 2.7.0-rmq3.3.5-git680dba8
[ ] rabbitmq_amqp1_0 3.3.5
[ ] rabbitmq_auth_backend_ldap 3.3.5
.......//省略
[root@mq01 bin]# rabbitmq-plugins enable rabbitmq_management #啟用管理服務
The following plugins have been enabled:
mochiweb
webmachine
rabbitmq_web_dispatch #網絡調度
amqp_client
rabbitmq_management_agent
rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect. #插件配置發生了變化。重新啟動RabbitMQ以使更改生效。
5.啟動rabbitmq服務,使用netstat -an | grep 5672進行查看,有如下三個端口開放說明正常。
[root@mq01 bin]# systemctl start rabbitmq-server.service
[root@mq01 bin]# netstat -an | grep 5672
tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN
tcp6 0 0 :::5672
參數註解:
15672和25672是rabbitmq的管理端口
5672是生產者、消費者通信的端口
6.檢查三臺的集群狀態
[root@mq01 bin]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ... #目前相互獨立,沒有形成集群
[{nodes,[{disc,[rabbit@mq01]}]},
{running_nodes,[rabbit@mq01]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done.
7.停止三臺服務器的rabbitmq服務
[root@mq01 bin]# systemctl stop rabbitmq-server.service
8.在三臺服務器上構建Erlang的集群環境
[root@mq01 bin]# vim /var/lib/rabbitmq/.erlang.cookie
GYIIPFNYPZITHCELVPZU
註意:
在Erlang的集群中,各節點是通過一個magic cookie來實現的,這個coolie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的權限。所以必須保證各節cookie保持一致,否則節點間就無法通信!
9.開啟rabbitmq服務
[root@mq01 bin]# systemctl start rabbitmq-server.service
10.將rabbitmq02、rabbitmq03作為內存節點與rabbitmq01磁盤節點連接起來。
rabbitmq02:
[root@mq02 bin]# rabbitmqctl stop_app #停止rabbitmq
[root@mq02 bin]# rabbitmqctl join_cluster --ram rabbit@mq01 #將mq02連接到mq01,成為一個集群
Clustering node rabbit@mq02 with rabbit@mq01 ...
...done.
[root@mq02 bin]# rabbitmqctl start_app #開啟rabbitmq
[root@mq02 bin]# rabbitmqctl cluster_status #驗證群集狀態
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]},
{running_nodes,[rabbit@mq01,rabbit@mq02]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done.
rabbitmq03:
[root@mq03 bin]# rabbitmqctl cluster_status #驗證群集
Cluster status of node rabbit@mq03 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},
{running_nodes,[rabbit@mq02,rabbit@mq01,rabbit@mq03]},
{cluster_name,<<"rabbit@mq01">>},
{partitions,[]}]
...done. #驗證成功
11.打開瀏覽器訪問http://192.168.126.138:15672/ #默認用戶名:guest 密碼:guest
策略創建、查看、添加隊列
1).點擊右邊的policies按鈕,創建策略。
參數註釋:
Name:策略名稱
pattern:匹配的規則
Definition:使用ha-mode模式中的all,也就是同步所以匹配的隊列。‘?’類型與幫助文檔
Priority:優先級,默認為0,值越大優先級越大。
2)在任意一臺節點上添加一個Queues隊列,點擊Queues按鈕,輸入name、Arguments的值,別的值按其默認就好,如圖所示:
參數註解:
Name:隊列的名稱
Durability:隊列是否持久化(Durable持久化)
Node:消息隊列的節點
Auto delete:自動刪除
Arguments:使用的策略類型
3)再創建一個隊列,分別在兩個隊列裏創建一條消息。點擊aa、ht隊列按鈕,選擇Publish Message創建消息。
參數註解:
2-Persistent:持久化,反之上面顯示非持久化
Headers:隨意填寫即可
Properties:點擊問號,選擇一個消息ID
4)進行破壞性測試看看群集效果是否成功。
將rabbitmq01節點關閉,再通過mq02、mq03查看消息記錄是否還存在。
[root@mq01 ~]# systemctl stop rabbitmq-server.service
如圖所示:
從上圖可以看到ht隊列已經不存在了,說明沒有做鏡像模式。而aa隊列已經從之前的+2顯示成+1了,而且消息還是存在的。
再將mq02節點的服務關閉,通過mq03查看消息記錄是否還存在。如圖所示:
[root@mq02 ~]# systemctl stop rabbitmq-server.service
將mq01、mq02節點的服務啟動,看到aa隊列後面的+2變成粉色,鼠標指上去顯示鏡像無法同步。如果這個時候將mq03節點的服務停止,那麽隊列裏的消息將會丟失。
在mq02節點服務器上執行rabbitmqctl sync_queue aa,同步完成後+2變成藍色。如圖所示:
[root@mq02 ~]# rabbitmqctl sync_queue aa
5)查看隊列在服務器上的位置,如圖所示,一個目錄對應的就是一個隊列,裏面就是該隊列本身的消息。註意如果內存節點故障,隊列就會丟失;如果是磁盤節點故障,隊列還會存在。但如果是創建隊列時指定了ha參數,帶修復磁盤節點故障後,再啟動磁盤節點的rabbitmq服務,未消費的隊列及消息會不存在,需要手動執行同步隊列命令。
[root@mq01 ~]# ll /var/lib/rabbitmq/mnesia/rabbit\@mq01/queues/
總用量 0
drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月 1 15:07 81NI5XJ4KZDI2KGNS7MV3CP7T
drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月 1 14:39 COUUYINKJGWZ16DIMV5GJZ5Z7
rabbitmq集群的破壞性測試成功,說明集群配置成功。
註意:
消息節點一般都是程序直接調用,去創建隊列、消息等等。程序裏面如果想使用消息高可用集群配置,那麽代碼需要指定ha參數,如果不指定x-ha-prolicy的話將無法復制。
在CentOS7上部署Rabbitmq集群配置