千万级并发HAproxy均衡负载系统介绍
Haproxy介紹及其定位?
?
HAProxy提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。根據(jù)官方數(shù)據(jù),其最高極限支持10G的并發(fā)。?
?
HAProxy特別適用于那些負(fù)載特大的web站點(diǎn), 這些站點(diǎn)通常又需要會(huì)話保持或七層處理。HAProxy運(yùn)行在當(dāng)前的硬件上,完全可以支持?jǐn)?shù)以萬(wàn)計(jì)的并發(fā)連接。并且它的運(yùn)行模式使得它可以很簡(jiǎn)單安全的整合進(jìn)您當(dāng)前的架構(gòu)中, 同時(shí)可以保護(hù)你的web服務(wù)器不被暴露到網(wǎng)絡(luò)上。
??
?
其支持從4層至7層的網(wǎng)絡(luò)交換,即覆蓋所有的TCP協(xié)議。就是說(shuō),Haproxy 甚至還支持 Mysql 的均衡負(fù)載。。
如果說(shuō)在功能上,能以proxy反向代理方式實(shí)現(xiàn) WEB均衡負(fù)載,這樣的產(chǎn)品有很多。包括 Nginx,ApacheProxy,lighttpd,Cheroke 等。?
但要明確一點(diǎn)的,Haproxy 并不是 Http 服務(wù)器。以上提到所有帶反向代理均衡負(fù)載的產(chǎn)品,都清一色是 WEB 服務(wù)器。簡(jiǎn)單說(shuō),就是他們能自個(gè)兒提供靜態(tài)(html,jpg,gif..)或動(dòng)態(tài)(php,cgi..)文件的傳輸以及處理。而Haproxy 僅僅,而且專門是一款的用于均衡負(fù)載的應(yīng)用代理。其自身并不能提供http服務(wù)。?
?
但其配置簡(jiǎn)單,擁有非常不錯(cuò)的服務(wù)器健康檢查功能還有專門的系統(tǒng)狀態(tài)監(jiān)控頁(yè)面,當(dāng)其代理的后端服務(wù)器出現(xiàn)故障, HAProxy會(huì)自動(dòng)將該服務(wù)器摘除,故障恢復(fù)后再自動(dòng)將該服務(wù)器加入。自1.3版本開始還引入了frontend,backend,frontend根據(jù)任意HTTP請(qǐng)求頭內(nèi)容做規(guī)則匹配,然后把請(qǐng)求定向到相關(guān)的backend。?
?
另外, 版本1.3 是處于活躍開發(fā)階段的版本, 它支持如下新特性:
?
l???????? 內(nèi)容交換 : 可以根據(jù)請(qǐng)求(request)的任何一部分 來(lái)選擇一組服務(wù)器, 比如請(qǐng)求的 URI , Host頭(header) , cookie , 以及其他任何東西. 當(dāng)然,對(duì)那些靜態(tài)分離的站點(diǎn)來(lái)說(shuō),對(duì)此特性還有更多的需求。
l???????? 全透明代理 : 可以用 客戶端IP地址 或者任何其他地址來(lái)連接后端服務(wù)器. 這個(gè)特性僅在Linux 2.4/2.6內(nèi)核打了cttproxy 補(bǔ)丁后才可以使用. 這個(gè)特性也使得為某特殊服務(wù)器處理部分流量同時(shí)又不修改服務(wù)器的地址成為可能。
?
l???????? 基于樹的更快的調(diào)度器 : 1.2.16以上的版本要求所有的超時(shí)都設(shè)成同樣的值以支持?jǐn)?shù)以萬(wàn)計(jì)的全速連接. 這個(gè)特性已經(jīng)移植到1.2.17.
l???????? 內(nèi)核TCP拼接 : 避免了內(nèi)核到用戶然后用戶到內(nèi)核端的數(shù)據(jù)拷貝, 提高了吞吐量同時(shí)又降低了CPU使用率 . Haproxy 1.3支持Linux L7SW 以滿足在商用硬件上數(shù)Gbps 的吞吐的需求。
l???????? 連接拒絕 : 因?yàn)榫S護(hù)一個(gè)連接的打開的開銷是很低的,有時(shí)我們很需要限制攻擊蠕蟲(attack bots),也就是說(shuō)限制它們的連接打開從而限制它們的危害。 這個(gè)已經(jīng)為一個(gè)陷于小型DDoS攻擊的網(wǎng)站開發(fā)了而且已經(jīng)拯救了很多站點(diǎn)。
l???????? 細(xì)微的頭部處理 : 使得編寫基于header的規(guī)則更為簡(jiǎn)單,同時(shí)可以處理URI的某部分。
l???????? 快而可靠的頭部處理 : 使用完全RFC2616 兼容的完整性檢查對(duì)一般的請(qǐng)求全部進(jìn)行分析和索引僅僅需要不到2ms 的時(shí)間。
l???????? 模塊化設(shè)計(jì) : 允許更多人加入進(jìn)此項(xiàng)目,調(diào)試也非常簡(jiǎn)單. poller已經(jīng)分離, 已經(jīng)使得它們的開發(fā)簡(jiǎn)單了很多. HTTP已經(jīng)從TCP分離出來(lái)了,這樣增加新的七層特性變得非常簡(jiǎn)單. 其他子系統(tǒng)也會(huì)很快實(shí)現(xiàn)模塊化
l???????? 投機(jī)I/O 處理 : 在一個(gè)套接字就緒前就嘗試從它讀取數(shù)據(jù)。poller僅推測(cè)哪個(gè)可能就緒哪個(gè)沒有,嘗試猜測(cè),并且如果成功,一些開銷很大的系統(tǒng)調(diào)用就可以省去了。如果失敗,就會(huì)調(diào)用這些系統(tǒng)調(diào)用。已知的使用Linux epoll()已經(jīng)凈提升起碼10%了。
l???????? ACLs : 使用任意規(guī)則的任意組合作為某動(dòng)作的執(zhí)行條件。
?
l???????? TCP 協(xié)議檢查 : 結(jié)合ACL來(lái)對(duì)請(qǐng)求的任意部分進(jìn)行檢查,然后再進(jìn)行轉(zhuǎn)發(fā)。這就可以執(zhí)行協(xié)議驗(yàn)證而不是盲目的進(jìn)行轉(zhuǎn)發(fā)。比如說(shuō)允許SSL但拒絕SSH。
?
l???????? 更多的負(fù)載均衡算法 : 現(xiàn)在,動(dòng)態(tài)加權(quán)輪循(Dynamic Round Robin),加權(quán)源地址哈希(Weighted Source Hash),加權(quán)URL哈希和加權(quán)參數(shù)哈希(Weighted Parameter Hash)已經(jīng)實(shí)現(xiàn)。其他算法比如Weighted Measured Response Time也很快會(huì)實(shí)現(xiàn)。?
?
安裝和配置?
Haproxy 的配置相當(dāng)簡(jiǎn)單,
?
從官方網(wǎng)站:http://www.haproxy.org 下載最新版本。
?
# wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz
# tar zcvf haproxy-1.3.20.tar.gz
# cd haproxy-1.3.20
# make TARGET=linux26 PREFIX=/usr/local/haprpxy
# make install PREFIX=/usr/local/haproxy
?
安裝完畢后,進(jìn)入安裝目錄創(chuàng)建配置文件
# cd /usr/local/haproxy?
# vi haproxy.cfg
?
配置內(nèi)容如下:
global
??????? log 127.0.0.1?? local0
??????? #log 127.0.0.1? local1 notice
??????? #log loghost??? local0 info
??????? maxconn 4096
??????? chroot /usr/local/haproxy
??????? uid 99????????????????????????? #所屬運(yùn)行的用戶uid
??????? gid 99????????????????????????? #所屬運(yùn)行的用戶組
??????? daemon
??????? nbproc 1
??????? pidfile /usr/local/haproxy/run/haproxy.pid
??????? #debug
??????? #quiet
defaults
??????? log???? global
??????? log???? 127.0.0.1?????? local3??????? #日志文件的輸出定向
??????? mode??? http??????????????????????????? #所處理的類別
??????? option? httplog??????????????????????? #日志類別
??????? option? httpclose
??????? option? dontlognull
??????? option? forwardfor
??????? option? redispatch
??????? retries 2????????????????????? #設(shè)置多個(gè)haproxy并發(fā)進(jìn)程提高性能
??????? maxconn 2000
??????? balance roundrobin???????????????????? #負(fù)載均衡算法
??????? stats?? uri???? /haproxy-stats??????? #haproxy 監(jiān)控頁(yè)面的訪問(wèn)地址
??????? # 可通過(guò) http://localhost:1080/haproxy-stats 訪問(wèn)
??????? contimeout????? 5000
??????? clitimeout????? 50000
??????? srvtimeout????? 50000
listen? localhost 0.0.0.0:1080?????????????????? #運(yùn)行的端口及主機(jī)名
??????? mode??? http
??????? option? httpchk GET /index.htm?????????? #健康檢測(cè)
??????? server? s1 127.0.0.1:3121 weight 3 check? #后端的主機(jī) IP &權(quán)衡
??????? server? s2 127.0.0.1:3122 weight 3 check? #后端的主機(jī) IP &權(quán)衡
?
啟動(dòng)服務(wù):
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
重啟服務(wù):
# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`? (沒有換行)
停止服務(wù):
# killall haproxy
當(dāng)然,為了方便系統(tǒng)在開機(jī)時(shí)加載,還可以創(chuàng)建啟動(dòng)腳本:
# vim /etc/rc.d/init.d/haproxy? 內(nèi)容如下:
#! /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
保存后賜予可執(zhí)行權(quán)限
# chmod +x /etc/rc.d/init.d/haproxy
就可以使用 service haproxy start|stop|restart 來(lái)控制服務(wù)的啟動(dòng)停止跟重啟。
并通過(guò)以下命令加載到開機(jī)服務(wù)啟動(dòng)列表
# chkconfig --add haproxy
配置日志:
# vim /etc/syslog.conf
在最下邊增加
local3.*???????? /var/log/haproxy.log
local0.*???????? /var/log/haproxy.log
重啟核心日志服務(wù)使配置起效
# 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"
應(yīng)用舉例
?
WEB 均衡負(fù)載 & 虛擬主機(jī)?
重新打開配置文件 haproxy.cfg,留意最下部分的均衡主機(jī)選項(xiàng)
listen? localhost 0.0.0.0:1080?????????????????? #運(yùn)行的端口及主機(jī)名
?? mode??? http
?? option? httpchk GET /index.htm????????????? #用于健康檢測(cè)的后端頁(yè)面
?? server? s1 127.0.0.1:3121 weight 3 check??? #后端的主機(jī) IP &權(quán)衡
?? server? s2 127.0.0.1:3122 weight 3 check??? #后端的主機(jī) IP &權(quán)衡
在實(shí)驗(yàn)中,我們的的后端是 squid 分開了2個(gè)端口在同一臺(tái)服務(wù)器上。
以其中一項(xiàng)為例:
server? s1 127.0.0.1:3121 weight 3 check
s1???????????? 是可自己定義的服務(wù)器別名
127.0.0.1:3121?? 服務(wù)器的IP地址以及端口號(hào)
weight 3??????? 所能分配到請(qǐng)求的高低權(quán)衡,數(shù)字越大分配到的請(qǐng)求數(shù)就越高
check????????? 接受 haproxy 的定時(shí)檢查,以確定后端服務(wù)器的健康情況。
如需配置虛擬主機(jī),相當(dāng)簡(jiǎn)單,緊需修改 localhost 為你虛擬主機(jī)的的域名,加到haproxy配置中, 再為其分配后端服務(wù)器的參數(shù)即可。
?例:
listen? www.x1.com 0.0.0.0:1080??????????????????? #運(yùn)行的端口及主機(jī)名
?? mode??? http
?? option? httpchk GET /index.htm????????????? #用于健康檢測(cè)的后端頁(yè)面
?? server? s1 127.0.0.1:3121 weight 3 check? #后端的主機(jī) IP &權(quán)衡
?? server? s2 127.0.0.1:3122 weight 3 check? #后端的主機(jī) IP &權(quán)衡
listen? www.x2.com 0.0.0.0:1080???????????????????? #運(yùn)行的端口及主機(jī)名
?? mode??? http
?? option? httpchk GET /index.htm???????????????????? #用于健康檢測(cè)的后端頁(yè)面
?? server? s1 127.0.0.1:3121 weight 3 check?????? #后端的主機(jī) IP &權(quán)衡
?? server? s2 127.0.0.1:3122 weight 3 check?????? #后端的主機(jī) IP &權(quán)衡
保存配置后重新加載,即可生效,刷新管理頁(yè)面也可看到新的虛擬主機(jī)。?
性能對(duì)比
在此,我們用最近最火紅的 http 兼前端WEB均衡負(fù)載服務(wù)器 Nginx 與 Haproxy 做個(gè)簡(jiǎn)單的性能對(duì)比。?
測(cè)試環(huán)境:
CPU:Xeon2.8G X2?
RAM:4G
OS:RedHat As5.3 X64
工具:apache ab
參數(shù):ab -i -c 500 -n 100000? (500并發(fā),1W請(qǐng)求)
最終服務(wù)端:2個(gè)squid 需實(shí)現(xiàn)均衡負(fù)載
成績(jī)?nèi)缦?#xff1a;
####### Nginx + haproxy :? (由Nginx通過(guò)反向代理發(fā)送請(qǐng)求至haproxy, 并由其進(jìn)行均衡負(fù)載)
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 :? (單獨(dú)由haproxy進(jìn)行均衡負(fù)載)
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 : (單獨(dú)由nginx進(jìn)行均衡負(fù)載)
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
?
反復(fù)測(cè)試,得出其結(jié)果:
Haproxy 單獨(dú)進(jìn)行均衡負(fù)載的性能最強(qiáng),超過(guò)了Nginx。
然而 Nginx + Haproxy 的搭配性能最弱,應(yīng)該是跟通過(guò)了2層反向代理有關(guān)。
所以想用 Haproxy 替代 Nginx 所自帶的均衡負(fù)載功能將會(huì)令性能打折。
但雖然如此 Haproxy 對(duì)均衡負(fù)載功能遠(yuǎn)比 Nginx 成熟,例如session粘貼,cookies 引導(dǎo)等都是 nginx 所沒有的。
可根據(jù)需要而選擇搭配。
相關(guān)啟動(dòng)參數(shù)介紹
相關(guān)啟動(dòng)參數(shù)介紹?
?? #./haproxy –help //haproxy相關(guān)命令參數(shù)介紹.
?? haproxy? -f? <配置文件>?
[-n 最大并發(fā)連接總數(shù)] [-N 每個(gè)偵聽的最大并發(fā)數(shù)] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-s] [-l] [-dk]
?????? [-ds] [-de] [-dp] [-db] [-m <內(nèi)存限制M>] [{-sf|-st} pidlist...]
?????? -d???? 前臺(tái),debug模式?
?????? -D???? daemon模式啟動(dòng)?
?????? -q???? 安靜模式,不輸出信息
?????? -V???? 詳細(xì)模式
?????? -c???? 對(duì)配置文件進(jìn)行語(yǔ)法檢查
?????? -s???? 顯示統(tǒng)計(jì)數(shù)據(jù)
?????? -l???? 顯示詳細(xì)統(tǒng)計(jì)數(shù)據(jù)
?????? -dk??? 不使用kqueue
?????? -ds??? 不使用speculative epoll
?????? -de??? 不使用epoll
?????? -dp??? 不使用poll
?????? -db??? 禁用后臺(tái)模式,程序跑在前臺(tái)
?????? -sf <pidlist>
?????? 程序啟動(dòng)后向pidlist里的進(jìn)程發(fā)送FINISH信號(hào),這個(gè)參數(shù)放在命令行的最后
?????? -st <pidlist>
?????? 程序啟動(dòng)后向pidlist里的進(jìn)程發(fā)送TERMINATE信號(hào),這個(gè)參數(shù)放在命令行的最后
參考資源 (resources)
本文僅作為引子,Haproxy 配置以其功能遠(yuǎn)遠(yuǎn)不止這些。更多資料可到以下網(wǎng)站中獲取。
?
·???????? Haproxy 中文 http://cn.haproxy.org
·???????? Haproxy 英文 http://www.haproxy.org
·???????? 中國(guó)開源社區(qū) http://www.oschina.net
?
轉(zhuǎn)載出自:開源中國(guó)社區(qū)(http://www.oschina.net)
總結(jié)
以上是生活随笔為你收集整理的千万级并发HAproxy均衡负载系统介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 打瘦脸多少钱啊?
- 下一篇: 什么是A记录、MX记录、CNAME记录