haproxy七層均衡

.haproxy的安裝和服務信息

1.1實驗環境

ip實驗設備
172.25.254.100haproxy
172.25.254.10RS1
172.25.254.20

RS2

172.25.254.111

client

1.2軟件安裝及配置

haproxy主機上配置

#下載

#進入此文件進行編輯

#關閉防火墻

RS1主機上配置

#下載

#生成默認文件

#重啟

#關閉防火墻

RS2主機上配置

?#下載

#生成默認文件

#重啟

#關閉防火墻

client主機上配置

#測試

1.3haproxy的基本配置信息

官方文檔:http://cbonte.github.io/haproxy-dconv/ HAProxy 的配置文件

haproxy.cfg由兩大部分組成,分別是:

global:全局配置段

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

性能調整相關參數

Debug參數

proxies:代理配置段

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

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

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

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

#查看haproxy多進程或多線程的信息

1.3.1global配值

global配置參數說明

#查看haproxy多進程或多線程的信息

#進入該文件進行編輯

#注意

#每次修改完配置文件進行重啟

#多進程模式下(nbproc)

#多線程模式下(nbthread)

1.3.2 proxies配置

1.3.2.1 proxies參數說明?proxies
參數類型作用
defaults
proxies
默認配置項,針對以下的frontendbackendlisten生效,可以多個
name也可以沒有name
frontend
proxies
前端servername,類似于Nginx的一個虛擬主機 serverLVS服務集
群。
backend
proxies
后端服務器組,等于nginxupstreamLVS中的RS服務器
listen
proxies
frontendbackend合并在一起配置,相對于frontendbackend
配置更簡潔,生產常用

1.3.2.2??Proxies配置-defaults

參數如下

1.3.3.3??Proxies配置-frontend

frontend 配置參數:

bind:指定HAProxy的監聽地址,可以是IPV4IPV6,可以同時監聽多個IP或端口,可同時用于listen字段中

#格式: bind [<address>]:<port_range> [, ...] [param*]

1.3.3.4??Proxies配置-backend

參數解釋如圖所示

server配置

實驗示例:

#測試效果

1.3.3.5??Proxies配置-listen 簡化配置

使用listen替換 frontendbackend的配置方式,可以簡化設置,通常只用于TCP協議的應用

實驗示例:

#測試

1.4?socat 工具

???????對服務器動態權重和其它狀態可以利用 socat工具進行調整,Socat Linux 下的一個多功能
的網絡工具,名字來由是Socket CAT,相當于netCAT的增強版.Socat 的主要特點就是在兩個數據流之間建立雙向通道,且支持眾多協議和鏈接方式。如 IPTCP UDPIPv6Socket文件等、
#下載
#修改配置文件
#查看haproxy狀態
#查看集群狀態
#設置權重
兩種方式
#在配置文件里面設置權重
#用非交互形式設置權重
#查看集群權重
#下線和上線后端服務器
#下線后端服務器
#上線后端服務器
針對多進程處理方法
如果開啟多進程那么我們在對進程的sock文件進行操作時其對進程的操作時隨機的
如果需要指定操作進程那么需要用多soct文件方式來完成
實驗示例:
#測試

二.haproxy的算法

HAProxy通過固定參數 balance 指明對后端服務器的調度算法

balance參數可以配置在listenbackend選項中。

HAProxy的調度算法分為靜態和動態調度算法

有些算法可以根據參數在靜態和動態算法中相互轉換。

2.1 靜態算法

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

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

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

不支持端服務器慢啟動

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

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

實驗示例:

2.1.2 first

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

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

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

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

實驗示例:

?
#測試

2.2 動態算法

動態算法

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

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

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

2.2.1 roundrobin

1. 基于權重的輪詢動態調度算法,

2. 支持權重的運行時調整,不同于lvs中的rr輪訓模式,

3. HAProxy中的roundrobin支持慢啟動(新加的服務器會逐漸增加轉發數)

4. 其每個后端backend中最多支持4095real server

5. 支持對real server權重動態調整,

6. roundrobin為默認調度算法,此算法使用廣泛

實驗示例

2.2.2 leastconn

leastconn加權的最少連接的動態

支持權重的運行時調整和慢啟動,即:根據當前連接最少的后端服務器而非權重進行優先調度(新客戶端連接)

比較適合長連接的場景使用,比如:MySQL等場景。

?

#測試

