haproxy代理

一.負載均衡

1.1.什么是負載均衡

負載均衡:Load Balance,簡稱LB,是一種服務或基于硬件設備等實現的高可用反向代理技術,負載均

衡將特定的業務(web服務、網絡流量等)分擔給指定的一個或多個后端特定的服務器或設備,從而提高了

公司業務的并發處理能力、保證了業務的高可用性、方便了業務后期的水平動態擴展

阿里云SLB介紹 :https://yq.aliyun.com/articles/1803

1.2.為什么用負載均衡

Web服務器的動態水平擴展-->對用戶無感知

增加業務并發訪問及處理能力-->解決單服務器瓶頸問題

節約公網IP地址-->降低IT支出成本

隱藏內部服務器IP-->提高內部服務器安全性

配置簡單-->固定格式的配置文件

功能豐富-->支持四層和七層,支持動態下線主機

性能較強-->并發數萬甚至數十萬

1.3.負載均衡類型

1.3.1硬件:

F5 美國F5網絡公司 https://f5.com/zh

Netscaler 美國思杰公司 https://www.citrix.com.cn/products/citrix-adc/、

Array 華耀 https://www.arraynetworks.com.cn/
AD-1000 深信服?深信服 - 讓每個用戶的數字化更簡單、更安全

1.3.2.四層負載均衡

1.通過ip+port決定負載均衡的去向。

2.對流量請求進行NAT處理,轉發至后臺服務器。

3.記錄tcp、udp流量分別是由哪臺服務器處理,后續該請求連接的流量都通過該服務器處理。

4.支持四層的軟件

lvs:重量級四層負載均衡器。

Nginx:輕量級四層負載均衡器,可緩存。(nginx四層是通過upstream模塊)

Haproxy:模擬四層轉發。

1.3.3.七層負載均衡

1.通過虛擬ur|或主機ip進行流量識別,根據應用層信息進行解析,決定是否需要進行負載均衡。

2.代理后臺服務器與客戶端建立連接,如nginx可代理前后端,與前端客戶端tcp連接,與后端服務器建立

tcp連接,

3.支持7層代理的軟件:

Nginx:基于http協議(nginx七層是通過proxy_pass)

Haproxy:七層代理,會話保持、標記、路徑轉移等。

1.3.4 四層和七層的區別

所謂的四到七層負載均衡,就是在對后臺的服務器進行負載均衡時,依據四層的信息或七層的信息來決定怎么樣轉發流量

四層的負載均衡,就是通過發布三層的IP地址(VIP),然后加四層的端口號,來決定哪些流量需要做負載均衡,對需要處理的流量進行NAT處理,轉發至后臺服務器,并記錄下這個TCP或者UDP的流量是由哪臺服務器處理的,后續這個連接的所有流量都同樣轉發到同一臺服務器處理

七層的負載均衡,就是在四層的基礎上(沒有四層是絕對不可能有七層的),再考慮應用層的特征,比如同一個Web服務器的負載均衡,除了根據VIP加80端口辨別是否需要處理的流量,還可根據七層的URL、瀏覽器類別、語言來決定是否要進行負載均衡。

1.分層位置:四層負載均衡在傳輸層及以下,七層負載均衡在應用層及以下

2.性能 :四層負載均衡架構無需解析報文消息內容,在網絡吞吐量與處理能力上較高:七層可支持解析應用

層報文消息內容,識別URL、Cookie、HTTP header等信息。、

3.原理 :四層負載均衡是基于ip+port;七層是基于虛擬的URL或主機IP等。

4.功能類比:四層負載均衡類似于路由器;七層類似于代理服務器。

5.安全性:四層負載均衡無法識別DDoS攻擊;七層可防御SYN Cookie/Flood攻擊

二.haproxy簡介

HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年使用C語言開發的一個開源軟件

是一款具備高并發(萬級以上)、高性能的TCP和HTTP負載均衡器

支持基于cookie的持久性,自動故障切換,支持正則表達式及web狀態統計

企業版網站:https://www.haproxy.com

社區版網站:http://www.haproxy.org

github:https://github.com/haprox

企業版本和社區版功能對比

三.haproxy的安裝和服務信息

3.1.實驗環境

功能 ? ? ? ? ? ? ? ? ? ?IP

Client ? ? ? ? ? ? ? ? eth0:172.,25.254.140

haproxy ? ? ? ? ? ? ? eth0:172.25.254.134

RS1 ? ? ? ? ? ? ? ? ? ? eth0:172.25.254.137

RS2 ? ? ? ? ? ? ? ? ? ? eth0:172.25.254.138

3.2.軟件安裝

軟件包下載地址

