RabbitMQ 簡介前端
MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通訊方法。應用程序經過讀寫出入隊列的消息(針對應用程序的數據)來通訊,而無需專用鏈接來連接它們。消息傳遞指的是程序之間經過在消息中發送數據進行通訊,而不是經過直接調用彼此來通訊,直接調用一般是用於諸如遠程過程調用的技術。排隊指的是應用程序經過 隊列來通訊。隊列的使用除去了接收和發送應用程序同時執行的要求。其中較爲成熟的MQ產品有IBM WEBSPHERE MQ等等。node
RabbitMQ 使用場景git
在項目中,將一些無需即時返回且耗時的操做提取出來,進行了異步處理,而這種異步處理的方式大大的節省了服務器的請求響應時間,從而提升了系統的吞吐量。web
RabbitMQ 支持消息的持久化,也就是數據寫在磁盤上。爲了數據安全考慮,大多數企業都會選擇持久化。固然若是以爲不須要消息持久化,那麼使用內存節點便可。vim
RabbitMQ 的結構圖如圖所示:瀏覽器
實現步驟安全
設計架構模式:在一個羣集裏,有三臺服務器,其中一臺使用磁盤模式,另兩臺使用內存模式。兩臺內存模式的節點無疑速度更快,所以經過客戶端鏈接訪問它們。可是客戶端不可能分別鏈接兩個內存節點,確定是經過前端反向代理去輪詢分發請求。若是擔憂前端反向代理服務器故障,能夠經過 Keepalived 軟件作一個高可用架構。而磁盤模式的節點,因爲磁盤 IO 相對較慢,所以僅做爲數據備份使用。服務器
注意這裏講三臺服務器都鏈接上互聯網並安裝軟件包。另外 RabbitMQ 集羣節點必須在同一個網段。cookie
RabbitMQ 羣集具體配置信息如表所示。架構
IP 地址 主機名 操做系統 防火牆和SELinux 用途 192.168.66.140 mq01 Centos 7 (64 位) 關閉 磁盤節點 192.168.66.143 mq02 Centos 7 (64 位) 關閉 內存節點 192.168.66.144 mq03 Centos 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