haproxy 算法

一、靜態算法

按照事先定義好的規則輪詢公平調度,不關心后端服務器的當前負載、連接數和響應速度 等,且無法實時修改權重(只能為0和1,不支持其它值),只能靠重啟HAProxy生效。(不管后端死活)

1.1、static-rr:基于權重的輪詢調度

不支持運行時利用socat進行權重的動態調整(只支持0和1,不支持其它值)

不支持端服務器慢啟動

其后端主機數量沒有限制,相當于LVS中的 wrr

**慢啟動**是指在服務器剛剛啟動上不會把他所應該承擔的訪問壓力全部給它,而是先給一部分,當沒 問題后在給一部分


listen webserverbind        *:80mode        http
#   balance     roundrobinbalance     static-rrserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 1server sorry 192.168.217.100:8080 backup

效果

1.2、first

根據服務器在列表中的位置,自上而下進行調度

其只會當第一臺服務器的連接數達到上限,新請求才會分配給下一臺服務

其會忽略服務器的權重設置

不支持用socat進行動態修改權重,可以設置01,可以設置其它值但無效


listen webserverbind        *:80mode        httpbalance     firstserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 1server sorry 192.168.217.100:8080 backup

權重RS2是3一般會一點給,但first會忽略權重,讓寫在前面的RS1得到的請求更多,要等RS1連接上限了才會分配給其他

二、動態算法

基于后端服務器狀態進行調度適當調整,

新請求將優先調度至當前負載較低的服務器

權重可以在haproxy運行時動態調整無需重啟

2.1、roundrobin

1. 基于權重的輪詢動態調度算法,
2. 支持權重的運行時調整,不同于lvs中的rr輪訓模式,
3. HAProxy中的roundrobin支持慢啟動(新加的服務器會逐漸增加轉發數)
4. 其每個后端backend中最多支持4095real server
5. 支持對real server權重動態調整,
6. roundrobin為默認調度算法,此算法使用廣泛

listen webserverbind        *:80mode        httpbalance     roundrobinserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backup

2.2、leastconn

加權的最少連接的動態

支持權重的運行時調整和慢啟動,即:根據當前連接最少的后端服務器而非權重進行優先調度(新客戶端連接)
比較適合長連接的場景使用,比如:MySQL等場景。

listen webserverbind        *:80mode        httpbalance     leastconnserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backup

三、其他算法

其它算法即可作為靜態算法,又可以通過選項成為動態算法
3.1、source?
源地址hash,基于用戶源地址hash并將請求轉發到后端服務器,后續同一個源地址請求將被轉發至同一 個后端web服務器。此方式當后端服務器數據量發生變化時,會導致很多用戶的請求轉發至新的后端服 務器,默認為靜態方式,但是可以通過hash-type支持的選項更改這個算法一般是在不插入CookieTCP 模式下使用,也可給拒絕會話cookie的客戶提供最好的會話粘性,適用于session會話保持但不支持 cookie和緩存的場景源地址有兩種轉發客戶端請求到后端服務器的服務器選取計算方式,分別是取模法 和一致性hash
缺陷:
如果訪問客戶端時一個家庭,那么所有的家庭的訪問流量都會被定向到一臺服務器。

listen webserverbind        *:80mode        httpbalance     sourceserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backup

3.2、map-basse取模法
source地址進行hash計算,再基于服務器總權重的取模,最終結果決定將此請 求轉發至對應的后端服務器。
是靜態算法,不支持在線調整權重和慢啟動。可實現對后端服務器均衡調度
缺點是當服務器的總權重發生變化時,即有服務器上線或下線,都會因總權重發生變化而導致調度結果整體改變。
取模就是計算兩個數相除之后的余數
比如當源hash值時111111121113,三臺服務器a b c的權重均為1
abc的調度標簽分別會被設定為 0 1 21111%3=11112%3=21113%3=0
1111 ----- > nodeb
1112 ------> nodec
1113 ------> nodea
如果a下線后,權重數量發生變化
1111%2=11112%2=01113%2=1
11121113被調度到的主機都發生變化,這樣會導致會話丟失
?3.3、一致性hash

一致性哈希算法的核心思想是將哈希值空間組織成一個虛擬的環形空間(通常稱為一致性哈希環),并按照哈希值的大小順序將節點和數據映射到這個環上。

