0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

全面剖析HAProxy 負(fù)載均衡器

馬哥Linux運(yùn)維 ? 來源:DevOps技術(shù)棧 ? 作者:DevOps技術(shù)棧 ? 2021-06-28 09:22 ? 次閱讀

HAProxy是什么

HAProxy 是一個(gè)免費(fèi)的負(fù)載均衡軟件,可以運(yùn)行于大部分主流的 Linux 操作系統(tǒng)上。

HAProxy 提供了L4(TCP)和L7(HTTP)兩種負(fù)載均衡能力,具備豐富的功能。

HAProxy 的社區(qū)非?;钴S,版本更新快速(最新穩(wěn)定版1.7.2于2017/01/13推出)。最關(guān)鍵的是,HAProxy 具備媲美商用負(fù)載均衡器的性能和穩(wěn)定性。因?yàn)?HAProxy 的上述優(yōu)點(diǎn),它當(dāng)前不僅僅是免費(fèi)負(fù)載均衡軟件的首選,更幾乎成為了唯一選擇。

HAProxy 的核心功能

負(fù)載均衡:L4和L7兩種模式,支持RR/靜態(tài)RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash 等豐富的負(fù)載均衡算法

健康檢查:支持TCP和HTTP兩種健康檢查模式

會話保持:對于未實(shí)現(xiàn)會話共享的應(yīng)用集群,可通過 Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多種 Hash 方式實(shí)現(xiàn)會話保持

SSL:HAProxy 可以解析 HTTPS 協(xié)議,并能夠?qū)⒄埱蠼饷転?HTTP 后向后端傳輸

HTTP 請求重寫與重定向

監(jiān)控與統(tǒng)計(jì):HAProxy 提供了基于 Web 的統(tǒng)計(jì)信息頁面,展現(xiàn)健康狀態(tài)和流量數(shù)據(jù)?;诖斯δ埽褂谜呖梢蚤_發(fā)監(jiān)控程序來監(jiān)控 HAProxy 的狀態(tài)

HAProxy的關(guān)鍵特性

性能

采用單線程、事件驅(qū)動、非阻塞模型,減少上下文切換的消耗,能在1ms內(nèi)處理數(shù)百個(gè)請求。并且每個(gè)會話只占用數(shù)KB的內(nèi)存。

大量精細(xì)的性能優(yōu)化,如O(1)復(fù)雜度的事件檢查器、延遲更新技術(shù)、Single-buffereing、Zero-copy forwarding等等,這些技術(shù)使得HAProxy在中等負(fù)載下只占用極低的CPU資源。

HAProxy大量利用操作系統(tǒng)本身的功能特性,使得其在處理請求時(shí)能發(fā)揮極高的性能,通常情況下,HAProxy自身只占用15%的處理時(shí)間,剩余的85%都是在系統(tǒng)內(nèi)核層完成的。

HAProxy作者在8年前(2009)年使用1.4版本進(jìn)行了一次測試,單個(gè)HAProxy進(jìn)程的處理能力突破了10萬請求/秒,并輕松占滿了10Gbps的網(wǎng)絡(luò)帶寬。

穩(wěn)定性

作為建議以單進(jìn)程模式運(yùn)行的程序,HAProxy對穩(wěn)定性的要求是十分嚴(yán)苛的。按照作者的說法,HAProxy在13年間從未出現(xiàn)過一個(gè)會導(dǎo)致其崩潰的BUG,HAProxy一旦成功啟動,除非操作系統(tǒng)或硬件故障,否則就不會崩潰(我覺得可能多少還是有夸大的成分)。

在上文中提到過,HAProxy的大部分工作都是在操作系統(tǒng)內(nèi)核完成的,所以HAProxy的穩(wěn)定性主要依賴于操作系統(tǒng),作者建議使用2.6或3.x的Linux內(nèi)核,對sysctls參數(shù)進(jìn)行精細(xì)的優(yōu)化,并且確保主機(jī)有足夠的內(nèi)存。這樣HAProxy就能夠持續(xù)滿負(fù)載穩(wěn)定運(yùn)行數(shù)年之久。

個(gè)人的建議:

使用3.x內(nèi)核的Linux操作系統(tǒng)運(yùn)行HAProxy

運(yùn)行HAProxy的主機(jī)上不要部署其他的應(yīng)用,確保HAProxy獨(dú)占資源,同時(shí)避免其他應(yīng)用引發(fā)操作系統(tǒng)或主機(jī)的故障

至少為HAProxy配備一臺備機(jī),以應(yīng)對主機(jī)硬件故障、斷電等突發(fā)情況(搭建雙活HAProxy的方法在后文中有描述)

sysctl的建議配置(并不是萬用配置,仍然需要針對具體情況進(jìn)行更精細(xì)的調(diào)整,但可以作為首次使用HAProxy的初始配置使用):

net.ipv4.tcp_tw_reuse = 1net.ipv4.ip_local_port_range = 1024 65023net.ipv4.tcp_max_syn_backlog = 10240net.ipv4.tcp_max_tw_buckets = 400000net.ipv4.tcp_max_orphans = 60000net.ipv4.tcp_synack_retries = 3net.core.somaxconn = 10000

HAProxy的安裝和運(yùn)行

下面介紹在CentOS7中安裝和運(yùn)行HAProxy最新穩(wěn)定版(1.7.2)的方法

