1. 程式人生 > >Haproxy-10萬並發級別負載均衡器

Haproxy-10萬並發級別負載均衡器

haproxy

Haproxy

第1章 前言

首先,我們知道nginx負載均衡集群,LVS負載均衡集群,haproxy負載集群,這三種集群比較來說,LVS性能最好,但是搭建相對復雜,nginxupstream模塊支持集群負載,但是對web節點的健康檢查功能不多,性能也沒有haproxy,這也是haproxy為什麽受歡迎的原因之一!

第2章 Haproxy簡介

1. haproxy是一個使用C語言編寫的開源軟件,支持高可用,負載均衡,以及基於tcphttp的應用程序代理

2. Haproxy特別適用於負載特別大的web站點,這些站點通常又需要會話保持或者7層處理,haproxy完全可以支持數以萬計的並發連接

,並且他的運行模式使得它可以簡答安全的整合到您當前的架構中,保證您的web節點不暴露在網絡上

3. Haproxy實現了一種事件驅動,單一進程模型,此模型支持非常大的並發鏈接數,多進程或多線程模型受內存限制,系統調度器限制以及無處不在的鎖限制,很少能處理數千並發鏈接

4. 事件驅動模型因為在有更好的資源和時間管理的用戶空間,實現所有這些任務,所有沒有這些問題,此模型的缺點是,在多核系統上,這些程序通常擴展性較差,這就是為什麽他們必須進行優化,是每個CPU時間片做更多的工作

第3章 haproxy負載均衡的調度算法:

3.1 目前haproxy支持的調度算法常見有如下幾種

先介紹表動態

hash的特點:

服務器運行時就可進行權重調整,即只需要重新載入配置文件即可,不需要重新啟動haproxy,並且支持慢速啟動,即重新恢復的後端節點不會一次性接受大量請求,而是慢慢增加的

3.1.1 roundrobin:基於權重的輪詢調度

動態加權輪詢算法,支持權重的運行時調整及慢啟動機制,最大支持4095個後端節點,在服務器的處理時間平均分配的情況下這是最流暢和公平的算法

3.1.2 static-rr:不支持動態hash,沒有後端數量限制,基本不用

靜態輪詢算法,不支持權重的運行時調整和慢啟動機制,每個服務器根據權重輪流使用,此種算法對後端節點數量沒有限制

3.1.3 lc:類似於LVSwlc算法

但是這裏是只考慮活動鏈接數

,即選擇活動連接數最少的,最好在長連接會話中使用

3.1.4 source:基於hash表的算法,類似於nginx中的ip_hash

源地址hash算法,對請求源ip地址進行hash,該算法一般用與不能插入cookietcp模式,它還可以用戶廣域網上為拒絕使用會話cookie的客戶端提供最有效的粘連

3.1.5 uri:基於uri生成hash表的算法,主要用於後端節點是緩存服務器的場景

此種方法基於uri進行選擇,如客戶端訪問了http://test.com/a.jpg,那麽在這個uri緩存失效之前,任何一個客戶訪問這個路徑,一定訪問的就是a.jpg

3.1.6 url_params:

根據url的參數來調度,用於將同一個用戶的信息,都發送到同一個後端節點

3.1.7 hdr:header基於頭部的信息來構建hash

基於用戶請求的主機名進行調度

第4章 Haproxy負載均衡的簡單實現

4.1 環境準備:

4.1.1 負載均衡前端:

10.0.0.41   172.16.1.41   backup

4.1.2 後端web服務器端:

10.0.0.17   172.16.1.17   web03
10.0.0.18   172.16.1.18   web04

4.2 yum安裝:

yum –y install haproxy

4.3 配置文件說明:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2     
 
    chroot      /var/lib/haproxy          改變當前工作目錄
    pidfile     /var/run/haproxy.pid      當前進程pid文件
    maxconn     4000                      最大連接數
    user        haproxy                   所屬用戶
    group       haproxy                   所屬用戶組
    daemon                                以守護進程的方式運行haproxy
 
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
 
defaults
    mode                    http          默認的模式tcp:4層;http:7層;health:只會返回OK
    log                     global        應用全局的日誌配置
    option                  httplog       啟用日誌記錄http請求,默認haproxy的日誌是不記錄http請求日誌的
option                  dontlognull   啟動該項,日誌中將不會記錄空鏈接,所謂空鏈接就是在上遊的
負載均衡器或者監控系統為了探測該服務器是否可用時
需要定期的連接或者獲取某一固定的組件或者頁面,
或者探測掃描端口是否在監聽或開放等動作被稱為空鏈接;
    option http-server-close              每次請求完畢後主動關閉http通道
    option forwardfor       except 127.0.0.0/8      如果服務器上的應用程序向記錄發起請求的客戶端的ip地址,需要在haproxy上配置此項,
    option                  redispatch    當時用了cookie時,haproxy會將其請求的後端服務器的server ID插入到cookie中,以保證會話的session持久性,而此時,如果後端的服務器宕掉了,但是客戶端的cookie是不會刷新的,如果設置次參數,會將客戶的請求強制定向到另外一個後端server上,以保證服務正常
