1.3.4 HAProxy負載均衡器的source算法
HAProxy負載均衡器也有與Nginx負載均衡器的ip_hash算法類似的算法機制,即source算法,它也可以實現會話保持功能。我們可以通過配置前端是一個HAProxy,后端是兩臺Web服務器的簡單Web架構來驗證一下。
·系統版本:CentOS 7.6 x86_64
·HAProxy版本:1.7.9
·HAProxy機器IP:192.168.100.22
1)安裝HAProxy,提前配置好epel外部yum源(這步略過)。
查看當前yum源是否提供了HAProxy的rpm包,命令如下:
yum list | grep haproxy
結果如下:
haproxy.x86_64 1.5.18-1.el6_7.1 updates
系統自帶的版本低,所以這里采用源碼編譯的方式進行安裝:
cd /usr/local/src wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz tar xvf haproxy-1.7.9.tar.gz cd haproxy-1.7.9 make TARGET=linux2628 PREFIX=/usr/local/haproxy # TARGET指定編譯OS對應的內核版本,這里寫Linux2628即可 make install PREFIX=/usr/local/haproxy
2)修改HAProxy默認的配置文件,不要用它默認的輪詢方式,請采用source。配置文件/etc/haproxy/haproxy.cfg的內容如下:
global log 127.0.0.1 local3 daemon #以daemon方式在后臺運行,推薦 nbproc 1 #HAProxy啟動時作為守護運行可創建的進程數,配合daemon參數使用,默認只啟動一個進程,該值應小于CPU核數 maxconn 102400 #最大同時連接 pidfile /usr/local/haproxy/conf/haproxy.pid #指定保存HAProxy進程號的文件 stats socket /usr/local/haproxy/stats #定義統計信息保存位置 defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats #這里定義的是HAProxy監控 mode http #模式http bind 0.0.0.0:1080 #綁定的監控IP與端口 stats enable #啟用監控 stats hide-version #隱藏HAProxy版本 stats uri /web_status #定義的URI stats realm Haproxy\ Statistics #定義顯示文字 stats auth admin:admin #認證 frontend http bind *:80 mode http log global option logasap option dontlognull capture request header Host len 20 capture request header Referer len 20 default_backend web backend web balance source server web1 192.168.100.23:80 check maxconn 2000 server web2 192.168.100.24:80 check maxconn 2000
3)新版HAProxy支持reload命令,啟動之前我們先檢查配置文件有無語法方面的問題,命令如下:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -c
結果顯示如下:
Configuration file is valid
然后重載HAProxy,命令如下:
/usr/local/haproxy/bin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/logs/haproxy.pid'
HAProxy自帶有強大的監控功能,我們輸入以下網址可以看到:
http://192.168.100.22:1080/web_status/
輸入相對應的賬號和密碼就可以看到監控頁面,如圖1-4所示。

