RabbitMQ訊息佇列叢集配置-1
阿新 • • 發佈:2020-08-04
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映象佇列進行訊息佇列實體複製
1.普通模式下,以兩個節點(rabbit01、rabbit02)為例來進行說明。對於Queue來說,訊息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元資料,即佇列的結構。當訊息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit01、rabbit02間進行訊息傳輸,把A中的訊息實體取出並經過B傳送給consumer。所以consumer應儘量連線每一個節點,從中取訊息。即對於同一個邏輯佇列,要在多個節點建立物理Queue。否則無論consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。
2.映象模式下,將需要消費的佇列變為映象佇列,存在於多個節點,這樣就可以實現RabbitMQ的HA高可用性。作用就是訊息實體會主動在映象節點之間實現同步,而不是像普通模式那樣,在consumer消費資料時臨時讀取。缺點就是,叢集內部的同步通訊會佔用大量的網路頻寬。
RabbitMQ的結構圖
環境部署
IP地址 | 主機名 | 作業系統 | 用途 |
---|---|---|---|
192.168.92.145 | mq01 | CentOS 7.4x86_64 | 磁碟節點 |
192.168.92.156 | mq02 | CentOS 7.4x86_64 | 記憶體節點 |
192.168.92.157 | mq03 | CentOS 7.4x86_64 | 記憶體節點 |
開始部署
1.關閉防火牆和selinux(3臺伺服器都要關)
systemctl stop firewalld.service
setenforce 0
2.修改主機名
1.mq01伺服器
hostnamectl set-hostname mq01.localdomain
2.mq02伺服器
hostnamectl set-hostname mq02.localdomain
3.mq03伺服器
hostnamectl set-hostname mq03.localdomain
3.修改三個節點hosts檔案,將以下內容分別加入三臺伺服器上。
192.168.92.145 mq01
192.168.92.156 mq02
192.168.92.157 mq03
4.三個節點配置epel源,安裝rabbitmq軟體包
yum install epel-release -y
yum install rabbitmq-server -y
5.建立軟連線
ln -s /usr/lib/rabbitmq/bin/* /usr/bin
6.檢視外掛的資訊
rabbitmq-plugins list
7.啟用rabbitmq_management服務
rabbitmq-plugins enable rabbitmq_management
8.啟動rabbitmq服務
systemctl start rabbitmq-server.service
9.使用以下命令檢查三臺的叢集狀態,目前相互獨立,沒有形成叢集
rabbitmqctl cluster_status
10.使用以下命令檢視埠開放說明正常。(其中15672和55672都是rabbitmq的管理埠,5672則是和生產者、消費者通訊的埠。)
netstat -ntap | grep 5672
11.停止三臺伺服器
systemctl stop rabbitmq-server.service
12.把mq01的cookie值複製到mq02和mq03伺服器
vim /var/lib/rabbitmq/.erlang.cookie
13.開啟3臺rabbitmq服務
systemctl start rabbitmq-server.service
14.以下操作只在mq02伺服器和mq03伺服器上操作
1.關閉rabbitmq應用
rabbitmqctl stop_app
2.分別在mq02伺服器、mq03伺服器上把mq02、mq03作為記憶體節點與mq01磁碟節點連線起來。
rabbitmqctl join_cluster --ram rabbit@mq01
3.啟動rabbitmq應用
rabbitmqctl start_app