Haproxy-10萬並發級別負載均衡器
第1章 前言
首先,我們知道nginx負載均衡集群,LVS負載均衡集群,和haproxy負載集群,這三種集群比較來說,LVS性能最好,但是搭建相對復雜,nginx的upstream模塊支持集群負載,但是對web節點的健康檢查功能不多,性能也沒有haproxy好,這也是haproxy為什麽受歡迎的原因之一!
第2章 Haproxy簡介
1. haproxy是一個使用C語言編寫的開源軟件,支持高可用,負載均衡,以及基於tcp和http的應用程序代理
2. Haproxy特別適用於負載特別大的web站點,這些站點通常又需要會話保持或者7層處理,haproxy完全可以支持數以萬計的並發連接
3. Haproxy實現了一種事件驅動,單一進程模型,此模型支持非常大的並發鏈接數,多進程或多線程模型受內存限制,系統調度器限制以及無處不在的鎖限制,很少能處理數千並發鏈接
4. 事件驅動模型因為在有更好的資源和時間管理的用戶空間,實現所有這些任務,所有沒有這些問題,此模型的缺點是,在多核系統上,這些程序通常擴展性較差,這就是為什麽他們必須進行優化,是每個CPU時間片做更多的工作
第3章 haproxy負載均衡的調度算法:
3.1 目前haproxy支持的調度算法常見有如下幾種
先介紹表動態
服務器運行時就可進行權重調整,即只需要重新載入配置文件即可,不需要重新啟動haproxy,並且支持慢速啟動,即重新恢復的後端節點不會一次性接受大量請求,而是慢慢增加的
3.1.1 roundrobin:基於權重的輪詢調度
動態加權輪詢算法,支持權重的運行時調整及慢啟動機制,最大支持4095個後端節點,在服務器的處理時間平均分配的情況下這是最流暢和公平的算法
3.1.2 static-rr:不支持動態hash,沒有後端數量限制,基本不用
靜態輪詢算法,不支持權重的運行時調整和慢啟動機制,每個服務器根據權重輪流使用,此種算法對後端節點數量沒有限制
3.1.3 lc:類似於LVS中wlc算法
但是這裏是只考慮活動鏈接數
3.1.4 source:基於hash表的算法,類似於nginx中的ip_hash
源地址hash算法,對請求源ip地址進行hash,該算法一般用與不能插入cookie的tcp模式,它還可以用戶廣域網上為拒絕使用會話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萬並發級別負載均衡器