1、HAProxy簡介html
1.HAProxy 是一款提供高可用性、負載均衡以及基於TCP(第四層)和HTTP(第七層)應用的代理軟件,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。 2.HAProxy 實現了一種事件驅動、單一進程模型,此模型支持很是大的併發鏈接數。 3.HAProxy 支持全透明代理(已具有硬件防火牆的典型特色): 能夠用客戶端IP地址或者任何其餘地址來鏈接後端服務器. 這個特性僅在Linux 2.4/2.6內核打了cttproxy補丁後纔可使用. 這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
2、HAProxy工做原理
HAProxy由前端(frontend)和後端(backend),前端和後端均可以有多個。也能夠只有一個listen塊來同時實現前端和後端。這裏主要講一下frontend和backend工做模式。
前端(frontend)區域能夠根據HTTP請求的header信息來定義一些規則,而後將符合某規則的請求轉發到相應後端(backend)進行處理。前端
3、HAProxy性能
HAProxy藉助於OS上幾種常見的技術來實現性能的最大化,全部的這些細微之處的優化實現了在中等規模負載之上依然有着至關低的CPU負載,甚至於在很是高的負載場景中,5%的用戶空間佔用率和95%的系統空間佔用率也是很是廣泛的現象,這意味着HAProxy進程消耗比系統空間消耗低20倍以上。所以,對OS進行性能調優是很是重要的。即便用戶空間的佔用率提升一倍,其CPU佔用率也僅爲10%,這也解釋了爲什麼7層處理對性能影響有限這一現象。由此,在高端系統上HAProxy的7層性能可輕易超過硬件負載均衡設備。linux
在生產環境中,在7層處理上使用HAProxy做爲昂貴的高端硬件負載均衡設備故障故障時的緊急解決方案也時長可見。硬件負載均衡設備在「報文」級別處理請求,這在支持跨報文請求(request across multiple packets)有着較高的難度,而且它們不緩衝任何數據,所以有着較長的響應時間。對應地,軟件負載均衡設備使用TCP緩衝,可創建極長的請求,且有着較大的響應時間。nginx
4、HAProxy詳解配置文件web
haproxy 的配置文件由兩部分組成:全局設定和對代理的設定,共分爲五段:global,defaults,frontend,backend,listen 1.global: (全局配置主要用於設定義全局參數,屬於進程級的配置,一般和操做系統配置有關) 2.default : (配置默認參數,這些參數能夠被用到frontend,backend,Listen組件) 在此部分中設置的參數值,默認會自動引用到下面的frontend、backend、listen部分中,因引,某些參數屬於公用的配置,只須要在defaults部分添加一次便可。而若是frontend、backend、listen部分也配置了與defaults部分同樣的參數,Defaults部分參數對應的值自動被覆蓋。 3.frontend:( 接收請求的前端虛擬節點,Frontend能夠更加規則直接指定具體使用後端的backend) frontend是在haproxy 1.3版本之後才引入的一個組件,同時引入的還有backend組件。經過引入這些組件,在很大程度上簡化了haproxy配置文件的複雜性。forntend能夠根據ACL規則直接指定要使用的後端backend 4.backend : (後端服務集羣的配置,真實服務器,一個Backend對應一個或者多個實體服務器) 在HAProxy1.3版本以前,HAProxy的全部配置選項都在這個部分中設置。爲了保持兼容性,haproxy新的版本依然保留了listen組件配置試。兩種配置方式任選一中 5.Listen : (Fronted和backend的組合體) 好比haproxy實例狀態監控部分配置
關於haproxy時間格式配置說明:redis
一些包含了值的參數表示時間,如超時時長。這些值通常以毫秒爲單位,但也可使用其它的時間單位後綴。 us: 微秒(microseconds),即1/1000000秒; ms: 毫秒(milliseconds),即1/1000秒; s: 秒(seconds); m: 分鐘(minutes); h:小時(hours); d: 天(days);
global部分配置說明
一般主要定義全局配置主要用於設定義全局參數,屬於進程級的配置,一般和操做系統配置有關。算法
global log 127.0.0.1 local3 #定義haproxy日誌輸出設置 log 127.0.0.1 local1 notice #log loghost local0 info #定義haproxy 日誌級別 ulimit-n 82000 #設置每一個進程的可用的最大文件描述符 maxconn 20480 #默認最大鏈接數 chroot /usr/local/haproxy #chroot運行路徑 uid 99 #運行haproxy 用戶 UID gid 99 #運行haproxy 用戶組gid daemon #之後臺形式運行harpoxy nbproc 1 #設置進程數量 pidfile /usr/local/haproxy/run/haproxy.pid #haproxy 進程PID文件 #debug #haproxy調試級別,建議只在開啓單進程的時候調試 #quiet
log:全局的日誌配置,local0是日誌輸出設置,info表示日誌級別(err,waning,info,debug);
maxconn:設定每一個HAProxy進程可接受的最大併發鏈接數,此選項等同於linux命令選項」ulimit -n」;
chroot:修改haproxy的工做目錄至指定的目錄並在放棄權限以前執行chroot()操做,能夠提高haproxy的安全級別,不過須要注意的是要確保指定的目錄爲空目錄且任何用戶均不能有寫權限;
daemon:讓haproxy以守護進程的方式工做於後臺,其等同於「-D」選項的功能,固然,也能夠在命令行中以「-db」選項將其禁用;
nbproc:指定啓動的haproxy進程個數,只能用於守護進程模式的haproxy;默認只啓動一個進程,鑑於調試困難等多方面的緣由,通常只在單進程僅能打開少數文件描述符的場景中才使用多進程模式;
pidfile:將haproxy的進程寫入pid文件;
ulimit-n:設定每進程所可以打開的最大文件描述符數目,默認狀況下其會自動進行計算,所以不推薦修改此選項;
stats socket <path>定義統計信息保存位置;數據庫
如要設置haproxy的日誌內容,可參考如下配置:後端
capture request header Host len 40 capture request header Content-Length len 10 capture request header Referer len 200 capture response header Server len 40 capture response header Content-Length len 10 capture response header Cache-Control len 8
defaults部分配置說明
用於設置配置默認參數,這些參數能夠被用到frontend,backend,Listen組件;
此部分中設置的參數值,默認會自動引用到下面的frontend、backend、listen部分中,因引,某些參數屬於公用的配置,只須要在defaults部分添加一次便可。而若是frontend、backend、listen部分也配置了與defaults部分同樣的參 數,Defaults部分參數對應的值自動被覆蓋;安全
defaults log global #引入global定義的日誌格式 mode http #所處理的類別(7層代理http,4層代理tcp) maxconn 50000 #最大鏈接數 option httplog #日誌類別爲http日誌格式 option httpclose #每次請求完畢後主動關閉http通道 option dontlognull #不記錄健康檢查日誌信息 option forwardfor #若是後端服務器須要得到客戶端的真實ip,須要配置的參數, 能夠從http header 中獲取客戶端的IP retries 3 #3次鏈接失敗就認爲服務器不可用,也能夠經過後面設置 option redispatch
#《---上述選項意思是指serverID 對應的服務器掛掉後,強制定向到其餘健康的服務器, 當使用了 cookie時, haproxy將會將其請求的後端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,若是 後端的服務器宕掉了,可是客戶端的cookie是不會刷新的,若是設置此參數,將會將客戶的請求強制定向到另一個 後端server上,以保證服務的正常---》 stats refresh 30 #設置統計頁面刷新時間間隔 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接 balance roundrobin #設置默認負載均衡方式,輪詢方式 #balance source #設置默認負載均衡方式,相似於nginx的ip_hash #contimeout 5000 #設置鏈接超時時間 #clitimeout 50000 #設置客戶端超時時間 #srvtimeout 50000 #設置服務器超時時間 timeout http-request 10s #默認http請求超時時間 timeout queue 1m #默認隊列超時時間 timeout connect 10s #默認鏈接超時時間 timeout client 1m #默認客戶端超時時間 timeout server 1m #默認服務器超時時間 timeout http-keep-alive 10s #默認持久鏈接超時時間 timeout check 10s #設置心跳檢查超時時間
mode http:設置haproxy的運行模式,有三種{http|tcp|health}。注意:若是haproxy中還要使用4層的應用(mode tcp)的話,不建議在此定義haproxy的運行模式。
設置HAProxy實例默認的運行模式有tcp、http、health三種可選:
tcp模式:在此模式下,客戶端和服務器端以前將創建一個全雙工的鏈接,不會對七層報文作任何檢查,默認爲tcp模式,常常用於SSL、SSH、SMTP等應用。 http模式:在此模式下,客戶端請求在轉發至後端服務器以前將會被深度分板,全部不與RFC格式兼容的請求都會被拒絕。 health:已基本不用了。
log global:設置日誌繼承全局配置段的設置。
option httplog:表示開始打開記錄http請求的日誌功能。
option dontlognull:若是產生了一個空鏈接,那這個空鏈接的日誌將不會記錄。
option http-server-close:打開http協議中服務器端關閉功能,使得支持長鏈接,使得會話能夠被重用,使得每個日誌記錄都會被記錄。
option forwardfor except 127.0.0.0/8:若是上游服務器上的應用程序想記錄客戶端的真實IP地址,haproxy會把客戶端的IP信息發送給上游服務器,在HTTP請求中添加」X-Forwarded-For」字段,但當是haproxy自身的健康檢測機制去訪問上游服務器時是不該該把這樣的訪問日誌記錄到日誌中的,因此用except來排除127.0.0.0,即haproxy身。
option redispatch:當與上游服務器的會話失敗(服務器故障或其餘緣由)時,把會話從新分發到其餘健康的服務器上,當原來故障的服務器恢復時,會話又被定向到已恢復的服務器上。還能夠用」retries」關鍵字來設定在斷定會話失敗時的嘗試鏈接的次數。
retries 3:向上遊服務器嘗試鏈接的最大次數,超過此值就認爲後端服務器不可用。
option abortonclose:當haproxy負載很高時,自動結束掉當前隊列處理比較久的連接。
timout http-request 10s:客戶端發送http請求的超時時間。
timeout queue 1m:當上遊服務器在高負載響應haproxy時,會把haproxy發送來的請求放進一個隊列中,timeout queue定義放入這個隊列的超時時間。
timeout connect 5s:haproxy與後端服務器鏈接超時時間,若是在同一個局域網可設置較小的時間。
timeout client 1m:定義客戶端與haproxy鏈接後,數據傳輸完畢,再也不有數據傳輸,即非活動鏈接的超時時間。
timeout server 1m:定義haproxy與上游服務器非活動鏈接的超時時間。
timeout http-keep-alive 10s:設置新的http請求鏈接創建的最大超時時間,時間較短時能夠儘快釋放出資源,節約資源。
timeout check 10s:健康檢測的時間的最大超時時間。
maxconn 3000:最大併發鏈接數。
contimeout 5000:設置成功鏈接到一臺服務器的最長等待時間,默認單位是毫秒,新版本的haproxy使用timeout connect替代,該參數向後兼容。
clitimeout 3000:設置鏈接客戶端發送數據時的成功鏈接最長等待時間,默認單位是毫秒,新版本haproxy使用timeout client替代。該參數向後兼容。
srvtimeout 3000:設置服務器端迴應客戶度數據發送的最長等待時間,默認單位是毫秒,新版本haproxy使用timeout server替代。該參數向後兼容。
balance roundrobin:設置負載算法爲:輪詢算法rr
balance :用來定義負載均衡算法
1.roundrobin:基於權重進行的輪叫算法,在服務器的性能分佈經較均勻時這是一種最公平的,最合量的算法。 2.static-rr:也是基於權重時行輪叫的算法,不過此算法爲靜態方法,在運行時調整其服務權重不會生效。 3.source:是基於請求源IP的算法,此算法對請求的源IP時行hash運算,而後將結果與後端服務器的權理總數相除後轉發至某臺匹配的後端服務器,這種方法可使用一個客戶端IP的請求始終轉發到特定的後端服務器。 4.leastconn:此算法會將新的鏈接請求轉發到具備最少鏈接數目的後端服務器。在會話時間較長的場景中推薦使用此算法。例如數據庫負載均衡等。此算法不適合會話較短的環境,如基於http的應用。 5.uri:此算法會對部分或整個URI進行hash運算,再通過與服務器的總權重要除,最後轉發到某臺匹配的後端服務器上。 6.uri_param:此算法會椐據URL路徑中的參數時行轉發,這樣能夠保證在後端真實服務器數量不變時,同一個用戶的請求始終分發到同一臺機器上。 7.hdr:此算法根據httpd頭時行轉發,若是指定的httpd頭名稱不存在,則使用roundrobin算法進行策略轉發。 8.rdp-cookie(name):示根據據cookie(name)來鎖定並哈希每一次TCP請求。
frontend部分配置說明
frontend是在haproxy 1.3版本之後才引入的一個組件,同時引入的還有backend組件。經過引入這些組件,在很大程度上簡化了haproxy配置文件的複雜性。frontend根據任意 HTTP請求頭內容作ACL規則匹配,而後把請求定向到相關的backend
frontend http_80_in bind 0.0.0.0:80 #設置監聽端口,即haproxy提供的web服務端口,和lvs的vip 相似 mode http #http 的7層模式 log global #應用全局的日誌設置 option httplog #啓用http的log option httpclose #每次請求完畢後主動關閉http通道,HAproxy不支持keep-alive模式 option forwardfor #若是後端服務器須要得到客戶端的真實IP須要配置此參數,將能夠從HttpHeader中得到客戶端IP default_backend wwwpool #設置請求默認轉發的後端服務池
frontend http_80_in:定義一個名爲http_80_in的frontend。
bind 0.0.0.0:80:定義haproxy前端部分監聽的端口。
mode http:定義爲http模式。
log global:繼承global中log的定義。
option forwardfor:使後端server獲取到客戶端的真實IP。
backend部分配置說明
用來定義後端服務集羣的配置,真實服務器,一個Backend對應一個或者多個實體服務器
backend wwwpool #定義wwwpool服務器組。 mode http #http的7層模式 option redispatch option abortonclose balance source #負載均衡的方式,源哈希算法 cookie SERVERID #容許插入serverid到cookie中,serverid後面能夠定義 option httpchk GET /test.html #心跳檢測 server web1 10.1.1.2:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3 maxconn 8
cookie:表示充許向cookie插入SERVERID,每臺服務器的SERVERID能夠下面的server關鍵字中使用cookie關鍵字定義。
option httpchk:此選項表示啓用HTTP的服務狀態檢測功能。 HAProxy做爲一個專業的負載均衡器,而且它支持對backend部分指定的後端服務節點的 健康檢查,以保證在後端的backend中某個節點不能服務時,把從frontend端進來的客戶端請求分配至backend中其餘健康節點上,從而保證 總體服務的可用性。
method:表示HTTP請求的方式,經常使用的有OPTIONS、GET、HEAD幾種方式。
通常健康檢查能夠採用HEAD方式進行,而不是採用GET方式,這是由於HEAD方式沒有數據返回,僅檢查Response的HEAD是否是狀態碼200。所以,相對於GET,HEAD方式更快,更簡單。
uri:表示要檢測的URL地址,經過執行此URL,能夠獲取後端服務器的運行狀態,在正常狀況下返回狀態碼200,返回其餘狀態碼均爲異常狀態。
version:指定心跳檢測時的HTTP的版本號。
server:用來定義多臺後端真實服務器,不能用於defaults和frontend部分,格式爲:server name address:port param*
name:爲後端真實服務器指定一個內部名稱,隨便這下義一個便可。
address:後端真實服務器的iP地址或主機名。
port:指定鏈接請求發往真實服務器時的目標端口,在未設定時,將使用客戶端請求時的同一端口。
param*:爲後端服務器設定的一系列參數,可用參數很是多。
check:表示啓用對此後端服務器執行健康檢查。
inter:設置健康狀態檢查的時間間隔,單位爲毫秒。
rise:設置人故障狀態轉換至正常狀態須要成功檢查的次數,如 rise 2:表示2次檢查正確就認爲此服務器可用。
fall:設置後端服務器從正常狀態轉換爲不可用狀態須要檢查的次數,如 fall 3表示3 次檢查失敗就認爲此服務器不可用。
cookie:爲指定的後端服務器設定cookie值,此外指定的值將在請求入站時被檢查,第一次爲此值挑選的後端服務器將在後續的請求中一直被選中,其目的在於實現持久鏈接的功能。
cookie server1:表示web1的serverid爲server1。
weigth:設置後端真實服務器的權重,默認爲1,最大值爲256,設置爲0表示不參與負載均衡。
maxconn:設定每一個backend中server進程可接受的最大併發鏈接數,此選項等同於linux命令選項」ulimit -n」。
backup:設置後端真實服務器的備份服器,僅僅在後端全部真實服務器均不可用的狀況下才啓用。
listen部分配置說明
經常用於狀態頁面監控,以及後端server檢查,是Fronted和backend的組合體。
以下爲haproxy訪問狀態監控頁面配置:
listen admin_status #Frontend和Backend的組合體,監控組的名稱,按需自定義名稱 bind 0.0.0.0:8888 #監聽端口 mode http #http的7層模式 log 127.0.0.1 local3 err #錯誤日誌記錄 stats refresh 5s #每隔5秒自動刷新監控頁面 stats uri /admin?stats #監控頁面的url訪問路徑 stats realm itnihao\ welcome #監控頁面的提示信息 stats auth admin:admin #監控頁面的用戶和密碼admin,能夠設置多個用戶名 stats auth admin1:admin1 #監控頁面的用戶和密碼admin1 stats hide-version #隱藏統計頁面上的HAproxy版本信息 stats admin if TRUE #手工啓用/禁用,後端服務器(haproxy-1.4.9之後版本)
HAProxy目前主要有三個版本: 1.3 , 1.4 ,1.5,CentOS6.6 自帶的RPM包爲 1.5 的。