安裝

為HAProxy 創(chuàng)建用戶和用戶組,此例中用戶和用戶組都是“ha”。注意,如果想要讓HAProxy監(jiān)聽1024以下的端口,則需要以root用戶來啟動

下載并解壓

wget http://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gztar -xzf haproxy-1.7.2.tar.gz

編譯并安裝

make PREFIX=/home/ha/haproxy TARGET=linux2628make install PREFIX=/home/ha/haproxy

PREFIX為指定的安裝路徑,TARGET則根據(jù)當(dāng)前操作系統(tǒng)內(nèi)核版本指定:

- linux22 for Linux 2.2- linux24 for Linux 2.4 and above (default)- linux24e for Linux 2.4 with support for a working epoll (》 0.21)- linux26 for Linux 2.6 and above- linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy)

此例中,我們的操作系統(tǒng)內(nèi)核版本為3.10.0,所以TARGET指定為linux2628

創(chuàng)建 HAProxy 配置文件

mkdir -p /home/ha/haproxy/confvi /home/ha/haproxy/conf/haproxy.cfg

我們先創(chuàng)建一個(gè)最簡單配置文件:

global #全局屬性 daemon #以daemon方式在后臺運(yùn)行 maxconn 256 #最大同時(shí)256連接 pidfile /home/ha/haproxy/conf/haproxy.pid #指定保存HAProxy進(jìn)程號的文件

defaults #默認(rèn)參數(shù) mode http #http模式 timeout connect 5000ms #連接server端超時(shí)5s timeout client 50000ms #客戶端響應(yīng)超時(shí)50s timeout server 50000ms #server端響應(yīng)超時(shí)50s

frontend http-in #前端服務(wù)http-in bind *:8080 #監(jiān)聽8080端口 default_backend servers #請求轉(zhuǎn)發(fā)至名為“servers”的后端服務(wù)

backend servers #后端服務(wù)servers server server1 127.0.0.1:8000 maxconn 32 #backend servers中只有一個(gè)后端服務(wù),名字叫server1,起在本機(jī)的8000端口,HAProxy同時(shí)最多向這個(gè)服務(wù)發(fā)起32個(gè)連接

注意:HAProxy 要求系統(tǒng)的 ulimit -n 參數(shù)大于[maxconn*2+18],在設(shè)置較大的 maxconn 時(shí),注意檢查并修改 ulimit -n 參數(shù)

將 HAProxy 注冊為系統(tǒng)服務(wù)

在 /etc/init.d 目錄下添加 HAProxy 服務(wù)的啟停腳本:

vi /etc/init.d/haproxy

#! /bin/shset -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/ha/haproxy/sbinPROGDIR=/home/ha/haproxyPROGNAME=haproxyDAEMON=$PROGDIR/sbin/$PROGNAMECONFIG=$PROGDIR/conf/$PROGNAME.cfgPIDFILE=$PROGDIR/conf/$PROGNAME.pidDESC=“HAProxy daemon”SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.test -x $DAEMON || exit 0

start(){ echo -e “Starting $DESC: $PROGNAME

” $DAEMON -f $CONFIG echo “?!眪

stop(){ echo -e “Stopping $DESC: $PROGNAME

” haproxy_pid=“$(cat $PIDFILE)” kill $haproxy_pid echo “。”}

restart(){ echo -e “Restarting $DESC: $PROGNAME

” $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE) echo “?!眪

case “$1” in start) start ;; stop) stop ;; restart) restart ;; *) echo “Usage: $SCRIPTNAME {start|stop|restart}” 》&2 exit 1 ;;esac

exit 0

運(yùn)行

啟動、停止和重啟

service haproxy startservice haproxy stopservice haproxy restart

添加日志

HAProxy 不會直接輸出文件日志,所以我們要借助 Linux 的 rsyslog 來讓 HAProxy 輸出日志

修改haproxy.cfg

在 global 域和 defaults 域中添加:

global 。。。 log 127.0.0.1 local0 info log 127.0.0.1 local1 warning 。。。

defaults 。。。 log global 。。。

意思是將 info級(及以上)的日志推送到rsyslog的local0接口,將warn級(及以上)的日志推送到rsyslog的local1接口,并且所有frontend都默認(rèn)使用global中的日志配置。

注:info級的日志會打印HAProxy處理的每一條請求,會占用很大的磁盤空間,在生產(chǎn)環(huán)境中,建議將日志級別調(diào)整為notice

為 rsyslog 添加 haproxy 日志的配置

vi /etc/rsyslog.d/haproxy.conf$ModLoad imudp$UDPServerRun 514$FileCreateMode 0644 #日志文件的權(quán)限$FileOwner ha #日志文件的ownerlocal0.* /var/log/haproxy.log #local0接口對應(yīng)的日志輸出文件local1.* /var/log/haproxy_warn.log #local1接口對應(yīng)的日志輸出文件

修改 rsyslog 的啟動參數(shù)

vi /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 detailsSYSLOGD_OPTIONS=“-c 2 -r -m 0”

重啟 rsyslog 和 HAProxy

service rsyslog restartservice haproxy restart

此時(shí)就應(yīng)該能在/var/log目錄下看到haproxy的日志文件了

用 logrotate 進(jìn)行日志切分