圖1-4 HAProxy的監控頁面
4)在默認情況下,為了節省讀寫I/O所消耗的性能,HAProxy沒有自動配置日志輸出功能,但線上的生產環境有時為了維護和調試方便,是需要有日志輸出的,所以我們可以根據需求來配置HAProxy的日志配置策略。
下面設置HAProxy的默認配置文件與日志相關的選項:
global log 127.0.0.1 local3 #local3相當于info級別的日志
然后編輯系統日志配置/etc/rsyslog.conf,此文件默認會讀取/etc/rsyslog.d/*.conf目錄下的配置文件,所以我們可以將HAProxy的相關配置放在其下,這里取名為haproxy.conf,文件內容如下:
$ModLoad imudp $UDPServerRun 514 local3.* /var/log/haproxy.log
對于上面的配置內容文件,這里也說明一下:
$ModLoad imudp
其中的imudp是模塊名,支持UDP。
$UDPServerRun 514
表示允許514端口接收使用UDP和TCP轉發過來的日志,而rsyslog在默認情況下,正是在514端口監聽UDP。
local3.* /var/log/haproxy.log
local3相當于info級別的日志,/var/log/haproxy.log后面跟的是詳細路徑名。
現在修改/etc/sysconfig/rsyslog文件:
# Options for rsyslogd # Syslogd options are deprecated since rsyslog v3. # If you want to use them, switch to compatibility mode 2 by "-c 2" # See rsyslogd(8) for more details SYSLOGD_OPTIONS="-c 2 -r -m 0"
各參數的作用如下。
·-c:指定運行兼容模式。
·-r:接收遠程日志。
·-x:在接收客戶端消息時,禁用DNS查找。須與-r參數配合使用。
·-m:標記時間戳。單位是分鐘,為0時,表示禁用該功能。
重新啟動rsyslog服務和HAProxy進程:
systemctl restart rsyslog /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st 'cat /usr/local/haproxy/conf/haproxy.pid'
HAProxy的日志內容如下:
Jul 29 03:16:59 server haproxy[4316]: Proxy http started. Jul 29 03:16:59 server haproxy[4316]: Proxy web started. Jul 29 03:18:10 server haproxy[4317]: 192.168.100.187:59736 [29/Jul/2019:03:18:10.271] http web/web1 0/0/0/4/+4 200 +345 - - --NI 2/2/1/0/0 0/0 {192.168.100.22|} "GET /test.php HTTP/1.1" Jul 29 03:18:10 server haproxy[4317]: 192.168.100.187:59736 [29/Jul/2019:03:18:10.271] http web/web1 0/0/0/4/+4 200 +345 - - --NI 2/2/1/0/0 0/0 {192.168.100.22|} "GET /test.php HTTP/1.1" Jul 29 13:16:10 server haproxy[3727]: Proxy stats started. Jul 29 13:16:10 server haproxy[3727]: Proxy http started. Jul 29 13:16:10 server haproxy[3727]: Proxy http started. Jul 29 13:16:10 server haproxy[3727]: Proxy web started. Jul 29 13:16:36 server haproxy[3728]: 192.168.100.80:51387 [29/Jul/2019:13:16:36.004] http web/web1 0/0/0/4/+4 404 +152 - - ---- 2/2/1/0/0 0/0 {192.168.100.22|http://192.168.100.2} "GET /favicon.ico HTTP/1.1" Jul 29 13:16:36 server haproxy[3728]: 192.168.100.80:51387 [29/Jul/2019:13:16:36.004] http web/web1 0/0/0/4/+4 404 +152 - - ---- 2/2/1/0/0 0/0 {192.168.100.22|http://192.168.100.2} "GET /favicon.ico HTTP/1.1"
HAProxy采用了source算法以后,我們發現無論怎么刷新,通過前面的HAProxy LB機器,始終只能訪問到后端提前定義好的Web1機器。在沒有用Session共享的工作場景中(也不允許代碼大量改動),我們可以通過采用此source算法,讓客戶始終只訪問固定的后端Web機器,以解決Session共享的問題。
在項目實際實施中,筆者會根據客戶的需求,將HAProxy用于一些時效性強的小中型網站(比如金融證券類的新聞資訊網站),比如,做成基于單機HAProxy(后面接2~3臺Web機器)的網站,因為這些網站只是在早上9:00以后到下午6:00之間會有用戶訪問,鑒于HAProxy的穩定性、接近硬件設備的網絡吞吐量,以及其所擁有的強大監控功能,完全可以勝任這項工作。
- 樂學Windows操作系統
- Social Media Mining with R
- Linux內核完全注釋(20周年版·第2版)
- 嵌入式Linux驅動程序和系統開發實例精講
- 混沌工程實戰:手把手教你實現系統穩定性
- RESS Essentials
- 嵌入式系統原理及開發
- 從實踐中學習Kali Linux無線網絡滲透測試
- Python UNIX和Linux系統管理指南
- Linux系統最佳實踐工具:命令行技術
- 大學計算機應用基礎實踐教程(Windows 7+MS Office 2010)
- Agile IT Security Implementation Methodology
- 完美應用Ubuntu(第2版)
- VMware Horizon Mirage Essentials
- VMware vSphere 5.1 Cookbook