2.3 其他算法

其它算法即可作為靜態算法,又可以通過選項成為動態算法

2.3.1 source

????????源地址hash,基于用戶源地址hash并將請求轉發到后端服務器,后續同一個源地址請求將被轉發至同一個后端web服務器。此方式當后端服務器數據量發生變化時,會導致很多用戶的請求轉發至新的后端服務器,默認為靜態方式,但是可以通過hash-type支持的選項更改這個算法一般是在不插入CookieTCP模式下使用,也可給拒絕會話cookie的客戶提供最好的會話粘性,適用于session會話保持但不支持cookie和緩存的場景源地址有兩種轉發客戶端請求到后端服務器的服務器選取計算方式,分別是取模法 和一致性hash

2.3.1.1?map-base 取模法(靜態)

map-based:取模法,對source地址進行hash計算,再基于服務器總權重的取模,最終結果決定將此請求轉發至對應的后端服務器。

此方法是靜態的,即不支持在線調整權重,不支持慢啟動,可實現對后端服務器均衡調度

缺點是當服務器的總權重發生變化時,即有服務器上線或下線,都會因總權重發生變化而導致調度結果整體改變hash-type 指定的默值為此算法

取模法配置示例:

#測試

2.3.1.2 一致性hash

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

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

算法:

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

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

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

hash環偏斜問題

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

一致性hash配置示例:

#測試(注意這個結果雖然一樣,但已經轉為動態算法)

2.3.2 uri

基于對用戶請求的URI的左半部分或整個urihash,再將hash結果對總權重進行取模后

根據最終結果將請求轉發到后端指定服務器

適用于后端是緩存服務器場景

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

注意:此算法基于應用層,所以只支持 mode http ,不支持 mode tcp

2.3.2.1 uri 取模法配置示例

#在RS2或者RS1添加這兩個

2.3.2.2 uri 一致性hash配置示例

#測試

訪問不同index

2.3.3 url_param

url_param對用戶請求的url中的 params 部分中的一個參數key對應的value值作hash計算,并由服務器總權重相除以后派發至某挑出的服務器,后端搜索同一個數據會被調度到同一個服務器,多用與電商.

通常用于追蹤用戶,以確保來自同一個用戶的請求始終發往同一個real server

如果無沒key,將按roundrobin算法

2.3.3.1 url_param取模法配置示例

2.3.3.2 url_param一致性hash配置示例

?#在RS2或者RS1添加這兩個

#測試

2.3.4 hdr

針對用戶每個http頭部(header)請求中的指定信息做hash

此處由 name 指定的http首部將會被取出并做hash計算,

然后由服務器總權重取模以后派發至某挑出的服務器,如果無有效值,則會使用默認的輪詢調度。

2.3.4.1 hdr取模法配置示例

2.3.4.2 一致性hash配置示例#測試

2.3.5?算法總結

#靜態

static-rr--------->tcp/http

first------------->tcp/http

#動態

roundrobin-------->tcp/http

leastconn--------->tcp/http

random------------>tcp/http

#以下靜態和動態取決于hash_type是否consistent

source------------>tcp/http

Uri--------------->http

url_param--------->http

hdr--------------->http

2.3.6?各算法使用場景

first ????????????????????????????????????#使用較少

static-rr? ? ? ? ? ? ? ? ? ????????????#做了session共享的web集群

roundrobin

random

leastconn? ? ? ? ? ? ? ? ? ? ? ? ?#數據庫

source? ? ? ? ? ? ? ? ? ???????????#基于客戶端公網IP的會話保持

Uri--------------->http???????? #緩存服務器,CDN服務商,藍汛、百度、阿里云、騰訊

url_param--------->http? ? #可以實現session保持

hdr? ? ? ? ? ? ? ? ? ? ? ? ·? ? ? ? ??#基于客戶端請求報文頭部做下一步處理

三.高級功能及配置

3.1 基于cookie的會話保持

cookie value:為當前server指定cookie值,實現基于cookie的會話黏性,相對于基于 source 地址hash調度算法對客戶端的粒度更精準,但同時也加大了haproxy負載,目前此模式使用較少, 已經被session共享服務器代替

注意:不支持 tcp mode,使用 http mode

3.1.1 配置選項

cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle <idle> ][ maxlife ]

name#cookie key名稱,用于實現持久連接

insert#插入新的cookie,默認不插入cookie

