RabbitMQ 羣集部署

RabbitMQ  簡介

         MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。排隊指的是應用程序通過 隊列來通信。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較爲成熟的MQ產品有IBM WEBSPHERE MQ等等。

RabbitMQ  使用場景

         在項目中,將一些無需即時返回且耗時的操作提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提高了系統的吞吐量。

         RabbitMQ 支持消息的持久化,也就是數據寫在磁盤上。爲了數據安全考慮,大多數企業都會選擇持久化。當然如果覺得不需要消息持久化,那麼使用內存節點即可。

RabbitMQ 的結構圖如圖所示:

3

實現步驟

        設計架構模式:在一個羣集裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點無疑速度更快,因此通過客戶端連接訪問它們。但是客戶端不可能分別連接兩個內存節點,肯定是通過前端反向代理去輪詢分發請求。如果擔心前端反向代理服務器故障,可以通過 Keepalived 軟件做一個高可用架構。而磁盤模式的節點,由於磁盤 IO 相對較慢,因此僅作爲數據備份使用。

         注意這裏講三臺服務器都連接上互聯網並安裝軟件包。另外 RabbitMQ 集羣節點必須在同一個網段。

RabbitMQ  羣集具體配置信息如表所示。

IP 地址  主機名操作系統 防火牆和SELinux用途
192.168.66.140  mq01 Centos 7 (64 位) 關閉 磁盤節點
192.168.66.143mq02 Centos 7 (64 位) 關閉 內存節點
192.168.66.144mq03Centos 7 (64 位) 關閉 內存節點


2.安裝 epel 源和 rabbitmq-server 軟件[root@localhost ~]# vim /etc/hostname                       //更改主機名,另外兩臺分別爲 mq02 ,mq03

mq01.localdomain

[root@localhost ~]# vim /etc/hosts                                //更改 hosts 文件

192.168.66.140 mq01
192.168.66.143 mq02
129.168.66.144 mq03

[root@mq01 ~]# yum install epel-release –y

[root@mq01 ~]# yum install rabbitmq-server –y

3.分別查看插件安裝情況

[root@mq01 ~]# 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
[ ] rabbitmq_auth_mechanism_ssl       3.3.5
[ ] rabbitmq_consistent_hash_exchange 3.3.5
[ ] rabbitmq_federation               3.3.5
[ ] rabbitmq_federation_management    3.3.5
[ ] rabbitmq_management               3.3.5
[ ] rabbitmq_management_agent         3.3.5
[ ] rabbitmq_management_visualiser    3.3.5
[ ] rabbitmq_mqtt                     3.3.5
[ ] rabbitmq_shovel                   3.3.5
[ ] rabbitmq_shovel_management        3.3.5
[ ] rabbitmq_stomp                    3.3.5
[ ] rabbitmq_test                     3.3.5
[ ] rabbitmq_tracing                  3.3.5
[ ] rabbitmq_web_dispatch             3.3.5
[ ] rabbitmq_web_stomp                3.3.5
[ ] rabbitmq_web_stomp_examples       3.3.5
[ ] sockjs                            0.3.4-rmq3.3.5-git3132eb9
[ ] webmachine                        1.10.3-rmq3.3.5-gite9359c7

4分別在三個節點添加管理服務,然後啓動 rabbitmq 服務

[root@mq01 ~]# 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.


[root@mq01 ~]# systemctl start rabbitmq-server.service                             //啓動rabbitmq 服務

查看端口5672

[root@mq01 ~]# netstat -natp | grep 5672
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      2282/beam          
tcp        0      0 0.0.0.0:25672           0.0.0.0:*               LISTEN      2282/beam          
tcp6       0      0 :::5672                 :::*                    LISTEN      2282/be

其中 15672 和 25672 都是 rabbitmq 的管理端口,5672 則是和生產者、消費者通信窗口。

5.在 rabbitmq 服務啓動後,此時分別查看羣級狀態。

[root@mq01 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
[{nodes,[{disc,[rabbit@mq01]}]},
  {running_nodes,[rabbit@mq01]},
  {cluster_name,<<"rabbit@mq01">>},
  {partitions,[]}]
...done.

[root@mq02 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq02]}]},
  {running_nodes,[rabbit@mq02]},
  {cluster_name,<<"rabbit@mq02">>},
  {partitions,[]}]
...done.