通過 rsyslog 輸出的日志是不會進(jìn)行切分的,所以需要依靠 Linux 提供的 logrotate (Linux系統(tǒng) Logrotate服務(wù)介紹)來進(jìn)行切分工作

使用 root 用戶,創(chuàng)建 haproxy 日志切分配置文件:

mkdir /root/logrotatevi /root/logrotate/haproxy/var/log/haproxy.log /var/log/haproxy_warn.log { #切分的兩個(gè)文件名 daily #按天切分 rotate 7 #保留7份 create 0644 ha ha #創(chuàng)建新文件的權(quán)限、用戶、用戶組 compress #壓縮舊日志 delaycompress #延遲一天壓縮 missingok #忽略文件不存在的錯(cuò)誤 dateext #舊日志加上日志后綴 sharedscripts #切分后的重啟腳本只運(yùn)行一次 postrotate #切分后運(yùn)行腳本重載rsyslog,讓rsyslog向新的日志文件中輸出日志 /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2》/dev/null) &》/dev/null endscript}

并配置在 crontab 中運(yùn)行:

0 0 * * * /usr/sbin/logrotate /root/logrotate/haproxy

HAProxy 搭建 L7 負(fù)載均衡器

總體方案

本節(jié)中,我們將使用 HAProxy 搭建一個(gè) L7 負(fù)載均衡器,應(yīng)用如下功能

負(fù)載均衡

會話保持

健康檢查

根據(jù)URI前綴向不同的后端集群轉(zhuǎn)發(fā)

監(jiān)控頁面

架構(gòu)如下:

433937e6-d79b-11eb-9e57-12bb97331649.jpg

架構(gòu)中共有6個(gè)后端服務(wù),劃分為3組,每組中2個(gè)服務(wù):

ms1:服務(wù)URI前綴為ms1/的請求

ms2:服務(wù)URI前綴為ms2/的請求

def:服務(wù)其他請求

搭建后端服務(wù)

部署6個(gè)后端服務(wù),可以使用任意的Web服務(wù),如Nginx、Apache HTTPD、Tomcat、Jetty等,具體Web服務(wù)的安裝過程省略。

此例中,我們在192.168.8.111和192.168.8.112兩臺主機(jī)上分別安裝了3個(gè)Nginx:

ms1.srv1 - 192.168.8.111:8080ms1.srv2 - 192.168.8.112:8080ms2.srv1 - 192.168.8.111:8081ms2.srv2 - 192.168.8.112:8081def.srv1 - 192.168.8.111:8082def.srv2 - 192.168.8.112:8082

在這 6個(gè) Nginx 服務(wù)分別部署健康檢查頁面 healthCheck.html,頁面內(nèi)容任意。確保通過http://ip:port/healthCheck.html 可以訪問到這個(gè)頁面

接下來在6個(gè) Nginx 服務(wù)中部署服務(wù)頁面:

在第一組中部署ms1/demo.html

在第二組中部署ms2/demo.html

在第三組中部署def/demo.html

demo.html的內(nèi)容,以部署在192.168.8.111:8080上的為例:

Hello! This is ms1.srv1!

部署在 192.168.8.112:8080 上的就應(yīng)該是

Hello! This is ms1.srv2!

以此類推

搭建 HAProxy

在 192.168.8.110 主機(jī)安裝 HAProxy,HAProxy 的安裝和配置步驟如上一章中描述,此處略去。

HAProxy 配置文件:

global daemon maxconn 30000 #ulimit -n至少為60018 user ha pidfile /home/ha/haproxy/conf/haproxy.pid log 127.0.0.1 local0 info log 127.0.0.1 local1 warning

defaults mode http log global option http-keep-alive #使用keepAlive連接 option forwardfor #記錄客戶端IP在X-Forwarded-For頭域中 option httplog #開啟httplog,HAProxy會記錄更豐富的請求信息 timeout connect 5000ms timeout client 10000ms timeout server 50000ms timeout http-request 20000ms #從連接創(chuàng)建開始到從客戶端讀取完整HTTP請求的超時(shí)時(shí)間,用于避免類DoS攻擊 option httpchk GET /healthCheck.html #定義默認(rèn)的健康檢查策略

frontend http-in bind *:9001 maxconn 30000 #定義此端口上的maxconn acl url_ms1 path_beg -i /ms1/ #定義ACL,當(dāng)uri以/ms1/開頭時(shí),ACL[url_ms1]為true acl url_ms2 path_beg -i /ms2/ #同上,url_ms2 use_backend ms1 if url_ms1 #當(dāng)[url_ms1]為true時(shí),定向到后端服務(wù)群ms1中 use_backend ms2 if url_ms2 #當(dāng)[url_ms2]為true時(shí),定向到后端服務(wù)群ms2中 default_backend default_servers #其他情況時(shí),定向到后端服務(wù)群default_servers中

backend ms1 #定義后端服務(wù)群ms1 balance roundrobin #使用RR負(fù)載均衡算法 cookie HA_STICKY_ms1 insert indirect nocache #會話保持策略,insert名為“HA_STICKY_ms1”的cookie #定義后端server[ms1.srv1],請求定向到該server時(shí)會在響應(yīng)中寫入cookie值[ms1.srv1] #針對此server的maxconn設(shè)置為300 #應(yīng)用默認(rèn)健康檢查策略,健康檢查間隔和超時(shí)時(shí)間為2000ms,兩次成功視為節(jié)點(diǎn)UP,三次失敗視為節(jié)點(diǎn)DOWN server ms1.srv1 192.168.8.111:8080 cookie ms1.srv1 maxconn 300 check inter 2000ms rise 2 fall 3 #同上,inter 2000ms rise 2 fall 3是默認(rèn)值,可以省略 server ms1.srv2 192.168.8.112:8080 cookie ms1.srv2 maxconn 300 check

backend ms2 #定義后端服務(wù)群ms2 balance roundrobin cookie HA_STICKY_ms2 insert indirect nocache server ms2.srv1 192.168.8.111:8081 cookie ms2.srv1 maxconn 300 check server ms2.srv2 192.168.8.112:8081 cookie ms2.srv2 maxconn 300 check

backend default_servers #定義后端服務(wù)群default_servers balance roundrobin cookie HA_STICKY_def insert indirect nocache server def.srv1 192.168.8.111:8082 cookie def.srv1 maxconn 300 check server def.srv2 192.168.8.112:8082 cookie def.srv2 maxconn 300 check

listen stats #定義監(jiān)控頁面 bind *:1080 #綁定端口1080 stats refresh 30s #每30秒更新監(jiān)控?cái)?shù)據(jù) stats uri /stats #訪問監(jiān)控頁面的uri stats realm HAProxy Stats #監(jiān)控頁面的認(rèn)證提示 stats auth admin:admin #監(jiān)控頁面的用戶名和密碼

修改完成后,啟動 HAProxy

service haproxy start

測試

首先,訪問一下監(jiān)控頁面 http://192.168.8.110:1080/stats 并按提示輸入用戶名密碼

監(jiān)控頁面中列出了我們配置的所有frontend和backend服務(wù),以及它們的詳細(xì)指標(biāo)。如連接數(shù),隊(duì)列情況,session rate,流量,后端服務(wù)的健康狀態(tài)等等

接下來,我們一一測試在HAProxy中配置的功能

健康檢查

從監(jiān)控頁面中就可以直接看出健康檢查配置的是否正確,上圖中可以看到,backend ms1、ms2、default_servers 下屬的 6 個(gè)后端服務(wù)的 Status 都是 20h28m UP,代表健康狀態(tài)已持續(xù)了 20 小時(shí) 28 分鐘,而 LastChk 顯示 L7OK/200 in 1ms 則代表在 1ms 前進(jìn)行了 L7 的健康檢查(即HTTP請求方式的健康檢查),返回碼為200

此時(shí)我們將 ms1.srv1 中的 healthCheck.html 改名

mv healthCheck.html healthCheck.html.bak

ms1.srv1 的狀態(tài)變成了2s DOWN,LastChk 則是 L7STS/404 in 2ms,代表上次健康檢查返回了 404,再恢復(fù) healthCheck.html,很快就能看到 ms1.srv1 重新恢復(fù)到 UP 狀態(tài)。

通過 URI 前綴轉(zhuǎn)發(fā)請求:訪問 http://192.168.8.110:9001/ms1/demo.html

可以看到成功定向到了 ms1.srv1上

訪問 http://192.168.8.110:9001/ms2/demo.html :

負(fù)載均衡和會話保持策略

在分別訪問過 ms1/demo.html,ms2/demo.html,m3/demo.html 后,查看一下瀏覽器的 Cookie

可以看到 HAProxy 已經(jīng)回寫了三個(gè)用于會話保持的 cookie,此時(shí)反復(fù)刷新這三個(gè)頁面,會發(fā)現(xiàn)總是被定向到 *.srv1上接下來我們刪除 HA_STICKY_ms1 這條 cookie,然后再訪問 ms1/demo.html,會看到

同時(shí)也被新寫入了一條 Cookie

如果發(fā)現(xiàn)仍然被定位到 ms1.srv1,同時(shí)也沒有寫入新的 HA_STICKY_ms1 Cookie,那么可能是瀏覽器緩存了 ms1/demo.html 頁面,請求并沒有到達(dá) HAProxy。F5刷新一下應(yīng)該就可以了。

HAProxy 搭建 L4 負(fù)載均衡器

HAProxy 作為 L4 負(fù)載均衡器工作時(shí),不會去解析任何與 HTTP 協(xié)議相關(guān)的內(nèi)容,只在傳輸層對數(shù)據(jù)包進(jìn)行處理。也就是說,以 L4 模式運(yùn)行的 HAProxy,無法實(shí)現(xiàn)根據(jù) URL向不同后端轉(zhuǎn)發(fā)、通過 cookie 實(shí)現(xiàn)會話保持等功能。

同時(shí),在 L4 模式下工作的 HAProxy 也無法提供監(jiān)控頁面。

但作為 L4 負(fù)載均衡器的 HAProxy 能夠提供更高的性能,適合于基于套接字的服務(wù)(如數(shù)據(jù)庫、消息隊(duì)列、RPC、郵件服務(wù)、Redis等),或不需要邏輯規(guī)則判斷,并已實(shí)現(xiàn)了會話共享的 HTTP 服務(wù)。

總體方案

本例中,我們使用 HAProxy 以 L4 方式來代理兩個(gè) HTTP 服務(wù),不提供會話保持。

global daemon maxconn 30000 #ulimit -n至少為60018 user ha pidfile /home/ha/haproxy/conf/haproxy.pid log 127.0.0.1 local0 info log 127.0.0.1 local1 warning

defaults mode tcp log global option tcplog #開啟tcplog timeout connect 5000ms timeout client 10000ms timeout server 10000ms #TCP模式下,應(yīng)將timeout client和timeout server設(shè)置為一樣的值,以防止出現(xiàn)問題 option httpchk GET /healthCheck.html #定義默認(rèn)的健康檢查策略

frontend http-in bind *:9002 maxconn 30000 #定義此端口上的maxconn default_backend default_servers #請求定向至后端服務(wù)群default_servers

backend default_servers #定義后端服務(wù)群default_servers balance roundrobin server def.srv1 192.168.8.111:8082 maxconn 300 check server def.srv2 192.168.8.112:8082 maxconn 300 check

L4模式下的會話保持

雖然 TCP 模式下的 HAProxy 無法通過 HTTP Cookie 實(shí)現(xiàn)會話保持,但可以很方便的實(shí)現(xiàn)基于客戶端IP的會話保持。只需將

balance roundrobin改為 balance source

此外,HAProxy 提供了強(qiáng)大的 stick-table 功能,HAProxy 可以從傳輸層的數(shù)據(jù)包中采樣出大量的屬性,并將這些屬性作為會話保持的策略寫入 stick-table 中。

HAProxy關(guān)鍵配置詳解

總覽

HAProxy 的配置文件共有5個(gè)域

global:用于配置全局參數(shù)default:用于配置所有frontend和backend的默認(rèn)屬性frontend:用于配置前端服務(wù)(即HAProxy自身提供的服務(wù))實(shí)例backend:用于配置后端服務(wù)(即HAProxy后面接的服務(wù))實(shí)例組listen:frontend+backend的組合配置,可以理解成更簡潔的配置方法

global 域的關(guān)鍵配置

daemon:指定HAProxy以后臺模式運(yùn)行,通常情況下都應(yīng)該使用這一配置user [username] :指定HAProxy進(jìn)程所屬的用戶group [groupname] :指定HAProxy進(jìn)程所屬的用戶組log [address] [device] [maxlevel] [minlevel]:日志輸出配置,如log 127.0.0.1 local0 info warning,即向本機(jī)rsyslog或syslog的local0輸出info到warning級別的日志。其中[minlevel]可以省略。HAProxy的日志共有8個(gè)級別,從高到低為emerg/alert/crit/err/warning/notice/info/debugpidfile :指定記錄HAProxy進(jìn)程號的文件絕對路徑。主要用于HAProxy進(jìn)程的停止和重啟動作。maxconn :HAProxy進(jìn)程同時(shí)處理的連接數(shù),當(dāng)連接數(shù)達(dá)到這一數(shù)值時(shí),HAProxy將停止接收連接請求

frontend 域的關(guān)鍵配置

acl [name] [criterion] [flags] [operator] [value]:定義一條ACL,ACL是根據(jù)數(shù)據(jù)包的指定屬性以指定表達(dá)式計(jì)算出的true/false值。如“acl url_ms1 path_beg -i /ms1/”定義了名為url_ms1的ACL,該ACL在請求uri以/ms1/開頭(忽略大小寫)時(shí)為truebind [ip]:[port]:frontend服務(wù)監(jiān)聽的端口default_backend [name]:frontend對應(yīng)的默認(rèn)backenddisabled:禁用此frontendhttp-request [operation] [condition]:對所有到達(dá)此frontend的HTTP請求應(yīng)用的策略,例如可以拒絕、要求認(rèn)證、添加header、替換header、定義ACL等等。http-response [operation] [condition]:對所有從此frontend返回的HTTP響應(yīng)應(yīng)用的策略,大體同上log:同global域的log配置,僅應(yīng)用于此frontend。如果要沿用global域的log配置,則此處配置為log globalmaxconn:同global域的maxconn,僅應(yīng)用于此frontendmode:此frontend的工作模式,主要有http和tcp兩種,對應(yīng)L7和L4兩種負(fù)載均衡模式option forwardfor:在請求中添加X-Forwarded-For Header,記錄客戶端ipoption http-keep-alive:以KeepAlive模式提供服務(wù)option httpclose:與http-keep-alive對應(yīng),關(guān)閉KeepAlive模式,如果HAProxy主要提供的是接口類型的服務(wù),可以考慮采用httpclose模式,以節(jié)省連接數(shù)資源。但如果這樣做了,接口的調(diào)用端將不能使用HTTP連接池option httplog:開啟httplog,HAProxy將會以類似Apache HTTP或Nginx的格式來記錄請求日志option tcplog:開啟tcplog,HAProxy將會在日志中記錄數(shù)據(jù)包在傳輸層的更多屬性stats uri [uri]:在此frontend上開啟監(jiān)控頁面,通過[uri]訪問stats refresh [time]:監(jiān)控?cái)?shù)據(jù)刷新周期stats auth [user]:[password]:監(jiān)控頁面的認(rèn)證用戶名密碼timeout client [time]:指連接創(chuàng)建后,客戶端持續(xù)不發(fā)送數(shù)據(jù)的超時(shí)時(shí)間timeout http-request [time]:指連接創(chuàng)建后,客戶端沒能發(fā)送完整HTTP請求的超時(shí)時(shí)間,主要用于防止DoS類攻擊,即創(chuàng)建連接后,以非常緩慢的速度發(fā)送請求包,導(dǎo)致HAProxy連接被長時(shí)間占用use_backend [backend] if|unless [acl]:與ACL搭配使用,在滿足/不滿足ACL時(shí)轉(zhuǎn)發(fā)至指定的backend

