官术网_书友最值得收藏!

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的穩定性、接近硬件設備的網絡吞吐量,以及其所擁有的強大監控功能,完全可以勝任這項工作。

主站蜘蛛池模板: 贡嘎县| 东方市| 湖北省| 余庆县| 桦南县| 葵青区| 衡阳县| 闻喜县| 临湘市| 柞水县| 阿坝县| 敖汉旗| 新乡市| 德惠市| 新余市| 普安县| 和田县| 海城市| 于都县| 德江县| 四会市| 黑水县| 十堰市| 东至县| 泽普县| 天峻县| 乌鲁木齐市| 清苑县| 南皮县| 虎林市| 扶余县| 新巴尔虎右旗| 上杭县| 西乌珠穆沁旗| 林口县| 达日县| 遵义县| 安远县| 建水县| 广灵县| 泰安市|