indirect#如果客戶端已經有cookie,則不會再發送cookie信息

nocache#clienthapoxy之間有緩存服務器(如:CDN)時,不允許中間緩存器緩存

cookie,因為這會導致很多經過同一個CDN的請求都發送到同一臺后端服務器

3.1.2?配置示例

3.1.3 驗證cookie信息

#也可以這樣

#curl訪問時指定cookie

#也可以這樣

3.2 HAProxy狀態頁

通過web界面,顯示當前HAProxy的運行狀態

3.2.1 狀態頁配置項

3.2.2 啟用狀態頁

#進入配置文件編輯

#測試

#瀏覽器

#自動刷新狀態頁

#測試

3.3 IP透傳

web服務器中需要記錄客戶端的真實IP地址,用于做訪問統計、安全防護、行為分析、區域排行等場景。

3.3.2四層IP透傳

實驗示例:

#在RS1和RS2上

?

?

#測試

#現在haproxy主機上訪問一下

#然后再RS2或者RS2上查看日志

3.3.3 七層IP透傳

實驗示例:

#haproxy主機上

#RS1和RS2主機上配置相同指令(在訪問日志中通過變量$proxy_protocol_addr 記錄透傳過來的客戶端IP

?

3.4 ACL

訪問控制列表ACLAccess Control Lists

是一種基于包過濾的訪問控制技術

它可以根據設定的條件對經過服務器傳輸的數據包進行過濾(條件匹配)即對接收到的報文進行匹配和過濾,基于請求報文頭部中的源地址、源端口、目標地址、目標端口、請求方法、URL、文件后綴等信息內容進行匹配并執行進一步操作,比如允許其通過或丟棄。

實驗前期準備

RS1和RS2主機(配置一樣

client主機配置

#測試是否能連接上

注意事項

實驗示例:

#測試

實驗示例:

haproxy主機上

RS1主機上

創建文件

#測試

3.4.1 ACL配置選項

3.4.1.1 ACL-Name 名稱

#ACL名稱,可以使用大字母A-Z、小寫字母a-z、數字0-9、冒號:、點.、中橫線和下劃線,并且嚴格區分大小寫,比如:my_aclMy_Acl就是兩個完全不同的acl5.8.1.2 ACL-criterion

3.4.1.2?ACL-flags 匹配模式

-i? ? ?不區分大小寫

-m? ?使用指定的正則表達式匹配方法

-n? ??不做DNS解析

-u? ??禁止acl重名,否則多個同名ACL匹配或關系

實驗示例:

haproxy主機

RS2和RS1主機上

#測試

3.4.2?ACL示例-基于源IP或子網調度訪問

3.4.2.1指定IP訪問

實驗示例

#測試(haproxy)

#測試(client)

3.4.2.2 拒絕指定ip

實驗示例

3.4.3?ACL示例-基于文件后綴名實現動靜分離

實驗前期準備(RS1和RS2安裝PHP):

RS2主機上配置

#測試(RS2可以登錄此界面)

RS1主機上配置((不能登錄)

實驗示例:

#測試

3.4.4?ACL-匹配訪問路徑實現動靜分離

實驗前期準備(RS1和RS2):

RS2

RS1

haproxy主機上

#測試

實驗示例

#測試

3.5 自定義HAProxy 錯誤界面

對指定的報錯進行重定向,進行優雅的顯示錯誤頁面

使用errorfileerrorloc指令的兩種方法,可以實現自定義各種錯誤頁面

實驗示例:

#haproxy默認使用的錯誤錯誤頁面

3.5.1 基于自定義的錯誤頁面文件

#進入該界面文件編寫

#再進入此界面編寫

#測試

關閉RS1和RS2上的后端

進入瀏覽器測試

3.6 HAProxy 四層負載

針對除HTTP以外的TCP協議應用服務訪問的應用場景

應用場景有:MySQL,?Redis,?Memcache ,RabbitMQ

實驗示例(MySQL為例):

(RS1和RS2上)

#下載

#進入此文件(RS2為例)

RS1

#測試(RS2上測試),在RS1上測試結果差不多

注意:此時是不能遠程連接的,那么解決這個問題的話就要以下這些步驟

#實驗示例(在RS2上):

#測試(在RS1上遠程連接)

#對 MySQL 服務實現四層負載

#測試

3.7 HAProxy https 實現

haproxy可以實現https的證書安全,從用戶到haproxyhttps,haproxy到后端服務器用http通信

但基于性能考慮,生產中證書都是在后端服務器比如nginx上實現

3.7.1 證書制作

實驗示例

#設置密鑰

#查看密鑰

#在xurui.pem里面添加密鑰

#進入此文件編寫

#測試(在client上測試)

#測試(也可以在網頁上)

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

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

相關文章

分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測

分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測 目錄 分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測 分類效果 基本介紹 算法步驟 參數設定 運行環境 應用場景 程序設計 參考資料 分類效果 基本介紹 該MATLAB代碼實現了基于冠豪豬優化算法(…

【MySQL 數據庫】MySQL基本查詢(第二節)

文章目錄&#x1f4dd;Update&#x1f309; 將孫悟空同學的數學成績變更為 80 分&#x1f309; 將曹孟德同學的數學成績變更為60分&#xff0c;語文成績變更為70分&#x1f309; 將總成績倒數前三的3位同學的數學成績加上30分&#x1f309;將所有同學的語文成績更新為原來的2倍…

Axios 響應攔截器

1.定義&#xff1a;響應攔截器&#xff08;Response Interceptor&#xff09;是一個可以在 axios 接收到服務器響應后&#xff0c;響應數據交給 .then() 處理之前執行的函數。你可以用它來統一處理響應數據&#xff0c;進行錯誤處理&#xff0c;或者對返回的數據做格式化和轉換…

k8s的nodeport和ingress

1.流量轉發圖targerport轉發到實際的容器端口containerPort&#xff08;后端端口&#xff09;nodeportingress2.配置場景總結字段作用對象必填示例值何時配置containerPort容器否80需明確記錄容器端口時&#xff08;推薦&#xff09;targetPortPod是80定義 Service 轉發規則時p…

VLA:自動駕駛的“新大腦”?

&#x1f525; 什么是 VLA&#xff1f;為什么突然火了&#xff1f;在自動駕駛圈子里&#xff0c;最近一個詞特別火&#xff1a;VLA。它不是某個新車的型號&#xff0c;也不是某家公司的新品牌&#xff0c;而是一種全新的智能架構&#xff0c;被稱為“自動駕駛的大腦2.0”。&…

Linux操作系統之線程(八):信號量sem

前言&#xff1a;大家好啊&#xff0c;我們上一篇文章已經講解了關于線程同步的一種辦法&#xff1a;運用條件變量cond。今天&#xff0c;我們就來學習一下線程同步的另外一種方法&#xff0c;信號量&#xff01;&#xff01;信號量呢有System V 信號量與POSIX 信號量&#xff…

【RocketMQ】一分鐘了解RocketMQ

MQ是什么 MQ全稱為Message Queue&#xff0c;即消息隊列 &#xff0c;是一種提供消息隊列服務的中間件&#xff0c;也稱為消息中間件&#xff0c;是一套提供了消息生 產、存儲、消費全過程的軟件系統&#xff0c;遵循FIFO原則。 MQ的好處有哪些 異步解耦 最常見的一個場景是…

01 01 01 第一部分 C++編程知識 C++入門 第一個C++程序

第一部分 C編程知識第一章 C入門 —— 第一個C程序一、第一個C程序代碼展示//寫一個C程序&#xff0c;實現在屏幕上打印 “hello world” #include <iostream> using namespace std; int main() {cout << "hello world" << endl;return 0; }二、…

進制定義與轉換詳解

文章目錄&#x1f4d8; 進制定義與轉換詳解一、進制的含義二、常見進制介紹1. 十進制&#xff08;Decimal&#xff0c;Base-10&#xff09;2. 二進制&#xff08;Binary&#xff0c;Base-2&#xff09;3. 八進制&#xff08;Octal&#xff0c;Base-8&#xff09;4. 十六進制&am…

【安卓筆記】用MVC、MVP、MVVM來實現井字棋案例

0. 環境&#xff1a;電腦&#xff1a;Windows10Android Studio: 2024.3.2編程語言: JavaGradle version&#xff1a;8.11.1Compile Sdk Version&#xff1a;35Java 版本&#xff1a;Java111. 首先、簡單實現井字棋的功能。功能拆解&#xff1a;1. 棋盤為3x32. 點擊棋盤button&a…

【洛谷】單向鏈表、隊列安排、約瑟夫問題(list相關算法題)

文章目錄單向鏈表題目描述題目解析代碼隊列安排題目描述題目解析代碼約瑟夫問題題目描述題目解析代碼單向鏈表 題目描述 題目解析 這道題因為有大量的任意位置插入刪除&#xff0c;所以肯定不能用數組&#xff0c;用鏈表是最合適的&#xff0c;而在算法競賽通常都用靜態鏈表&a…

當人機交互邁向新紀元:腦機接口與AR/VR/MR的狂飆之路

從手機到 “頭盔”&#xff1a;交互終端的變革猜想??在當今數字化時代&#xff0c;智能手機無疑是我們生活中不可或缺的一部分。它集通訊、娛樂、辦公等多種功能于一身&#xff0c;成為了人們與外界交互的主要窗口。然而&#xff0c;隨著科技的飛速發展&#xff0c;智能手機作…

InfluxDB HTTP API 接口調用詳解(二)

實際應用案例演示 1. 數據寫入案例 假設在一個物聯網設備數據采集場景中&#xff0c;有多個傳感器設備持續采集環境的溫度和濕度數據。我們以 Python 語言為例&#xff0c;使用requests庫來調用 InfluxDB 的 Write 接口將數據寫入 InfluxDB。 首先&#xff0c;確保已經安裝了…

世運會線上知識競賽答題pk小程序怎么做

隨著2025年成都世界運動會的來臨&#xff0c;越來越多的企事業單位組織員工進行線上知識競賽&#xff0c;那么答題PK小程序該怎么做&#xff0c;接下來我們來一一分析&#xff1a; 世運會線上知識競賽答題pk小程序怎么做一、答題功能&#xff1a;支持多種題型&#xff0c;如選擇…

Java畢業設計 | 基于微信小程序的家校互動作業管理系統(Spring Boot+Vue.js+uni-app+AI,附源碼+文檔)

Java畢業設計 | 基于微信小程序的家校互動作業管理系統&#xff08;Spring BootVue.jsuni-app&#xff0c;附源碼文檔&#xff09;&#x1f3af; 畢業設計私人教練 專注計算機畢設輔導第 6 年&#xff0c;累計 1v1 帶飛 800 同學順利通關。從選題、開題、代碼、論文到答辯&…

CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服務器

CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服務器 一、前言 由于 Jellyfin 的 GPL 協議和 Intel 的 media-driver (iHD) Linux 驅動&#xff08;部分開源&#xff09;在協議上不兼容的緣故&#xff0c;Jellyfin 官方的 Docker 鏡像&#xff1a;jellyfin/jellyfin 并不包含 …

PyTorch武俠演義 第一卷:初入江湖 第4章:損失玉佩的評分風波

第一卷&#xff1a;初入江湖 第4章&#xff1a;損失玉佩的評分風波比武開幕 晨鐘響徹山谷&#xff0c;PyTorch派三年一度的"模型比武大會"正式開始。各分舵弟子列隊入場&#xff0c;林小碼跟在Tensor大師身后&#xff0c;眼睛瞪得溜圓——只見&#xff1a; "卷積…

HttpServletRequestWrapper存儲Request

HTTP請求的輸入流只能被讀取一次&#xff0c;再想獲取就獲取不到了&#xff0c;那有什么方法可以緩存呢&#xff0c;我們可以自定義一個HttpServletRequest&#xff0c;或者是想在請求參數中統一添加或刪除參數也可以使用此類進行改造&#xff0c;然后通過過濾器繼續向下流轉。…

算法:數組part02: 209. 長度最小的子數組 + 59.螺旋矩陣II + 代碼隨想錄補充58.區間和 + 44. 開發商購買土地

算法&#xff1a;數組part02: 209. 長度最小的子數組 59.螺旋矩陣II 代碼隨想錄補充58.區間和 44. 開發商購買土地 209. 長度最小的子數組題目&#xff1a;https://leetcode.cn/problems/minimum-size-subarray-sum/description/ 文章講解&#xff1a;https://programmercarl…

Spring 核心知識點梳理 1

目錄 Spring Spring是什么&#xff1f; Spring中重要的模塊 Spring中最重要的就是IOC(控制反轉)和AOP(面向切面編程) 什么是IOC DI和IOC之間的區別 為什么要使用IOC呢&#xff1f; IOC的實現機制 什么是AOP Aop的核心概念 AOP的環繞方式 AOP發生的時期 AOP和OOP的…