backend 域的關(guān)鍵配置

acl:同frontend域balance [algorithm]:在此backend下所有server間的負(fù)載均衡算法,常用的有roundrobin和source,完整的算法說明見官方文檔configuration.html#4.2-balancecookie:在backend server間啟用基于cookie的會話保持策略,最常用的是insert方式,如cookie HA_STICKY_ms1 insert indirect nocache,指HAProxy將在響應(yīng)中插入名為HA_STICKY_ms1的cookie,其值為對應(yīng)的server定義中指定的值,并根據(jù)請求中此cookie的值決定轉(zhuǎn)發(fā)至哪個(gè)server。indirect代表如果請求中已經(jīng)帶有合法的HA_STICK_ms1 cookie,則HAProxy不會在響應(yīng)中再次插入此cookie,nocache則代表禁止鏈路上的所有網(wǎng)關(guān)和緩存服務(wù)器緩存帶有Set-Cookie頭的響應(yīng)。default-server:用于指定此backend下所有server的默認(rèn)設(shè)置。具體見下面的server配置。disabled:禁用此backendhttp-request/http-response:同frontend域log:同frontend域mode:同frontend域option forwardfor:同frontend域option http-keep-alive:同frontend域option httpclose:同frontend域option httpchk [METHOD] [URL] [VERSION]:定義以http方式進(jìn)行的健康檢查策略。如option httpchk GET /healthCheck.html HTTP/1.1option httplog:同frontend域option tcplog:同frontend域server [name] [ip]:[port] [params]:定義backend中的一個(gè)后端server,[params]用于指定這個(gè)server的參數(shù),常用的包括有:check:指定此參數(shù)時(shí),HAProxy將會對此server執(zhí)行健康檢查,檢查方法在option httpchk中配置。同時(shí)還可以在check后指定inter, rise, fall三個(gè)參數(shù),分別代表健康檢查的周期、連續(xù)幾次成功認(rèn)為server UP,連續(xù)幾次失敗認(rèn)為server DOWN,默認(rèn)值是inter 2000ms rise 2 fall 3cookie [value]:用于配合基于cookie的會話保持,如cookie ms1.srv1代表交由此server處理的請求會在響應(yīng)中寫入值為ms1.srv1的cookie(具體的cookie名則在backend域中的cookie設(shè)置中指定)maxconn:指HAProxy最多同時(shí)向此server發(fā)起的連接數(shù),當(dāng)連接數(shù)到達(dá)maxconn后,向此server發(fā)起的新連接會進(jìn)入等待隊(duì)列。默認(rèn)為0,即無限maxqueue:等待隊(duì)列的長度,當(dāng)隊(duì)列已滿后,后續(xù)請求將會發(fā)至此backend下的其他server,默認(rèn)為0,即無限weight:server的權(quán)重,0-256,權(quán)重越大,分給這個(gè)server的請求就越多。weight為0的server將不會被分配任何新的連接。所有server默認(rèn)weight為1