算法:

  • 后端服務器哈希環點keyA=hash(后端服務器虛擬ip)%(2^32)
  • 客戶機哈希環點key1=hash(client_ip)%(2^32) 得到的值在[0---4294967295]之間
  • keyAkey1都放在hash環上,將用戶請求調度到離key1最近的keyA對應的后端服務器
  • 節點的增加:新節點加入時,只需將其哈希值映射到環上,并將環上部分數據重新分配到新節點。

  • 節點的減少:節點移除時,只需將該節點上的數據重新分配到其順時針方向的下一個節點。

當某一臺后端服務器下線后,就是節點移除了,就只需要將該電商的數據重新分配到其順時針方向的下一個節點。如圖中當keyB下線了,其附近的key2和key4就會按照順時針去到keyC節點上。

一致性hash配置


listen webserverbind        *:80mode        httpbalance     sourcehash-type   consistentserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backup
3.4、uri算法
3.4.1、uri算法
  • HAProxy 對請求的 URI 進行哈希計算,生成一個哈希值。根據哈希值對后端服務器的總權重取模,將請求分配到特定的后端服務器

  • 默認是靜態算法,也可以通過hash-type指定map-basedconsistent,來定義使用取模法還是一致性 hash

注意

  • URI 的范圍:uri 算法可以基于 URI 的路徑部分或整個 URI(包括查詢字符串)進行哈希計算。

  • <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
    左半部分:/<path>;<params>
    整個uri/<path>;<params>?<query>#<frag>
  • 僅支持 HTTP 模式:uri 算法僅適用于 HTTP 模式(mode http),不支持 TCP 模式。

  • 動態調整:使用一致性哈希算法時,后端服務器的增減對請求分配的影響較小

測試

3.4.2、url-param算法
#假設:
url = http://www.timinglee.com/foo/bar/index.php?key=value
#則:
host = "www.timinglee.com"
url_param = "key=value

核心原理

  • 提取請求 URL 中指定的查詢參數(如 ?user=123 中的 user)。

  • 對該參數的值進行哈希計算(支持一致性哈希)。

  • 根據哈希值與后端服務器權重取模,決定請求路由到哪臺服務器。

  • 相同參數值始終路由到同一臺服務器(會話保持效果)。

url_param配置示例
listen webserverbind        *:80mode        httpbalance     url_param nameserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backupurl_param一致性hash配置示例
listen webserverbind        *:80mode        httpbalance     url-paramhash-type   consistentserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 3server sorry 192.168.217.100:8080 backup
[root@clietn ~]# curl 192.168.217.100/index.html?name=timinglee
RS1 192.168.217.10 index3
[root@clietn ~]# curl 192.168.217.100/index.html?name=timinglee
RS1 192.168.217.10 index3
[root@clietn ~]# curl 192.168.217.100/index.html?name=lee
RS1 192.168.217.20 index3
[root@clietn ~]# curl 192.168.217.100/index.html?name=lee
RS1 192.168.217.20 index3
3.5 hdr

HAProxy 中的 hdr 算法 是一種基于 HTTP 請求頭部字段值 進行哈希計算的負載均衡算法,適用于 HTTP 模式(mode http),常用于實現基于特定頭部(如 User-AgentAuthorizationX-Forwarded-For 等)的會話保持或流量分發。

配置

hdr取模算法
listen webserverbind        *:80mode        httpbalance     hdr(User-Agent)hash-type   consistentserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 1server sorry 192.168.217.100:8080 backuphdr一致性hash算法
listen webserverbind        *:80mode        httpbalance     hdr(User-Agent)hash-type   consistentserver web1 192.168.217.10:80 check inter 3s fall 5 rise 3 weight 1server web2 192.168.217.20:80 check inter 3s fall 5 rise 3 weight 1server sorry 192.168.217.100:8080 backup

測試

