RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-3-keepalived-haproxy/
試想下如果前面配置的HAProxy主機192.168.0.9突然宕機或者網卡失效,那么雖然RabbitMQ集群沒有任何故障,但是對于外界的客戶端來說所有的連接都會被斷開,結果將是災難性的。確保負載均衡服務的可靠性同樣顯得十分的重要。這里就引入Keepalived工具,它能夠通過自身健康檢查、資源接管功能做高可用(雙機熱備),實現故障轉移。
Keepalived采用VRRP(Virtual Router Redundancy Protocol,虛擬路由冗余協議),以軟件的形式實現服務器熱備功能。通常情況下是將兩臺Linux服務器組成一個熱備組(Master和Backup),同一時間熱備組內只有一臺主服務器Master提供服務,同時Master會虛擬出一個公用的虛擬IP地址,簡稱VIP。這個VIP只存在在Master上并對外提供服務。如果Keepalived檢測到Master宕機或者服務故障,備份服務器Backup會自動接管VIP稱為Master,Keepalived并將原Master從熱備組中移除。當原Master恢復后,會自動加入到熱備組,默認再搶占稱為Master,起到故障轉移的功能。
Keepalived工作在OSI模型中的第3層、第4層和第7層。
工作在第3層是指Keepalived會定期向熱備組中的服務器發送一個ICMP數據包來判斷某臺服務器是否故障,如果故障則將這臺服務器從熱備組移除。
工作在第4層是指Keepalived以TCP端口的狀態判斷服務器是否故障,比如檢測RabbitMQ的5672端口,如果故障則將這臺服務器從熱備組中移除。
工作在第7層是指Keepalived根據用戶設定的策略(通常是一個自定義的檢測腳本)判斷服務器上的程序是否正常運行,如果故障將這臺服務器從熱備組移除。
Keepalived的安裝
首先需要去Keepalived的官網下載Keepalived的安裝文件,目前最新的版本為:keepalived-1.3.5.tar.gz,下載地址為http://www.keepalived.org/download.html。
將keepalived-1.3.5.tar.gz解壓并安裝,詳細步驟如下:
之后將安裝過后的Keepalived加入系統服務中,詳細步驟如下(注意千萬不要輸錯命令):
#復制啟動腳本到/etc/init.d/下 [root@node1 ~]# cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@node1 ~]# cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig [root@node1 ~]# cp /opt/keepalived/sbin/keepalived /usr/sbin/ [root@node1 ~]# chmod +x /etc/init.d/keepalived [root@node1 ~]# chkconfig --add keepalived [root@node1 ~]# chkconfig keepalived on #Keepalived默認會讀取/etc/keepalived/keepalived.conf配置文件 [root@node1 ~]# mkdir /etc/keepalived [root@node1 ~]# cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/執行完之后就可以使用如下:
service keepalived restart service keepalived start service keepalived stop service keepalived status這4個命令來重啟、啟動、關閉和查看keepalived狀態。
配置
在安裝的時候我們已經創建了/etc/keepalived目錄,并將keepalived.conf配置文件拷貝到此目錄下,如此Keepalived便可以讀取這個默認的配置文件了。如果要將Keepalived與前面的HAProxy服務結合起來需要更改/etc/keepalived/keepalived.conf這個配置文件,在此之前先來看看本次配置需要完成的詳情及目標。
如圖所示,兩臺Keepalived服務器之間通過VRRP進行交互,對外部虛擬出一個VIP為192.168.0.10。Keepalived與HAProxy部署在同一臺機器上,兩個Keepalived服務實例匹配兩個HAProxy服務實例,這樣通過Keeaplived實現HAProxy的雙機熱備。所以在上一小節的192.168.0.9的基礎之上,還要再部署一臺HAProxy服務,IP地址為192.168.0.8。整條調用鏈路為:客戶端通過VIP建立通信鏈路;通信鏈路通過Keeaplived的Master節點路由到對應的HAProxy之上;HAProxy通過負載均衡算法將負載分發到集群中的各個節點之上。正常情況下客戶端的連接通過圖中左側部分進行負載分發。當Keepalived的Master節點掛掉或者HAProxy掛掉無法恢復,那么Backup提升為Master,客戶端的連接通過圖中右側部分進行負載分發。如果你追求要更高的可靠性,可以加入多個Backup角色的Keepalived節點來實現一主多從的多機熱備。當然這樣會提升硬件資源的成本,該如何抉擇需要更細致的考恒,一般情況下雙機熱備的配備已足夠滿足應用需求。
接下來我們要修改/etc/keepalived/keepalived.conf文件,在Keepalived的Master上配置詳情如下:
#Keepalived配置文件 global_defs {router_id NodeA #路由ID, 主備的ID不能相同 }#自定義監控腳本 vrrp_script chk_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 5weight 2 }vrrp_instance VI_1 {state MASTER #Keepalived的角色。Master表示主服務器,從服務器設置為BACKUPinterface eth0 #指定監測網卡virtual_router_id 1priority 100 #優先級,BACKUP機器上的優先級要小于這個值advert_int 1 #設置主備之間的檢查時間,單位為sauthentication { #定義驗證類型和密碼auth_type PASSauth_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 ];thenhaproxy -f /opt/haproxy-1.7.8/haproxy.cfg fi sleep 2 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];thenservice keepalived stop fi如此配置好之后,使用service keepalived start命令啟動192.168.0.8和192.168.0.9中的Keepalived服務即可。之后客戶端的應用可以通過192.168.0.10這個IP地址來接通RabbitMQ服務。
##查看Keepalived的運行情況
可以通過tail -f /var/log/messages -n 200命令查看相應的Keepalived日志輸出。Master啟動日志如下:
Master啟動之后可以通過ip add show命令查看添加的VIP(加粗部分,Backup節點是沒有VIP的):
[root@node1 ~]# ip add show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP qlen 1000link/ether fa:16:3e:5e:7a:f7 brd ff:ff:ff:ff:ff:ffinet 192.168.0.8/18 brd xx.xx.255.255 scope global eth0inet 192.168.0.10/32 scope global eth0inet6 fe80::f816:3eff:fe5e:7af7/64 scope link valid_lft forever preferred_lft forever在Master節點執行 service keepalived stop模擬異常關閉的情況,觀察Master的日志:
Oct 4 22:58:32 node1 Keepalived[27609]: Stopping Oct 4 22:58:32 node1 Keepalived_vrrp[27611]: VRRP_Instance(VI_1) sent 0 priority Oct 4 22:58:32 node1 Keepalived_vrrp[27611]: VRRP_Instance(VI_1) removing protocol VIPs. Oct 4 22:58:32 node1 Keepalived_healthcheckers[27610]: Stopped Oct 4 22:58:33 node1 Keepalived_vrrp[27611]: Stopped Oct 4 22:58:33 node1 Keepalived[27609]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2 Oct 4 22:58:34 node1 ntpd[1313]: Deleting interface #13 eth0, 192.168.0.10#123, interface stats: received=0, sent=0, dropped=0, active_time=532 secs Oct 4 22:58:34 node1 ntpd[1313]: peers refreshed對應的Master上的VIP也會消失:
[root@node1 ~]# ip add show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP qlen 1000link/ether fa:16:3e:5e:7a:f7 brd ff:ff:ff:ff:ff:ffinet 192.168.0.8/18 brd xx.xx.255.255 scope global eth0inet6 fe80::f816:3eff:fe5e:7af7/64 scope link valid_lft forever preferred_lft foreverMaster關閉后,Backup會提升為新的Master,對應的日志為:
Oct 4 22:58:15 node2 Keepalived_vrrp[2352]: VRRP_Instance(VI_1) Transition to MASTER STATE Oct 4 22:58:16 node2 Keepalived_vrrp[2352]: VRRP_Instance(VI_1) Entering MASTER STATE Oct 4 22:58:16 node2 Keepalived_vrrp[2352]: VRRP_Instance(VI_1) setting protocol VIPs.可以看到新的Master節點上虛擬出了VIP如下所示:
[root@node2 ~]# ip add show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host loinet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP qlen 1000link/ether fa:16:3e:23:ac:ec brd ff:ff:ff:ff:ff:ffinet 192.168.0.9/18 brd xx.xx.255.255 scope global eth0inet 192.168.0.10/32 scope global eth0inet6 fe80::f816:3eff:fe23:acec/64 scope link valid_lft forever preferred_lft forever歡迎跳轉到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-load-balance-3-keepalived-haproxy/
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。
總結
以上是生活随笔為你收集整理的RabbitMQ负载均衡(3)——Keepalived+HAProxy实现高可用的负载均衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ负载均衡(2)——HAP
- 下一篇: RabbitMQ负载均衡(4)——LVS