timeout connect [time]:指HAProxy嘗試與backend server創(chuàng)建連接的超時(shí)時(shí)間timeout check [time]:默認(rèn)情況下,健康檢查的連接+響應(yīng)超時(shí)時(shí)間為server命令中指定的inter值,如果配置了timeout check,HAProxy會以inter作為健康檢查請求的連接超時(shí)時(shí)間,并以timeout check的值作為健康檢查請求的響應(yīng)超時(shí)時(shí)間timeout server [time]:指backend server響應(yīng)HAProxy請求的超時(shí)時(shí)間

default 域

上文所屬的frontend和backend域關(guān)鍵配置中,除acl、bind、http-request、http-response、use_backend外,其余的均可以配置在default域中。default域中配置了的項(xiàng)目,如果在frontend或backend域中沒有配置,將會使用default域中的配置。

listen 域

listen域是frontend域和backend域的組合,frontend域和backend域中所有的配置都可以配置在listen域下

使用Keepalived實(shí)現(xiàn)HAProxy高可用

盡管 HAProxy 非常穩(wěn)定,但仍然無法規(guī)避操作系統(tǒng)故障、主機(jī)硬件故障、網(wǎng)絡(luò)故障甚至斷電帶來的風(fēng)險(xiǎn)。所以必須對 HAProxy 實(shí)施高可用方案。下文將介紹利用 Keepalived 實(shí)現(xiàn)的 HAProxy 熱備方案。即兩臺主機(jī)上的兩個(gè) HAProxy實(shí)例同時(shí)在線,其中權(quán)重較高的實(shí)例為 MASTER,MASTER 出現(xiàn)問題時(shí),另一臺實(shí)例自動接管所有流量。