https://github.com/haproxy/wiki/wiki/Packages

安裝軟件包:

[root@haproxy ~]# dnf install haproxy -y

查看版本

[root@haproxy ~]# haproxy -v

關閉防火墻

[root@haproxy ~]# systemctl disable --now firewalld

haproxy軟件基本信息

3.3.haproxy的基本配置信息

官方文檔:http://cbonte.github.io/haproxy-dconv/

HAProxy 的配置文件haproxy.cfg由兩大部分組成,分別是:

global:全局配置段

進程及安全配置相關的參數

性能調整相關參數

Debug參數

proxies:代理配置段

defaults:為frontend, backend, listen提供默認配置

frontend:前端,相當于nginx中的server {}

backend:后端,相當于nginx中的upstream {}

listen:同時擁有前端和后端配置,配置簡單,生產推薦使用

RS1/2配置

訪問側式

環境搭建完成

1.3 線程與CPU核心綁定

原因

HAProxy默認以單線程模式運行,但現代版本支持多線程(通過nbthread參數配置)。線程綁定的核心目的和優勢包括:

性能優化:將線程綁定到特定CPU核心(通過cpu-map配置),減少上下文切換開銷,提升緩存命中率,尤其在高并發場景下顯著降低延遲。

資源隔離:避免線程在不同核心間遷移導致的性能波動,確保關鍵流量處理的穩定性。

NUMA架構適配:在多處理器NUMA系統中,綁定線程到本地內存節點可減少跨節點訪問延遲。

通過配置nbproc和cpu-map實現進程與CPU核心的綁定。

global

? ? nbthread 4 ?# 啟用4個工作線程

? ? cpu-map 1 0 ?# 線程1綁定到CPU核心0

? ? cpu-map 2 1 ?# 線程2綁定到CPU核心1

? ? cpu-map 3 2 ?# 線程3綁定到CPU核心2

cpu-map 4 3 ?# 線程4綁定到CPU核心3

綁定后減少線程跨核心切換的開銷,提升處理效率,適用于高并發場景

#添加多線程

1.vim /etc/haproxy/haproxy.cfg

2.修改完重啟文件件?systemctl restart haproxy

進程會在下面多n個

2.通過文件配置具體內容

2.1前端(Frontend)監聽

Haproxy配置前端監聽特定端口(如80或443),接收客戶端請求。前端定義訪問控制、SSL證書等參數

每次修改完文件后都要重啟服務systemctl restart haproxy

負載均衡算法的具體配置

靜態負載均衡算法

采用“慢更新”策略:先給一點點訪問壓力,當沒問題后在給一部分

服務器加入時逐步增加負載,但權重固定不可動態調整。

適用場景:服務器性能差異小且負載穩定。

缺點:靈活性低,無法適應突發流量或服務器性能變化。

動態負載均衡算法

roundrobin(輪詢)

根據權重比例分配請求,結合實時LVS負載計算最優目標服務器,誰的值小就給誰

  • 支持動態權重調整(無需重啟)。
  • 適用場景:服務器性能差異大或負載波動頻繁。

文件配置:

先將這部分全部注釋掉

然后添加?roundrobin(輪詢)配置

測試訪問是否是輪詢、

leastconn(最小連接數)

優先分配請求給當前連接數最少的服務器,權重高的服務器在連接數相近時優先。

支持動態權重調整。

適用場景:長連接服務(如數據庫)。

重啟之后訪問測試

第二種修改權重的方法:

source(源地址哈希)

根據客戶端IP哈希固定分配請求到同一服務器。

優點:會話保持。

缺點:服務器故障時影響所有關聯客戶端。

重啟,訪問

發現鏈接只打在一臺主機上

map-base(取模)

總結:對主機標識取模分配請求,服務器故障需全局重新計算。

主機有數字,該數字除以服務器的個數然后取余,余數跟對應的服務器建立鏈接,掛了一臺服務器算法就得重新計算鏈接

如果有一臺主機(服務器)掛科了,所有主機都要重新建立VIP

適用場景:服務器數量固定且故障率低。

這個可以和其他算法共存

一致性hash

一致性哈希,當服務器的總權重發生變化時,對調度結果影響是局部的,不會引起大的變動hash(o) mod n

該hash算法是動態的,支持使用 socat等工具進行在線權重調整,支持慢啟動

算法:

1、后端服務器哈希環點keyA=hash(后端服務器虛擬ip)%(2^32)

2、客戶機哈希環點key1=hash(client_ip)%(2^32) 得到的值在[0---4294967295]之間

3、將keyA和key1都放在hash環上,將用戶請求調度到離key1最近的keyA對應的后端服務器

