HAProxy 實驗指南:從零開始搭建高可用負載均衡系統

引言

HAProxy(High Availability Proxy)是一款高性能的TCP/HTTP負載均衡器和代理服務器,廣泛用于構建高可用、可擴展的Web架構。它由法國開發者Willy Tarreau于2000年開發,如今已成為開源社區和企業級應用中不可或缺的工具。HAProxy以其卓越的性能、靈活性和豐富的功能,被用于處理數百萬并發連接的場景,例如大型網站、API網關、微服務架構等。

本文將通過一個完整的實驗,帶你一步步在RHEL 9系統上搭建HAProxy負載均衡環境,并深入探索其核心功能,包括七層和四層負載均衡、健康檢查、訪問控制、HTTPS配置、動態權重調整等。

HAProxy 簡介

1. HAProxy 是什么?

HAProxy 是一個開源的高性能 TCP/HTTP 負載均衡器,主要用于分發網絡流量到多個后端服務器。它支持基于 HTTP 和 TCP 協議的負載均衡,能夠實現高可用性、會話保持、動態權重調整、健康檢查等功能。HAProxy 的設計目標是提供一個可靠且高效的解決方案,以應對高并發、高流量的業務需求。

2. HAProxy 的核心特性

  • 高性能:支持數萬甚至數十萬的并發連接。

  • 靈活的負載均衡算法:支持輪詢(Round Robin)、最少連接(LeastConn)、源地址哈希(Source Hash)、一致性哈希(Consistent Hash)等。

  • 健康檢查:自動檢測后端服務器的健康狀態,故障時自動切換。

  • 會話保持:通過 Cookie 或源地址哈希實現會話粘性。

  • SSL/TLS 支持:支持 HTTPS 協議,提供加密通信。

  • 動態配置:通過?socat?工具實現運行時動態調整后端服務器權重或狀態。

  • 狀態監控:提供 Web 狀態頁面,實時查看負載均衡器的運行狀態。

3. HAProxy 的應用場景

  • Web 服務負載均衡:將流量分發到多個 Web 服務器,提高并發處理能力。

  • 數據庫負載均衡:分發數據庫請求到多個 MySQL 或 PostgreSQL 實例。

  • API 網關:作為 API 請求的入口,實現流量控制、路由和安全策略。

  • 微服務架構:在微服務中實現服務發現和負載均衡。

  • 高可用架構:通過健康檢查和故障轉移,確保服務的持續可用性。

實驗環境準備

1.機器角色分配

  • HAProxy服務器(172.25.254.100)

  • 后端服務器1(RS1)

  • 后端服務器2(RS2)

  • 客戶端:172.25.254.103

2.所有機器基礎配置

  • 配置靜態IP(根據上述分配)。

  • 關閉防火墻(臨時測試用,生產需配置規則)

  • 關閉SELinxu

第一步:安裝HAProxy和依賴

在HAProxy服務器(172.25.254.100)上執行

1.安裝HAProxy:

dnf install haproxy -y

2.啟動并啟用HAProxy服務:

systemctl start haproxy
systemctl enable haproxy

第三步:?配置HAProxy負載均衡

在HAProxy服務器(172.25.254.100)上執行:

1.編輯HAProxy配置文件:

vim /etc/haproxy/haproxy.cfg

?2.配置內容

3.驗證配置文件語法:

haproxy -c -f /etc/haproxy/haproxy.cfg-c:表示 "check"(檢查)模式,僅驗證配置文件的語法合法性,不會啟動 HAProxy 服務
-f /etc/haproxy/haproxy.cfg:指定要檢查的配置文件路徑(這里是默認的配置文件路徑)

