1. 程式人生 > >RabbitMQ(消息隊列)集群配置與使用篇

RabbitMQ(消息隊列)集群配置與使用篇

images usr 兩臺 tab cer etc 路由 arguments 客戶端

介紹

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工作原理圖
技術分享圖片
概念:

?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-plugins enable rabbitmq_management //啟用rabbitmq_management服務
systemctl start rabbitmq-server.service //開啟rabbitmq服務

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

技術分享圖片技術分享圖片技術分享圖片
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
技術分享圖片
內存節點mq02
技術分享圖片
內存節點mq03
技術分享圖片
開啟三臺節點rabbitmq服務

service rabbitmq-server start

將內存節點mq02,mq03與磁盤節點mq01連接起來
在內存節點mq02,mq03上操作,先停掉rabbitmq應用,然後調用cluster命令,組成集群,最後再啟動rabbitmq應用

rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01 //加入到磁盤節點 --ram 以內存節點形式添加 在集群裏至少有一個磁盤節點存在
rabbitmqctl start_app
rabbitmqctl cluster_status //驗證集群狀態

技術分享圖片技術分享圖片
打開瀏覽器進入web頁面管理
輸入:http://192.168.195.147:15672/
默認用戶名:guest 密碼:guest
技術分享圖片
添加策略

Name:策略名稱
Pattern:匹配的規則
Definition;使用ha-mode模式中的all,也就是同步所有匹配的隊列。
Priority:優先級,默認是0,值越大優先級越大。
最後點擊添加Add policy按鈕,這樣就多了一個策略

技術分享圖片
以下簡單增加消息隊列

Name:隊列名稱
Durability:隊列是否持久化(durable 是支持)
Auto delete:自動刪除
Arguments:使用的策略類型
最後點擊Add queue按鈕,會出現添加的隊列

技術分享圖片
再新建一個bb隊列。arguments項不填寫。
查看隊列消息
技術分享圖片
在aa和bb隊列中新建消息
技術分享圖片
技術分享圖片
可以看到剛才添加的消息隊列
技術分享圖片
關於rabbitmq服務web網頁的管理就介紹到這裏。

RabbitMQ(消息隊列)集群配置與使用篇