1. 程式人生 > >RabbitMQ高可用叢集部署及配置+HAproxy負載(原始碼)

RabbitMQ高可用叢集部署及配置+HAproxy負載(原始碼)

1.環境

rabbitmq-1 10.24.43.4 centos6.x
rabbitmq-2 10.24.43.5 centos6.x

2.部署前準備

(1).修改主機名

10.24.43.4 rabbitmq_1
10.24.43.5 rabbitmq_2
部署路徑:/data/UnicomSMS/

(2).時間同步
ntpdate ntp1.aliyun.com
注:這裡ntp後面跟域名/ip可以自行選擇,此處作者用的時阿里的時間伺服器
兩臺同步同一個地址,建立計劃任務每5分鐘同步一次即可
crontab -e
最後一行新增
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
3.安裝依賴環境
yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
4.安裝erlang

wget http://erlang.org/download/otp_src_19.0.tar.gz
tar -zxvf otp_src_19.0.tar.gz
cd otp_src_19.0
mkdir /data/UnicomSMS/Erlang
./configure --prefix=/data/UnicomSMS/Erlang --without-javac
make && make install
export
echo "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >>/etc/profile
source /etc/profile

測試:輸出erl會進入erl編譯介面,證明安裝配置成功!ctrl+G 然後輸入q退出編譯

5.安裝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-generic-unix-3.6.5.tar.xz
mkdir /data/UnicomSMS/Rabbitmq_server-3.6.5
tar -xvf rabbitmq-server-generic-unix-3.6.5.tar -C /data/UnicomSMS/Rabbitmq_server-3.6.5/
echo "export PATH=$PATH:/data/UnicomSMS/Erlang/bin:/data/UnicomSMS/Rabbitmq_server-3.6.5/sbin" >> /etc/profile
source /etc/profile

6.匯入rabbitmq的管理介面

兩個目錄沒作用太繁瑣,環境變數也定義的一個,所以去掉一個

cd /data/UnicomSMS/Rabbitmq_server-3.6.5/rabbitmq_server-3.6.5/
mv * ..
cd ..
rm -rf rabbitmq_server-3.6.5/

進入rabbitmq的sbin目錄

cd /data/UnicomSMS/Rabbitmq_server-3.6.5/sbin
./rabbitmq-plugins enable rabbitmq_management
這裡執行後The following plugins have been enabled:意思是下列外掛已啟用,有點像報錯,並不是報錯哦

7.設定erlang

查詢位置:find / -name *erlang.cookie
/root/.erlang.cookie #如果用的包和我一樣,預設就是這
將rabbitmq-1的該檔案內容複製到rabbitmq_2,注意這個檔案的許可權是 400(預設即是400)
[[email protected]_1 ~]#cat /root/.erlang.cookie
將其內容複製
[[email protected]_2 ~]# vim /root/.erlang.cookie
將複製的內容替換到此處
[[email protected]_2 ~]#chmod 400 /root/.erlang.cookie

可以通過cat /root/.erlang.cookie來檢視兩臺機器的cookie是否一致,設定erlang的目的是要保證叢集內的cookie內容一致。

8.使用-detached引數執行各節點

rabbitmqctl stop #如果已經在執行中用此命令停掉服務
rabbitmq-server -detached #執行各節點
rabbitmqctl start_app #開啟
rabbitmqctl stop_app #關閉
然後可以通過rabbitmqctl cluster_status檢視節點狀態。PS:要先拷貝cookie到另一臺機器上,保證兩臺機器上的cookie是一致的並且許可權都為400,然後再啟動服務。

9.新增使用者賦予許可權

由於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存在的,也可以正常提供服務了

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

rabbitmq_2#rabbitmqctl stop_app

rabbitmq_2#rabbitmqctl join_cluster [email protected]_1
#這裡叢集的名字一定不要寫錯了,需保證rabbitmq_1是開啟的,rabbitmq_2是關閉的,才可以加入叢集,如果還報錯,請檢查
cookie是否一致且許可權都是否為400,最好不要複製cookie到其他節點,建議把檔案cp過去並賦予400許可權,因為我第一次複製過去wc -c 發現位元組不一樣
rabbitmq_2# rabbitmqctl start_app

(PS:如果要使用記憶體節點,則可以使用rabbitmq_2# rabbitmqctl join_cluster --ram [email protected]加入叢集)叢集配置完畢!
11.檢查叢集狀態

叢集配置完畢後,可以在 RabbitMQ 任意節點上執行 rabbitmqctl cluster_status 來檢視是否叢集配置成功。
rabbitmq_1# rabbitmqctl cluster_status

會有一個叢集名字和連線資訊,我這裡只貼出來一個叢集名字
{cluster_name,<<”[email protected]_1”>>}

可知,叢集的名稱預設為[email protected]_1;

PS:另外一種檢視叢集是否成功的方式,在web頁面上的“Queues”的列表中,檢視有如下顯示為“同步映象到node2”,則也表示叢集配置成功

12.設定映象佇列策略
在任意一個節點上執行如下操作(這裡在rabbitmq_1上執行)

首先,在web介面,登陸後,點選“Admin–Virtual Hosts(頁面右側)”,在開啟的頁面上的下方的“Add a new virtual host”處增加一個虛擬主機,同時給使用者“admin”和“guest”均加上許可權(在頁面直接設定、點點點即可);

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

rabbitmqctl set_policy -p / ha-all "^" '{"ha-mode":"all"}'
“/” vhost預設名稱,可通過rabbitmqctl list_vhosts檢視, “^”匹配所有的佇列, ha-all 策略名稱為ha-all, ‘{“ha-mode”:”all”}’ 策略模式為 all 即複製到所有節點,包含新增節點。

則此時映象佇列設定成功。(這裡的虛擬主機coresystem是程式碼中需要用到的虛擬主機,虛擬主機的作用是做一個訊息的隔離,本質上可認為是一個rabbitmq-server,是否增加虛擬主機,增加幾個,這是由開發中的業務決定,即有哪幾類服務,哪些服務用哪一個虛擬主機,這是一個規劃)。

12:這裡補充一些對於設定映象佇列策略的說明

格式: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指定
node#:表示在指定的節點上進行映象,節點名稱通過ha-params指定
ha-params#ha-mode模式需要用到的引數
ha-sync-mode#進行佇列中訊息的同步方式,有效值為automatic和manual
priority#可選引數,policy的優先順序
將所有佇列設定為映象佇列,即佇列會被複制到各個節點,各個節點狀態保持一直。完成這 幾個步驟後,RabbitMQ 高可用叢集就已經搭建好了,最後一個步驟就是搭建均衡器。

13.安裝並配置HA
在rabbitmq-1上yum安裝HAProxy(yum -y install haproxy),然後修改vim /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 10.24.43.4:5670
       mode      tcp 
       balance roundrobin 
       server rabbit1  10.24.43.4:5672 check inter 5000 rise 2 fall 2 
       server rabbit2  10.24.43.5:5672 check inter 5000 rise 2 fall 2 

       listen private_monitoring :8100 mode http option httplog stats enable stats uri /rabbitmqstats stats refresh 5s

一般前面對照一下,就listen段落複製進去就可以了,記得改ip哦
14.重啟 haproxy
service haproxy restart

登入瀏覽器輸入地址http://10.24.43.4:8100/rabbitmqstats檢視HAProxy的狀態

15.查詢命令
獲取伺服器狀態資訊
伺服器狀態:rabbitmqctl status ##其中可檢視rabbitmq的版本資訊

16.獲取叢集狀態資訊
rabbitmqctl cluster_status

原文