RabbitMQ是目前流行的開源消息隊列系統。MQ(消息隊列)是一種應用程序對應用程序的通訊方法。前端
在一個集羣裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點無疑速度更快,所以經過客戶端鏈接訪問它們。可是客戶端不可能分別鏈接兩個內存節點,確定是經過前端反向代理去輪詢分發請求若是擔憂前端反向代理服務器故障,能夠經過Keepalived軟件作一個高可用架構。而磁盤模式的節點,因爲磁盤IO相對較慢,所以僅做數據備份使用。node
注意:將三臺服務器都鏈接上互聯網並安裝軟件包。另外RabbitMQ集羣節點必須在同一個網段裏,若是是跨廣域網,效果就會變差。git
1.配置三個節點的host文件,將如下內容分別加入到三臺服務器上。web
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.關閉三臺服務器的防火牆而且重啓虛擬機便於系統識別vim
[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進行查看,有以下三個端口開放說明正常。cookie
[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.將rabbitmq0二、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節點關閉,再經過mq0二、mq03查看消息記錄是否還存在。
[root@mq01 ~]# systemctl stop rabbitmq-server.service
如圖所示:
從上圖能夠看到ht隊列已經不存在了,說明沒有作鏡像模式。而aa隊列已經從以前的+2顯示成+1了,並且消息仍是存在的。
再將mq02節點的服務關閉,經過mq03查看消息記錄是否還存在。如圖所示:
[root@mq02 ~]# systemctl stop rabbitmq-server.service
將mq0一、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的話將沒法複製。