本文使用Docker搭建RabbitMQ集羣,而後使用HAProxy作負載均衡,最後使用KeepAlived實現集羣高可用,從而搭建起來一個完成了RabbitMQ高可用負載均衡集羣。受限於自身條件,本文使用VMware虛擬機的克隆功能克隆了兩臺服務器進行操做,僅做爲一個demo,開發中可根據實際狀況進行調整。html
爲何要搭建高可用負載均衡集羣?一句話來講就是:引入消息隊列,能夠實現異步操做、流量削峯、應用解耦等好處,可是消息隊列畢竟是一把雙刃劍,帶了這些好處的同時也會使系統可用性、穩定性下降。對於RabbitMQ而言,它自己並非分佈式的(對比Kafka),因此咱們要搭建RabbitMQ的集羣來實現高可用。linux
首先看下RabbitMQ高可用負載均衡集羣長什麼樣子:web
使用Docker構建RabbitMQ高可用負載均衡集羣大概分爲三個步驟:算法
使用Docker啓動3個RabbitMQ節點,目標以下表所示:docker
服務器ip | 端口 | hostname | 管理界面地址 |
---|---|---|---|
192.168.16.128 | 5672 | my-rabbit1 | 192.168.16.128:15672 |
192.168.16.128 | 5673 | my-rabbit2 | 192.168.16.128:15673 |
192.168.16.128 | 5674 | my-rabbit3 | 192.168.16.128:15674 |
命令:瀏覽器
docker run -d --hostname my-rabbit1 --name rabbit1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.8.0-beta.4-management docker run -d --hostname my-rabbit2 --name rabbit2 -p 5673:5672 -p 15673:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 rabbitmq:3.8.0-beta.4-management docker run -d --hostname my-rabbit3 --name rabbit3 -p 5674:5672 -p 15674:15672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link rabbit1:my-rabbit1 --link rabbit2:my-rabbit2 rabbitmq:3.8.0-beta.4-management
注意:因爲Erlang節點間經過認證Erlang cookie的方式來容許互相通訊,因此RABBITMQ_ERLANG_COOKIE必須設置爲相同的。bash
啓動完成以後,使用docker ps命令查看運行狀況,確保RabbitMQ都已經啓動。服務器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d6f612fdc8e rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 5 seconds ago Up 4 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, 0.0.0.0:15674->15672/tcp rabbit3 c410aa73ce68 rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 14 seconds ago Up 14 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp rabbit2 ceb28620d7b1 rabbitmq:3.8.0-beta.4-management "docker-entrypoint..." 24 seconds ago Up 23 seconds 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbit1
內存節點和磁盤節點的選擇:cookie
每一個RabbitMQ節點,要麼是內存節點,要麼是磁盤節點。內存節點將全部的隊列、交換器、綁定、用戶等元數據定義都存儲在內存中;而磁盤節點將元數據存儲在磁盤中。單節點系統只容許磁盤類型的節點,不然當節點重啓之後,全部的配置信息都會丟失。若是採用集羣的方式,能夠選擇至少配置一個節點爲磁盤節點,其他部分配置爲內存節點,,這樣能夠得到更快的響應。因此本集羣中配置節點1位磁盤節點,節點2和節點3位內存節點。app
集羣中的第一個節點將初始元數據代入集羣中,而且無須被告知加入。而第2個和以後加入的節點將加入它並獲取它的元數據。要加入節點,須要進入Docker容器,重啓RabbitMQ。
設置節點1:
docker exec -it rabbit1 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app exit
設置節點2:
docker exec -it rabbit2 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@my-rabbit1 rabbitmqctl start_app exit
設置節點3:
docker exec -it rabbit3 bash rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@my-rabbit1 rabbitmqctl start_app exit
節點設置完成以後,在瀏覽器訪問192.168.16.128:1567二、192.168.16.128:15673和192.168.16.128:15674中任意一個,都會看到RabbitMQ集羣已經建立成功。
鏡像隊列工做原理:在非鏡像隊列的集羣中,消息會路由到指定的隊列。當配置爲鏡像隊列以後,消息除了按照路由規則投遞到相應的隊列外,還會投遞到鏡像隊列的拷貝。也能夠想象在鏡像隊列中隱藏着一個fanout交換器,將消息發送到鏡像的隊列的拷貝。
進入任意一個RabbitMQ節點,執行以下命令:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
能夠設置鏡像隊列,"^"表示匹配全部隊列,即全部隊列在各個節點上都會有備份。在集羣中,只須要在一個節點上設置鏡像隊列,設置操做會同步到其餘節點。
查看集羣的狀態:
rabbitmqctl cluster_status
第一步構建RabbitMQ集羣只是構建高可用負載均衡集羣的基礎,下面將使用HAProxy爲RabbitMQ集羣作負載均衡。
Haproxy 是目前比較流行的一種羣集調度工具,是使用C語言編寫的自由及開放源代碼軟件,其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程序代理。同類羣集調度工具備不少,如LVS 和 Nginx 。相比較而言,LVS 性能最好,可是搭建相對複雜,Nginx的upstream模塊支持羣集功能,可是對羣集節點的健康檢查功能不強,性能沒有HAProxy 好。
對於調度算法本文采用最簡單最經常使用的輪詢算法。
原本想採用Docker的方式拉取並運行HAProxy鏡像,折騰了好幾天搞不定,HAProxy啓動不了,故採用源碼安裝的方式安裝HAProxy。
配置兩個HAProxy節點實現負載均衡:
服務器ip | 端口號 | 管理界面地址 |
---|---|---|
192.168.16.128 | 8888 | http://192.168.16.128:8888/haproxy |
192.168.16.129 | 8888 | http://192.168.16.129:8888/haproxy |
因爲到官網下載須要kexue上網,這裏提供百度雲連接。
連接: https://pan.baidu.com/s/1uaSJa3NHFiE1E6dk7iHMwQ 提取碼: irz6
tar zxvf haproxy-1.7.8.tar.gz
將源代碼解壓以後,須要運行make來將HAProxy編譯成爲可執行文件。若是是在Linux2.6系統上面進行編譯的話,須要設置TARGET=linux26以開啓epoll支持,這也是爲何網上許多博客裏面都是這麼寫的。對於其餘的UNIX系統來講,直接採用TARGET=generic方式,本文進行安裝的系統爲CentOS7 ,內核3.10版本。
cd haproxy-1.7.8 make TARGET=generic
執行完畢以後,目錄下出現haproxy的可執行文件。
HAProxy配置文件說明
HAProxy配置文件一般分爲三個部分,即global、defaults和listen。global爲全局配置,defaults爲默認配置,listen爲應用組件配置。
global爲全局配置部分,屬於進程級別的配置,一般和使用的操做系統配置相關。
defaults配置項配置默認參數,會被應用組件繼承,若是在應用組件中沒有特別聲明,將使用默認配置參數。
以配置RabbitMQ集羣的負載均衡爲例,在安裝目錄下面新建一個haproxy.cfg,輸入下面配置信息:
global #日誌輸出配置,全部日誌都記錄在本機,經過local0輸出 log 127.0.0.1 local0 info #最大鏈接數 maxconn 10240 #以守護進程方式運行 daemon defaults #應用全局的日誌配置 log global mode http #超時配置 timeout connect 5000 timeout client 5000 timeout server 5000 timeout check 2000 listen http_front #haproxy的客戶頁面 bind 192.168.16.128:8888 mode http option httplog stats uri /haproxy stats auth admin:123456 stats refresh 5s stats enable listen haproxy #負載均衡的名字 bind 0.0.0.0:5666 #對外提供的虛擬的端口 option tcplog mode tcp #輪詢算法 balance roundrobin server rabbit1 192.168.16.128:5672 check inter 5000 rise 2 fall 2 server rabbit2 192.168.16.128:5673 check inter 5000 rise 2 fall 2 server rabbit3 192.168.16.128:5674 check inter 5000 rise 2 fall 2
啓動命令:
/opt/haproxy-1.7.8/haproxy -f /opt/haproxy-1.7.8/haproxy.cfg
驗證一下是否啓動成功:
[root@localhost haproxy-1.7.8]# lsof -i:8888 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME haproxy 45031 root 3u IPv4 228341 0t0 TCP localhost.localdomain:ddi-tcp-1 (LISTEN)
在瀏覽器上訪問http://192.168.16.128:8888/haproxy,輸入配置的用戶名和密碼登陸之後,能夠看到以下畫面:
再以相同的方式在192.168.16.129服務器上面啓動一個HAProxy。
到此,負載均衡配置完成。
Keepalived,它是一個高性能的服務器高可用或熱備解決方案,Keepalived主要來防止服務器單點故障的發生問題,能夠經過其與Nginx、Haproxy等反向代理的負載均衡服務器配合實現web服務端的高可用。Keepalived以VRRP協議爲實現基礎,用VRRP協議來實現高可用性(HA)。
Keepalived的官網下載Keepalived的安裝文件,目前最新的版本爲:keepalived-2.0.17.tar.gz,下載地址爲http://www.keepalived.org/download.html。
下載以後進行解壓和編譯安裝。
tar zxvf keepalived-2.0.17.tar.gz cd keepalived-2.0.17 ./configure --prefix=/opt/keepalived --with-init=SYSV #注:(upstart|systemd|SYSV|SUSE|openrc) #根據你的系統選擇對應的啓動方式 make make install
以後將安裝事後的Keepalived加入系統服務中,詳細步驟以下:
cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig cp /opt/keepalived/sbin/keepalived /usr/sbin/ chmod +x /etc/init.d/keepalived chkconfig --add keepalived chkconfig keepalived on #Keepalived默認會讀取/etc/keepalived/keepalived.conf配置文件 mkdir /etc/keepalived cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/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 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.16.130 } }
Backup中的配置大體和Master中的相同,不過須要修改global_defs{}的router_id,好比置爲NodeB;其次要修改vrrp_instance VI_1{}中的state爲BACKUP;最後要將priority設置爲小於100的值。注意Master和Backup中的virtual_router_id要保持一致。下面簡要的展現下Backup的配置:
#Keepalived配置文件 global_defs { router_id NodeB #路由ID, 主備的ID不能相同 } #自定義監控腳本 vrrp_script chk_haproxy { script "/etc/keepalived/check_haproxy.sh" interval 5 weight 2 } vrrp_instance VI_1 { state BACKUP interface eth0 #指定監測網卡 virtual_router_id 1 priority 80 #優先級,BACKUP機器上的優先級要小於這個值 advert_int 1 #設置主備之間的檢查時間,單位爲s authentication { #定義驗證類型和密碼 auth_type PASS auth_pass root123 } track_script { chk_haproxy } virtual_ipaddress { #VIP地址,能夠設置多個: 192.168.16.130 } }
爲了防止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 /opt/haproxy-1.7.8/haproxy.cfg fi sleep 2 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then service keepalived stop fi
如此配置好以後,使用service keepalived start命令啓動192.168.16.128和192.168.16.129中的Keepalived服務便可。以後客戶端的應用能夠經過192.168.16.130這個IP地址來接通RabbitMQ服務。
原文出處:https://www.cnblogs.com/sgh1023/p/11296013.html