基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用負載均衡集群
基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用負載均衡集群實戰指南
一、前言
在企業級應用中,消息隊列的高可用性是系統穩定性的重要保障。RabbitMQ 作為主流的消息中間件,雖然自身支持集群模式,但客戶端連接仍存在單點風險。本文將手把手教你如何利用 KeepAlived + HAProxy 構建一個 高可用且具備負載均衡能力 的 RabbitMQ 集群,實現故障自動切換與流量分發。
二、架構設計
2.1 核心組件
- RabbitMQ 集群:3 節點(1 磁盤節點 + 2 內存節點)
- HAProxy:提供 4 層 TCP 負載均衡,健康檢查
- KeepAlived:基于 VRRP 協議實現 VIP(虛擬 IP)高可用
2.2 集群架構圖示
2.3 網絡拓撲圖
VIP: 192.168.61.159┌───────────────────┐│ KeepAlived ││ (Master) │┌────────┴────────┐ ││ HAProxy │ ││ 192.168.61.156│ │└────────┬────────┘ ││ │
┌──────────────┼───────────────────┼──────────────┐
│ │ │ │
│ ┌──────────┴─────────┐ ┌──────┴────────┐ │
│ │ RabbitMQ (Memory) │ │RabbitMQ(Memory)│ │
│ │ 192.168.61.157 │ │192.168.61.156 │ │
│ └────────────────────┘ └────────────────┘ │
│ │
│ ┌──────────────────────┐ │
│ │ RabbitMQ (Disk) │ │
│ │ 192.168.61.158 │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────┘
三、環境準備
3.1 軟件版本
- Erlang:23.1
- RabbitMQ:3.8.9
- HAProxy:1.8+
- KeepAlived:1.3+
3.2 節點規劃
主機名 | IP 地址 | 角色 | 部署服務 |
---|---|---|---|
rabbitmq-1 | 192.168.61.156 | Master | RabbitMQ + HAProxy + KeepAlived |
rabbitmq-2 | 192.168.61.157 | Backup | RabbitMQ + HAProxy + KeepAlived |
rabbitmq-3 | 192.168.61.158 | Disk 節點 | RabbitMQ |
四、RabbitMQ 集群搭建
4.1 安裝 Erlang 和 RabbitMQ
# 三臺機器同步執行
cd /usr/local/soft
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v23.1/erlang-23.1-1.el7.x86_64.rpm
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.9/rabbitmq-server-3.8.9-1.el7.noarch.rpmyum install -y erlang-23.1-1.el7.x86_64.rpm
yum install -y rabbitmq-server-3.8.9-1.el7.noarch.rpm# 啟用管理插件
rabbitmq-plugins enable rabbitmq_management
具體參考博客:Linux快速安裝Erlang和RabbitMQ單機版
4.2 配置集群
# 1. 同步 .erlang.cookie
# 所有節點必須保證該文件內容一致
chmod 600 /var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@rmq157:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@rmq158:/var/lib/rabbitmq/# 2. 配置 hosts
cat >> /etc/hosts << EOF
192.168.44.156 rmq156
192.168.44.157 rmq157
192.168.44.158 rmq158
EOF# 3. 啟動并加入集群
# 在 rabbitmq-3 (磁盤節點) 執行:
rabbitmq-server -detached
rabbitmqctl start_app# 在 rabbitmq-1 和 rabbitmq-2 執行:
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@rmq158
rabbitmqctl start_app# 4. 設置鏡像隊列
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
集群加入成功,在每一個節點都可以看到如下所示:
五、HAProxy 配置
5.1 安裝 HAProxy
yum install -y haproxy
5.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 root # 默認用戶
group root # 默認組
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 rabbitmq-1 192.168.61.156:15672
server rabbitmq-2 192.168.61.157:15672
#######################監聽rabbimq_cluster #################################
listen rabbitmq_cluster
bind 0.0.0.0:5670
mode tcp
#負載均衡算法(#banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數)
balance roundrobin#check inter 2000 是檢測心跳頻率
#rise 2是2次正確認為服務器可用
#fall 2是2次失敗認為服務器不可用
server rabbit1 192.168.61.156:5672 check inter 5000 rise 2 fall 2
server rabbit2 192.168.61.157:5672 check inter 5000 rise 2 fall 2
5.3 啟動 HAProxy
systemctl start haproxy
systemctl enable haproxy
啟動成功,訪問:http://192.168.61.156:9188/stats
六、KeepAlived 配置
6.1 安裝 KeepAlived
yum install -y keepalived
6.2 Master 節點配置 (156)
編輯 /etc/keepalived/keepalived.conf
:
global_defs {router_id NodeA # 起一個唯一的名字,不能與備機相同
}vrrp_script chk_haproxy {script "/etc/keepalived/check_haproxy.sh"interval 5weight 2
}vrrp_instance VI_1 {state MASTER # 這里標記為主interface enp0s3 # 這里的必須和你的網卡一致,ipconfig獲得virtual_router_id 1 # 這里表示路由的唯一標識與備機一致priority 100 # 配置優先級advert_int 1authentication {auth_type PASSauth_pass root # 配置認證密碼}virtual_ipaddress { # 配置虛擬ip地址,就是開放的地址,與本機ip不同192.168.61.159}track_script {chk_haproxy}
}
6.3 Backup 節點配置 (157)
global_defs {router_id NodeB
}vrrp_script chk_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 5
weight 2
}vrrp_instance VI_1 {state BACKUP # 通過BACKUP表示該機器為備機interface enp0s3 # 與網卡一致,ipconfig獲得virtual_router_id 1 # 與主機一致priority 50advert_int 1authentication {auth_type PASSauth_pass root} virtual_ipaddress { # 開放的虛擬地址192.168.61.159}track_script {chk_haproxy}
}
6.4 健康檢查腳本
創建 /etc/keepalived/check_haproxy.sh
:
#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; thensystemctl restart haproxysleep 2if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalivedfi
fi
賦予執行權限:
chmod +x /etc/keepalived/check_haproxy.sh
6.5 啟動 KeepAlived
systemctl start keepalived
systemctl enable keepalived
七、驗證測試
7.1 查看集群狀態
# 任意節點執行
rabbitmqctl cluster_status
7.2 訪問管理界面
- VIP 管理界面:http://192.168.61.159:15670 (admin/admin)
- HAProxy 監控:http://192.168.61.159:9188/stats (admin/123456)
7.3 故障模擬測試
-
停止 Master 節點的 HAProxy:
systemctl stop haproxy
- 觀察 VIP 是否漂移至 Backup 節點(通過
ip a
查看) - 客戶端連接是否仍可用(通過
telnet 192.168.44.159 5670
測試)
- 觀察 VIP 是否漂移至 Backup 節點(通過
-
停止 RabbitMQ 節點:
systemctl stop rabbitmq-server
- 觀察 HAProxy 監控界面是否自動剔除故障節點
- 消息收發是否正常(通過管理界面查看隊列狀態)
八、客戶端連接示例
Java 客戶端連接
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.61.159");
factory.setPort(5670);
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
九、總結
通過 KeepAlived + HAProxy 的組合,我們實現了:
- 高可用性:任何節點故障自動切換
- 負載均衡:客戶端請求均勻分發到多個 RabbitMQ 節點
- 易擴展:新增節點只需修改 HAProxy 配置
此架構適用于生產環境,可根據實際業務量調整節點數量和負載均衡策略(如一致性哈希)。