1. 程式人生 > >RabbitMQ消息隊列集群配置

RabbitMQ消息隊列集群配置

oca 一個 服務 操作 wall 通信 tex 消費 d3d

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

分別查看3臺rabbitmq服務器的狀態

技術分享圖片
技術分享圖片

技術分享圖片

通過瀏覽器輸入http://192.168.175.132:15672訪問RabbitMQ(默認用戶名:guest 密碼:guest)

技術分享圖片
技術分享圖片

RabbitMQ消息隊列集群配置