rabbitmq集群部署及配置


rabbitmq集群部署及配置

前言

消息中間件rabbitmq,一般以集群方式部署,主要提供消息的接受和發送,實現各微服務之間的消息異步。本篇將以rabbitmq+HA方式進行部署。

一、原理介紹

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消費數據時臨時讀取。缺點就是,集群內部的同步通訊會占用大量的網絡帶寬。

二、部署方案

本方案中是在多台機器之間部署rabbitmq的cluster,要求如下:這幾個節點需要再同一個局域網內;這幾個節點需要有相同的erlang cookie,否則不能正常通信,為了實現cookie內容一致,采用scp的方式進行。

1.環境介紹

主機名 IP
rabbit1 192.168.116.128
rabbit2 192.168.116.129
rabbit3 192.168.116.130

2.部署過程

(1)分別在3台機器上配置/etc/hosts,如下

192.168.116.128 rabbit1
192.168.116.129 rabbit2
192.168.116.130 rabbit3

(2)分別在3台機器上安裝erLang和rabbitmq

    安裝erLang

    安裝依賴包

yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel

    編譯安裝

mkdir /app/erlang21.3
wget http://erlang.org/download/otp_src_21.3.tar.gz
tar xzf otp_src_21.3.tar.gz
cd otp_src_21.3
./configure --prefix=/app/erlang21.3 --without-javac
make && make install

    出現erl命令則說明安裝成功;

    安裝rabbitmq

    編譯安裝

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.8/rabbitmq-server-generic-unix-3.8.8.tar.xz
yum -y install xz
tar xvf rabbitmq-server-generic-unix-3.8.8.tar.xz
mkdir /app/rabbitmq
mv rabbitmq_server-3.8.8 /app/rabbitmq
添加環境
vim /etc/profile
export PATH=$PATH:/app/erlang21.3/bin:/app/rabbitmq/rabbitmq_server-3.8.8/sbin
source /etc/profile

導入rabbitmq的管理界面

rabbitmq-plugins enable rabbitmq_management

    設置erlang

找到erlang cookie文件的位置,官方在介紹集群的文檔中提到過.erlang.cookie一般會存在這兩個地址:第一個是$home/.erlang.cookie;第二個地方就是/var/lib/rabbitmq/.erlang.cookie。如果我們使用解壓縮方式安裝部署的rabbitmq,那么這個文件會在${home}目錄下,也就是$home/.erlang.cookie。如果我們使用rpm等安裝包方式進行安裝的,那么這個文件會在/var/lib/rabbitmq目錄下。

這里將 node1 的該文件復制到 node2、node3,注意這個文件的權限是 400(默認即是400),因此采用scp的方式只拷貝內容即可;

可以通過cat $home/.erlang.cookie來查看三台機器的cookie是否一致,設置erlang的目的是要保證集群內的cookie內容一致。

    使用-detached參數運行各節點

rabbitmqctl stop
rabbitmq-server -detached

然后可以通過rabbitmqctl cluster_status查看節點狀態。PS:要先拷貝cookie到另外兩台機器上,保證三台機器上的cookie是一致的,然后再啟動服務。
由於guest這個用戶,只能在本地訪問,所以我們要新增一個用戶並賦予權限:

添加用戶並設置密碼:

rabbitmqctl add_user  admin 123456

添加權限(使admin用戶對虛擬主機“/” 具有所有權限):

rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"

修改用戶角色(加入administrator用戶組)

rabbitmqctl set_user_tags admin administrator

然后就可以遠程訪問了,然后可直接配置用戶權限等信息。到此,就可以通過http://ip:15672 使用admin 123456 進行登陸了。

到這里的話,每個節點是作為單獨的一台RabbitMQ存在的,也可以正常提供服務了

(3)組成集群

rabbitmq-server啟動時,會一起啟動節點和應用,它預先設置RabbitMQ應用為standalone模式。要將一個節點加入到現有的集群中,你需要停止這個應用,並將節點設置為原始狀態。如果使用./rabbitmqctl stop,應用和節點都將被關閉。所以使用rabbitmqctl stop_app僅僅關閉應用。

將 rabbit2、rabbit3與 rabbit1 組成集群,這里以rabbit2為例

rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1             ####這里集群的名字一定不要寫錯了
rabbit2# rabbitmqctl start_app

將rabbit3重復上述操作,也加入rabbit1的集群。

則此時 rabbit2 與 rabbit3 也會自動建立連接,集群配置完畢;(PS:如果要使用內存節點,則可以使用rabbit2 # rabbitmqctl join_cluster --ram rabbit@rabbit1加入集群)集群配置好后,可以在 RabbitMQ 任意節點上執行 rabbitmqctl cluster_status 來查看是否集群配置成功。

PS:另外一種查看集群是否成功的方式,在web頁面上查看
在這里插入圖片描述
(4)設置鏡像隊列策略

在任意一個節點上執行如下操作(這里在node1上執行)

首先,在web界面,登陸后,點擊“Admin--Virtual Hosts(頁面右側)”,在打開的頁面上的下方的“Add a new virtual host”處增加一個虛擬主機,同時給用戶“admin”和“guest”均加上權限(在頁面直接設置、點點點即可);

然后,在linux中執行如下命令

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

則此時鏡像隊列設置成功。

PS:這里補充一些對於設置鏡像隊列策略的說明

rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
 
-p Vhost: 可選參數,針對指定vhost下的queue進行設置
Name: policy的名稱
Pattern: queue的匹配模式(正則表達式)
Definition:鏡像定義,包括三個部分ha-mode, ha-params, ha-sync-mode
    ha-mode:指明鏡像隊列的模式,有效值為 all/exactly/nodes
        all:表示在集群中所有的節點上進行鏡像
        exactly:表示在指定個數的節點上進行鏡像,節點的個數由ha-params指定
        nodes:表示在指定的節點上進行鏡像,節點名稱通過ha-params指定
    ha-params:ha-mode模式需要用到的參數
    ha-sync-mode:進行隊列中消息的同步方式,有效值為automatic和manual
priority:可選參數,policy的優先級

將所有隊列設置為鏡像隊列,即隊列會被復制到各個節點,各個節點狀態保持一直。完成這 6 個步驟后,RabbitMQ 高可用集群就已經搭建好了。

小結

過程有些繁瑣,但細心總會讓你看見光明!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM