HAProxy詳解(三):基於虛擬主機的HAProxy負載均衡系統配置實例【轉】
一.基於虛擬主機的HAProxy負載均衡系統配置實例
1.通過HAProxy的ACL規則配置虛擬主機:
下面將通過HAProxy的ACL功能配置一套基於虛擬主機的負載均衡系統。這裏操作系統環境為:CentOS release 6.7,HAProxy版本為haproxy-1.4.24,要實現的功能如圖:
本實例有一個電商網站服務器群、一個論壇服務器群、一個博客服務器群和默認服務器群,4個服務器群都由多臺服務器組成,而4個服務器群又組成了一個應用服務器群組,在每個服務器群的前端有一個基於HAProxy的負載均衡調度器,整個應用架構要實現的功能為:當客戶端通過域名www.tb.com或tb.com訪問時,HAProxy將請求提交到電商網站服務器群,進而實現電商網站的負載均衡;當客戶端通過域名bbs.tb.com訪問時就將請求調度到論壇服務器群,實現論壇的負載均衡;當客戶端通過blog.tb.com訪問時則將請求調度到博客服務器群中,實現博客的負載均衡;如果客戶端通過除上面三種方式外的任意方式請求服務時,就將請求調度到缺省服務器群。
1.配置HAProxy
HAProxy的安裝非常簡單,這裏直接進入HAProxy的配置過程,配置文件如下:
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:admin
stats auth yan:123456
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 10.0.0.8:8000 cookie default1 weight 6 check inter 2000 rise 2 fall 3
server default2 10.0.0.7:8000 cookie default2 weight 6 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 10.0.0.18:80 cookie www1 weight 6 check inter 2000 rise 2 fall 3
server www2 10.0.0.17:80 cookie www2 weight 6 check inter 2000 rise 2 fall 3
server www3 10.0.0.16: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 10.0.0.28:8080 cookie bbs1 weight 6 check inter 2000 rise 2 fall 3
server bbs2 10.0.0.27:8080 cookie bbs2 weight 6 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 10.0.0.38:80 cookie blog1 weight 6 check inter 2000 rise 2 fall 3
server blog2 10.0.0.37:80 cookie blog2 weight 6 check inter 2000 rise 2 fall 3
關於HAProxy配置文件中每個選項的含義,這裏重點看一下frontend部分中關於ACL配置部分的內容,這個是實現虛擬主機的核心配置部分。另外,這個配置文件定義了server_www、server_bbs、server_blog、server_default 4個backend,分別對應上面的4個服務器群,對於server_www群和server_bbs群,采用了基於請求源IP的負載均衡算法,其他兩個群均采用基於權重進行輪叫調度的算法。這也是根據Web應用的特點而定的。每個backend中都定義了httpchk的檢測方式,因此要保證這裏指定的URL頁面是可訪問到的。
為了驗證負載均衡的功能,這裏需要將後端真實服務器做一個訪問標記,這個架構一共加入了9臺後端真實服務器,共分為四組,這裏將server_www的三臺後端服務器默認的Web頁面設置如下:
[root@www1]# echo "This is www1 10.0.0.18" > /var/www/html/index.html
[root@www2]# echo "This is www2 10.0.0.17" > /var/www/html/index.html
[root@www3]# echo "This is www3 10.0.0.16" > /var/www/html/index.html
同理,將server_bbs的兩個後端服務器默認的web頁面設置如下:
[root@bbs1]# echo "This is bbs1 10.0.0.28" > /var/www/html/index.html
[root@bbs2]# echo "This is bbs2 10.0.0.27" > /var/www/html/index.html
接著,將server_blog的兩臺後端服務器默認的web頁面設置如下:
[root@blog1]# echo "This is blog1 10.0.0.38" > /var/www/html/index.html
[root@blog2]# echo "This is blog2 10.0.0.37" > /var/www/html/index.html
最後,將server_default的兩臺後端服務器默認的Web頁面設置如下:
[root@default1]# echo "This is default1 10.0.0.8" > /var/www/html/index.html
[root@default2]# echo "This is default2 10.0.0.7" > /var/www/html/index.html
這樣就為接下來的測試做好了準備。
2.啟動HAProxy
HAProxy安裝完成後,會在安裝根目錄的sbin目錄下生成一個可執行的二進制文件haproxy,對HAProxy的啟動、關閉、重啟等維護操作都是通過這個二進制文件實現的,執行“haproxy -h ”命令即可得到此文件的用法。
haproxy [ -f <配置文件> ] [ -vdVD ] [ -n 最大並發連接總數 ] [ -N 默認的連接數 ]
haproxy常用的參數以及含義如表
-v 顯示當前版本信息,“-vv”顯示已知的創建選項。
-d 表示讓進程運行在debug模式,“-db”表示禁用後臺模式,讓程序在前臺運行
-D 讓程序以daemon模式啟動,此選項ye可以在HAProxy配置文件中設置。
-q 表示安靜模式,程序運行不輸出任何信息。
-c 對HAProxy配置文件進行語法檢查。此參數非常有用。如果配置文件錯誤,會輸出對應的錯誤位置和錯誤信息。
-n 設置最大並發連接總數
-m 限制可用的內存大小,以MB為單位。
-N 設置默認的連接數
-p 設置HAProxy的PID文件路徑
-de 不使用epool模型
-ds 不使用speculative epoll
-dp 不使用poll模型
-sf 程序啟動後向PID文件裏的進程發送FINISH信號,這個參數需要放在命令行的最後。
-st 程序啟動後向PID文件裏的進程發送TERMINATE信號,這個參數放在命令行的最後,經常用於重啟HAProxy進程。
開啟HAProxy,操作如下:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg
關閉HAProxy,執行命令:
killall -9 haproxy
平滑重啟,執行命令:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg -st `cat /usr/local/haproxy/logs/haproxy.pid`
有時候為了管理和維護方便,也可以把HAProxy的啟動與關閉寫成一個獨立的腳本,腳本內容如下:
#!/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。放在系統的/etc/init.d/目錄下。
2.測試HAProxy實現虛擬主機和負載均衡功能:
首先通過不同IP的客戶端以www.tb.com或者tb.com域名訪問網站,如果訪問網站,如果HAProxy運行正常,並且ACL規則設置正確,server_www的三臺後端服務器默認的web頁面信息將會依次出現,這說明HAProxy對電商網站實現了負載均衡,同時,不會出現其他後端服務器的默認Web頁面信息。說明ACL規則生效,實現虛擬主機功能。
同理,當通過不同IP的客戶端以bbs.tb.com訪問網站時,server_bbs的兩臺後端服務器默認的web頁面信息將輪換出現。這表示實現了論壇的負載均衡功能,同時,不會出現其他後端服務器的默認web頁面信息,說明ACL規則生效,實現虛擬主機功能。
用同樣的方法可以驗證blog.tb.com是否實現了虛擬主機功能以及負載均衡功能。最後,當通過HAProxy服務器的IP或者其他方式訪問時,訪問請求將被調度到server_default指定的兩臺後端真實服務器上。
3.測試HAProxy的故障轉移功能:
測試HAProxy的故障轉移功能也非常簡單,這裏假定將server_www組的一臺後端服務器10.0.0.17的httpd服務停止,那麽當通過www.tb.com或者tb.com域名訪問網站時,這個失效的節點將不會被訪問到,因為當httpd服務被停止後,HAProxy通過httpchk方式將立刻檢測到此節點無法返回數據,從而屏蔽此節點對外提供服務的功能,這樣就實現了故障轉移功能。
4.使用HAProxy的web監控平臺:
雖然HAProxy實現了服務的故障轉移功能,但是在主機或者服務出現故障的時候,並不能發出通知告知運維人員,這對於及時性要求高的業務系統來說,是非常不便的。不過,HAProxy似乎也考慮到了這一點,在新的版本中HAProxy推出了一個基於Web的監控平臺,通過這個平臺可以查看此集群系統所有後端服務器的運行狀態,在後端服務或服務出現故障時,監控頁面會通過不同的顏色來展示故障信息,這在很大程度上解決了後端服務器故障報警的問題,運維人員可通過監控這個頁面來第一時間發現節點故障,進而修復故障。如圖:
在這個監控頁面中,詳細記錄了HAParoxy中配置的frontend、backend等信息。在backend中有各臺後端真實服務器的運行狀態,正常情況下,所有後端服務器都以淺綠色展示,當某臺服務器出現故障時,將以深橙色顯示。
在這個監控頁面中,還可以執行關閉自動刷新、隱藏故障狀態的節點、手動刷新、導出數據為csv文件等各種操作。在新版的HAProxy中,又增加了對backend後端節點的管理功能,例如,可以在web頁面下執行disable、enable、soft stop、soft start 等後端節點來管理操作。
HAProxy詳解(三)-閆利朋的博客-51CTO博客
http://blog.51cto.com/6284444/2140563
HAProxy詳解(三):基於虛擬主機的HAProxy負載均衡系統配置實例【轉】