rabbitmq集羣部署及配置

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

1、原理介紹node

rabbitmq是依據erlang的分佈式特性(RabbitMQ底層是經過Erlang架構來實現的,因此rabbitmqctl會啓動Erlang節點,並基於Erlang節點來使用Erlang系統鏈接RabbitMQ節點,在鏈接過程當中須要正確的Erlang Cookie和節點名稱,Erlang節點經過交換Erlang Cookie以得到認證)來實現的,因此部署rabbitmq分佈式集羣時要先安裝erlang,並把其中一個服務的cookie複製到另外的節點。linux

rabbitmq集羣中,各個rabbitmq爲對等節點,即每一個節點均提供給客戶端鏈接,進行消息的接收和發送。節點分爲內存節點和磁盤節點,通常的,均應創建爲磁盤節點,爲了防止機器重啓後的消息消失;c++

RabbitMQ的Cluster集羣模式通常分爲兩種,普通模式和鏡像模式。消息隊列經過rabbitmq HA鏡像隊列進行消息隊列實體複製。web

普通模式下,以兩個節點(rabbit0一、rabbit02)爲例來進行說明。對於Queue來講,消息實體只存在於其中一個節點rabbit01(或者rabbit02),rabbit01和rabbit02兩個節點僅有相同的元數據,即隊列的結構。當消息進入rabbit01節點的Queue後,consumer從rabbit02節點消費時,RabbitMQ會臨時在rabbit0一、rabbit02間進行消息傳輸,把A中的消息實體取出並通過B發送給consumer。因此consumer應儘可能鏈接每個節點,從中取消息。即對於同一個邏輯隊列,要在多個節點創建物理Queue。不然不管consumer連rabbit01或rabbit02,出口總在rabbit01,會產生瓶頸。正則表達式

鏡像模式下,將須要消費的隊列變爲鏡像隊列,存在於多個節點,這樣就能夠實現RabbitMQ的HA高可用性。做用就是消息實體會主動在鏡像節點之間實現同步,而不是像普通模式那樣,在consumer消費數據時臨時讀取。缺點就是,集羣內部的同步通信會佔用大量的網絡帶寬。redis

2、部署方案centos

本方案中是在多臺機器之間部署rabbitmq的cluster,要求以下:這幾個節點須要再同一個局域網內;這幾個節點須要有相同的erlang cookie,不然不能正常通訊,爲了實現cookie內容一致,採用scp的方式進行。瀏覽器

一、環境介紹服務器

rabbitmq01 192.168.101.11  

rabbitmq02 192.168.101.12 

rabbitmq03 192.168.101.13

操做系統:centos6.7

二、部署過程

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

node1 192.168.101.11  

node2 192.168.101.12 

node3 192.168.101.13

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

安裝erlang

安裝依賴包

yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
編譯安裝
tar -zxvf otp_src_19.0.tar.gz
cd otp_src_19.0
./configure --prefix=/usr/local/bin/erlang --without-javac
make && make install
echo "export PATH=$PATH:/usr/local/bin/erlang/bin:/usr/local/bin/rabbitmq_server-3.6.5/sbin" >> /etc/profile
source /etc/profile
出現erl命令則說明安裝成功;
安裝rabbitmq

編譯安裝

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-generic-unix-3.6.5.tar.xz
yum install -y xz
xz -d rabbitmq-server-3.6.3.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.6.5.tar -C /usr/local/bin/
echo "export PATH=$PATH:/usr/local/bin/erlang/bin:/usr/local/bin/rabbitmq_server-3.6.5/sbin" >> /etc/profile
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 的該文件複製到 node二、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僅僅關閉應用。

將 node二、node3與 node1 組成集羣,這裏以node2爲例

node2# rabbitmqctl stop_app     

node2# rabbitmqctl join_cluster rabbit@node1               ####這裏集羣的名字必定不要寫錯了

node2# rabbitmqctl start_app

將node3重複上述操做,也加入node1的集羣。