原理

在兩臺 HAProxy 的主機(jī)上分別運(yùn)行著一個(gè) Keepalived 實(shí)例,這兩個(gè) Keepalived 爭搶同一個(gè)虛IP地址,兩個(gè) HAProxy 也嘗試去綁定這同一個(gè)虛IP地址上的端口。

顯然,同時(shí)只能有一個(gè) Keepalived 搶到這個(gè)虛 IP,搶到了這個(gè)虛 IP 的 Keepalived 主機(jī)上的 HAProxy 便是當(dāng)前的 MASTER。

Keepalived 內(nèi)部維護(hù)一個(gè)權(quán)重值,權(quán)重值最高的 Keepalived 實(shí)例能夠搶到虛IP。同時(shí) Keepalived 會定期 check 本主機(jī)上的 HAProxy 狀態(tài),狀態(tài)OK時(shí)權(quán)重值增加。

搭建 HAProxy 主備集群

環(huán)境準(zhǔn)備

在兩臺物理機(jī)上安裝并配置 HAProxy,本例中,將在 192.168.8.110 和 192.168.8.111 兩臺主機(jī)上上安裝兩套完全一樣的 HAProxy,具體步驟省略,請參考“使用 HAProxy 搭建L7負(fù)載均衡器”一節(jié)。

