RabbitMQ消息隊列集群
MQ(Message Queue,消息隊列)是一款消息中間件,一般以集群方式部署,主要提供消息的接受和發送,實現各微服務之間的消息異步。
集群原理
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消費數據時臨時讀取。缺點就是,集群內部的同步通訊會占用大量的網絡帶寬。
系統架構
概念說明:
Broker:它提供一種傳輸服務,它的角色就是維護一條從生產者到消費者的路線,保證數據能按照指定的方式進行傳輸
Exchange:消息交換機,它指定消息按什麽規則,路由到哪個隊列
Queue:消息的載體,每個消息都會被投到一個或多個隊列
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來
vhost:虛擬主機,一個broker裏可以有多個vhost,用作不同用戶的權限分離
Producer:消息生產者,就是投遞消息的程序
Consumer:消息消費者,就是接受消息的程序
Channel:消息通道,在客戶端的每個連接裏,可建立多個channel
系統環境
主機名 | 操作系統 | IP地址 | 用途 |
---|---|---|---|
rabbitmq01 | Centos 7.4 x86_64 | 192.168.96.41 | 磁盤節點 |
rabbitmq02 | Centos 7.4.x86_64 | 192.168.96.42 | 內存節點 |
rabbitmq03 | Centos 7.4 x86_64 | 192.168.96.43 | 內存節點 |
開始部署
以下三臺服務器部署配置一致,如下步驟1 - 8
1.關閉防火墻及Selinux
setenforce 0
systemctl stop firewalld
2.分別修改三臺服務器的主機名
2.1 rabbitmq01服務器
vim /etc/hostname
rabbitmq01
2.2 rabbitmq02服務器
vim /etc/hostname
rabbitmq02
2.3 rabbitmq03服務器
vim /etc/hostname
rabbitmq03
3.分別修改三臺服務器的hosts文件
vim /etc/hosts
192.168.96.23 rabbitmq01
192.168.96.21 rabbitmq02
192.168.96.22 rabbitmq03
4.安裝最新repo源
yum -y install epel-release
5.安裝rabbitmq-server軟件包
yum -y install rabbitmq-server
6.查看已安裝的插件
rabbitmq-plugins list
7.啟動管理服務
rabbitmq-plugins enable rabbitmq_management
8.分別啟動rabbitmq服務
systemctl start rabbitmq-server
rabbitmq集群部署
1.先停止rabbitmq服務
systemctl stop rabbitmq-server
2.進入cookie文件目錄
cd /var/lib/rabbitmq/
3.編輯.erlang.cookie文件序列號(各節點需要有相同序列號值)
vim .erlang.cookie
4.再啟動rabbitmq服務
systemctl start rabbitmq-server
5.停止rabbitmq應用
rabbitmqctl stop_app
6.將rabbitmq02、rabbitmq03加入rabbitmq01,使它們成為一個集群
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
7.啟動rabbitmq應用
rabbitmqctl start_app
8.分別查看rabbitmq服務器狀態
rabbitmqctl cluster_status
通過客戶端瀏覽器進行訪問RabbitMQ (用戶名:guest 密碼:guest)http://192.168.96.41:15672
RabbitMQ消息隊列集群