1. 程式人生 > >RabbitMQ(訊息佇列)叢集配置與使用篇

RabbitMQ(訊息佇列)叢集配置與使用篇

介紹

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

MQ特點

MQ是消費-生產者模型的一個典型的代表,一端往訊息佇列中不斷寫入訊息,而另一端則可以讀取或者訂閱佇列中的訊息。MQ和JMS類似,但不同的是JMS是SUN JAVA訊息中介軟體服務的一個標準和API定義,而MQ則是遵循了AMQP協議的具體實現和產品。

使用場景

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

含義

RabbitMQ是流行的開源訊息佇列系統,用erlang語言開發。RabbitMQ是一個在AMQP基礎上完成的,可複用的企業訊息系統。他遵循Mozilla Public License開源協議,

RabiitMQ工作原理圖
RabbitMQ(訊息佇列)叢集配置與使用篇
概念:

•Brocker:訊息佇列伺服器實體。
•Exchange:訊息交換機,指定訊息按什麼規則,路由到哪個佇列。
•Queue:訊息佇列,每個訊息都會被投入到一個或者多個佇列裡。
•Binding:繫結,它的作用是把exchange和queue按照路由規則binding起來。
•Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞。
•Vhost:虛擬主機,一個broker裡可以開設多個vhost,用作不用使用者的許可權分離。
•Producer:訊息生產者,就是投遞訊息的程式。
•Consumer:訊息消費者,就是接受訊息的程式。
•Channel:訊息通道,在客戶端的每個連線裡,可建立多個channel,每個channel代表一個會話任務。

訊息佇列的使用過程大概如下:

(1)客戶端連線到訊息佇列伺服器,開啟一個channel。

(2)客戶端宣告一個exchange,並設定相關屬性。

(3)客戶端宣告一個queue,並設定相關屬性。

(4)客戶端使用routing key,在exchange和queue之間建立好繫結關係。

(5)客戶端投遞訊息到exchange。

exchange接收到訊息後,就根據訊息的key和已經設定的binding,進行訊息路由,將訊息投遞到一個或多個佇列裡。

exchange也有幾個型別,完全根據key進行投遞的叫做Direct交換機,例如,繫結時設定了routing key為"abc",那麼客戶端提交的訊息,只有設定了key為"abc"的才會投遞到佇列。對key進行模式匹配後進行投遞的叫做Topic交換機,符號"#"匹配一個或多個詞,符號""匹配正好一個詞。例如"abc.#"匹配"abc.def.ghi","abc.

"只匹配"abc.def"。還有一種不需要key的,叫做Fanout交換機,它採取廣播模式,一個訊息進來時,投遞到與該交換機繫結的所有佇列。

RabbitMQ支援訊息的持久化,也就是資料寫在磁碟上,為了資料安全考慮,我想大多數使用者都會選擇持久化。訊息佇列持久化包括3個部分:

(1)exchange持久化,在宣告時指定durable => 1

(2)queue持久化,在宣告時指定durable => 1

(3)訊息持久化,在投遞時指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那麼它們之間的binding也是持久化的。如果exchange和queue兩者之間有一個持久化,一個非持久化,就不允許建立繫結。
RabbitMQ的叢集節點包括記憶體節點,磁碟節點。因此實驗環境準備三臺伺服器,其中一臺使用磁碟模式,另外兩臺使用記憶體模式。

RabbitMQ叢集具體配置:

主機名 IP地址 用途 作業系統
mq01 192.168.195.147 磁碟節點 CentOS7
mq02 192.168.195.160 記憶體節點 CentOS7
mq03 192.168.195.159 記憶體節點 CentOS7

注意:這裡三臺伺服器都連線上網際網路並安裝軟體包。另外RabbitMQ叢集節點必須在同一網段裡。

RabbitMQ安裝與部署,
首先我們需要配置三個節點的hosts檔案,將如下的內容分別加入到三臺伺服器上。

vim /etc/hosts
192.168.195.147 mq01 //注意不能帶”.“
192.168.195.160 mq02
192.168.195.159 mq03

並分別修改三個節點伺服器的主機名

vim /etc/hostname
mq01.localdomain //另外兩臺分別為mq02,mq03

重啟主機使主機名生效

init 6

重啟之後關閉實驗主機的防火牆,以及selinux功能(否則會影響實驗效果)

service firewalld stop
setenforce 0

