您好,登錄后才能下訂單哦!
小編給大家分享一下如何搭建高可用RabbitMQ集群和HAProxy軟負載,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
RabbitMQ 高可用集群架構
將兩個 RabbitMQ 磁盤節點和一個 RabbitMQ 內存節點組成一個內建集群,之所以要用兩個磁盤節點是防止,唯一的磁盤節點掛掉后,不能重建隊列,交換器。用 HAProxy 作為 RabbitMQ 集群的負載均衡。為了防止 HAProxy 單點故障,用 Keepalived 將兩個 HAProxy 節點做成一主一備。應用使用 VIP(虛擬IP) 訪問 HAProxy 服務時,默認連接主機(Master)的 HAProxy,當主機(Master)上的 HAProxy 故障時,VIP 會漂移到備機(Backup)上,就會連接備機(Backup)上的 HAProxy 服務。
準備工作
服務器安裝 docker,docker-compose,準備離線鏡像 rabbitmq.tar,haproxy.tar。
服務器節點間可以相互 ping 通。
RabbitMQ 集群
使用 RabbitMQ 內建集群,持久化隊列無法在隊列節點崩潰時,自動連接別的節點創建隊列,非持久化隊列可以自動連接可用節點創建隊列。我們的項目使用的非持久化隊列。
至少保證有兩個磁盤節點,否則在唯一磁盤節點崩潰時,無法在集群中創建隊列,交換器等元數據。
服務分布情況
192.168.1.213 服務器部署 RabbitMQ Disc Node1。 192.168.1.203 服務器部署 RabbitMQ Disc Node2。 192.168.1.212 服務器部署 RabbitMQ RAM Node3。
創建第一個 RabbitMQ 節點
登錄服務器,創建目錄 /app/mcst/rabbitmq。
將鏡像 tar 包 rabbitmq.tar,服務編排文件 mcst-rabbitmq-node1.yaml 通過 sftp 上傳到剛創建的目錄下。
導入鏡像
$ docker load -i rabbitmq.tar $ docker images # 查看是否導入成功
查看服務編排文件 mcst-rabbitmq-node1.yaml
version: '3' services: rabbitmq: container_name: mcst-rabbitmq image: rabbitmq:3-management restart: always ports: - 4369:4369 - 5671:5671 - 5672:5672 - 15672:15672 - 25672:25672 environment: - TZ=Asia/Shanghai - RABBITMQ_ERLANG_COOKIE=iweru238roseire - RABBITMQ_DEFAULT_USER=mcst_admin - RABBITMQ_DEFAULT_PASS=mcst_admin_123 - RABBITMQ_DEFAULT_VHOST=mcst_vhost hostname: rabbitmq1 extra_hosts: - rabbitmq1:192.168.1.213 - rabbitmq2:192.168.1.203 - rabbitmq3:192.168.1.212 volumes: - ./data:/var/lib/rabbitmq
部署命令
$ docker-compose -f mcst-rabbitmq-node1.yaml up -d
注意:三個節點 RABBITMQ_ERLANG_COOKIE 保持一致。一定要有 extra_hosts 配置,否則在搭建集群的過程中會連接不到其他 rabbitmq 節點服務。此節點作為集群根節點。
部署第二個 RabbitMQ 節點
方法同上,上傳 rabbitmq.sh 腳本到 volumes 配置的 ./rabbitmq.sh 路徑。查看 mcst-rabbitmq-node2.yaml
version: '3' services: rabbitmq: container_name: mcst-rabbitmq image: rabbitmq:3-management restart: always ports: - 4369:4369 - 5671:5671 - 5672:5672 - 15672:15672 - 25672:25672 environment: - TZ=Asia/Shanghai - RABBITMQ_ERLANG_COOKIE=iweru238roseire - RABBITMQ_DEFAULT_USER=mcst_admin - RABBITMQ_DEFAULT_PASS=mcst_admin_123 - RABBITMQ_DEFAULT_VHOST=mcst_vhost hostname: rabbitmq2 extra_hosts: - rabbitmq1:192.168.1.213 - rabbitmq2:192.168.1.203 - rabbitmq3:192.168.1.212 volumes: - ./rabbitmq.sh:/home/rabbitmq.sh - ./data:/var/lib/rabbitmq
部署命令
$ docker-compose -f mcst-rabbitmq-node2.yaml up -d
節點啟動完成后,通過命令進入 rabbitmq2 節點的容器中,執行 /home/rabbitmq.sh 腳本。如果報權限錯誤,則在容器內執行 chmod +x /home/rabbitmq.sh 賦權,然后 bash /home/rabbitmq.sh 執行腳本添加到集群中。
進入容器的命令:
$ docker exec -it mcst-rabbitmq /bin/bash
腳本內容如下(磁盤節點):
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster rabbit@rabbitmq1 rabbitmqctl start_app
部署第三個 RabbitMQ 節點
方法同上,查看 mcst-rabbitmq-node3.yaml
version: '3' services: rabbitmq: container_name: mcst-rabbitmq image: rabbitmq:3-management restart: always ports: - 4369:4369 - 5671:5671 - 5672:5672 - 15672:15672 - 25672:25672 environment: - TZ=Asia/Shanghai - RABBITMQ_ERLANG_COOKIE=iweru238roseire - RABBITMQ_DEFAULT_USER=mcst_admin - RABBITMQ_DEFAULT_PASS=mcst_admin_123 - RABBITMQ_DEFAULT_VHOST=mcst_vhost hostname: rabbitmq3 extra_hosts: - rabbitmq1:192.168.1.213 - rabbitmq2:192.168.1.203 - rabbitmq3:192.168.1.212 volumes: - ./rabbitmq-ram.sh:/home/rabbitmq-ram.sh - ./data:/var/lib/rabbitmq
部署命令
$ docker-compose -f mcst-rabbitmq-node3.yaml up -d
在啟動 rabbitmq3 節點,啟動后,進入容器內部,執行 bash /home/rabbitmq-ram.sh 腳本添加內存節點到集群中。
腳本內容:
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl join_cluster --ram rabbit@rabbitmq1 rabbitmqctl start_app
在容器內部使用命令查看集群狀態:rabbitmqctl cluster_status。
Cluster status of node rabbit@rabbitmq1 ... [{nodes,[{disc,[rabbit@rabbitmq1,rabbit@rabbitmq2]},{ram,[rabbit@rabbitmq3]}]}, {running_nodes,[rabbit@rabbitmq2,rabbit@rabbitmq3,rabbit@rabbitmq1]}, {cluster_name,<<"rabbit@rabbitmq2">>}, {partitions,[]}, {alarms,[{rabbit@rabbitmq2,[]},{rabbit@rabbitmq3,[]},{rabbit@rabbitmq1,[]}]}]
也可以通過 http://192.168.1.213:15672 進入管理端查看集群狀態。
HAProxy 負載均衡
創建目錄 /app/mcst/haproxy,將鏡像 tar 包,haproxy 配置文件,docker 服務編排文件上傳到該目錄。
導入鏡像方法同上。
查看服務編排文件內容:
version: '3' services: haproxy: container_name: mcst-haproxy image: haproxy:2.1 restart: always ports: - 8100:8100 - 15670:5670 environment: - TZ=Asia/Shanghai extra_hosts: - rabbitmq1:192.168.1.213 - rabbitmq2:192.168.1.203 - rabbitmq3:192.168.1.212 volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
重點是設置 extra_hosts(rabbitmq 集群節點 ip) 和 volumes(使用自定義的配置文件)。
haproxy 配置文件內容:
global log 127.0.0.1 local0 info maxconn 4096 defaults log global mode tcp option tcplog retries 3 option redispatch maxconn 2000 timeout connect 5s timeout client 120s timeout server 120s # ssl for rabbitmq # frontend ssl_rabbitmq # bind *:5673 ssl crt /root/rmqha_proxy/rmqha.pem # mode tcp # default_backend rabbitmq # web 管理界面 listen stats bind *:8100 mode http stats enable stats realm Haproxy\ Statistics stats uri / stats auth admin:admin123 # 配置負載均衡 listen rabbitmq bind *:5670 mode tcp balance roundrobin server rabbitmq1 rabbitmq1:5672 check inter 5s rise 2 fall 3 server rabbitmq2 rabbitmq2:5672 check inter 5s rise 2 fall 3 server rabbitmq3 rabbitmq3:5672 check inter 5s rise 2 fall 3
部署命令
$ docker-compose -f mcst-haproxy.yaml up -d
服務分布情況
192.168.1.212 服務器部署 HAProxy Master。 192.168.1.203 服務器部署 HAProxy Backup。
分別在以上兩個節點起好 HAProxy 服務。
登錄 HAProxy 的管理端查看集群狀態:http://192.168.1.212:8100/。
使用 Keepalived 給 HAProxy 做主備
準備工作
申請一個和服務節點同一局域網的 ip 地址,該 ip 不能被占用,作為 VIP(虛擬ip)。
安裝 Keepalived
到 Keepalived 官網下載最新版本包,本次安裝使用的是 2.0.20 版本。
下載好后的文件是:keepalived-2.0.20.tar.gz。
上傳到服務器,對 tar 包解壓縮。
$ tar -xf keepalived-2.0.20.tar.gz
檢查依賴
$ cd keepalived-2.0.20 $ ./configure
Keepalived 的安裝需要以下依賴 gcc,openssl-devel。
安裝命令
$ yum install -y gcc $ yum install -y openssl-devel
因為是內網服務器不能使用外網的 yum 源,所以需要更改用本地 yum 源。
將 linux 的安裝光盤鏡像上傳到 /mnt/iso 目錄下,并 mount 到 /mnt/cdrom 目錄下,作為 yum 的一個安裝源。
$ mkdir /mnt/iso $ mkdir /mnt/cdrom $ mv /ftp/rhel-server-7.3-x86_64-dvd.iso /mnt/iso
掛載光盤鏡像
$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom $ mv /ftp/myself.repo /etc/yum.repos.d $ yum clean all $ yum makecache $ yum update
附:myself.repo文件內容:
[base] name= Red Hat Enterprise Linux $releasever - $basearch - Source baseurl=file:///mnt/cdrom enabled=1 gpgcheck=1 gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release
更改完成后,以后每次需要 linux 安裝盤安裝軟件包時,只需要執行 mount 命令,將光盤 ISO 文件加載即可。
$ mount -ro loop /mnt/iso/rhel-server-7.3-x86_64-dvd.iso /mnt/cdrom
這時使用 yum 安裝 gcc,openssl-devel就沒問題了。
如果使用本地 yum 源的條件也不具備,那么可以使用 yum 的 downloadonly 插件。
要在能連接外網和系統版本一致的機器上將需要的依賴下載下來,到目標內網機器上本地安裝。
還是推薦使用本地 yum 源的方式
安裝完 gcc,openssl-devel 后,再次執行 ./configure 會報一個警告。
“this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.”
安裝如下依賴解決
$ yum install -y libnl libnl-devel
安裝完成后再次 ./configure 就沒問題了。
然后執行 make 編譯
最后執行 make install 安裝
安裝完成后執行 keepalived --version,輸出版本號即為安裝成功。
創建 Keepalived 配置文件
創建配置文件 /etc/keepalived/keepalived.conf
Master 節點配置:
vrrp_script chk_haproxy { script "killall -0 haproxy" # verify haproxy's pid existance interval 5 # check every 2 seconds weight -2 # if check failed, priority will minus 2 } vrrp_instance VI_1 { # 主機: MASTER # 備機: BACKUP state MASTER # 實例綁定的網卡, 用ip a命令查看網卡編號 interface ens192 # 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP實例中主備服務器ID必須一樣 virtual_router_id 51 # 優先級,數字越大優先級越高,在一個實例中主服務器優先級要高于備服務器 priority 101 # 虛擬IP地址,可以有多個,每行一個 virtual_ipaddress { 192.168.1.110 } track_script { # Scripts state we monitor chk_haproxy } }
ens192 是網卡名,ifconfig 命令查看服務器網卡,找到和本機服務 ip 對應的網卡,virtual_router_id 的值要和 backup 節點上的配置保持一致。killall \-0 haproxy 命令的意思是,如果 haproxy 服務存在執行該命令,什么都不會發生,如果服務不存在,執行該命令會報找不到進程 haproxy: no process found。
# 網卡信息 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.203 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::250:56ff:fe94:bceb prefixlen 64 scopeid 0x20<link> ether 00:50:56:94:bc:eb txqueuelen 1000 (Ethernet) RX packets 88711011 bytes 12324982140 (11.4 GiB) RX errors 0 dropped 272 overruns 0 frame 0 TX packets 88438149 bytes 10760989492 (10.0 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # haproxy 服務不存在 [root@localhost ~]# killall -0 haproxy haproxy: no process found
master 節點的 priority 在減去 weight 后要比 backup 節點的 priority 低才行,否則主備切換不成功。
Backup節點配置:
vrrp_script chk_haproxy { script "killall -0 haproxy" # verify haproxy's pid existance interval 5 # check every 2 seconds weight -2 # if check failed, priority will minus 2 } vrrp_instance VI_1 { # 主機: MASTER # 備機: BACKUP state BACKUP # 實例綁定的網卡, 用ip a命令查看網卡編號 interface ens192 # 虛擬路由標識,這個標識是一個數字(1-255),在一個VRRP實例中主備服務器ID必須一樣 virtual_router_id 51 # 優先級,數字越大優先級越高,在一個實例中主服務器優先級要高于備服務器 priority 100 # 虛擬IP地址,可以有多個,每行一個 virtual_ipaddress { 192.168.1.110 } track_script { # Scripts state we monitor chk_haproxy } }
創建完配置,啟動 keepalived。
$ systemctl restart keepalived
測試 Keepalived
在 Master,Backup 節點上,使用 ip addr 命令看下 vip 在哪臺機器的 ens192 網卡上。
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:50:56:94:c1:79 brd ff:ff:ff:ff:ff:ff inet 192.168.1.212/24 brd 192.168.1.255 scope global ens192 valid_lft forever preferred_lft forever inet 192.168.1.110/32 scope global ens192 valid_lft forever preferred_lft forever inet6 fe80::250:56ff:fe94:c179/64 scope link valid_lft forever preferred_lft forever
默認在 master 主機上,停掉 master 主機的 haproxy 服務,然后在用 ip addr 查看虛擬 ip 在哪個機器上,如果漂移到備份主機上則代表熱備生效。
在開啟 master 主機的 haproxy 服務,ip addr 查看虛擬ip應該重新漂移回 master 主機上。
測試服務,使用虛擬 ip 加服務端口號訪問 HAProxy 服務。
以上是“如何搭建高可用RabbitMQ集群和HAProxy軟負載”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。