hash環偏斜問題

增加虛擬服務器IP數量,比如:一個后端服務器根據權重為1生成1000個虛擬IP,再hash。而后端服務器權 重為2則生成2000的虛擬IP,再bash,最終在hash環上生成3000個節點,從而解決hash環偏斜問題

hash對象

Hash對象到后端服務器的映射關系:

一致性hash示意圖

后端服務器在線與離線的調度方式

URI哈希

基于請求URI哈希分配,相同URI指向同一服務器。

僅支持HTTP模式(mode http)。

適用場景:靜態資源緩存優化。

此時可以通過VIP訪問兩個服務器對應的index

url_param(URL參數哈希)

根據指定URL參數(如user_id)哈希分配請求。

適用場景:需按業務參數保持會話一致性。

重啟服務

訪問出現的都是同一個

hdr(User-Agent)(用戶代理哈希)

根據請求頭中的User-Agent分配請求。

適用場景:針對不同客戶端類型差異化處理。

現在我們訪問的都是同一個頁面

指定瀏覽器,就可以保證訪問該瀏覽器時出現固定的頁面

Cookie會話保持

通過cookie或stick-table實現會話粘滯,確保用戶請求始終指向同一后端服務器。

適用場景:登錄態等強會話依賴服務。

backend web_backend

? balance roundrobin

? cookie SERVERID insert nocache

? server server1 192.168.1.10:80 cookie s1 check

? server server2 192.168.1.11:80 cookie s2 check

bash

動態權重調整

# 動態修改服務器權重(需啟用stats socket)

echo "set server backend/server1 weight 50" | sudo socat stdio /var/run/haproxy.sock

動態配置與ACL規則

使用ACL(訪問控制列表)實現高級路由,例如按路徑、域名或Header分流。

frontend web_front

? bind *:80

? acl path_blog path_beg /blog

? use_backend blog_backend if path_blog

? default_backend web_backend

以上算法可根據實際業務需求組合使用,例如:

電商場景:source + Cookie保證會話一致性。

CDN加速:URI哈希提升緩存命中率。
?

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

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

相關文章

【面試】軟件測試面試題

1. 測試用例如何編寫 2. bug的生命周期 項目有多少人?多少條測試用例?多少bug?自己發現的第一條?(是不是bug) 3. 缺陷管理工具 包括Jira, PingCode, 禪道,BugZilla,Redmine, TAPD&am…

HbuilderX開發小程序

1.打卡HbuilderX,選擇文件—新建—項目2.創建項目3.在HbuilderX中運行前要確定微信開發這工具的服務端口號是打開的4.HbuilderX中點擊預覽可以實時預覽5.在微信開發者中進行本地測試點擊后自動跳轉到微信開發者工具中運行項目

Netty中FastThreadLocal解讀

io.netty.util.concurrent.FastThreadLocal 是 Netty 中提供的高性能線程局部存儲(Thread-Local Storage)實現,位于 io.netty.util.concurrent 包。它是 Java 標準庫 ThreadLocal 的替代品,旨在優化性能,減少內存分配和…

上海迪士尼游玩攻略 小鐵寄存柜讓你輕松暢玩

去上海迪士尼玩最煩帶一堆行李,其實有小鐵寄存柜幫忙就能輕裝上陣,各個關鍵位置都有分布,玩起來特別省心。?剛到迪士尼的時候,要是坐地鐵到上海國際旅游度假區站,1/2 號口安檢區就有小鐵柜,行李箱、大背包…

飛算科技重磅出品:飛算 JavaAI 重構 Java 開發效率新標桿

在 Java 開發領域,一款由國家級高新技術企業自主研發的智能工具正引發行業關注 —— 飛算 JavaAI 不僅承載著中國原創技術的創新基因,更以貼合實際開發場景的功能設計,成為眾多企業提升 Java 開發效率的核心助力。?作為飛算數智科技&#xf…

python案例:基于python 神經網絡cnn和LDA主題分析的旅游景點滿意度分析

1.緒論1.1研究背景與意義1.1.1研究背景隨著旅游業的快速發展,滿意度分析成為評估旅游景點質量和提升游客體驗的重要手段。作為中國的旅游城市之一,其旅游景點吸引了大量游客。然而,如何科學評估和提升旅游景點的滿意度&#xff0c…

Git快速入門,完整的git項目管理工具教程,git入門到精通!

Git的下載與安裝: 直接去官網下載即可; 或者查看這個博客學會下載:Git 詳細安裝教程(詳解 Git 安裝過程的每一個步驟)_git安裝-CSDN博客 注意:一個文件夾下只能有一個本地倉庫(就是一個.git) 細節操作