三個節點使用yum安裝RabbitMQ軟體

yum install -y epel-release //安裝epel源

yum install -y rabbitmq-server //安裝RabbitMQ軟體

ln -s /usr/lib/rabbitmq/bin/* /usr/bin/ //建立連結,使系統能夠識別RabbitMQ命令

rabbitmq-plugins list //檢視外掛安裝情況

RabbitMQ(訊息佇列)叢集配置與使用篇

rabbitmq-plugins enable rabbitmq_management //啟用rabbitmq_management服務
systemctl start rabbitmq-server.service //開啟rabbitmq服務

netstat -ntap | grep 5672 //有三個埠開啟 說明正常
其中15672,25672都是rabbitmq的管理埠,
5672則是和生產者,消費者通訊的埠
rabbitmqctl cluster_status //檢查三臺的叢集狀態,目前相互獨立,沒有形成叢集。

RabbitMQ(訊息佇列)叢集配置與使用篇RabbitMQ(訊息佇列)叢集配置與使用篇RabbitMQ(訊息佇列)叢集配置與使用篇
RabbitMQ的叢集是依賴於erlang的叢集來工作的,所以必須先構建起erlang的叢集環境,在erlang的叢集中,各節點是通過一個magic.cookie來實現的,這個cookie存放在/var/lib/rabbitmq/.erlang.cookie中,檔案是400的許可權。所以必須保證各節點cookie保持一致,否則節點之間就無法通訊。
現在三個節點的rabbitmq服務都是開啟的,但是每個節點的.erlang.cookie檔案中的值各不相同,因此我們需要將節點的rabbitmq服務停止,將磁碟節點上的.erlang.cookie值複製下來儲存到兩個記憶體節點上的.erlang.cookie檔案中,再次啟動兩個記憶體節點的rabbitmq服務,並將它們加入一個叢集中。

service rabbitmq-server stop //停止三臺伺服器

vi /var/lib/rabbitmq/.erlang.cookie //三臺值配置成一樣的,複製磁碟節點內容到其他兩臺

磁碟節點主機mq01
RabbitMQ(訊息佇列)叢集配置與使用篇
記憶體節點mq02
RabbitMQ(訊息佇列)叢集配置與使用篇
記憶體節點mq03
RabbitMQ(訊息佇列)叢集配置與使用篇
開啟三臺節點rabbitmq服務

service rabbitmq-server start

將記憶體節點mq02,mq03與磁碟節點mq01連線起來
在記憶體節點mq02,mq03上操作,先停掉rabbitmq應用,然後呼叫cluster命令,組成叢集,最後再啟動rabbitmq應用

rabbitmqctl stop_app
rabbitmqctl join_cluster --ram [email protected] //加入到磁碟節點 --ram 以記憶體節點形式新增 在叢集裡至少有一個磁碟節點存在
rabbitmqctl start_app
rabbitmqctl cluster_status //驗證叢集狀態

RabbitMQ(訊息佇列)叢集配置與使用篇RabbitMQ(訊息佇列)叢集配置與使用篇
開啟瀏覽器進入web頁面管理
輸入:http://192.168.195.147:15672/
預設使用者名稱:guest 密碼:guest
RabbitMQ(訊息佇列)叢集配置與使用篇
新增策略

Name:策略名稱
Pattern:匹配的規則
Definition;使用ha-mode模式中的all,也就是同步所有匹配的佇列。
Priority:優先順序,預設是0,值越大優先順序越大。
最後點選新增Add policy按鈕,這樣就多了一個策略

RabbitMQ(訊息佇列)叢集配置與使用篇
以下簡單增加訊息佇列

Name:佇列名稱
Durability:佇列是否持久化(durable 是支援)
Auto delete:自動刪除
Arguments:使用的策略型別
最後點選Add queue按鈕,會出現新增的佇列

RabbitMQ(訊息佇列)叢集配置與使用篇
再新建一個bb佇列。arguments項不填寫。
檢視佇列訊息
RabbitMQ(訊息佇列)叢集配置與使用篇
在aa和bb佇列中新建訊息
RabbitMQ(訊息佇列)叢集配置與使用篇
RabbitMQ(訊息佇列)叢集配置與使用篇
可以看到剛才新增的訊息佇列
RabbitMQ(訊息佇列)叢集配置與使用篇
關於rabbitmq服務web網頁的管理就介紹到這裡。