[root@client ~]# curl -vA "firefox" 172.25.254.100
[root@client ~]# curl -vA "sougou" 172.25.254.100-v:啟用詳細模式(verbose),會顯示請求頭、響應頭、連接過程等調試信息。
-A "firefox":設置 User-Agent 為 "firefox"
172.25.254.100:請求的目標地址(默認使用 http:// 協議,端口 80)。

算法總結

算法關鍵字適用模式調度依據會話保持一致性哈希典型使用場景備注說明
roundrobinhttp/tcp輪詢 + 權重通用無狀態服務默認算法
static-rrhttp/tcp靜態權重輪詢后端節點固定、無故障摘除不重新分發
leastconnhttp/tcp當前連接數最少長連接/數據庫/SSH動態權重
firsthttp/tcp按服務器順序填滿短連接批處理任務先滿后用
sourcehttp/tcp客戶端源 IP 哈希會話保持、內網 NAT 出口需 hash-type consistent
urihttp完整 URI 哈希(路徑+參數)CDN、緩存、靜態資源需 hash-type consistent
url_param <name>http指定查詢參數值哈希API 分流、AB 測試需 hash-type consistent
hdr(<name>)http指定請求頭值哈希按 User-Agent、Token、Region 分流需 hash-type consistent

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

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

相關文章

Go 的第一類對象與閉包

1. Go 的第一類對象&#xff08;First-Class Citizens&#xff09; 什么是第一類對象&#xff1f; 第一類對象是指能夠像 普通值 一樣使用的對象&#xff0c;通常可以賦值給變量、傳遞給函數、作為函數返回值等。在很多編程語言中&#xff0c;函數本身不被視為第一類對象&#…

深度分析Android多線程編程

理解并正確運用多線程是構建高性能、流暢、響應迅速的 Android 應用的關鍵&#xff0c;但也充滿挑戰和陷阱。 核心挑戰&#xff1a;UI 線程&#xff08;主線程&#xff09;的限制 唯一性&#xff1a; Android 應用只有一個主線程&#xff0c;負責處理所有用戶交互&#xff08;觸…

uniapp在app中關于解決輸入框鍵盤彈出后遮住輸入框問題

問題描述&#xff1a; uniapp的app中&#xff0c;當表單頁面過長時&#xff0c;點擊下方的輸入框時&#xff0c;彈出鍵盤后會把輸入框給擋住&#xff0c;導致看不到輸入內容。 解決方案&#xff1a; 在page.json中&#xff0c;找到此頁面的配置&#xff0c;加上style中的softin…

二分查找----5.尋找旋轉排序數組中的最小值

題目鏈接 /** 數組在某處進行旋轉,分割為兩個獨立的遞增區間,找出數組的最小值;特殊情況:若旋轉次數是數組長度的倍數,則數組不變 特點: 常規情況: 數組被分割為兩個獨立的子區間,左半區的最小值大于右半區的最大值 依據數組長度,mid可能落在左半區也有可能落在右半區,最小值在…

Eureka-服務注冊,服務發現

在遠程調用的時候&#xff0c;我們寫的url是寫死的。 String url "<http://127.0.0.1:9090/product/>" orderInfo.getProductId();當換個機器&#xff0c;或者新增個機器&#xff0c;導致ip變換&#xff0c;從而使得 url 發生了變化&#xff0c;接著就需要去…

ubuntu24的一些小問題

截圖Keyboard -> Keyboard Shortcus -> View and customize Shortcus如上&#xff0c;可以修改默認的快捷按鍵。比如截圖按鍵可以修改。 ibus輸入法無法&#xff0c;輸入V異常問題 也是困擾了很久&#xff0c;發現是這樣的&#xff1a;https://github.com/libpinyin/ibus…

Python Locust庫詳解:從入門到分布式壓力測試實戰

一、Locust核心優勢 作為一款基于Python的開源負載測試工具&#xff0c;Locust通過協程架構實現了高效資源利用。其獨特優勢體現在&#xff1a; 純Python腳本&#xff1a;用熟悉的語言定義用戶行為&#xff0c;支持條件判斷和復雜邏輯分布式擴展&#xff1a;單節點支持數千并發…

Redis數據類型與內部編碼

在Redis中通常普遍認為&#xff0c;使用redis的能進行查詢&#xff0c;插入&#xff0c;刪除&#xff0c;修改操作都是O(1)是因為他是利用hash表實現的&#xff0c;但是&#xff0c;背后的實現不一定是一個標準的hash表&#xff0c;它內部的數據類型還會有變數&#xff0c;不過…

03-netty基礎-多路復用select、poll、epoll

1 什么是多路復用多路復用&#xff08;Multiplexing&#xff09; 是一種讓單個線程同時處理多個 I/O 通道的技術&#xff0c;核心是通過系統調用將 I/O 狀態查詢的工作交給操作系統內核&#xff0c;應用程序只需等待內核通知哪些通道就緒。多路&#xff1a;指的是多個socket網絡…

網易大模型算法面經總結第一篇

網友一 MHA的原理&#xff0c;是如何進行加速的&#xff0c;用的什么框架推理。 回答&#xff1a; ①先答一下什么是MHA&#xff1a;Multi-Head Attention&#xff08;MHA&#xff09;是 Transformer 的核心機制&#xff0c;并行地關注輸入序列中不同位置的多種信息 ②回答MHA的…

Vue3 面試題及詳細答案120道(91-105 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

SAP-MM-物料進銷存表

ABAP庫存進銷存報表程序摘要 該ABAP程序是一個完整的庫存進銷存報表系統,主要功能包括: 報表類型選擇: 物料庫存進銷存 批次庫存進銷存 寄售庫存進銷存 供應商庫存進銷存 原料庫存進銷存 主要功能: 從歷史數據表(MARDH, MSKAH, MSLBH, MCHBH等)獲取期初庫存 處理物料移動數…

這幾天都是發癲寫的

#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> #include <cmath> // for sqrt// Gen-Sort 實現&#xff08;保持不變&#xff09; void genSort(std::vector<int>& arr) {if (arr.empty()) r…

QT6 源,七章對話框與多窗體(11) 進度對話框 QProgressDialog:屬性,公共成員函數,槽函數,信號函數,與源代碼帶注釋

&#xff08;1&#xff09; 本類的繼承關系 &#xff1a;可見&#xff0c;進度對話框&#xff0c;也是 QDialog 的子類&#xff0c;在其上面又擺放了一些控件&#xff0c;構成了不同用途的對話框。咱們也可以自定義對話框。只是沒有 QT 官方大師們做的好。 人家在定義這 6 個子…

學習游戲制作記錄(技能系統)7.24

1.技能系統概念首先讓我們了解一下游戲的技能本質是什么&#xff0c;以投擲劍為例子&#xff0c;當玩家使用這個技能時&#xff0c;首先會播放玩家的動畫&#xff0c;隨后通過技能腳本創建一個劍的對象&#xff0c;當劍回收時會再次調用腳本&#xff0c;讓它朝向玩家飛來并銷毀…

外部存檔(External Archive)機制

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

MybatisPlus操作方法詳細總結

摘要&#xff1a;本文圍繞 MyBatis-Plus 數據操作展開&#xff0c;涵蓋標準數據層 CRUD 與分頁查詢&#xff1b;以及各種的復雜 SQL 查詢&#xff1b;映射匹配&#xff08;TableField、TableName 注解&#xff09;與 ID 生成策略&#xff08;TableId 五種類型及全局配置&#x…

【C語言進階】動態內存管理的面試題||練習

本節內容專門整理了一些動態內存管理的面試題&#xff0c;配有詳細的解答。 目錄 1. 看代碼說結果 2. 看代碼說結果 3. 看代碼說結果 4.小樂樂與歐幾里得 描述 分析1&#xff1a; 分析2&#xff1a; 代碼&#xff1a; 5. 空心正方形 分析&#xff1a; 1. 看代碼說結…

【圖論】倍增與lca

void dfs(long u,long father){ dep[u]dep[father]1;//只在這里初始化depfor(long i1;(1<<i)<dep[u];i)fa[u][i]fa[fa[u][i-1]][i-1];//只這里用的倍增for(long ihead[u];~i;iedge[i].next){long vedge[i].to;if(vfather)continue;fa[v][0]u;dfs(v,u); }} long lca(lo…

VS Code 美化插件

目錄1. Better Comments 更好的注釋2. indent-rainbow 彩虹的縮進3. Trailing Spaces 尾隨的空格4. Gruvbox Material 護眼的材質5. Md Editor 博客編輯器6. 待補充推薦筆記&#xff1a;VS Code寫代碼必備的五款代碼美化插件 1. Better Comments 更好的注釋 Better Comments Be…