安裝Keepalived

下載,解壓,編譯,安裝:

wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gztar -xzf keepalived-1.2.19.tar.gz./configure --prefix=/usr/local/keepalivedmakemake install

注冊為系統(tǒng)服務(wù):

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/chmod +x /etc/init.d/keepalived

注意:Keepalived 需要使用 root 用戶進(jìn)行安裝和配置

配置 Keepalived

創(chuàng)建并編輯配置文件

mkdir -p /etc/keepalived/cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/vi /etc/keepalived/keepalived.conf

配置文件內(nèi)容:

global_defs { router_id LVS_DEVEL #虛擬路由名稱}

#HAProxy健康檢查配置vrrp_script chk_haproxy { script “killall -0 haproxy” #使用killall -0檢查haproxy實(shí)例是否存在,性能高于ps命令 interval 2 #腳本運(yùn)行周期 weight 2 #每次檢查的加權(quán)權(quán)重值}

#虛擬路由配置vrrp_instance VI_1 { state MASTER #本機(jī)實(shí)例狀態(tài),MASTER/BACKUP,備機(jī)配置文件中請寫B(tài)ACKUP interface enp0s25 #本機(jī)網(wǎng)卡名稱,使用ifconfig命令查看 virtual_router_id 51 #虛擬路由編號,主備機(jī)保持一致 priority 101 #本機(jī)初始權(quán)重,備機(jī)請?zhí)顚懶∮谥鳈C(jī)的值(例如100) advert_int 1 #爭搶虛地址的周期,秒 virtual_ipaddress { 192.168.8.201 #虛地址IP,主備機(jī)保持一致 } track_script { chk_haproxy #對應(yīng)的健康檢查配置 }}

如果主機(jī)沒有killall命令,則需要安裝psmisc包:

yum intall psmisc

分別啟動兩個(gè)Keepalived

service keepalived start

驗(yàn)證

啟動后,先分別在兩臺主機(jī)查看虛IP 192.168.8.201由誰持有,執(zhí)行命令:

ip addr sh enp0s25 (將enp0s25替換成主機(jī)的網(wǎng)卡名)

持有虛IP的主機(jī)輸出會是這樣的:

43a4afc6-d79b-11eb-9e57-12bb97331649.jpg

另一臺主機(jī)輸出則是這樣的:

43b02e0a-d79b-11eb-9e57-12bb97331649.jpg

如果你先啟動備機(jī)的 Keepalived,那么很有可能虛 IP 會被備機(jī)搶到,因?yàn)閭錂C(jī)的權(quán)重配置只比主機(jī)低1,只要執(zhí)行一次健康檢查就能把權(quán)重提高到 102,高于主機(jī)的 101。

此時(shí)訪問 http://192.168.8.201:9001/ms1/demo.html ,可以看到我們先前部署的網(wǎng)頁。

此時(shí),檢查/var/log/haproxy.log,能看到此請求落在了搶到了虛IP的主機(jī)上。

接下來,我們停掉當(dāng)前 MASTER 主機(jī)的 HAProxy 實(shí)例(或者Keepalive實(shí)例,效果一樣)

service haproxy stop

再次訪問 http://192.168.8.201:9001/ms1/demo.html ,并查看備機(jī)的 /var/log/haproxy.log,會看到此請求落在了備機(jī)上,主備自動切換成功。

也可以再次執(zhí)行ip addr sh enp0s25命令,會看到虛IP被備機(jī)搶去了。

在/var/log/message中,也能夠看到keepalived輸出的切換日志:

43bb6162-d79b-11eb-9e57-12bb97331649.jpg

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    478

    瀏覽量

    30762
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78756
  • SSL
    SSL
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    25681

