基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用負載均衡集群

基于 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-1192.168.61.156MasterRabbitMQ + HAProxy + KeepAlived
rabbitmq-2192.168.61.157BackupRabbitMQ + HAProxy + KeepAlived
rabbitmq-3192.168.61.158Disk 節點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 故障模擬測試

  1. 停止 Master 節點的 HAProxy

    systemctl stop haproxy
    
    • 觀察 VIP 是否漂移至 Backup 節點(通過 ip a 查看)
    • 客戶端連接是否仍可用(通過 telnet 192.168.44.159 5670 測試)
  2. 停止 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 配置

此架構適用于生產環境,可根據實際業務量調整節點數量和負載均衡策略(如一致性哈希)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90621.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

京東獲得JD商品詳情 API 返回值說明||京東API接入文檔

京東商品詳情API返回值核心字段說明一、商品基礎信息商品ID&#xff08;skuId/productId&#xff09;唯一標識符&#xff0c;用于定位具體商品或SKU&#xff08;如不同顏色、尺寸的變體&#xff09;。示例&#xff1a;"skuId": "123456789"商品標題&#x…

其他世界的自來水

西歐&#xff0c;北美&#xff0c;亞洲日韓等地區&#xff0c;他們的自來水可以直接飲用以英國為例&#xff1a;自來水的質量可能等同或者有可能超過純凈水&#xff0c;不需要消毒和過濾直接可以飲用。直接從水龍接的水和瓶裝純凈水沒有什么差別&#xff0c;甚至比瓶裝純凈水更…

IO密集型、CPU密集型、負載、負載均衡

0、引入 從宏觀上來講&#xff0c;計算機可以抽象為【輸入 > 計算 > 輸出】這三部分 輸入輸出自然就是io&#xff0c;而計算部分自然歸cpu管 不同的任務&#xff0c;對io和cpu的依賴程度不同&#xff0c;由此有了cpu密集型任務和io密集型任務 1、IO密集型 更依賴輸入…

從甲方的角度看MOM項目成敗的原因

關鍵詞&#xff1a;MOM、數字化轉型、成敗數字化轉型中流行這么一句話&#xff1a;SAP項目加班到晚上8點&#xff0c;MOM項目最少到晚上10點。由此可見&#xff0c;MOM項目實施的難度、復雜度。但&#xff0c;為什么MOM難度大&#xff1f;先引入1個故事&#xff1a;1個價值300萬…

MySQL操作進階

系列文章目錄 MySQL的基礎操作-CSDN博客 目錄 系列文章目錄 前言 一、數據庫的約束 1. 約束類型&#xff1a;not null 2. 約束類型&#xff1a;unique 3. 約束類型&#xff1a;default 4. 約束類型&#xff1a;primary key 5. 約束條件&#xff1a;foreign key 二、表…

表征工程 中怎么 調整參數或比例

表征工程 中怎么 調整參數或比例 在表征工程(Representation Engineering)中,調整參數或比例的核心目標是平衡干預效果與模型基礎能力,避免過度干預導致語義失真或能力退化。以下是幾種常用的方法論及具體案例: 1. 系數縮放法(Scaling Coefficients):通過權重參數控制…

如何使用Anaconda(miniconda)和Pycharm

文章目錄前言具體操作Pycharm連接配置 Anaconda&#xff08;miniconda&#xff09;創建的虛擬環境PipAnacondaPyCharm三者關系一圖勝千言總結前言 本文介紹如何利用Anaconda和Pycharm這兩個強大的工具&#xff0c;實現Python項目的高效開發。通過構建虛擬環境、安裝依賴包及利…

【07】C#入門到精通——C# 生成dll庫 C#添加現有DLL C#調用自己生成的dll庫

文章目錄0 多個.cs文件源碼01 Hero.cs02 ShowInfo.cs03 Program.cs &#xff08;相當于Main文件&#xff09;04 運行效果1 生成dll庫1.1 創建類庫1.2 添加要生成 dll庫 的代碼文件1.2.1 添加 Hero類1.2.2 添加 ShowInfo類1.3 生成dll庫 及 查看3 添加自己生成的dll庫4 調用運行…

進程控制->進程替換(Linux)

在之前的博客中&#xff0c;我們已經探討了進程創建、終止和等待的相關知識。今天&#xff0c;我們將繼續深入學習進程控制中的另一個重要概念——進程替換。回顧之前的代碼示例&#xff0c;我們使用fork()創建子進程時&#xff0c;子進程會復制父進程的代碼和數據&#xff08;…

