HAproxy均衡負載部署和配置文件詳解
php
HAProxy提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支持虛擬主機,它是免費、快速而且可靠的一種解決方案。根據官方數據,其最高極限支持10G的併發。 html
HAProxy特別適用於那些負載特大的web站點, 這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。前端
其支持從4層至7層的網絡交換,即覆蓋全部的TCP協議。就是說,Haproxy 甚至還支持 Mysql 的均衡負載。。nginx
若是說在功能上,能以proxy反向代理方式實現 WEB均衡負載,這樣的產品有不少。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。 web
但要明確一點的,Haproxy 並非 Http 服務器。以上提到全部帶反向代理均衡負載的產品,都清一色是 WEB 服務器。簡單說,就是他們能自個兒提供靜態(html,jpg,gif..)或動態(php,cgi..)文件的傳輸以及處理。而Haproxy 僅僅,並且專門是一款的用於均衡負載的應用代理。其自身並不能提供http服務。 redis
但其配置簡單,擁有很是不錯的服務器健康檢查功能還有專門的系統狀態監控頁面,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入。自1.3版本開始還引入了frontend,backend,frontend根據任意HTTP請求頭內容作規則匹配,而後把請求定向到相關的backend。 算法
另外, 版本1.3 是處於活躍開發階段的版本, 它支持以下新特性: sql
l 內容交換 : 能夠根據請求(request)的任何一部分 來選擇一組服務器, 好比請求的 URI , Host頭(header) , cookie , 以及其餘任何東西. 固然,對那些靜態分離的站點來講,對此特性還有更多的需求。
apache
l 全透明代理 : 能夠用 客戶端IP地址 或者任何其餘地址來鏈接後端服務器. 這個特性僅在Linux 2.4/2.6內核打了cttproxy 補丁後纔可使用. 這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
vim
l 基於樹的更快的調度器 : 1.2.16以上的版本要求全部的超時都設成一樣的值以支持數以萬計的全速鏈接. 這個特性已經移植到1.2.17.
l 內核TCP拼接 : 避免了內核到用戶而後用戶到內核端的數據拷貝, 提升了吞吐量同時又下降了CPU使用率 . Haproxy 1.3支持Linux L7SW 以知足在商用硬件上數Gbps 的吞吐的需求。
l 鏈接拒絕 : 由於維護一個鏈接的打開的開銷是很低的,有時咱們很須要限制攻擊蠕蟲(attack bots),也就是說限制它們的鏈接打開從而限制它們的危害。 這個已經爲一個陷於小型DDoS攻擊的網站開發了並且已經拯救了不少站點。
l 細微的頭部處理 : 使得編寫基於header的規則更爲簡單,同時能夠處理URI的某部分。
l 快而可靠的頭部處理 : 使用徹底RFC2616 兼容的完整性檢查對通常的請求所有進行分析和索引僅僅須要不到2ms 的時間。
l 模塊化設計 : 容許更多人加入進此項目,調試也很是簡單. poller已經分離, 已經使得它們的開發簡單了不少. HTTP已經從TCP分離出來了,這樣增長新的七層特性變得很是簡單. 其餘子系統也會很快實現模塊化
l 投機I/O 處理 : 在一個套接字就緒前就嘗試從它讀取數據。poller僅推測哪一個可能就緒哪一個沒有,嘗試猜想,而且若是成功,一些開銷很大的系統調用就能夠省去了。若是失敗,就會調用這些系統調用。已知的使用Linux epoll()已經淨提高起碼10%了。
l ACLs : 使用任意規則的任意組合做爲某動做的執行條件。
l TCP 協議檢查 : 結合ACL來對請求的任意部分進行檢查,而後再進行轉發。這就能夠執行協議驗證而不是盲目的進行轉發。好比說容許SSL但拒絕SSH。
l 更多的負載均衡算法 : 如今,動態加權輪循(Dynamic Round Robin),加權源地址哈希(Weighted Source Hash),加權URL哈希和加權參數哈希(Weighted Parameter Hash)已經實現。其餘算法好比Weighted Measured Response Time也很快會實現。
安裝:
一、從官網 http://haproxy.1wt.eu/#down 下載最新版本,如 haproxy-1.4.16.tar.gz
二、解壓縮, # tar zcvf haproxy-1.4.16.tar.gz 建議移動到工做目錄 /usr/local/haproxy/ 下,不然後續安裝時還要用PREFIX=/usr/local/haprpxy指定安裝路徑
三、運行 make install 即完成安裝
程序爲 /usr/local/haproxy 或 /usr/local/sbin/haproxy, 運行程序 haproxy,顯示版本信息即說明安裝成功
文檔在/usr/local/doc/haproxy下
Man:/usr/local/share/man/man1
配置: # vi haproxy.cfg
配置內容以下:
global #全局設置
log 127.0.0.1 local0 #日誌輸出配置,全部日誌都記錄在本機,經過local0輸出
#log 127.0.0.1 local1 notice
#log loghost local0 info
ulimit-n 82000 #設置每一個進程的可用的最大文件描述符
maxconn 4096 #最大鏈接數
chroot /usr/local/haproxy #改變當前工做目錄
uid 99 #所屬運行的用戶uid
gid 99 #所屬運行的用戶組
daemon #之後臺形式運行ha-proxy
nbproc 3 #啓動2個ha-proxy實例
pidfile /usr/local/haproxy/run/haproxy.pid #pid文件位置
debug #調試模式,輸出啓動信息到標準輸出
#quiet #安靜模式,啓動時無輸出
defaults #默認設置
log global
log 127.0.0.1 local3 #日誌文件的輸出定向
mode http #所處理的類別,默認採用http模式,可配置成tcp做4層消息轉發
option httplog #日誌類別,採用httplog
option httpclose #每次請求完畢後主動關閉http通道,ha-proxy不支持keep-alive,只能模擬這種模式的實現
option dontlognull
option forwardfor #若是後端服務器須要得到客戶端真實ip須要配置的參數,能夠從Http Header中得到客戶端ip
option redispatch
retries 2 #3次鏈接失敗就認爲服務器不可用,主要經過後面的check檢查
maxconn 2000 #最大鏈接數
balance roundrobin #負載均衡算法
stats uri /haproxy-stats #haproxy 監控頁面的訪問地址,可經過http://ip/haproxy-stats訪問
contimeout 5000 #鏈接超時時間
clitimeout 50000 #客戶端鏈接超時時間
srvtimeout 50000 #服務器端鏈接超時時間
listen app-balancer 0.0.0.0:80
mode http
# log 127.0.0.1 local3
#cookie ServerID insert nocache
cookie ServerID prefix
cookie JSESSIONID prefix
capture request header Cookie len 200
capture request header X-Forwarded-For len 15
capture request header Host len 15
capture request header Referrer len 15
appsession JSESSIONID len 52 timeout 1080000
balance roundrobin
option httpchk GET /ok.jsp HTTP/1.0 #健康檢查
server app_1 192.168.0.243:8080 cookie app1 minconn 100 maxconn 40960 check inter 5000 rise 2 fall 5 weight 2
server app_2 192.168.0.242:8080 cookie app2 minconn 100 maxconn 40960 check inter 2000 rise 2 fall 5 weight 2
server app_4 192.168.0.245:8080 cookie app2 minconn 100 maxconn 40960 check inter 2000 rise 2 fall 5 weight 1
#option forwardfor except 192.168.0.159
option forwardfor
stats enable
stats uri /haproxy-stat
stats realm "test_123 monitor"
stats auth admin:admin
運行:
啓動服務:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
重啓服務:
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid` (沒有換行)
中止服務:
# killall haproxy
固然,爲了方便系統在開機時加載,還能夠建立啓動腳本:
# vim /etc/rc.d/init.d/haproxy 內容以下:
#! /bin/sh
set -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/conf/$PROGNAME.conf
PIDFILE=$PROGDIR/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME
# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0
start()
{
echo -n "Starting $DESC: $PROGNAME"
$DAEMON -f $CONFIG
echo "."
}
stop()
{
echo -n "Stopping $DESC: $PROGNAME"
haproxy_pid=cat $PIDFILE
kill $haproxy_pid
echo "."
}
restart()
{
echo -n "Restarting $DESC: $PROGNAME"
$DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
echo "."
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
exit 1
;;
esac
exit 0
保存後賜予可執行權限
# chmod +x /etc/rc.d/init.d/haproxy
就可使用 service haproxy start|stop|restart 來控制服務的啓動中止跟重啓。
並經過如下命令加載到開機服務啓動列表
# chkconfig --add haproxy
配置日誌:
# vim /etc/syslog.conf
在最下邊增長
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
重啓核心日誌服務使配置起效
# service syslog restart
而後就可查看日誌了
# tail –f /var/log/harpoxy.log
Aug 22 15:32:06 localhost haproxy[64136]: Proxy www started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy cherokee started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy wap started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy pic started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy img started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started.
Aug 22 15:32:06 localhost haproxy[64136]: Proxy public started.
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/<STATS> 0/-1/-1/-1/0 200 17329 - - PR-- 0/0/0/0/0 0/0 "GET /?stats HTTP/1.1"
Aug 22 15:32:59 localhost haproxy[64137]: 219.142.128.30:6416 [22/Aug/2009:15:32:59.754] public stats/<STATS> 0/-1/-1/-1/0 200 17329 - - PR-- 0/0/0/0/0 0/0 "GET /?stats HTTP/1.1"
應用舉例
WEB 均衡負載& 虛擬主機
從新打開配置文件haproxy.cfg,留意最下部分的均衡主機選項
listen localhost 0.0.0.0:1080 #運行的端口及主機名
mode http
option httpchk GET /index.htm #用於健康檢測的後端頁面
server s1 127.0.0.1:3121 weight 3 check #後端的主機 IP &權衡
server s2 127.0.0.1:3122 weight 3 check #後端的主機 IP &權衡
在實驗中,咱們的的後端是 squid 分開了2個端口在同一臺服務器上。
以其中一項爲例:
server s1 127.0.0.1:3121 weight 3 check
s1 是可本身定義的服務器別名
127.0.0.1:3121 服務器的IP地址以及端口號
weight 3 所能分配到請求的高低權衡,數字越大分配到的請求數就越高
check 接受 haproxy 的定時檢查,以肯定後端服務器的健康狀況。
如需配置虛擬主機,至關簡單,緊需修改 localhost 爲你虛擬主機的的域名,加到haproxy配置中, 再爲其分配後端服務器的參數便可。
例:
listen www.x1.com 0.0.0.0:1080 #運行的端口及主機名
mode http
option httpchk GET /index.htm #用於健康檢測的後端頁面
server s1 127.0.0.1:3121 weight 3 check #後端的主機 IP &權衡
server s2 127.0.0.1:3122 weight 3 check #後端的主機 IP &權衡
listen www.x2.com 0.0.0.0:1080 #運行的端口及主機名
mode http
option httpchk GET /index.htm #用於健康檢測的後端頁面
server s1 127.0.0.1:3121 weight 3 check #後端的主機 IP &權衡
server s2 127.0.0.1:3122 weight 3 check #後端的主機 IP &權衡
保存配置後從新加載,便可生效,刷新管理頁面也可看到新的虛擬主機。
性能對比在此,咱們用最近最火紅的http 兼前端WEB均衡負載服務器Nginx 與Haproxy 作個簡單的性能對比。
測試環境:
CPU:Xeon2.8G X2
RAM:4G
OS:RedHat As5.3 X64
工具:apache ab
參數:ab -i -c 500 -n 100000 (500併發,1W請求)
最終服務端:2個squid 需實現均衡負載
成績以下:
####### Nginx + haproxy : (由Nginx經過反向代理髮送請求至haproxy, 並由其進行均衡負載)
Concurrency Level: 500
Time taken for tests: 53.758 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 38600386 bytes
HTML transferred: 0 bytes
Requests per second: 1860.19 [#/sec] (mean)
Time per request: 268.790 [ms] (mean)
Time per request: 0.538 [ms] (mean, across all concurrent requests)
Transfer rate: 701.21 [Kbytes/sec] received
####### haproxy : (單獨由haproxy進行均衡負載)
Concurrency Level: 500
Time taken for tests: 32.562 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 36606588 bytes
HTML transferred: 0 bytes
Requests per second: 3071.02 [#/sec] (mean)
Time per request: 162.812 [ms] (mean)
Time per request: 0.326 [ms] (mean, across all concurrent requests)
Transfer rate: 1097.85 [Kbytes/sec] received
####### nginx : (單獨由nginx進行均衡負載)
Concurrency Level: 500
Time taken for tests: 36.539 seconds
Complete requests: 100000
Failed requests: 0
Write errors: 0
Total transferred: 38600000 bytes
HTML transferred: 0 bytes
Requests per second: 2736.82 [#/sec] (mean)
Time per request: 182.694 [ms] (mean)
Time per request: 0.365 [ms] (mean, across all concurrent requests)
Transfer rate: 1031.65 [Kbytes/sec] received
反覆測試,得出其結果:
Haproxy 單獨進行均衡負載的性能最強,超過了Nginx。
然而 Nginx + Haproxy 的搭配性能最弱,應該是跟經過了2層反向代理有關。
因此想用 Haproxy 替代 Nginx 所自帶的均衡負載功能將會令性能打折。
但雖然如此 Haproxy 對均衡負載功能遠比 Nginx 成熟,例如session粘貼,cookies 引導等都是 nginx 所沒有的。
可根據須要而選擇搭配。
相關啓動參數介紹
#./haproxy –help //haproxy相關命令參數介紹.
haproxy -f <配置文件>
[-n 最大併發鏈接總數] [-N 每一個偵聽的最大併發數] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-s] [-l] [-dk]
[-ds] [-de] [-dp] [-db] [-m <內存限制M>] [{-sf|-st} pidlist...]
-d 前臺,debug模式
-D daemon模式啓動
-q 安靜模式,不輸出信息
-V 詳細模式
-c 對配置文件進行語法檢查
-s 顯示統計數據
-l 顯示詳細統計數據
-dk 不使用kqueue
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-db 禁用後臺模式,程序跑在前臺
-sf <pidlist> 程序啓動後向pidlist裏的進程發送FINISH信號,這個參數放在命令行的最後
-st <pidlist> 程序啓動後向pidlist裏的進程發送TERMINATE信號,這個參數放在命令行的最後
附:一個比較簡單的配置文件內容
global log 127.0.0.1 local0 maxconn 4096 chroot /usr/local/haproxy uid 99 gid 99 daemon nbproc 1 pidfile /usr/local/haproxy/haproxy.pid debug #quiet defaults log 127.0.0.1 local3 mode http option httplog option httpclose option dontlognull option forwardfor option redispatch retries 2 maxconn 2000 balance roundrobin contimeout 5000 clitimeout 50000 srvtimeout 50000 listen webinfo :1080 mode http balance roundrobin option httpclose option forwardfor server phpinfo1 192.168.18.2:10000 check weight 1 minconn 1 maxconn 3 check inter 40000 server phpinfo2 127.0.0.1:80 check weight 1 minconn 1 maxconn 3 check inter 40000 listen webmb :1081 mode http balance roundrobin option httpclose option forwardfor server webmb1 192.168.1.91:10000 weight 1 minconn 1 maxconn 3 check inter 40000 server webmb2 127.0.0.1:10000 weight 1 minconn 1 maxconn 3 check inter 40000 listen stats :8888 mode http transparent stats uri / haproxy-stats stats realm Haproxy \ statistic stats auth admin:admin