原文標(biāo)題:從零開始掌握 HAProxy 負(fù)載均衡器

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    單電源NE5532搭建的音頻EQ均衡器底噪大怎么解決?

    最近做一個(gè)EQ均衡器電路,用NE5532搭建。電源為單電源,由220V轉(zhuǎn)18V開關(guān)電源適配器(成品)提供,接上EQ電路帶負(fù)載之后測得紋波Vrms約40mv左右,偶爾波動到60mv;示波器看峰峰值在
    發(fā)表于 08-29 08:22

    均衡器的工作原理和類型

    均衡器在電動汽車領(lǐng)域中,特別是電池管理系統(tǒng)中扮演著至關(guān)重要的角色。它主要負(fù)責(zé)調(diào)整電池組中各個(gè)電池單元的能量狀態(tài),以確保電池組整體性能的優(yōu)化和延長電池的使用壽命
    的頭像 發(fā)表于 08-06 18:08 ?820次閱讀

    DS38EP100 1至5 Gbps省電均衡器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS38EP100 1至5 Gbps省電均衡器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-05 09:43 ?0次下載
    DS38EP100 1至5 Gbps省電<b class='flag-5'>均衡器</b>數(shù)據(jù)表

    DS80EP100 5至12.5 Gbps省電均衡器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS80EP100 5至12.5 Gbps省電均衡器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-05 09:36 ?0次下載
    DS80EP100 5至12.5 Gbps省電<b class='flag-5'>均衡器</b>數(shù)據(jù)表

    LMH0395低功耗擴(kuò)展距離自適應(yīng)電纜均衡器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《LMH0395低功耗擴(kuò)展距離自適應(yīng)電纜均衡器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-04 11:37 ?0次下載
    LMH0395低功耗擴(kuò)展距離自適應(yīng)電纜<b class='flag-5'>均衡器</b>數(shù)據(jù)表

    DS32EV100可編程單通道均衡器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS32EV100可編程單通道均衡器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-04 11:35 ?0次下載
    DS32EV100可編程單通道<b class='flag-5'>均衡器</b>數(shù)據(jù)表

    DS16EV5110視頻均衡器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS16EV5110視頻均衡器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-04 09:29 ?0次下載
    DS16EV5110視頻<b class='flag-5'>均衡器</b>數(shù)據(jù)表

    4.25-GBPS電纜和PC板均衡器TLK4201EA數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《4.25-GBPS電纜和PC板均衡器TLK4201EA數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 06-25 09:33 ?0次下載
    4.25-GBPS電纜和PC板<b class='flag-5'>均衡器</b>TLK4201EA數(shù)據(jù)表

    圖形均衡器電路圖分享

    圖形均衡器是一種可以直觀地調(diào)整各個(gè)頻段增益的音頻處理設(shè)備。與參數(shù)均衡器不同,圖形均衡器采用固定的頻段和Q值(即頻段的寬度),用戶可以直接通過拖拽按鈕來調(diào)整每個(gè)頻段的增益,從而實(shí)現(xiàn)對音頻信號的頻率分布進(jìn)行修飾和增強(qiáng)。
    的頭像 發(fā)表于 02-06 15:13 ?5235次閱讀
    圖形<b class='flag-5'>均衡器</b>電路圖分享

    音頻均衡器電路圖分享

    音頻均衡器是一種可以分別調(diào)節(jié)各種頻率成分電信號放大量的電子設(shè)備。它通過對各種不同頻率的電信號的調(diào)節(jié)來補(bǔ)償揚(yáng)聲器和聲場的缺陷,修飾和增強(qiáng)各種聲源的效果,以及進(jìn)行其他特殊作用。在音響器材中,音頻均衡器通常用于調(diào)節(jié)音頻信號的頻率分布,使得音頻在各種頻段上達(dá)到
    的頭像 發(fā)表于 02-06 14:58 ?5555次閱讀
    音頻<b class='flag-5'>均衡器</b>電路圖分享

    負(fù)載均衡器的誕生和工作機(jī)制

    今天我們來深度揭秘一下負(fù)載均衡器 LVS 的秘密,相信大家看了你管這破玩意兒叫負(fù)載均衡?這篇文章后,還是有不少疑問,比如 LVS 看起來只有類似路由器的轉(zhuǎn)發(fā)功能,為啥說它是四層(傳輸層
    的頭像 發(fā)表于 01-04 12:26 ?799次閱讀
    <b class='flag-5'>負(fù)載</b><b class='flag-5'>均衡器</b>的誕生和工作機(jī)制

    均衡器的基本原理是什么?

    均衡器是一種用于調(diào)節(jié)音頻頻譜的設(shè)備,它可以增強(qiáng)或削弱特定頻率范圍內(nèi)的聲音。
    的頭像 發(fā)表于 12-29 18:06 ?1495次閱讀

    基于UW字的單載波判決反饋均衡器水聲通信研究

    電子發(fā)燒友網(wǎng)站提供《基于UW字的單載波判決反饋均衡器水聲通信研究.pdf》資料免費(fèi)下載
    發(fā)表于 11-08 14:46 ?0次下載
    基于UW字的單載波判決反饋<b class='flag-5'>均衡器</b>水聲通信研究

    基于FPGA的自適應(yīng)均衡器的研究與設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于FPGA的自適應(yīng)均衡器的研究與設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 11-07 10:33 ?8次下載
    基于FPGA的自適應(yīng)<b class='flag-5'>均衡器</b>的研究與設(shè)計(jì)

    Channel怎么來匹配?發(fā)射端均衡器和接收端均衡器有怎么樣的玩法?

    Channel怎么來匹配?發(fā)射端均衡器和接收端均衡器有怎么樣的玩法? 匹配是指在通信系統(tǒng)中,發(fā)射端和接收端之間的信號傳遞路徑之間的適配。在數(shù)字通信系統(tǒng)中,匹配是非常重要的,它可以最大限度地提高信號
    的頭像 發(fā)表于 11-07 10:26 ?488次閱讀