retries                 3         定義連接後端服務器的失敗重連次數
連接失敗次數超過此值後將會標記對應後端服務器為不可用
    timeout http-request    10s       http請求超時時間
    timeout queue           1m        一個請求在隊列裏的超時時間
    timeout connect         10s       連接超時
    timeout client          1m        客戶端超時
    timeout server          1m        服務端超時
    timeout http-keep-alive 10s      
    timeout check           10s       檢測超時
    maxconn                 3000      每個進程可用最大連接數
 
frontend  main *:5000                 監聽端口
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
 
    use_backend static          if url_static
default_backend             app              後端web集群組名
 
backend static
balance     roundrobin                       負載均衡算法, balance  roundrobin輪詢 
balance  source保存session值
    server      static 127.0.0.1:4331 check      靜態文件部署在本機
 
backend app
    balance     roundrobin                       負載均衡算法
    server  app1 127.0.0.1:5001 check            定義後端
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

4.4 web服務端部署:

這裏為了快速部署,安裝了httpd,yum安裝即可

4.4.1 創建測試頁面:

echo "172.16.1.17 web03" > /var/www/html/index.html
echo "172.16.1.18 web04" > /var/www/html/index.html

4.4.2 啟動httpd服務:

systemctl start httpd.service

4.4.3 啟動httpd服務後訪問頁面測試一下,確保後端節點訪問正常

技術分享圖片

技術分享圖片

1.1 編寫負載均衡服務器haproxy的配置文件:

[root@backup ~]# vim /etc/haproxy/haproxy.cfg
frontend  http *:80
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
 
    use_backend static          if url_static
    default_backend             web
backend web
    balance     roundrobin
    server  web03 172.16.1.17:80 check
    server  web04 172.16.1.18:80 check


1.2 啟動haproxy服務:

systemctl start haproxy.service

1.3 進行負載測試:

1.3.1 第一次訪問:

技術分享圖片

1.1.1 第二次訪問:

技術分享圖片

1.1 查看httpd服務的日誌:

1.1.1 日誌記錄的是負載均衡的ip地址,而非真實訪問的源IP地址

[root@web03 html]# tail -2 /var/log/httpd/access_log
172.16.1.41 - - [18/Mar/2018:02:28:12 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
172.16.1.41 - - [18/Mar/2018:02:28:13 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"

1.1.2 解決辦法:

找到定義日誌記錄格式的地方:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

修改記錄http訪問的頭部信息:

LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

重啟httpd服務:

systemctl restart httpd.service

1.1.3 在此訪問後驗證:

[root@web03 html]# tail -2 /var/log/httpd/access_log
"10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"
"10.0.0.1" - - [18/Mar/2018:02:41:49 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"

第2章 實現基於cookie實現負載:

2.1 cookie可以實現根據客戶端cookie信息來實現持久連接,實現原理:

客戶端首次訪問服務器,服務端會通過set-cookie設定客戶端的cookie信息,以後客戶端訪問服務端時,會附加設置好的cookie信息進行訪問

2.2 修改haproxy配置文件信息: 綠色為修改部分

backend web
    balance     roundrobin
    cookie webser insert nocache  
    server  web03 172.16.1.17:80 cookie web03
server  web04 172.16.1.18:80 cookie web04

cookie 關鍵字用法說明:

nocache:姜付加cookie信息的源不緩存於緩存服務器中

insert:插入cookie信息

rewrite:重寫cookie

prefix:作為前綴

2.3 進行測試: 多次訪問 都是同一臺服務器

技術分享圖片

第1章 Haproxy狀態頁:

1.1 在配置文件中添加狀態頁相關信息:

[root@backup ~]# vim /etc/haproxy/haproxy.cfg
listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri     /haproxyadmin/stats
    stats realm   Haproxy\ Statistics
    stats auth    admin:admin
    stats admin if TRUE

1.2 在瀏覽器中輸入網址訪問

http://10.0.0.41:1080/haproxyadmin/stats

技術分享圖片

技術分享圖片

第1章 實現haproxy自動監控後端狀態:

1.1 修改haproxy配置文件:

backend web
    balance     roundrobin
    server  web03 172.16.1.17:80 check port 80 inter 2 fall 2 rise 1
    server  web04 172.16.1.18:80 check port 80 inter 2 fall 2 rise 1


1.2 宕掉後端服務器,模擬故障:

[root@web03 html]# systemctl stop httpd.service
[root@web04 httpd-2.4.6]# systemctl stop httpd.service

1.3 進行訪問:

技術分享圖片

1.1 恢復其中一臺,再次進行測試:

後端服務器恢復後,立馬上線

技術分享圖片

Haproxy-10萬並發級別負載均衡器