[root@mq03 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@mq03 ...
[{nodes,[{disc,[rabbit@mq03]}]},
  {running_nodes,[rabbit@mq03]},
  {cluster_name,<<"rabbit@mq03">>},
  {partitions,[]}]
...done.

檢查三臺的羣集狀態,目前相互獨立,還未成爲羣集狀態

6.   Rabbitmq 的羣集是依賴於 Erlang 的羣集來工作的,所以必須先構建起 Eelang 的集羣環境。在集羣中,個節點是通過一個 magic cookie 來實現的,這個 cookie 存放在 /var/lib/.erlang.cookie 中,文件是 400 權限。所以必須保證各節點 cookie 保持一致。否則節點之間就無法通信。

        將其中一臺節點上的 .erlang.cookie 值複製下來保持到其他節點上,需要注意文件的權限爲 400 。屬主屬組 爲 rabbitmq。現在三個節點的 rabbitmq 服務都是開啓的,但是每個節點的 .erlang.cookie 文件中的值都一樣,因此我們需要將三臺節點的 rabbitmq 服務停止

[root@mq01 ~]# systemctl stop rabbitmq-server.service             //先關閉rabbitmq 服務(三臺都關閉)

分別查看三臺節點的 .relang.cookie 中的值

[root@mq01 rabbitmq]# cd /var/lib/rabbitmq/
[root@mq01 rabbitmq]# ls -a
.  ..  .erlang.cookie mnesia
[root@mq01 rabbitmq]# cat .erlang.cookie
ZXSCNEWFINFMZFEEVJOY[root@mq01 rabbitmq]#

[root@mq02 ~]# cd /var/lib/rabbitmq/                                   
[root@mq02 rabbitmq]# ls -a
.  ..  .erlang.cookie  mnesia                                                                              // .erlang.cookie 是隱藏文件,三臺節點的值都不一樣
[root@mq02 rabbitmq]# cat .erlang.cookie
ICPOPREABNCPJSIIKBJZ[root@mq02 rabbitmq]#

[root@mq03 ~]# cd /var/lib/rabbitmq/
[root@mq03 rabbitmq]# ls -a
.  ..  .erlang.cookie  mnesia
[root@mq03 rabbitmq]# cat .erlang.cookie
NRFLUNPJNNEGAHHFPFXY[root@mq03 rabbitmq]#

將 mq01 上的 .erlang.cookie 的值複製保存到其他兩臺節點上。(mq01 作爲磁盤節點,mq02 和mq03 作爲內存節點)

[root@mq02 rabbitmq]# vim .erlang.cookie

ZXSCNEWFINFMZFEEVJOY

[root@mq03 rabbitmq]# vim .erlang.cookie

ZXSCNEWFINFMZFEEVJOY

啓動 rabbitmq 服務(三臺都起)

[root@mq01 rabbitmq]# systemctl start rabbitmq-server.service  

7. 將 mq02 和 mq03 作爲內存節點與 mq01 磁盤節點連接起來,在mq02  和 mq03 執行以下命令

[root@mq02 rabbitmq]# systemctl start rabbitmq-server.service                           //啓動 rabbitmq 服務
[root@mq02 rabbitmq]# rabbitmqctl stop_app                                                           //先停掉 rabbitmq 應用
Stopping node rabbit@mq02 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@mq01                     // 加入到磁盤節點 
Clustering node rabbit@mq02 with rabbit@mq01 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl start_app                                                  //啓動 rabbirmq 應用         
Starting node rabbit@mq02 ...
...done.
[root@mq02 rabbitmq]# rabbitmqctl cluster_status                                          //查看羣集狀態
Cluster status of node rabbit@mq02 ...
[{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]},              //mq 01爲磁盤節點 ,mq02 和 mq03 爲內存節點
  {running_nodes,[rabbit@mq03,rabbit@mq01,rabbit@mq02]},
  {cluster_name,<<"rabbit@mq01">>},
  {partitions,[]}]
...done.

mq03 同樣操作 

[root@mq03 rabbitmq]# systemctl start rabbitmq-server.service
[root@mq03 rabbitmq]# rabbitmqctl stop_app
Stopping node rabbit@mq03 ...
...done.
[root@mq03 rabbitmq]# rabbitmqctl join_cluster --ram rabbit@mq01
Clustering node rabbit@mq03 with rabbit@mq01 ...
...done.
[root@mq03 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@mq03 ...
...done.
[root@mq03 rabbitmq]# 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.

上面已經完成了配置 rabbirmq 默認羣集模式。

8. 打開瀏覽器輸入 http://192.168.66.140.55672, 它會自動將55672 端口改爲 15672 端口,也可將端口直接寫爲 15672

1

2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章