則此時 node2 與 node3 也會自動創建鏈接,集羣配置完畢;(PS:若是要使用內存節點,則可使用node2 # rabbitmqctl join_cluster --ram rabbit@node1加入集羣)集羣配置好後,能夠在 RabbitMQ 任意節點上執行 rabbitmqctl cluster_status 來查看是否集羣配置成功。

node3# rabbitmqctl cluster_status

Cluster status of node rabbit@node3 ...
[{nodes,[{disc,[rabbit@node1,rabbit@node2,rabbit@node3]}]},
 {running_nodes,[rabbit@node1,rabbit@node2,rabbit@node3]},
 {cluster_name,<<"rabbit@node1">>},
 {partitions,[]},
 {alarms,[{rabbit@node1,[]},{rabbit@node2,[]},{rabbit@node3,[]}]}]
可知,集羣的名稱默認爲rabbit@node1;

PS:另一種查看集羣是否成功的方式,在web頁面上的「Queues」的列表中,查看有以下顯示爲「同步鏡像到node2」,則也表示集羣配置成功

 

(4)設置鏡像隊列策略

在任意一個節點上執行以下操做(這裏在node1上執行)

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

而後,在linux中執行以下命令

rabbitmqctl set_policy -p coresystem ha-all "^" '{"ha-mode":"all"}'
"coresystem" vhost名稱, "^"匹配全部的隊列, ha-all 策略名稱爲ha-all, '{"ha-mode":"all"}' 策略模式爲 all 即複製到全部節點,包含新增節點。

則此時鏡像隊列設置成功。(這裏的虛擬主機coresystem是代碼中須要用到的虛擬主機,虛擬主機的做用是作一個消息的隔離,本質上可認爲是一個rabbitmq-server,是否增長虛擬主機,增長几個,這是由開發中的業務決定,即有哪幾類服務,哪些服務用哪個虛擬主機,這是一個規劃)。

--------------------------------------------#########################--------------------------------------------------------------------------------------------------

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 高可用集羣就已經搭建好了,最後一個步驟就是搭建均衡器。

(5)安裝並配置HA

PS:可使用阿里雲的內網slb來實現負載均衡,不用本身搭建HA。這裏僅演示以下:

在192.168.101.11上yum安裝HAProxy(yum -y install HAProxy),而後修改 /etc/haproxy/haproxy.cfg:

global

log 127.0.0.1 local2

chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon

stats socket /var/lib/haproxy/stats

defaults
log global
mode tcp
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5s
clitimeout 120s
srvtimeout 120s

listen rabbitmq_cluster 192.168.101.11:5670
mode tcp
balance roundrobin
server rabbit1 192.168.101.11:5672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.101.12:5672 check inter 5000 rise 2 fall 2
server rabbit3 192.168.101.13:5672 check inter 5000 rise 2 fall 2
listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s
重啓HAProxy
service haproxy restart
登陸瀏覽器輸入地址http://192.168.101.11:8100/rabbitmqstats查看HAProxy的狀態

3、常見問題
常見錯誤:

一、使用 rabbitmq-server -detached命令啓動rabbitmq時,出現如下提示Warning: PID file not written; -detached was passed,此時使用rabbitmqctl status提示服務已啓動,可知此問題不用解決。

二、因爲更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就報錯,提示大概以下

Cluster status of node rabbit@web2 ...
Error: unable to connect to node rabbit@web2: nodedown

DIAGNOSTICS
===========

attempted to contact: [rabbit@web2]

rabbit@web2:
  * connected to epmd (port 4369) on web2
  * epmd reports node 'rabbit' running on port 25672
  * TCP connection succeeded but Erlang distribution failed

  * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"


current node details:
- node name: 'rabbitmq-cli-11@web2'
- home dir: /root
- cookie hash: SGwxMdJ3PjEXG1asIEFpBg==

此時先ps aux | grep mq,而後kill -9 該進程,而後再rabbitmq-server -detached便可解決。(即先強殺,再從新啓動)

三、使用rabbitmqctl stop,rabbitmq-server -detached從新啓動後,原先添加的用戶admin、虛擬主機coresystem等均丟失,還須要從新添加。

採用腳本啓動,在腳本中寫好啓動好須要加載的各配置項(建立admin用戶並受權,建立虛擬主機並受權,配置鏡像隊列)。

三、命令

rabbitmqctl stop_app 僅關閉應用,不關閉節點
rabbitmqctl start_app 開啓應用
rabbitmq--server -detached 啓動節點和應用
rabbitmqctl 關閉節點和應用
四、經常使用命令:

Rabbitmq服務器的主要經過rabbitmqctl和rabbimq-plugins兩個工具來管理,如下是一些經常使用功能。

1). 服務器啓動與關閉

啓動: rabbitmq-server –detached
關閉:rabbitmqctl stop
若單機有多個實例,則在rabbitmqctlh後加–n 指定名稱

2). 插件管理

開啓某個插件:rabbitmq-plugins enable xxx
關閉某個插件:rabbitmq-plugins disable xxx
注意:重啓服務器後生效。
3).virtual_host管理

新建virtual_host: rabbitmqctl add_vhost xxx
撤銷virtual_host:rabbitmqctl delete_vhost xxx

4). 用戶管理

新建用戶:rabbitmqctl add_user xxxpwd
刪除用戶: rabbitmqctl delete_user xxx
查看用戶:rabbitmqctl list_users
 改密碼: rabbimqctlchange_password {username} {newpassword}
設置用戶角色:rabbitmqctlset_user_tags {username} {tag ...}
Tag能夠爲 administrator,monitoring, management

5). 權限管理

權限設置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath
Vhost路徑
user
用戶名
Conf
一個正則表達式match哪些配置資源可以被該用戶訪問。
Write
一個正則表達式match哪些配置資源可以被該用戶讀。
Read
一個正則表達式match哪些配置資源可以被該用戶訪問。

6). 獲取服務器狀態信息

服務器狀態:rabbitmqctl status ##其中可查看rabbitmq的版本信息7).獲取集羣狀態信息

相關文章
相關標籤/搜索