HAproxy均衡負載部署和配置文件詳解

HAProxy提供高可用性負載均衡以及基於TCPHTTP應用的代理,支持虛擬主機,它是免費、快速並且可靠的一種解決方案。根據官方數據,其最高極限支持10G的併發。 

 

HAProxy特別適用於那些負載特大的web站點, 這些站點通常又需要會話保持或七層處理。HAProxy運行在當前的硬件上,完全可以支持數以萬計的併發連接。並且它的運行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的web服務器不被暴露到網絡上。

  

 

其支持從4層至7層的網絡交換,即覆蓋所有的TCP協議。就是說,Haproxy 甚至還支持 Mysql 的均衡負載。

如果說在功能上,能以proxy反向代理方式實現 WEB均衡負載,這樣的產品有很多。包括NginxApacheProxylighttpdCheroke 等。 

但要明確一點的,Haproxy 並不是 Http 服務器。以上提到所有帶反向代理均衡負載的產品,都清一色是 WEB 服務器。簡單說,就是他們能自個兒提供靜態(html,jpg,gif..)或動態(php,cgi..)文件的傳輸以及處理。而Haproxy 僅僅,而且專門是一款的用於均衡負載的應用代理。其自身並不能提供http服務。 

 

但其配置簡單,擁有非常不錯的服務器健康檢查功能還有專門的系統狀態監控頁面,當其代理的後端服務器出現故障, HAProxy會自動將該服務器摘除,故障恢復後再自動將該服務器加入。1.3版本開始還引入了frontend,backend,frontend根據任意HTTP請求頭內容做規則匹配,然後把請求定向到相關的backend 

 

另外版本1.3 是處於活躍開發階段的版本它支持如下新特性:

 

l         內容交換 : 可以根據請求(request)的任何一部分 來選擇一組服務器比如請求的 URI , Host(header) , cookie , 以及其他任何東西.當然,對那些靜態分離的站點來說,對此特性還有更多的需求。 

l         全透明代理 : 可以用 客戶端IP地址 或者任何其他地址來連接後端服務器這個特性僅在Linux 2.4/2.6內核打了cttproxy 補丁後纔可以使用這個特性也使得爲某特殊服務器處理部分流量同時又不修改服務器的地址成爲可能。
 

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也很快會實現。 

安裝:

        1、從官網 http://haproxy.1wt.eu/#down 下載最新版本,如  haproxy-1.4.16.tar.gz   
        2、解壓縮, # tar zcvf haproxy-1.4.16.tar.gz  建議移動到工作目錄  /usr/local/haproxy/ 下,否則後續安裝時還要用PREFIX=/usr/local/haprpxy指定安裝路徑
        3、運行 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 做個簡單的性能對比。 

測試環境:

CPUXeon2.8G X2 
RAM
4G
OSRedHat As5.3 X64

工具:apache ab
參數:ab -i -c 500 -n 100000  (500併發,1W請求
)
最終服務端:2squid 需實現均衡負載

成績如下:

####### 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章