千萬級高並發負載均衡軟件haproxy配置文件詳解


 

balance roundrobin         #輪詢方式

balance source               #將用戶IP經過hash計算后,使同一IP地址的所有請求都發送到同一固定的后端真實服務器上,與nginx的ip_hash相同,都是為了解決haproxy與客戶端session一致性的問題

balance leastconn           #最小連接

 

--------------------------------------------------------------------------------

 10.0.3.121:8080 ----->10.0.3.122:9090

用haproxy做端口轉發實現以上功能:

global
maxconn 40000
#debug #調試模式,輸出啟動信息到標准輸出
#quiet     #安靜模式,啟動時無輸出
user allison
group users
nbproc 1
log 127.0.0.1 local3
spread-checks 2
defaults
option srvtcpka
option clitcpka
option tcpka
 
#以下幾個timeout值注意不能設置太短,否則客戶端和服務端連接容易斷掉,默認單位:毫秒
timeout server 300s
timeout connect 300s
timeout client 300s
timeout http-request 300s
timeout queue 300s
listen yuan 10.0.3.121:8080

mode tcp
option persist #強制將http請求發往已經down 掉的server
server mubiao 10.0.3.122:9090 weight 256

---------------------------------------------------------------------------------------------------------------------------------------

#HAProxy配置中分成五部分內容,當然這些組件不是必選的,可以根據需要選擇部分作為配置。 

#global:參數是進程級的,通常和操作系統(OS)相關。這些參數一般只設置一次,如果配置無誤,就不需要再次配置進行修改 

#defaults:配置默認參數的,這些參數可以被利用配置到frontend,backend,listen組件。而如果在frontend、backend和listen部分中也配置了與defaults部分一樣的參數,那么default部分參數對應的值自動被覆蓋。

#frontend:接收請求的前端虛擬節點,Frontend可以根據規則直接指定具體使用后端的backend(可動態選擇)。 

#backend:后端服務集群的配置,是真實的服務器,一個Backend對應一個或者多個實體服務器。 

#listen:Frontend和Backend的組合體

 

      軟件負載均衡一般通過兩種方式來實現:基於操作系統的軟負載實現和基於第三方應用的軟負載實現。LVS就是基於Linux操作系統實現的一種軟負載,HAProxy就是開源的並且基於第三應用實現的軟負載。

  HAProxy相比LVS的使用要簡單很多,功能方面也很豐富。當前,HAProxy支持兩種主要的代理模式:"tcp"也即4層(大多用於郵 件服務器、內部協議通信服務器等),和7層(HTTP)。在4層模式下,HAproxy僅在客戶端和服務器之間轉發雙向流量。7層模式下,HAProxy 會分析協議,並且能通過允許、拒絕、交換、增加、修改或者刪除請求(request)或者回應(response)里指定內容來控制協議,這種操作要基於特定規則。

另外,Haproxy也可用於MySQL數據庫(讀操作)的負載均衡。

 

配置:    # 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                 #啟動3個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        #保證HAProxy不記錄上級負載均衡發送過來的用於檢測狀態沒有數據的心跳包
        option  forwardfor         #如果后端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip

        option  redispatch     #是否允許重新分配在session 失敗后
        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

 

重新打開配置文件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 &權衡

保存配置后重新加載,即可生效,刷新管理頁面也可看到新的虛擬主機。

 

 

反復測試,得出其結果:
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

------------------------------------------------------------------------------------------------

#acl 參數
acl(關鍵字) 定義acl(名稱)  方法           -i (忽略大小寫)  [匹配的路徑或文件]
                           hdr_beg(host)
                          hdr_reg(host)
                          path_beg
                          path_end
 
 
 
