Centos7 RabbitMQ訊息佇列叢集
一、簡介
MQ(Message Queue,訊息佇列)是一款訊息中介軟體,一般以叢集方式部署,主要提供訊息的接受和傳送,實現各微服務之間的訊息非同步。
1、叢集原理
rabbitmq 是依據erlang的分散式特性(RabbitMQ底層是通過Erlang架構來實現的,所以rabbitmqctl會啟動Erlang節點,並基於Erlang節點來使用Erlang系統連線RabbitMQ節點,在連線過程中需要正確的Erlang Cookie和節點名稱,Erlang節點通過交換Erlang Cookie以獲得認證)來實現的,所以部署rabbitmq分散式叢集時要先安裝erlang,並把其中一個服務的cookie複製到另外的節點。
rabbitmq叢集中,各個rabbitmq為對等節點,即每個節點均提供給客戶端連線,進行訊息的接收和傳送。節點分為記憶體節點和磁碟節點,一般的,均應建立為磁碟節點,為了防止機器重啟後的訊息消失;
RabbitMQ的Cluster叢集模式一般分為兩種, 普通模式和映象模式 。訊息佇列通過rabbitmq HA映象佇列進行訊息佇列實體複製。
普通模式下, 以兩個節點(rabbit01、rabbit02)為例來進行說明。對於Queue來說,訊息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元資料,即佇列的結構。當訊息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行訊息傳輸,把A中的訊息實體取出並經過B傳送給consumer。所以consumer應儘量連線每一個節點,從中取訊息。即對於同一個邏輯佇列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。
映象模式下, 將需要消費的佇列變為映象佇列,存在於多個節點,這樣就可以實現RabbitMQ的HA高可用性。作用就是訊息實體會主動在映象節點之間實現同步,而不是像普通模式那樣,在consumer消費資料時臨時讀取。缺點就是,叢集內部的同步通訊會佔用大量的網路頻寬。
2、系統架構
概念說明:
Broker:它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證資料能按照指定的方式進行傳輸
Exchange:訊息交換機,它指定訊息按什麼規則,路由到哪個佇列
Queue:訊息的載體,每個訊息都會被投到一個或多個佇列
Binding:繫結,它的作用就是把exchange和queue按照路由規則繫結起來
Routing Key:路由關鍵字,exchange根據這個關鍵字進行訊息投遞
vhost:虛擬主機,一個broker裡可以有多個vhost,用作不同使用者的許可權分離
Producer:訊息生產者,就是投遞訊息的程式
Consumer:訊息消費者,就是接受訊息的程式
Channel:訊息通道,在客戶端的每個連線裡,可建立多個channel
二、環境準備
1、系統環境
2、暫時關閉防火牆和selinux
3、設定三個節點主機名hosts
[[email protected] ~]# cat /etc/hosts
192.168.56.129 master
192.168.56.130 slave1
192.168.56.131 slave2
三、搭建服務
1、安裝最新repo源
[[email protected] ~]# yum -y install epel-release
2、安裝三個節點的rabbitmq-server軟體包
[[email protected] ~]# yum -y install rabbitmq-server
3、檢視已安裝的外掛
[[email protected] ~]# rabbitmq-plugins list
4、啟動管理服務(三個節點)
[[email protected] ~]# rabbitmq-plugins enable rabbitmq_management
5、分別啟動rabbitmq服務(三個節點)
[[email protected] ~]# systemctl start rabbitmq-server.service
rabbitmq叢集部署
1、關閉服務(三個節點)
[[email protected] ~]# systemctl stop rabbitmq-server.service
2、進入cookie檔案目錄,配置(各節點需要有相同序列號值)
[[email protected] ~]# cd /var/lib/rabbitmq/
[[email protected] rabbitmq]# vim .erlang.cookie
3、再啟動rabbitmq服務
[[email protected] rabbitmq]# systemctl start rabbitmq-server.service
4、關閉rabbitmq應用(只關閉slave1和slave2)
[[email protected] rabbitmq]# rabbitmqctl stop_app
5、將slave1、slave2加入master,使它們成為一個叢集。再次啟動應用
[[email protected] ~]# rabbitmqctl join_cluster --ram [email protected]
[[email protected] ~]# rabbitmqctl start_app
6、分別檢視rabbitmq伺服器狀態
[[email protected] ~]# rabbitmqctl cluster_status
7、通過客戶端瀏覽器進行訪問RabbitMQ (使用者名稱:guest 密碼:guest)