認識泛型、泛型類和泛型接口

目錄泛型泛型類泛型接口泛型 定義類、接口、方法時&#xff0c;同時聲明了一個或者多個類型變量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;稱為泛型類、泛型接口、泛型方法、它們統稱為泛型 作用&#xff1a;泛型提供了在編譯階段約束所能操作的數據類型&…

如何排查并解決項目啟動時報錯Error encountered while processing: java.io.IOException: closed 的問題

如何排查并解決項目啟動時報錯Error encountered while processing: java.io.IOException: closed 的問題 摘要 本文針對Java項目啟動時出現的java.io.IOException: closed錯誤&#xff0c;提供系統性解決方案。該異常通常由流資源異常關閉或損壞引發&#xff0c;常見于Maven依…

Kafka——多線程開發消費者實例

引言在分布式系統領域&#xff0c;Kafka憑借高吞吐量、低延遲的特性成為消息隊列的事實標準。隨著硬件技術的飛速發展&#xff0c;服務器多核CPU已成常態——一臺普通的云服務器動輒配備16核、32核甚至更多核心。然而&#xff0c;Kafka Java Consumer的設計卻長期保持著"單…

PDF 轉 HTML5 —— HTML5 填充圖形不支持 Even-Odd 奇偶規則?(第二部分)

這是關于該主題的第二部分。如果你還沒有閱讀第一部分&#xff0c;請先閱讀&#xff0c;以便理解“繞組規則”的問題。 快速回顧一下&#xff1a;HTML5 只支持 Non-Zero&#xff08;非零&#xff09;繞組規則&#xff0c;而 PDF 同時支持 Non-Zero 和 Even-Odd&#xff08;奇偶…

機器學習 KNN 算法,鳶尾花案例

目錄 一.機器學習概述 二.人工智能的兩大方向 三.KNN算法介紹 1.核心思想&#xff1a;“物以類聚&#xff0c;人以群分” 2.算法步驟 四.KNN算法實現 1.安裝scikit-learn庫 2.導入knn用于分類的類KNeighborsClassifier 3.設置KNeighborsClassifier的相關參數 4.訓練模…

強化學習(第三課第三周)

文章目錄強化學習&#xff08;第三課第三周&#xff09;一、以火星探測器為例說明強化學習的形式化表示二、強化學習中的回報三、強化學習算法的目標&#xff08;一&#xff09;馬爾可夫決策過程&#xff08;二&#xff09;狀態動作價值函數&#xff08;四&#xff09;使用Bell…

星痕共鳴數據分析2

今天實驗內容是攻擊力部分 1.思路 由于昨天數據分析出了一個函數 這個函數可以把奇怪的字節變成正常的數字 int parse_varint(unsigned const char* data, int count) {int value 0;int shift 0;for (int i 0; i < count; i) {unsigned char byte data[i];value | ((byt…

強化學習新發現:僅需更新5%參數的稀疏子網絡可達到全模型更新效果

摘要&#xff1a;強化學習&#xff08;RL&#xff09;已成為大語言模型&#xff08;LLM&#xff09;在完成預訓練后與復雜任務及人類偏好對齊的關鍵步驟。人們通常認為&#xff0c;要通過 RL 微調獲得新的行為&#xff0c;就必須更新模型的大部分參數。本研究對這一假設提出了挑…

electron 使用記錄

目錄 代理設置以打包成功 參考文檔 代理設置以打包成功 參考文檔 使用 JavaScript、HTML 和 CSS 構建跨平臺桌面應用 |電子 --- Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron

Spring boot Grafana優秀的監控模板

JVM (Micrometer) | Grafana Labs 1 SLS JVM監控大盤 | Grafana Labs Spring Boot 2.1 Statistics | Grafana Labs springboot granfana 監控接口指定接口響應的 在Spring Boot應用中&#xff0c;使用Grafana進行監控通常涉及以下幾個步驟&#xff1a; 設置Prometheus作…

LeetCode11~30題解

LeetCode11.盛水最多的容器&#xff1a; 題目描述&#xff1a; 給定一個長度為 n 的整數數組 height 。有 n 條垂線&#xff0c;第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。 找出其中的兩條線&#xff0c;使得它們與 x 軸共同構成的容器可以容納最多的水。 返回容器…