本文通過一個(gè)具體的實(shí)例詳細(xì)講解和演示HAProxy下虛擬主機(jī)的實(shí)現(xiàn)過程以及HAProxy是如何實(shí)現(xiàn)負(fù)載均衡和故障轉(zhuǎn)移的。
永新網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。1、通過HAProxy的ACL規(guī)則配置虛擬主機(jī)
下面通過HAProxy的ACL功能配置一套基于虛擬主機(jī)的負(fù)載均衡系統(tǒng),這里的操作系統(tǒng)環(huán)境為CentOS release 6.3,HAProxy版本為haproxy-1.4.24,要實(shí)現(xiàn)的功能如圖1所示。
圖1 基于虛擬主機(jī)的HAPro y應(yīng)用實(shí)例
本實(shí)例有一個(gè)電商網(wǎng)站服務(wù)器群、一個(gè)論壇服務(wù)器群、一個(gè)博客服務(wù)器群和默認(rèn)服務(wù)器群,4個(gè)服務(wù)器群都由多臺(tái)服務(wù)器組成,而4個(gè)服務(wù)器群又組成了一個(gè)應(yīng)用服務(wù)器群組,在每個(gè)服務(wù)器群的前端有一個(gè)基于HAProxy的負(fù)載均衡調(diào)度器,整個(gè)應(yīng)用架構(gòu)要實(shí)現(xiàn)的功能為:當(dāng)客戶端通過域名www.tb.com或tb.com訪問時(shí),HAProxy將請(qǐng)求提交到電商網(wǎng)站服務(wù)器群,進(jìn)而實(shí)現(xiàn)電商網(wǎng)站的負(fù)載均衡;當(dāng)客戶端通過域名bbs.tb.com訪問時(shí)就將請(qǐng)求調(diào)度到論壇服務(wù)器群,實(shí)現(xiàn)論壇的負(fù)載均衡;當(dāng)客戶端通過blog.tb.com訪問時(shí)則將請(qǐng)求調(diào)度到博客服務(wù)器群中,實(shí)現(xiàn)博客的負(fù)載均衡;如果客戶端通過除上面三種方式外的任意方式請(qǐng)求服務(wù)時(shí),就將請(qǐng)求調(diào)度到缺省服務(wù)器群。
要實(shí)現(xiàn)上述功能,如果使用四層的LVS負(fù)載均衡器,則需要一個(gè)代理服務(wù)器配合LVS負(fù)載均衡器才能實(shí)現(xiàn),而通過HAProxy實(shí)現(xiàn)時(shí),僅需要一個(gè)HAProxy負(fù)載調(diào)度器再結(jié)合ACL規(guī)則即可輕松實(shí)現(xiàn)。
(1)配置HAProxy
HAProxy的安裝非常簡(jiǎn)單,這里直接進(jìn)入HAProxy的配置過程,配置好的文件內(nèi)容如下:
global
log 127.0.0.1 local0 info
maxconn 4096
user nobody
group nobody
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid
defaults
mode http
retries 3
timeout connect 5s
timeout client 30s
timeout server 30s
timeout check 2s
listen admin_stats
bind 0.0.0.0:19088
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /haproxy-status
stats realm welcome login\\ Haproxy
stats auth admin:xxxxxx
stats auth admin1:xxxxxx
stats hide-version
stats admin if TRUE
frontend www
bind *:80
mode http
option httplog
option forwardfor
log global
acl host_www hdr_reg(host) -i ^(www.tb.com|tb.com)
acl host_bbs hdr_dom(host) -i bbs.tb.com
acl host_blog hdr_beg(host) -i blog.
use_backend server_www if host_www
use_backend server_bbs if host_bbs
use_backend server_blog if host_blog
default_backend server_default
backend server_default
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /check_status.html
server default1 192.168.88.90:8000 cookie default1 weight 3 check inter 2000 rise 2 fall 3
server default2192.168.88.91:8000 cookie default2weight 3 check inter 2000 rise 2 fall 3
backend server_www
mode http
option redispatch
option abortonclose
balance source
cookie SERVERID
option httpchk GET /check_status.jsp
server www1 192.168.88.80:80 cookie www1 weight 6 check inter 2000 rise 2 fall 3
server www2 192.168.88.81:80 cookie www2 weight 6 check inter 2000 rise 2 fall 3
server www3 192.168.88.82:80 cookie www3 weight 6 check inter 2000 rise 2 fall 3
backend server_bbs
mode http
option redispatch
option abortonclose
balance source
cookie SERVERID
option httpchk GET /check_status.php
server bbs1 192.168.88.83:8080 cookie bbs1 weight 8 check inter 2000 rise 2 fall 3
server bbs2 192.168.88.84:8090 cookie bbs2 weight 8 check inter 2000 rise 2 fall 3
backend server_blog
mode http
option redispatch
option abortonclose
balance roundrobin
cookie SERVERID
option httpchk GET /check_blog.php
server blog1 192.168.88.85:80 cookie blog1 weight 5 check inter 2000 rise 2 fall 3
server blog2 192.168.88.86:80 cookie blog2 weight 5 check inter 2000 rise 2 fall 3
這里重點(diǎn)看一下HAProxy配置文件中frontend部分中關(guān)于ACL配置部分的內(nèi)容,這個(gè)是實(shí)現(xiàn)虛擬主機(jī)的核心配置部分。另外,這個(gè)配置文件定義了server_www、server_bbs、server_blog、server_default4個(gè)backend,分別對(duì)應(yīng)上面的4個(gè)服務(wù)器群,對(duì)于server_www群和server_bbs群,采用了基于請(qǐng)求源IP的負(fù)載均衡算法,其他兩個(gè)群均采用基于權(quán)重進(jìn)行輪叫調(diào)度的算法。這也是根據(jù)Web應(yīng)用的特點(diǎn)而定的。每個(gè)backend中都定義了httpchk的檢測(cè)方式,因此要保證這里指定的URL頁(yè)面是可訪問到的。
為了驗(yàn)證負(fù)載均衡的功能,這里需要將后端真實(shí)服務(wù)器做一個(gè)訪問標(biāo)記,這個(gè)架構(gòu)一共加入了9臺(tái)后端真實(shí)服務(wù)器,共分為四組,這里將server_www的三臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面設(shè)置如下:
[root@www1 app]# echo "This is www1192.168.88.80" > /var/www/html/index.html
[root@www2 app]# echo "This is www2 192.168.88.81" > /var/www/html/index.html
[root@www3 app]# echo "This is www3 192.168.88.82" > /var/www/html/index.html
同理,將server_bbs的兩臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面設(shè)置如下:
[root@bbs1 app]# echo "This is bbs1 192.168.88.83" > /var/www/html/index.html
[root@bbs2 app]# echo "This is bbs2 192.168.88.84" > /var/www/html/index.html
接著,將server_blog的兩臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面設(shè)置如下:
[root@blog1 app]# echo "This is bbs1 192.168.88.85" > /var/www/html/index.html
[root@blog2 app]# echo "This is bbs2 192.168.88.86" > /var/www/html/index.html
最后,將server_default的兩臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面設(shè)置如下:
[root@default1 app]# echo "This is default1 192.168.88.90" > /var/www/html/index.html
[root@default2 app]# echo "This isdefault2 192.168.88.91" > /var/www/html/index.html
這樣就為接下來的測(cè)試做好了準(zhǔn)備。
(2)啟動(dòng)HAProxy
HAProxy安裝完成后,會(huì)在安裝根目錄的sbin目錄下生成一個(gè)可執(zhí)行的二進(jìn)制文件haproxy,對(duì)HAProxy的啟動(dòng)、關(guān)閉、重啟等維護(hù)操作都是通過這個(gè)二進(jìn)制文件實(shí)現(xiàn)的,執(zhí)行“haproxy -h”命令即可得到此文件的用法。
haproxy[ -f <配置文件> ][ -vdVD ][ -n 并發(fā)連接總數(shù) ][ -N 默認(rèn)的連接數(shù) ]
haproxy常用的參數(shù)以及含義如表1所示。
表1 haproxy常用參數(shù)及含義
介紹完HAProxy常用的參數(shù)后,下面開始啟動(dòng)HAProxy,操作如下:
[root@haproxy-server haproxy]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
如果要關(guān)閉HAProxy,執(zhí)行如下命令即可:
[root@haproxy-server haproxy]# killall -9 haproxy
如果要平滑重啟HAProxy,可執(zhí)行如下命令:
[root@haproxy-server haproxy]#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`
有時(shí)候?yàn)榱斯芾砗途S護(hù)方便,也可以把HAProxy的啟動(dòng)與關(guān)閉寫成一個(gè)獨(dú)立的腳本,這里給出一個(gè)例子,腳本內(nèi)容如下:
#!/bin/bash
#config:/usr/local/haproxy/conf/haproxy.cfg
#pidfile:/usr/local/haproxy/logs/haproxy.pid
#Source function library
. /etc/rc.d/init.d/functions
#Source networking configuration
. /etc/sysconfig/network
#Check that networking is up
[ "$NETWORKING" = "no" ] && exit 0
config="/usr/local/haproxy/conf/haproxy.cfg"
exec="/usr/local/haproxy/sbin/haproxy"
prog=$(basename $exec)
[ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
lockfile=/var/lock/subsys/haproxy
check() {
$exec -c -V -f $config
}
start() {
$exec -c -V -f $config
if [ $? -ne 0 ];then
echo "Erros in configuration file, check with $prog check."
return 1
fi
echo -n $"Starting $prog:"
#start it up here, usually something like "daemon $exec"
daemon $exec -D -f $config -p /usr/local/haproxy/logs/$prog.pid
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n "Stopping $prog:"
# stop it here, often "killproc $prog"
killproc $prog
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
$exec -c -q -f $config
if [ $? -ne 0 ];then
echo "Errors in configuration file, check with $prog check."
return 1
fi
stop
start
}
reload() {
$exec -c -q -f $config
if [ $? -ne 0 ];then
echo "Errors in configuration file, check with $prog check."
return 1
fi
echo -n $"Reloading $prog:"
$exec -D -f $config -p /usr/local/haproxy/logs/$prog.pid -sf $(cat /usr/local/haproxy/logs/$prog.pid)
retval=$?
echo
return $retval
}
force_reload() {
restart
}
fdr_status() {
status $prog
}
case $1 in
start|stop|restart|reload)
$1
;;
force-reload)
force_reload
;;
checkconfig)
check
;;
status)
fdr_status
;;
condrestart|try-restart)
[ ! -f $lockfile ] || restart
;;
*)
echo $"Usage: $0 {start|stop|status|checkconfig|restart|try-restart|reload|force_reload}"
exit 2
esac
將此腳本命名為haproxy,放在系統(tǒng)的/etc/init.d/目錄下,下面是此腳本的用法:
[root@haproxy-server logs]#/etc/init.d/haproxyUsage:/etc/init.d/haproxy{start|stop|status|checkconfig|restart|try-restart reload|force-reload}
HAProxy啟動(dòng)后,就可以測(cè)試HAProxy所實(shí)現(xiàn)的各種功能了。
2、測(cè)試HAProxy實(shí)現(xiàn)虛擬主機(jī)和負(fù)載均衡功能
首先通過不同IP的客戶端以www.tb.com或者tb.com域名訪問網(wǎng)站,如果HAProxy運(yùn)行正常,并且ACL規(guī)則設(shè)置正確,server_www的三臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面信息將會(huì)依次出現(xiàn),這說明HAProxy對(duì)電商網(wǎng)站實(shí)現(xiàn)了負(fù)載均衡,同時(shí),不會(huì)出現(xiàn)其他后端服務(wù)器的默認(rèn)Web頁(yè)面信息,說明ACL規(guī)則生效,實(shí)現(xiàn)虛擬主機(jī)功能。
同理,當(dāng)通過不同IP的客戶端以bbs.tb.com訪問網(wǎng)站時(shí),server_bbs的兩臺(tái)后端服務(wù)器默認(rèn)的Web頁(yè)面信息將輪換出現(xiàn)。這表示實(shí)現(xiàn)了論壇的負(fù)載均衡功能,同時(shí),不會(huì)出現(xiàn)其他后端服務(wù)器的默認(rèn)Web頁(yè)面信息,說明ACL規(guī)則生效,實(shí)現(xiàn)虛擬主機(jī)功能。
用同樣的方法可以驗(yàn)證blog.tb.com是否實(shí)現(xiàn)了虛擬主機(jī)功能以及負(fù)載均衡功能。最后,當(dāng)通過HAProxy服務(wù)器的IP或者其他方式訪問時(shí),訪問請(qǐng)求將被調(diào)度到server_default指定的兩臺(tái)后端真實(shí)服務(wù)器上。
3、測(cè)試HAProxy的故障轉(zhuǎn)移功能
測(cè)試HAProxy的故障轉(zhuǎn)移功能也非常簡(jiǎn)單,這里假定將server_www組的一臺(tái)后端服務(wù)器192.168.88.82的httpd服務(wù)停止,那么當(dāng)通過www.tb.com或者tb.com域名訪問網(wǎng)站時(shí),這個(gè)失效的節(jié)點(diǎn)將不會(huì)被訪問到,因?yàn)楫?dāng)httpd服務(wù)被停止后,HAProxy通過httpchk方式將立刻檢測(cè)到此節(jié)點(diǎn)無法返回?cái)?shù)據(jù),從而屏蔽此節(jié)點(diǎn)對(duì)外提供服務(wù)的功能,這樣就實(shí)現(xiàn)了故障轉(zhuǎn)移功能。通過類似的方法可以測(cè)試其他節(jié)點(diǎn)的應(yīng)用。
4、使用HAProxy的Web監(jiān)控平臺(tái)
雖然HAProxy實(shí)現(xiàn)了服務(wù)的故障轉(zhuǎn)移功能,但是在主機(jī)或者服務(wù)出現(xiàn)故障的時(shí)候,并不能發(fā)出通知告知運(yùn)維人員,這對(duì)于及時(shí)性要求很高的業(yè)務(wù)系統(tǒng)來說,是非常不便的。不過,HAProxy似乎也考慮到了這一點(diǎn),在新的版本中HAProxy推出了一個(gè)基于Web的監(jiān)控平臺(tái),通過這個(gè)平臺(tái)可以查看此集群系統(tǒng)所有后端服務(wù)器的運(yùn)行狀態(tài),在后端服務(wù)或服務(wù)器出現(xiàn)故障時(shí),監(jiān)控頁(yè)面會(huì)通過不同的顏色來展示故障信息,這在很大程度上解決了后端服務(wù)器故障報(bào)警的問題,運(yùn)維人員可通過監(jiān)控這個(gè)頁(yè)面來第一時(shí)間發(fā)現(xiàn)節(jié)點(diǎn)故障,進(jìn)而修復(fù)故障,如圖2所示。
圖2 HAProxy的Web監(jiān)控頁(yè)面
在這個(gè)監(jiān)控頁(yè)面中,詳細(xì)記錄了HAProxy中配置的frontend、backend等信息。在backend中有各臺(tái)后端真實(shí)服務(wù)器的運(yùn)行狀態(tài),正常情況下,所有后端服務(wù)器都以淺綠色展示,當(dāng)某臺(tái)后端服務(wù)器出現(xiàn)故障時(shí),將以深橙色顯示。其實(shí)每種顏色代表什么狀態(tài),在上面這個(gè)圖中都有詳細(xì)說明。
在這個(gè)監(jiān)控頁(yè)面中,還可以執(zhí)行關(guān)閉自動(dòng)刷新、隱藏故障狀態(tài)的節(jié)點(diǎn)、手動(dòng)刷新、導(dǎo)出數(shù)據(jù)為CSV文件等各種操作。在新版的HAProxy中,又增加了對(duì)backend后端節(jié)點(diǎn)的管理功能,例如,可以在Web頁(yè)面下執(zhí)行Disable、Enable、Soft Stop、Soft Start等對(duì)后端節(jié)點(diǎn)的管理操作。這個(gè)功能在后端節(jié)點(diǎn)升級(jí)、故障維護(hù)時(shí)非常有用。