Rabbitmq +Haproxy +keepalived 實現高可用集群


 

 搭建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

 


免責聲明!

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



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