详解HaProxy
簡介:
軟件負載均衡一般通過兩種方式來實現(xiàn):基于操作系統(tǒng)的軟負載實現(xiàn)和基于第三方應用的軟負載實現(xiàn)。LVS就是基于Linux操作系統(tǒng)實現(xiàn)的一種軟負載,HAProxy就是開源的并且基于第三應用實現(xiàn)的軟負載。
HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當 前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用于郵件服務器、內(nèi)部協(xié)議通信服務器等),和7層(HTTP)。在4層模式 下,HAproxy僅在客戶端和服務器之間轉發(fā)雙向流量。7層模式下,HAProxy會分析協(xié)議,并且能通過允許、拒絕、交換、增加、修改或者刪除請求 (request)或者回應(response)里指定內(nèi)容來控制協(xié)議,這種操作要基于特定規(guī)則。
詳情可以在HAProxy官方網(wǎng)站(http://haproxy.1wt.eu)可以下載配置說明文檔(configuration.txt)和架構文件(architecture.txt)作為參考。
1. HAProxy的安裝
在“http://haproxy.1wt.eu/#down”下載HAProxy的源碼包。這里以1.3.20版本,安裝在目錄/home/admin/haproxy為例
解壓下載的源碼包
tar -xzvf haproxy-1.3.20.tar.gz
2.編譯安裝
進入解壓后的源碼目錄
make TARGET=linux26 PREFIX=/home/admin/haproxy install
(注意,TARGET后面根據(jù)本機操作系統(tǒng)內(nèi)核版本來填寫,PREFIX是要安裝到的目錄)
安裝完成后會在安裝目錄下生成doc ,sbin ,share三個文件夾。解壓的源碼文件也可以刪除掉。
3.創(chuàng)建配置文件
在安裝目錄下建立配置文件目錄
mkdir conf
在新創(chuàng)建的目錄下創(chuàng)建配置文件
vi haproxy.cfg
在創(chuàng)建的haproxy.cfg文件中填入
global?
log 127.0.0.1 local0 info #[err warning info debug]?
maxconn 4096
user admin
group admin
daemon
nbproc 1
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults?
maxconn 2000
contimeout 5000
clitimeout 30000
srvtimeout 30000
listen admin_stats
bind 0.0.0.0:1080
mode http
log 127.0.0.1 local0 err
stats uri /admin?stats
這個配置是能讓HAProxy工作起來的最小配置
4.啟動HAProxy
進入安裝目錄下的sbin目錄
啟動HAProxy
./haproxy -f ../conf/haproxy.cfg
通過瀏覽器訪問“http://xxx.xxx.xxx.xxx:1080/admin?stats“(xxx為IP),看到管理頁面
5.修改haproxy啟動文件權限
(如果你是用ROOT用戶啟動HAProxy,這步可以省略,這個步驟是為了能讓非ROOT用戶也能通過HAProxy監(jiān)聽80端口,因為LIUNX的80端口一定要使用ROOT賬戶啟動)
使用root賬戶進入sbin目錄
更改haproxy的所有者為root
chown root:root haproxy
給haproxy增加S權限
chmod u+s haproxy
6.配置日志
創(chuàng)建日志目錄
使用非root賬戶這里是admin賬戶創(chuàng)建日志文件
mkdir /home/admin/haproxy/logs
修改操作系統(tǒng)的日志配置
HAProxy可以收集本機及其他后端服務器日志,但是需要在HAProxy和操作系統(tǒng)上作一些配置。
使用root賬戶首先修改/etc/sysconfig/syslog文件,將SYSLOGD_OPTIONS="-m 0” 修改為SYSLOGD_OPTIONS="-m 0 -r -x",支持收集遠程服務器日志。
然后修改/etc/syslog.conf,增加如下語句:
local0.* /home/admin/haproxy/logs/haproxy.log // haproxy.log地址代表了需要存儲日志的地址,其中l(wèi)ocal0這個級別要和haproxy.cfg配置的log級別一樣
執(zhí)行service syslog restart,重新啟動系統(tǒng)日志器
更改日志文件用戶
chown admin:admin /home/admin/haproxy/logs/haproxy.log
7.創(chuàng)建啟動/停止腳本(如果你認為現(xiàn)在的啟動腳本已經(jīng)夠方便了,這步可以省略)
為了方便以后啟動或停止,所以編寫一個啟動腳本
在sbin目錄下創(chuàng)建hactl.sh
vi hactl.sh
填入一下內(nèi)容
#!/bin/sh#?
cd `dirname $0`/..
BASE_DIR="`pwd`"
ARGV="$@"
start()
{
echo "START HAPoxy SERVERS"
$BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.cfg
}
stop()
{?
#haproxy.pid的路徑是haproxy.cfg文件中配置的
echo "STOP HAPoxy Listen"
kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)
echo "STOP HAPoxy process"
kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)
}
case $ARGV in
start)
start
ERROR=$?
;;?
stop)
stop
ERROR=$?
;;?
restart)
stop
start
ERROR=$?
;;?
*)?
echo "hactl.sh [start|restart|stop]"
esac
exit $ERROR
保存后,給hactl.sh增加可執(zhí)行權限
chmod 755 hactl.sh
這樣就可以使用./ hactl.sh [start|restart|stop] 的方式啟動,關閉,重啟了,如果你使用的目錄和例子中不一樣的話,需要自己對應的修改下以上腳本的目錄地址
經(jīng)過以上1-6步驟以后HAProxy的安裝已經(jīng)結束,之后就是詳細的配置下haproxy.cfg文件了
2. HAProxy的配置
HAProxy配置中分成五部分內(nèi)容,當然這些組件不是必選的,可以根據(jù)需要選擇部分作為配置。
global:參數(shù)是進程級的,通常和操作系統(tǒng)(OS)相關。這些參數(shù)一般只設置一次,如果配置無誤,就不需要再次配置進行修改
defaults:配置默認參數(shù)的,這些參數(shù)可以被利用配置到frontend,backend,listen組件
frontend:接收請求的前端虛擬節(jié)點,Frontend可以根據(jù)規(guī)則直接指定具體使用后端的 backend(可動態(tài)選擇)。
backend:后端服務集群的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器。
listen:Frontend和Backend的組合體。
下面是HAProxy的一些常用的配置,這個配置是用來說明HAProxy的一些常用功能的配置,具體詳細配置請查看安裝目錄下的doc目錄下的文檔文件,或者到” http://cn.haproxy.org/”
下載中文配置說明文檔
配置文件例子:
global
#全局的日志配置 其中日志級別是[err warning info debug]
#local0 是日志設備,必須為如下24種標準syslog設備的一種:?
#kern user mail daemon auth syslog lpr news?
#uucp cron auth2 ftp ntp audit alert cron2?
#local0 local1 local2 local3 local4 local5 local6 local7?
#但是之前在/etc/syslog.conf文件中定義的是local0所以
#這里也是用local0
log 127.0.0.1 local0 info #[err warning info debug]
#最大連接數(shù)
maxconn 4096
#用戶
user admin
#組
group admin
#使HAProxy進程進入后臺運行。這是推薦的運行模式
daemon
#創(chuàng)建4個進程進入deamon模式運行。此參數(shù)要求將運行模式設置為"daemon"
nbproc 4
#將所有進程的pid寫入文件 啟動進程的用戶必須有權限訪問此文件。
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults?
#默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
mode http
#采用http日志格式
option httplog
#三次連接失敗就認為是服務器不可用,也可以通過后面設置
retries 3
如果cookie寫入了serverId而客戶端不會刷新cookie,
#當serverId對應的服務器掛掉后,強制定向到其他健康的服務器
option redispatch
#當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
option abortonclose
#默認的最大連接數(shù)
maxconn 4096
#連接超時
contimeout 5000
#客戶端超時
clitimeout 30000
#服務器超時
srvtimeout 30000
#=心跳檢測超時
timeout check 2000
#注:一些參數(shù)值為時間,比如說timeout。時間值通常單位為毫秒(ms),但是也可以通過加#后綴,來使用其他的單位。
#- us : microseconds. 1 microsecond = 1/1000000 second
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
#- s : seconds. 1s = 1000ms
#- m : minutes. 1m = 60s = 60000ms
#- h : hours. 1h = 60m = 3600s = 3600000ms
#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
########統(tǒng)計頁面配置############
listen admin_stats
#監(jiān)聽端口
bind 0.0.0.0:1080
#http的7層模式
mode http
#日志設置
log 127.0.0.1 local0 err #[err warning info debug]
#統(tǒng)計頁面自動刷新時間
stats refresh 30s
#統(tǒng)計頁面url
stats uri /admin?stats
#統(tǒng)計頁面密碼框上提示文本
stats realm Gemini/ Haproxy
#統(tǒng)計頁面用戶名和密碼設置
stats auth admin:admin
stats auth admin1:admin1
#隱藏統(tǒng)計頁面上HAProxy的版本信息
stats hide-version
#######網(wǎng)站檢測listen定義############
listen site_status
bind 0.0.0.0:1081
mode http
log 127.0.0.1 local0 err #[err warning info debug]
#網(wǎng)站健康檢測URL,用來檢測HAProxy管理的網(wǎng)站是否可以用,正常返回200,不正常返回500
monitor-uri /site_status
#定義網(wǎng)站down時的策略
#當掛在負載均衡上的指定backend的中有效機器數(shù)小于1臺時返回true
acl site_dead nbsrv(denali_server) lt 1
acl site_dead nbsrv(tm_server) lt 1?
acl site_dead nbsrv(mms_server) lt 1
#當滿足策略的時候返回500
monitor fail if site_dead
#如果192.168.0.252或者192.168.0.31這兩天機器掛了
#認為網(wǎng)站掛了,這時候返回500,判斷標準是如果mode是
#http返回200認為是正常的,如果mode是tcp認為端口暢通是好的
monitor-net 192.168.0.252/31
?
########frontend配置############
frontend http_80_in
#監(jiān)聽端口
bind 0.0.0.0:80
#http的7層模式
mode http
#應用全局的日志配置
log global
#啟用http的log
option httplog
#每次請求完畢后主動關閉http通道,HA-Proxy不支持keep-alive模式
option httpclose
#如果后端服務器需要獲得客戶端的真實IP需要配置次參數(shù),將可以從Http Header中
#獲得客戶端IP
option forwardfor
###########HAProxy的日志記錄內(nèi)容配置##########
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
?
####################acl策略定義#########################
#如果請求的域名滿足正則表達式返回true -i是忽略大小寫
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
#如果請求域名滿足trade.gemini.taobao.net 返回 true -i是忽略大小寫
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
##在請求url中包含sip_apiname=,則此控制策略返回true,否則為false
acl invalid_req url_sub -i sip_apiname=
##在請求url中存在timetask作為部分地址路徑,則此控制策略返回true,否則返回false
acl timetask_req url_dir -i timetask
#當請求的header中Content-length等于0時返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
?
######################acl策略匹配相應###################
##當請求中header中Content-length等于0 阻止請求返回403
block if missing_cl
##block表示阻止請求,返回403錯誤,當前表示如果不滿足策略invalid_req,或者滿足策略timetask_req,則阻止請求。?
block if !invalid_req || timetask_req?
#當滿足denali_policy的策略時使用denali_server的backend
use_backend denali_server if denali_policy
#當滿足tm_policy的策略時使用tm_server的backend
use_backend tm_server if tm_policy
#reqisetbe關鍵字定義,根據(jù)定義的關鍵字選擇backend
reqisetbe ^Host:/ img dynamic
reqisetbe ^[^/ ]*/ /(img|css)/ dynamic
reqisetbe ^[^/ ]*/ /admin/stats stats
#以上都不滿足的時候使用默認mms_server的backend
default_backend mms_server
#HAProxy錯誤頁面設置
errorfile 400 /home/admin/haproxy/errorfiles/400.http
errorfile 403 /home/admin/haproxy/errorfiles/403.http
errorfile 408 /home/admin/haproxy/errorfiles/408.http
errorfile 500 /home/admin/haproxy/errorfiles/500.http
errorfile 502 /home/admin/haproxy/errorfiles/502.http
errorfile 503 /home/admin/haproxy/errorfiles/503.http
errorfile 504 /home/admin/haproxy/errorfiles/504.http
##########backend的設置##############
backend mms_server
#http的7層模式
mode http
#負載均衡的方式,roundrobin平均方式
balance roundrobin
#允許插入serverid到cookie中,serverid后面可以定義
cookie SERVERID
#心跳檢測的URL,HTTP/1.1rnHost:XXXX,指定了心跳檢測HTTP的版本,XXX為檢測時請求
#服務器的request中的域名是什么,這個在應用的檢測URL對應的功能有對域名依賴的話需要設置
option httpchk GET /member/login.jhtml HTTP/1.1/r/nHost:member1.gemini.taobao.net
#服務器定義,cookie 1表示serverid為1,check inter 1500 是檢測心跳頻率
#rise 3是3次正確認為服務器可用,fall 3是3次失敗認為服務器不可用,weight代表權重
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
backend denali_server
mode http
#負載均衡的方式,source根據(jù)客戶端IP進行哈希的方式
balance source
#但設置了backup的時候,默認第一個backup會優(yōu)先,設置option allbackups后
#所有備份服務器權重一樣
option allbackups
#心跳檢測URL設置
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1/r/nHost:my.gemini.taobao.net
#可以根據(jù)機器的性能不同,不使用默認的連接數(shù)配置而使用自己的特殊的連接數(shù)配置
#如minconn 10 maxconn 20
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
#備份機器配置,正常情況下備機不會使用,當主機的全部服務器都down的時候備備機會啟用
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
backend tm_server
mode http
#負載均衡的方式,leastconn根據(jù)服務器當前的請求數(shù),取當前請求數(shù)最少的服務器
balance leastconn
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1/r/nHost:trade.gemini.taobao.ne
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
######reqisetbe自定義關鍵字匹配backend部分#######################
backend dynamic
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1/r/nHost:www.taobao.net
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
backend stats
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1/r/nHost:www.taobao.net
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
3. HA-Proxy的壓力測試結果
簡單的壓力測試采用Apache ab,500并發(fā)用戶,10w的請求總數(shù)。
總耗時(s)
TPS(#/sec)
HA-2Node
21.387
4675.61
HA-5Node
27.371
3653.37
HA-2Node為配置了兩個節(jié)點作為后段的服務節(jié)點,HA-5Node為配置了5個節(jié)點作為后端的服務處理節(jié)點。上面結果看到2個節(jié)點的HA比5個節(jié)點的速度來的快。可以確定的是
HAProxy的性能是跟隨backend的數(shù)量增加而下降,所以當backend節(jié)點過多時可以考慮通過拆分到多臺HAProxy來提高性能。
轉載于:https://blog.51cto.com/mypchome/1558907
總結
- 上一篇: 操作 Wave 文件(14): wave
- 下一篇: [翻译] TWRPickerSlider