C++day07(三種取整方法)

學習目標 認識流程圖 多種方式解決問題 取整方式和取整函數 1.解決編程問題的過程 1.理解題意,找出關鍵信息。 2.整理思路,用圖或者文字寫出算法。 3.將算法步驟翻譯為C++代碼。 4.編譯運行,修改語法或邏輯錯誤。 不符合則需要回到上一步進行修改。 5 .輸入測試用例與…

Go語言實戰案例-LRU緩存機制模擬

在高性能服務開發中,緩存是提升訪問速度和減少后端負載的重要手段。常見的緩存淘汰策略中,**LRU(Least Recently Used,最近最少使用)**是應用最廣的一種。本篇我們用Go語言手寫一個LRU緩存機制的模擬實現。一、LRU緩存…

vue2中實現leader-line-vue連線文章對應字符

效果展示 通過點擊右邊的tag,觸發連接操作 第一步:獲取右邊tag展示 1.右邊的tag列表展示,我這邊是分為兩個list嵌套的數據結構; {"人員": [{

SPEA2(Strength Pareto Evolutionary Algorithm 2)優化算法簡介

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

IDEA 手動下載安裝數據庫驅動,IDEA無法下載數據庫驅動問題解決方案,IDEA無法連接數據庫解決方案(通用,Oracle為例)

一、查詢要下載的數據庫驅動 在IDEA側邊欄找到數據庫(databases),新增一個數據連接 右鍵,屬性 點擊下載,查看要下載的驅動版本 二、下載數據庫驅動(Oracle為例) 下載對應MySQL/Oracle數據庫的…

專業Python爬蟲實戰教程:逆向加密接口與驗證碼突破完整案例

案例背景假設我們需要爬取一家內部測試系統的動態數據API接口。該系統前端頁面使用了復雜的JavaScript混淆技術來防止接口被直接調用,同時對請求參數進行了加密簽名。另外,登錄環節帶有圖形驗證碼用于防護。我們的目標是:分析JavaScript代碼&…

【SQL】Windows MySQL 服務查詢啟動停止自啟動(保姆級)

MySQL是一種開放源代碼的輕量級關系型數據庫管理系統,使用最常用的結構化查詢語言(SQL)對數據庫進行管理。由于MySQL具有體積小、速度快、成本低、開放源碼等優點,現已被廣泛應用于互聯網上的中小型網站中,并且大型網站…

算法提升之數論(矩陣+快速冪)

通過矩陣和快速冪的方法來解決算法題目可以很好地降低時間復雜度,幫助大家更好地解決題目。下面這道題目有一定難度,希望大家可以好好地理解,相信對大家會有很大的幫助。問題描述有 n(2≤n≤10) 個玩家玩游戲,他們按 1 到 n 編號。…

數學建模算法-day[14]

6.2 傳染病預測問題 問題提出 世界上存在很多傳染病,如何根據其傳播機理預測疾病得傳染范圍及染病人數等,對傳染病的控制意義十分重大。 1.指數傳播模型 基本假設 (1) 所研究的區域是一封閉區域,在一個時期內人口總量相對穩定,不考…

Linux救援模式之簡介篇

什么是救援模式?救援模式提供了一個最小的Linux環境,通常只加載最基本的系統組件,允許管理員:修復損壞的系統恢復丟失的文件修改配置文件重置密碼檢查磁盤錯誤重新安裝引導加載程序如何進入救援模式?1. 通過GRUB菜單進…

C++20實戰FlamingoIM開發

C++20 與 Flamingo IM 實例 C++20 引入了許多新特性,如概念(Concepts)、協程(Coroutines)、范圍(Ranges)等。Flamingo IM 是一個即時通訊項目,結合 C++20 的特性可以提升代碼的可讀性和性能。以下是基于 C++20 和 Flamingo IM 的實例。 協程實現異步網絡通信 使用 C…

FPGA實現SRIO高速接口與DSP交互,FPGA+DSP異構方案,提供3套工程源碼和技術支持

目錄1、前言:SRIO在FPGADSP架構中的作用工程概述免責聲明2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的FPGADSP異構方案我這里已有的 GT 高速接口解決方案3、工程詳細設計方案工程設計原理框圖FPGA端工程源碼FPGA端SRIO從…

記一次導出pdf表單引發的問題

需求:點擊按鈕,將相關內容生成pdf下載下來問題1:之前項目封裝好的下載文件方法不攜帶token 我嘗試新寫了一個方法,攜帶token問題2:此時出現了跨域問題 我分別嘗試在controller類上和方法上加CrossOrigin(origins “*”…