另附一我自己的實例: 
復制代碼
  1 global
  2         log 127.0.0.1 local3 debug
  3         maxconn 50000   
  4         chroot /usr/local/haproxy
  5         uid 99   
  6         gid 99   
  7         daemon  
  8         nbproc 4
  9         pidfile /usr/local/haproxy/haproxy.pid  
 10 #######
 11 defaults
 12         log     global
 13         mode    http
 14         option  dontlognull
 15         retries 3
 16         option redispatch
 17         maxconn 50000
 18         timeout connect    5000
 19         timeout client     50000
 20         timeout server     50000
 21 ######
 22 
 23 
 24 frontend http-in
 25          bind *:80   
 26          acl push dst 10.2.1.106
 27          acl match  dst 10.2.1.107
 28          acl social dst  10.2.1.108
 29          acl promotion dst  10.2.1.109
 30          acl cms dst  10.2.1.111
 31          acl cms-web dst 10.2.1.119
 32          #acl cms dst  10.2.1.111
 33          #errorfile 404 /usr/local/haproxy/html/404.html
 34 
 35          use_backend Push if push    
 36          use_backend Match if match
 37          use_backend Social if social
 38          use_backend Promotion  if promotion 
 39          use_backend CMS  if cms
 40          
 41 backend  Push    
 42          balance roundrobin    
 43          cookie SERVERID insert nocache indirect 
 44          option httpclose    
 45          option forwardfor   header X-Forwarded-For      
 46          #如果服務器上的應用程序想記錄發起請求的客戶端的IP地址,需要在HAProxy上配置此選項,這樣HAProxy會把客戶端的IP信息發送給服務器,在HTTP請求中添加"X-Forwarded-For"字段
 47          server 10.2.1.53-PS 10.2.1.53:8094 backup check inter 5000 fall 1 rise 2 
 48          server 10.2.1.54-PS 10.2.1.54:8094  check inter 5000 fall 1 rise 2   
 49          #check inter 5000 是檢測心跳頻率,rise 2是2次正確認為服務器可用,fall 1是1次失敗認為服務器不可用,weight代表權重
 50          timeout server     50000 
 51          
 52 backend  Match    
 53          balance roundrobin    
 54          cookie SERVERID insert nocache indirect 
 55          option httpclose    
 56          option forwardfor   header X-Forwarded-For 
 57          server 10.2.1.53-MC 10.2.1.53:8992 backup check inter 5000 fall 1 rise 2
 58          server 10.2.1.54-MC 10.2.1.54:8992  check inter 5000 fall 1 rise 2 59  
   timeout server 50000 60 61 backend Social 62 balance roundrobin 63 cookie SERVERID insert nocache indirect 64 option httpclose 65 option forwardfor header X-Forwarded-For 66 server 10.2.1.53-weibo 10.2.1.53:25100 check inter 5000 fall 1 rise 2 67 server 10.2.1.54-weibo 10.2.1.54:25100 backup check inter 5000 fall 1 rise 2 68 timeout server 50000 69 70 backend CMS 71 balance roundrobin 72 cookie SERVERID insert nocache indirect 73 option httpclose 74 option forwardfor header X-Forwarded-For 75 server 10.2.1.53-CMS 10.2.1.53:9981 check inter 5000 fall 1 rise 2 76 server 10.2.1.54-CMS 10.2.1.54:9981 backup check inter 5000 fall 1 rise 2 79 timeout server 50000 80 81 backend Promotion 82 balance roundrobin 83 cookie SERVERID insert nocache indirect 84 option httpclose 85 option forwardfor header X-Forwarded-For 86 server 10.2.1.53-PRO 10.2.1.53:8982 check inter 5000 fall 1 rise 2 87 server 10.2.1.54-PRO 10.2.1.54:8982 backup check inter 5000 fall 1 rise 2 88 timeout server 50000 89 90 91 92 ####### 93 listen localhost 10.2.1.53:18888 94 mode http 95 stats refresh 30s #統計頁面的自動刷新時間 96 stats uri /haproxy-stats #統計頁面的url 97 stats realm Haproxy \ statistic #統計頁面密碼框上提示的文本 98 stats auth admin:uuzz@123 #統計頁面用戶名和密碼設置 99 stats hide-version #隱藏統計頁面上HAProxy的版本信息 100 stats admin if TRUE #手工啟用/禁用,后端服務器
復制代碼

 

 

另:

COOKIE 選項:

cookie JSESSIONID prefix :如果客戶端只支持一個cookie,並且服務器上的應用程序已經對返回設置了cookie,HAProxy設置此選項可以改寫應用程序設置的cookie信息,把服務器的信息添加到原cookie中去。

cookie SERVERID indirect :HAProxy會刪除添加的cookie信息,避免此cookie信息發送到服務器。

cookie SERVERID rewrite :

cookie SERVERID insert :

cookie SERVERID insert nocache :

cookie SERVERID insert postonly :

 

cookie參數設置:  http://dngood.blog.51cto.com/446195/1098105/

 
參考資料:http://www.cnblogs.com/xiaocen/p/3721029.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM