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