?如果提示 Configuration file is valid,則配置正確。

    4.重啟HAProxy服務

    systemctl restart haproxy

    第四步:測試負載均衡

    在客戶端(192.168.0.103)上執行

    1.多次訪問HAProxy服務器(172.25.254.100):

    for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done

    輸出應交替顯示RS和RS2,說明負載均衡生效。

    第五步:配置健康檢查

    修改HAProxy配置文件

    1.編輯配置文件:

    vim /etc/haproxy/haproxy.cfg

    2.修改backend webcluster部分,添加健康檢查:

    backend webclusterbalance roundrobinserver web1 192.168.0.101:80 checkserver web2 192.168.0.102:80 check

    3.重啟HAProxy:

    systemctl restart haproxy

    4.測試健康檢查

    • 在RS1上停止Nginx服務:

      systemctl stop nginx
    • 再次運行客戶端測試命令:

      for i in {1..10}; do curl http://172.25.254.100; sleep 0.5; done

    所有請求應只返回RS2 server - 192.168.0.102。

    第六步:配置訪問控制(ACL)

    修改HAProxy配置文件

    1.編輯配置文件:

    vim /etc/haproxy/haproxy.cfg

    2.添加以下內容到defaults段之后:

    frontend webserverbind *:80acl block_curl hdr_sub(User-Agent) -i curlhttp-request deny if block_curldefault_backend webcluster

    這將阻止使用curl工具的訪問。

    3.重啟HAProxy:

    systemctl restart haproxy

    4.測試ACL:

    ?使用curl訪問會失敗:curl http://172.25.254.100

    ?返回403 Forbidden。

    將curl的請求頭偽裝為Firefox 128.0 瀏覽器,繞過基于User-Agent的攔截規則。

    第七步:配置HTTPS

    1.生成自簽名證書

    1.1在HAProxy服務器上生成證書:

    mkdir /etc/haproxy/certs
    openssl req -newkey rsa:2048 -nodes -keyout /etc/haproxy/certs/haproxy.key -x509 -days 365 -out /etc/haproxy/certs/haproxy.crt

    1.2合并證書和私鑰:

    cat /etc/haproxy/certs/haproxy.key /etc/haproxy/certs/haproxy.crt > /etc/haproxy/certs/haproxy.pem

    2.修改HAProxy配置文件

    2.1編輯配置文件:

    vim /etc/haproxy/haproxy.cfg

    2.2添加以下配置:

    3.重啟HAProxy:

    systemctl restart haproxy

    4.測試

    4.1HTTP請求測試:

    HAproxy的80端口(HTTP)監聽正常,觸發了配置中的redirect scheme https code 301規則。重定向邏輯正確,將 HTTP 請求強制導向 HTTPS 地址,符合預期。

    4.2HTTPS請求測試:

    HAProxy 的 443 端口(HTTPS)監聽正常,SSL 證書配置有效(-k參數跳過證書驗證,適合測試環境)。

    請求已成功轉發到后端的 Nginx 服務器(172.25.254.101172.25.254.102),后端服務器正常響應。

    第八步:配置狀態頁

    1.編輯配置文件:

    vim /etc/haproxy/haproxy.cfg

    2.在defaults段之后添加狀態頁配置:

    listen statsbind *:8888mode httpstats enablestats uri /haproxy-statusstats auth admin:admin123stats hide-versionstats refresh 2s

    3.重啟HAProxy:

    systemctl restart haproxy

    ?4.訪問狀態頁:

    • 瀏覽器訪問 http://172.25.254.100:8888/haproxy-status

    • 用戶名:admin,密碼:admin123

    第九步:動態調整后端服務器權重

    通過 HAProxy 的 Unix 套接字(socket) 動態管理后端服務器(webcluster 組中的 web1),無需重啟 HAProxy 服務。

    使用socat工具

    1.安裝socat

    dnf install socat -y

    2.修改HAProxy配置文件

    授予socket管理員權限。(未修改前無法使用set weight,是因為 HAProxy 默認對統計 socket 僅開放讀取權限,限制了寫入操作)

    3.設置權重

    # 查看 web1 權重
    [root@haproxy ~]# echo "get weight webcluster/web1" | socat stdio /var/lib/haproxy/stats
    1 (initial 1)
    # 查看 web2 權重
    [root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
    1 (initial 1)
    # 設置 web2 權重
    [root@haproxy ~]# echo "set weight webcluster/web2 2" | socat stdio /var/lib/haproxy/stats
    # 驗證 web2 權重
    [root@haproxy ~]# echo "get weight webcluster/web2" | socat stdio /var/lib/haproxy/stats
    2 (initial 1)

    4.測試驗證

    5.禁用/啟用后端服務器

    # 禁用后端服務器 web1
    echo "disable server webcluster/web1" | socat stdio /var/lib/haproxy/stats
    # # 啟用后端服務器 web1
    echo "enable server webcluster/web1" | socat stdio /var/lib/haproxy/stats

    第十步:配置四層負載均衡(TCP)

    1.編輯配置文件:

    vim /etc/haproxy/haproxy.cfg

    2.添加以下內容:

    listen mysql_portbind *:3306  # 監聽所有IP的3306端口mode tcp ?  # MySQL基于TCP協議balance leastconn ? # 最少連接數算法,適合數據庫負載均衡server mysql1 172.25.254.101:3306 check inter 3s fall 3  rise 5  weight 2 # 后端服務器1,啟動健康檢查server mysql2 172.25.254.102:3306 check inter 3s fall 3  rise 5  weight 1 # 后端服務器2,啟用健康檢查

    3.重啟HAProxy:

    systemctl restart haproxy

    4.安裝并啟動mariadb: ?

    • 在RS1和RS2上安裝MySQL(或MariaDB)并配置監聽3306端口。

    # 兩臺機器都執行
    dnf install mariadb-server -y  # 安裝
    systemctl start mariadb        # 啟動
    systemctl enable mariadb       # 開機自啟

    5.配置數據庫區分標識(方便驗證負載均衡)

    # (rs1):設置server-id=101
    vim /etc/my.cnf
    [mysqld]
    server-id=101  # 唯一標識,區分不同服務器#(rs2):設置server-id=102
    vim /etc/my.cnf
    [mysqld]
    server-id=102# 重啟數據庫使配置生效
    systemctl restart mariadb

    ?6.授權數據庫訪問(允許 HAProxy 轉發的客戶端連接)

    # rs1和rs2都執行,授權用戶admin(密碼admin)從任何IP訪問數據庫
    mysql -e "grant all on *.* to 'admin'@'%' identified by 'admin';"
    mysql -e "flush privileges;"  # 刷新權限

    7.在Clinet上安裝 MySQL 客戶端(用于連接測試)

    dnf  install mariadb -y  

    8.在Client上測試 多次連接 HAProxy,查看分配結果

    # 連接HAProxy服務器(IP為172.25.254.100),查詢服務器標識
    mysql -uadmin -padmin -h 172.25.254.100 -e "show variables like 'hostname'"  # 查看主機名
    mysql -uladmin -padmin -h 172.25.254.100 -e "select @@server_id"  # 查看server-id

    負載均衡配置已經成功生效

    • 多次訪問172.25.254.100(HAProxy 節點)時,請求被交替分發到后端的 101(server_id=101,主機名rs1)和 102(server_id=102,主機名rs2)。

    • admin用戶的權限配置正確,能夠正常連接并執行查詢命令(如show variablesselect @@server_id)。

    • 結合之前的 HAProxy 配置(balance leastconn),這種交替返回的結果符合 “最少連接數” 負載均衡策略的預期(在連接數相近時會交替分配)。

    總結

    HAProxy 作為一款高性能、功能豐富的開源負載均衡器,是構建高可用架構的核心組件。通過本次實驗,我們不僅掌握了其基礎配置,還深入實踐了動態管理、安全策略和四層負載均衡等高級功能。HAProxy 的靈活性和穩定性使其成為企業級應用的理想選擇,未來可通過持續學習其高級特性(如 ACL 規則優化、SSL 終止加速等)進一步提升技能水平。

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

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

        相關文章

        2.10DOM和BOM插入/移除/克隆

        1.DOM創建/插入/移除/克隆1.1創建元素前面我們使用過 document.write 方法寫入一個元素:這種方式寫起來非常便捷,但是對于復雜的內容、元素關系拼接并不方便;它是在早期沒有 DOM 的時候使用的方案,目前依然被保留了下來&#xff1…

        華為倉頡編程語言的表達式及其特點

        華為倉頡編程語言的表達式及其特點 倉頡(Cangjie)語言的表達式有一個明顯的特點,范圍不再局限于傳統算術運算,而是擴展到條件表達式、循環表達式等多種類型,每種表達式均有確定的類型和值。 傳統基本表達式&#xff0…

        【linux】keepalived

        一.高可用集群1.1 集群類型LB:Load Balance 負載均衡 LVS/HAProxy/nginx(http/upstream, stream/upstream) HA:High Availability 高可用集群 數據庫、Redis SPoF: Single Point of Failure,解決單點故障 HPC&#xff…

        Webpack配置原理

        一、Loader: 1、定義:將不同類型的文件轉換為 webpack 可識別的模塊2、分類: ① pre: 前置 loader (1)配置:在 webpack 配置文件中通過enforce進行指定 loader的優先級配置(2&#x…

        對比JS“上下文”與“作用域”

        下面從定義、特性、示例,以及在代碼分析中何時側重“上下文”(Execution Context/this)和何時側重“作用域”(Scope/變量查找),以及二者結合的場景來做對比和指導。一、概念對比 | 維度 | 上下文&#xff0…

        如何做數據增強?

        目錄 1、為什么要做數據增強? 2、圖像數據增強? 3、文本與音頻數據增強? 4、高級數據增強? 數據增強技術就像是一種“造數據”的魔法,通過對原始數據進行各種變換,生成新的樣本,從而提高模型…

        Go by Example

        網頁地址Go by Example 中文版 Github倉庫地址mmcgrana/gobyexample:按示例進行 HelloWorld package mainimport ("fmt" )func main() {fmt.Println("Hello World") } Hello World 值 package mainimport ("fmt" )func main() {…

        ClickHouse高性能實時分析數據庫-消費實時數據流(消費kafka)

        告別等待,秒級響應!這不只是教程,這是你駕馭PB級數據的超能力!我的ClickHouse視頻課,凝練十年實戰精華,從入門到精通,從單機到集群。點開它,讓數據處理速度快到飛起,讓你…

        電子電氣架構 --- 車載軟件與樣件產品交付的方法

        我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

        C++:STL中vector的使用和模擬實現

        在上一篇中講到了string類,string并不屬于STL中因為string出現的比STL早,但是在使用方法上兩者有相似之處,學習完string后再來看vector會容易的多,接著往下閱讀,一定會有收獲滴! 目錄 vector的介紹 vect…

        倉庫管理的流程、績效和解決方案?

        什么是倉庫管理? 倉庫管理涉及對所有倉庫運營的日常監督。一個全面、集成的倉庫管理解決方案采用行業最佳實踐,并涵蓋使高效運營得以實現的所有基本要素。這些要素包括分銷和庫存管理、倉庫勞動力管理以及業務支持服務。此外,由內部提供或與服…

        TIM 實現定時中斷【STM32L4】【實操】

        使用定時器實現定時中斷的功能:比如每1ms進入中斷處理函數使用STM32CubeMX配置TIM初始化先了解每個參數的含義,在進行配置Counter Settings: 計數器基本設置Prescaler(PSC): 預分頻器,設置預分頻器系數Counter Mode: 技術模式,…

        Elasticsearch 的聚合(Aggregations)操作詳解

        目錄 1. 概述 2. 聚合類型分類詳解 2.1 桶聚合(Bucket Aggregations) 2.1.1 基礎桶聚合 2.1.2 特殊桶聚合 2.1.3 高級桶聚合 2.2 指標聚合(Metric Aggregations) 2.2.1 單值指標聚合(Single-value Metrics&am…

        電子電氣架構 --- 高階智能駕駛對E/E架構的新要求

        我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

        0.深度學習環境配置步驟

        0.深度學習環境配置步驟 這里介紹深度學習環境配置詳細步驟,包括安裝軟件,每一步都有安裝時的截圖(后續持續更新,敬請關注) 目錄如下: 1.安裝anaconda 2.安裝CUDA 3.安裝CU_DNN 4.安裝pytorch

        在 Azure 中配置 SMS 與 OTP

        1. Azure Active Directory B2C (AAD B2C) 中的 SMS/OTP 身份驗證 1.1. 現狀與原理:電話注冊與登錄 Azure Active Directory B2C (AAD B2C) 提供了將電話號碼作為用戶身份標識進行注冊和登錄的功能,旨在為用戶提供一種便捷的替代傳統電子郵件或用戶名登錄…

        簡單實現支付密碼的頁面及輸入效果

        干我們這行,風吹日曬不到,就怕甲方突發奇想。 今天客戶要做一個安全密碼前置校驗,還要做成支付寶那種效果。ps:android端 心理吐槽了一萬遍以后,還是得面對現實。 先用通義問一遍,給了兩個方案,要么自己寫&…

        proxmox 解決docker容器MongoDB創建報錯MongoDB 5.0+ requires a CPU with AVX support

        目錄 最簡單直接的方式 測試MongoDB docker compose的安裝shell腳本 驗證訪問 最簡單直接的方式 讓虛擬機直接使用宿主機的物理 CPU 功能標志。 打開 Proxmox Web UI。 選擇你的 VM → 硬件 (Hardware) → CPU → 點擊 編輯 (Edit)。 將 CPU 類型改為 host。 確認并重啟…

        向前滾動累加SQL 實現思路

        一、業務背景在經營分析場景里,我們經常需要回答:“截至今天,過去 N 天/月/周累計發生了多少?”“把維度切到省、市、房型、項目經理、代理商等,結果又是什么?”本文用兩個真實需求做演示:以天為…

        Spring AI(14)——文本分塊優化

        RAG時,檢索效果的優劣,和文本的分塊的情況有很大關系。SpringAI中通過TokenTextSplitter對文本分塊。本文對SpringAI提供的TokenTextSplitter源碼進行了分析,并給出一些自己的想法,歡迎大家互相探討。查看了TokenTextSplitter的源…