
搭建rabbitmq的高可用集群,分三步走:
1)搭建rabbitmq集群:
多機集群搭建
1.安裝單機版的 教程:《Linux下安裝rabbitmq》
(安裝rpm包或者源碼包,這里簡單介紹下安裝rpm包)
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.1/rabbitmq-server-3.5.1-1.noarch.rpm rpm -i --nodeps rabbitmq-server-3.5.1-1.noarch.rpm 3、安裝RabbitMQ rpm -ivh rabbitmq-server-3.5.1-1.noarch.rpm 或 $$$ rpm -ivh --nodeps --force rabbitmq-server-3.5.1-1.noarch.rpm 啟動RabbitMQ: /etc/init.d/rabbitmq-server start 或 service rabbitmq-service start 打開web管理插件 rabbitmq-plugins enable rabbitmq_management 管理界面地址:http://127.0.0.1:15672/ MQ新建用戶 rabbitmqctl add_user admin admin 授權 rabbitmqctl set_user_tags admin administrator rabbitmqctl set_permissions -p "/" admin".*" ".*" ".*"
注意:不同於單機多節點的情況,在多機環境,如果要在cluster集群內部署多個節點,需要注意兩個方面:
1)保證需要部署的這幾個節點在同一個局域網內
2)需要有相同的Erlang Cookie,否則不能進行通信,為保證cookie的完全一致,采用從一個節點copy的方式,下面就會使用這種方式
2.要搭建集群,先將之前單機版中歷史記錄干掉,刪除rabbitmq/var/lib/rabbitmq/mnesia下的所有內容。
3.分別在192.168.1.103 192.168.1.104 192.168.1.105節點上安裝rabbitmq server。
4.在瀏覽器訪問每一個rabbitmq實例,是夠可以顯示登錄頁面,如果顯示成功,繼續往下進行。
5.設置不同節點間同一認證的Erlang Cookie
將192.168.1.103上的rabbitmq/var/lib/rabbitmq/.erlang.cookie中的內容復制到192.168.1.104和192.168.1.105上的rabbitmq/var/lib/rabbitmq/.erlang.cookie文件中,
即三台服務器必須具有相同的cookie,如果不相同的話,無法搭建集群
注意:
官方在介紹集群的文檔中提到過.erlang.cookie一般會存在這兩個地址:第一個是$home/.erlang.cookie也就是/root 目錄下,
第二個地方就是/var/lib/rabbitmq/.erlang.cookie。
如果我們使用解壓縮方式安裝部署的rabbitmq,那么這個文件會在$home目錄下,也就是$home/.erlang.cookie。
如果我們使用rpm等安裝包方式進行安裝的,那么這個文件會在/var/lib/rabbitmq目錄下。
6.分別在三個節點的/etc/hosts下設置相同的配置信息,然后重啟機器
192.168.1.103 rabbit1
192.168.1.104 rabbit2
192.168.1.105 rabbit3
重啟之后[root@localhost ~]# 改為[root@rabbit1 ~]# hostname就會生效
7.使用 -detached運行各節點
rabbitmq-server -detached
8.創建集群
1)rabbit1為主節點,另外兩個為從節點搭建,主節點不用動,只在兩個從節點運行如下命令,我這里只舉一個節點(rabbit2)的例子,rabbit3執行相同的命令
[root@rabbit2 rabbitmq]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit2 ...
[root@rabbit2 rabbitmq]# rabbitmqctl reset
Resetting node rabbit@rabbit2 ...
[root@rabbit2 rabbitmq]# rabbitmqctl join_cluster rabbit@rabbit1
Clustering node rabbit@rabbit2 with rabbit@rabbit1 ...
[root@rabbit2 rabbitmq]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
2)使用rabbitmqctl cluster_status查看集群狀態
[root@rabbit2 rabbitmq]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]},
{cluster_name,<<"rabbit@rabbit2">>},
{partitions,[]},
{alarms,[{rabbit@rabbit1,[]},{rabbit@rabbit2,[]}]}]
9.我這里創建完成之后,之前的admin用戶無法使用了,重新添加用戶,參考之前搭建單機版的命令
10.使用剛才的賬號密碼登錄,出現界面,表示成功。
二)安裝haproxy
.Haproxy負載代理
1)在192.168.1.101和192.168.1.102節點上安裝haproxy
yum install haproxy
2)修改/etc/haproxy/haproxy.cfg為以下內容,全覆蓋,修改對應的端口號
#--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global log 127.0.0.1 local2 chroot /var/lib/haproxy # 改變當前工作目錄 pidfile /var/run/haproxy.pid # haproxy的pid存放路徑,啟動進程的用戶必須有權限訪問此文件 maxconn 4000 # 最大連接數,默認4000 user haproxy # 默認用戶 group haproxy # 默認組 daemon # 創建1個進程進入deamon模式運行。此參數要求將運行模式設置為daemon stats socket /var/lib/haproxy/stats # 創建監控所用的套接字目錄 #--------------------------------------------------------------------- # defaults settings #--------------------------------------------------------------------- # 注意:因為要使用tcp的負載,屏蔽掉與http相關的默認配置 defaults mode http # 默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK log global # option httplog # 采用http日志格式 option dontlognull # 啟用該項,日志中將不會記錄空連接。所謂空連接就是在上游的負載均衡器 # option http-server-close # 每次請求完畢后主動關閉http通道 # option forwardfor except 127.0.0.0/8 # 如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip option redispatch # serverId對應的服務器掛掉后,強制定向到其他健康的服務器 retries 3 # 3次連接失敗就認為服務不可用,也可以通過后面設置 # timeout http-request 10s timeout queue 1m timeout connect 10s # 連接超時時間 timeout client 1m # 客戶端連接超時時間 timeout server 1m # 服務器端連接超時時間 # timeout http-keep-alive 10s timeout check 10s maxconn 3000 # 最大連接數 ###################### 打開haproxy的監測界面############################### listen status bind 0.0.0.0:9188 mode http stats enable stats refresh 30s stats uri /stats #設置haproxy監控地址為http://localhost:9188/stats stats auth admin:123456 #添加用戶名密碼認證 stats realm (Haproxy\ statistic) stats admin if TRUE ######################監聽rabbitmq的web操作頁面############################ listen rabbitmq_admin bind 0.0.0.0:15670 server rabbit1 192.168.1.102:15672 server rabbit2 192.168.1.101:15672 server rabbit3 192.168.1.101:15673 #######################監聽rabbimq_cluster ################################# listen rabbitmq_cluster bind 0.0.0.0:5670 mode tcp balance roundrobin #負載均衡算法(#banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數) server rabbit1 192.168.1.102:5672 check inter 5000 rise 2 fall 2 #check inter 2000 是檢測心跳頻率 server rabbit2 192.168.1.101:5672 check inter 5000 rise 2 fall 2 #rise 2是2次正確認為服務器可用 server rabbit3 192.168.1.101:5673 check inter 5000 rise 2 fall 2 #fall 2是2次失敗認為服務器不可用
3)啟動haproxy
haproxy -f /etc/haproxy/haproxy.cfg
service haproxy restart#重啟
service haproxy stop#停止
4)兩個ip分別訪問以下地址,出現以下頁面證明沒錯
瀏覽器訪問:192.168.0.101:15670 和 192.168.0.101:9188/stats
三)安裝配置keepalived
1)安裝keepalived
yum install keepalived
chkconfig --add keepalived#設置開機啟動,可以不用設置
2)修改/etc/keepalived/keepalived.conf配置文件,主機和備機稍有不同,已經在配置文件中聲明,請詳細閱讀!
#Keepalived配置文件
global_defs { router_id NodeA #路由ID, 主備的ID不能相同 } #自定義監控腳本 vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 5 weight 2 } vrrp_instance VI_1 { state MASTER #Keepalived的角色。Master表示主服務器,從服務器設置為BACKUP interface eth0 #指定監測網卡 virtual_router_id 1 priority 100 #優先級,BACKUP機器上的優先級要小於這個值 advert_int 1 #設置主備之間的檢查時間,單位為s authentication { #定義驗證類型和密碼 auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,可以設置多個: 192.168.0.10 } }
Backup中的配置大致和Master中的相同,不過需要修改global_defs{}的router_id,比如置為NodeB;其次要修改vrrp_instance VI_1{}中的state為BACKUP;最后要將priority設置為小於100的值。注意Master和Backup中的virtual_router_id要保持一致。下面簡要的展示下Backup的配置:
global_defs { router_id NodeB } vrrp_script chk_haproxy { ... } vrrp_instance VI_1 { state BACKUP ... priority 50 ... }
為了防止HAProxy服務掛了,但是Keepalived卻還在正常工作而沒有切換到Backup上,所以這里需要編寫一個腳本來檢測HAProxy服務的狀態。當HAProxy服務掛掉之后該腳本會自動重啟HAProxy的服務,如果不成功則關閉Keepalived服務,如此便可以切換到Backup繼續工作。這個腳本就對應了上面配置中vrrp_script chk_haproxy{}的script對應的值,/etc/keepalived/check_haproxy.sh的內容如代碼清單所示。
#!/bin/bash if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then haproxy -f /etc/haproxy/haproxy.cfg fi sleep 2 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then service keepalived stop fi
3)啟動服務
因為是為了實現haproxy的高可用,啟動時需要順序啟動:
(1) 啟動兩個節點的haproxy:
haproxy -f /etc/haproxy/haproxy.cfg
(2) 啟動keeepalived:先啟動master節點,后啟動BACKUP節點
keepalived start
如此配置好之后,使用service keepalived start命令啟動192.168.0.8和192.168.0.9中的Keepalived服務即可。之后客戶端的應用可以通過192.168.0.10這個IP地址來接通RabbitMQ服務。
Master啟動之后可以通過ip add show命令查看添加的VIP(加粗部分,Backup節點是沒有VIP的):
參考文章: https://blog.csdn.net/qq_34021712/article/details/72634167
https://blog.csdn.net/u013256816/article/details/77171017
