HaProxy是一個特別適用於高可用性環境的TCP/HTTP開源的反向代理和負載均衡軟件。在七層負載均衡方面的功能很強大(支持cookie track,header rewrite等等),支持雙機熱備,支持虛擬主機,支持健康檢查,同時還提供直觀的監控頁面,能夠清晰的監控服務集羣的運行情況。同時支持Linux2.6內核中System Epoll,經過簡化系統調用,大幅的提升了網絡I/O性能。javascript
Haproxy包括如下一些特徵:css
- 根據靜態分配的cookie分配HTTP請求
- 分配負載到各個服務器,同時保證服務器經過使用HTTP Cookie實現鏈接保持;
- 當主服務器宕機時切換到備服務器,容許特殊端口的服務監控;
- 作維護時經過配置能夠保證業務的連續性,更加人性化;
- 添加修改刪除HTTP Request和Respone頭;
- 經過特定表達式Block HTTP請求;
- 根據應用的cookie作鏈接保持;
- 常有用戶驗證的詳細的HTML監控報告。
HaProxy能夠運行在以下這些平臺上:html
- 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
HaProxy的負載均衡算法如今具體有以下8種:
一、 roundrobin:簡單的輪詢
二、 static-rr:權重輪詢
三、 leastconn:最少鏈接者優先
四、 source:根據請求源IP,這個跟Nginx的ip_hash機制相似
五、 ri:根據請求的URI
六、 rl_param:表示根據請求的URI參數‘balance url_param’requires an URL parameter name;
七、 hdr(name):根據HTTP請求頭來鎖定每一次HTTP請求
八、 rdp-cookie(name):根據cookie來鎖定並哈希每一次TCP請求前端
HAProxy的配置過程分爲3個主要部分:java
- 命令行參數,這是最優先的;
- global(全局)段,設置進程級參數;
- 代理配置段,一般位於default,listen,backend這樣的形式內。
配置文件的語法是由關鍵字後跟可選的一個或者多個參數(參數之間有空格)組成。若是字符串中包含空格,必須用’\’進行轉義。HAPROXY配置中分五大部分:node
- global:全局參數配置,進程級的,用來控制Haproxy啓動前的一些進程及系統設置。
- defaults:配置一些默認的參數,能夠被frontend,backend,listen段集成使用
- frontend:用來匹配接收客戶所請求的域名,uri等,並針對不一樣的匹配,作不一樣的請求處理;
- backend:定義後端服務器集羣,以及對後端服務器集羣的一些權重、隊列、鏈接數等選項的設置,相似於nginx中的upstream模塊;
- listen:能夠理解爲frontend和backend的組合體。
Haproxy配置文件的配置方法主要有兩種,一種是由前端(frontend)和後端(backend)配置塊組成,前端和後端均可以有多個。第二種方法是隻有一個listen配置塊來同時實現前端和後端。最經常使用也是推薦的方法爲第一種,即frontend和backend的模式。
配置參數及詳解:nginx
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 #定義的多個後端
Haproxy做爲Loadblance,支持對backend的健康檢查,以保證在後端backend不能服務時,把從frontend進來的request分配至其餘能夠服務的backend,從而保證總體服務的可用性。web
相關配置:redis
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算法
3.3.2 檢測方式
一、經過監聽端口進行健康檢測
這種檢測方式,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
二、經過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
三、經過request獲取的頭部信息進行匹配進行健康檢測
這種檢測方式,是基於一些高級、精細的監測需求,經過對後端頭部訪問的頭部信息進行匹配檢測。
listen http_proxy 0.0.0.0:80mode httpcookie SERVERIDbalance roundrobinoption httpchk HEAD /index.jsp HTTP/1.1\r\n\Host:\www.xxx.comserver web1 192.168.1.1:80 cookie server01 checkserver web2 192.168.1.2:80 cookie serve02 check inter 500 rise 1 fall 2