haproxy相關概念及原理
HaProxy是一個特別適用於高可用性環境的TCP/HTTP開源的反向代理和負載均衡軟件。在七層負載均衡方面的功能很強大(支持cookie track,header rewrite等等),支持雙機熱備,支持虛擬主機,支持健康檢查,同時還提供直觀的監控頁面,可以清晰的監控服務集群的運行狀況。同時支持Linux2.6內核中System Epoll,通過簡化系統調用,大幅的提高了網絡I/O性能。
Haproxy包括以下一些特征:
- 根據靜態分配的cookie分配HTTP請求
- 分配負載到各個服務器,同時保證服務器通過使用HTTP Cookie實現連接保持;
- 當主服務器宕機時切換到備服務器,允許特殊端口的服務監控;
- 做維護時通過配置可以保證業務的連續性,更加人性化;
- 添加修改刪除HTTP Request和Respone頭;
- 通過特定表達式Block HTTP請求;
- 根據應用的cookie做連接保持;
- 常有用戶驗證的詳細的HTML監控報告。
1.1 Haproxy支持的平臺
HaProxy可以運行在如下這些平臺上:
- Linux2.4 on x86,x86_64,Alpha,Sparc,MIPS,PARISC
- Linux2.6/3.x on x86,x86_64,ARM,Sparc,PPC64
- Solaris 8/9 on UltraSparc 2 and 3
- Solaris 10 Opteron and UltraSPARC
- FreeBSD 4.10 - 10 on x86
- OpenBSD 3.1-current on i386,amd64,alpha,spare64 and VAX (check the ports)
- AIX 5.1-5.3 on Power architechare
1.2 Haproxy負載均衡算法
HaProxy的負載均衡算法現在具體有如下8種:
1、 roundrobin:簡單的輪詢
2、 static-rr:權重輪詢
3、 leastconn:最少連接者優先
4、 source:根據請求源IP,這個跟Nginx的ip_hash機制類似
5、 ri:根據請求的URI
6、 rl_param:表示根據請求的URI參數‘balance url_param’requires an URL parameter name;7、 hdr(name):根據HTTP請求頭來鎖定每一次HTTP請求
8、 rdp-cookie(name):根據cookie來鎖定並哈希每一次TCP請求
2.HAPROXY的配置
HAProxy的配置過程分為3個主要部分:
- 命令行參數,這是最優先的;
- global(全局)段,設置進程級參數;
- 代理配置段,通常位於default,listen,backend這樣的形式內。
配置文件的語法是由關鍵字後跟可選的一個或者多個參數(參數之間有空格)組成。如果字符串中包含空格,必須用’\’進行轉義。HAPROXY配置中分五大部分:
- global:全局參數配置,進程級的,用來控制Haproxy啟動前的一些進程及系統設置。
- defaults:配置一些默認的參數,可以被frontend,backend,listen段集成使用
- frontend:用來匹配接收客戶所請求的域名,uri等,並針對不同的匹配,做不同的請求處理;
- backend:定義後端服務器集群,以及對後端服務器集群的一些權重、隊列、連接數等選項的設置,類似於nginx中的upstream模塊;
- listen:可以理解為frontend和backend的組合體。
Haproxy配置文件的配置方法主要有兩種,一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端都可以有多個。第二種方法是只有一個listen配置塊來同時實現前端和後端。最常用也是推薦的方法為第一種,即frontend和backend的模式。
2.1 配置參數
配置參數及詳解:
global # 全局參數global模塊的設置
log 127.0.0.1 local2 # log語法:log <address_1>[max_level_1] # 全局的日誌配置,使用log關鍵字,指定使用127.0.0.1上的syslog服務中的local0日誌設備,記錄日誌等級為info的日誌
chroot /var/lib/haproxy #工作目錄
pidfile /var/run/haproxy.pid #進程pid文件
maxconn 4000 #最大連接數
user haproxy #所屬用戶
group haproxy #所屬用戶組
daemon #以守護進程方式運行haproxy
stats socket /var/lib/haproxy/stats #定義socket套接字,針對在線維護很有幫助
defaults # defaults模塊的設置
mode http #默認的模式{ tcp|http|health},health只會返回OK
log global #應用全局的日誌配置
option httplog #啟用日誌記錄HTTP請求,默認不記錄HTTP請求日誌
option dontlognull # 啟用該項,日誌中將不會記錄空連接。所謂空連接就是在上遊的負載均衡器者監控系統為了探測該 服務是否存活可用時,需要定期的連接或者獲取某一固定的組件或頁面,或者探測掃描端口是否在監聽或開放等動作被稱為空連接;官方文檔中標註,如果該服務上遊沒有其他的負載均衡器的話,建議不要使用該參數,因為互聯網上的惡意掃描或其他動作就不會被記錄下來
option http-server-close #每次請求完畢後主動關閉http通道
option forwardfor except 127.0.0.0/8 #如果服務器上的應用程序想記錄發起請求的客戶端的IP地址,需要在HAProxy上配置此選項, 這樣 HAProxy會把客戶端的IP信息發送給服務器,在HTTP 請求中添加"X-Forwarded-For"字段。 啟用 X-Forwarded-For,在requests 頭部插入客戶端IP發送給後端的server,使後端server獲取到客戶端的真實IP。
option redispatch # 當使用了cookie時,haproxy將會將其請求的後端服務器的serverID插入到cookie中,以保證會話的SESSION持久性;而此時,如果後端的服務器宕掉 了, 但是客戶端的cookie是不會刷新的,如果設置此參數,將會將客戶的請 求強制定向到另外一個後端server上,以保證服務的正常。
retries 3 # 定義連接後端服務器的失敗重連次數,連接失敗次數超過此值後將會將對應後端服務器標記為不可用
timeout http-request 10s #http請求超時時間
timeout queue 1m #一個請求在隊列裏的超時時間
timeout connect 10s #連接超時
timeout client 1m #客戶端超時
timeout server 1m #服務器端超時
timeout http-keep-alive 10s #設置http-keep-alive的超時時間
timeout check 10s #檢測超時
maxconn 3000 #每個進程可用的最大連接數
listen stats #定義一個listen模塊,用於狀態檢測
mode http #模式采用http
bind 0.0.0.0:8888 #綁定本機的地址及端口
stats enable #啟用狀態檢測功能
stats uri /haproxy-status #狀態檢測的URI
stats auth haproxy:123456 #訪問檢測界面的用戶名和密碼
frontend main *:80 #frontend模塊的設置,定義了一個前端
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js #這裏定義了一個acl規則
use_backend static if url_static #如果匹配到了acl,則訪問後端的static模塊
default_backend my_webserver #如果沒有匹配到acl,則將請求丟給默認的模塊
backend static #定義第一個後端模塊,static
balance roundrobin #負載均衡算法為輪詢
server static 127.0.0.1:80 check #後端服務器地址
backend my_webserver #定第二個後端,my_wenserver
balance roundrobin #負載均衡算法
server web01 172.31.2.33:80 check inter 2000 fall 3 weight 30 #定義的多個後端
server web02 172.31.2.34:80 check inter 2000 fall 3 weight 30 #定義的多個後端
server web03 172.31.2.35:80 check inter 2000 fall 3 weight 30 #定義的多個後端
2.2 健康檢查
Haproxy作為Loadblance,支持對backend的健康檢查,以保證在後端backend不能服務時,把從frontend進來的request分配至其他可以服務的backend,從而保證整體服務的可用性。
2.2.1 相關配置
相關配置:
httpchk <method><uri><version>
option httpchk HEAD / HTTP/1.0
check:啟動健康檢測
inter:健康檢測時間間隔
rise:檢測服務可用的連接次數
fall:檢測服務不可用的連接次數
error-limit:往server寫數據連續失敗次數的上限,執行on-error的設定
observe<mode>:把正常服務過程作為健康檢測請求,即實時檢測
on-error<mode>:滿足error-limit後執行的操作(fastinter、fail-check、sudden-death、mark-down)。其中fastinter表示立即按照fastinter的檢測延時進行。fail-check表示改次error作為一次檢測;sudden-death表示模仿一次fatal,如果緊接著一次fail則server為down;mark-down表示直接把server設置為down狀態。
server web-node2 192.168.56.22:8080 check inter 2000 rise 30 fall 15
2.2.2檢測方式
3.3.2 檢測方式
1、通過監聽端口進行健康檢測
這種檢測方式,haproxy只會去檢查server的端口,並不能保證服務真正可用。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2
2、通過URI進行健康檢測
這種檢測方式,是用去GET後端server的web頁面,基本可以代表後端服務的可用性。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk GET /index.html
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2
3、通過request獲取的頭部信息進行匹配進行健康檢測
這種檢測方式,是基於一些高級、精細的監測需求,通過對後端頭部訪問的頭部信息進行匹配檢測。
listen http_proxy 0.0.0.0:80
mode http
cookie SERVERID
balance roundrobin
option httpchk HEAD /index.jsp HTTP/1.1\r\n\Host:\www.xxx.com
server web1 192.168.1.1:80 cookie server01 check
server web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2
haproxy相關概念及原理