<b>6.3 cdn</b><b>緩存伺服器的負載均衡(</b><b>lvs+keepalived</b><b>)</b>
在cdn的某個區域,需要部署多個緩存伺服器,以叢集方式來應對大量使用者的通路請求,提高系統的高可用性。在機器數量較少的時候,我曾用dns輪訓的方式把通路負載分擔給伺服器,效果不佳,因為DNS不會做健康檢查。後來增加機器,做成lvs叢集,就很安心了。
<b>6.3.1</b><b> cdn</b><b>緩存伺服器叢集場景</b><b></b>
<b></b>
6個伺服器,2個伺服器為lvs負載均衡器,4個伺服器為真實伺服器。另外為了友善遠端管理,還購置了一個KVM OVER IP裝置。
申請到8個公網ip位址,6個伺服器用去6個,KVM OVER IP裝置用掉1個,剩下1個作為VIP.
4個真實伺服器已經部署好應用(Varnish),并且隻要修改本地windows的hosts檔案,把域名指向這些ip,就可以通過這些緩存伺服器通路到網站内容。關于緩存伺服器的具體部署,請參照本書第7章“簡單cdn”。
為了友善閱讀和了解,我把上述資訊做成一個彙總表,如表6-2。
角色
所需ip
實作負載所需軟體
操作
負載均衡器(MASTER)
接口ip、VIP
ipvsadm,keepalived
安裝ipvsadm及keepalived
負載均衡器(BACKUP)
真實伺服器(server pool)
Lvs 用戶端配置腳本
按“6.1.2”節内容編寫配置腳本
表6-2 緩存伺服器叢集資訊彙總
<b>6.3.2</b><b> cdn</b><b>緩存伺服器叢集部署</b><b></b>
盡管部署cdn緩存伺服器叢集沒有先後順序之分,但為了部署順利進行,我們可以先從簡單的部分開始,即先從lvs用戶端開始,然後再到負載均衡器這邊。
● 真實伺服器上的操作(每個伺服器都是一樣的操作)
1、 照“6.1.2節”的格式編寫lvs用戶端配置腳本,儲存後給予執行權限。其完整的内容如下:
[root@huludao-2 ~]# <b>more /usr/local/bin/lvs_real</b>
#!/bin/bash
#description : start realserver
VIP=125.38.38.64
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" &gt;/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" &gt;/proc/sys/net/ipv4/conf/all/arp_announce
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
2、 運作和驗證這個配置腳本,其具體方法如前所叙,不再贅述。
● 負載均衡器上的操作
MASTER和BACKUP上安裝ipvsadm及keepalived的方法都是一樣的(具體步驟參見“6.1.1”及“6.2.2”兩節的内容),兩者之間的主要差異在于其配置檔案keepalived.conf 。
1、 MASTER的配置檔案/etc/keepalived/keepalived.conf.
#writed by sery , contact [email protected]
#guration File for keepalived
#global define
global_defs {
router_id LVS_CNC_1
}
vrrp_sync_group VGM {
group {
VI_CACHE
################################################################
# vvrp_instance define #
vrrp_instance VI_CACHE {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 180
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
virtual_ipaddress {
125.38.38.64
##############################################################
# virtual machine setting #
# setting port 80 forward
virtual_server 125.38.38.64 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
# persistence_timeout 20
protocol TCP
real_server 125.38.38.101 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
real_server 125.38.38.102 80 {
real_server 125.38.38.104 80 {
real_server 125.38.38.99 80 {
2、 BACKUP配置檔案/etc/keepalived/keepalived.conf
router_id LVS_CNC_2
# vrrp_instance setting #
state BACKUP
interface eth1
lvs_sync_daemon_inteface eth1
priority 150
# virtual server setting #
virtual_server 125.38.28.64 80 {
# persistence_timeout 50
在這樣隻有一個vrrp_instance 的環境裡,主負載均衡器(MASTER)與備份負載均衡器(BACKUP)配置檔案的差異一共隻有3處: 全局定義的route_id、vrrp_instance state已經vrrp_instance的優先級priority。
<b>6.3.3</b><b> </b><b>負載均衡服務的啟用和驗證</b><b></b>
Lvs用戶端的啟用和驗證在前面的“6.1.3”一節有過詳細的說明,此處略過。前面我們也提過,keepalived啟動過程不會檢查配置檔案的文法,是以在啟動keepalived以前,需要人工對/etc/keepalived/keepalived.conf檔案做全面的文法檢查。一個比較容易犯的錯誤就是把花括号“}”寫漏了,不成對!
當lvs用戶端都正常啟動并且配置檔案經檢查無誤後(當然有錯誤也無妨,随時可以修改嘛!),執行指令 /usr/local/keepalived/sbin/keepalived –D ,然後我們檢視系統程序,看是否是3個keepalived程序。如果配置檔案的路徑不是/etc/keepalived/keepalived.conf則需要在啟動時用選項-f指定。
最能反映keepalived啟動情況的地方當屬系統日志。手動執行啟動操作後,使用指令 tail –f /var/log/messages 滾動檢視輸出,就能詳細了解其運作情況。圖6-3為某個lvs環境的keepalived啟動輸出:
<a href="http://img1.51cto.com/attachment/200909/28/403325_12541082646OGq.jpg"></a>
圖6-3 啟動keepalived時系統日志的輸出(截取)
另外一個反映keepalived正常運作狀态的地方是網絡接口vip的啟用。通過執行ip add 即可看見vip已經被綁定在制定的網絡接口(注意:ifconfig 不能顯示 vip)。需要注意的是,BACKUP的vip暫時不綁定。圖6-4顯示了這種比較。
<a href="http://img1.51cto.com/attachment/200909/28/403325_12541082728Nyd.jpg"></a>
圖6-4 主負載均衡器(MASTER) 與備份負載均衡器(BACKUP)輸出對比
主負載均衡器(MASTER)和備份負載均衡器(BACKUP)的keepalived 都把它運作起來,然後我們進行功能測試。
● 測試前的準備
1、 保證所有伺服器的網絡服務正常。這可以通過ping 所有機器的ip位址已經ping vip 來檢查。
2、 修改本地計算機的hosts檔案,把域名跟vip綁定起來。然後再 ping 一下域名,看是否正常。如 125.38.38.64 www.sery.com
● 轉發功能測試
3、 登入主負載均衡器,察看轉發情況。Lvs的轉發情況,是不能通過netstat –an這樣的方式來察看的。這時,前面我們安裝的ipvsadm終于上場了。執行不帶任何選項的 ipvsadm指令,即可察看tcp連接配接情況。圖6-5為主負載均衡器的轉發情況:
<a href="http://img1.51cto.com/attachment/200909/28/403325_1254108281eB7W.jpg"></a>
圖6-5 負載均衡器轉發狀态
如果想知道目前測試機的通路請求被轉發到那個伺服器去了,可以在ipvsadm指令後帶一個選項,其完整形式為:ipvsadm –lcn | grep 159.226.240.63 。
[root@hld081028-mk ~]# ipvsadm -lcn | grep 159.226.240.63
TCP 14:56 ESTABLISHED 159.226.240.63:39783 125.38.38.64:80 125.38.38.99:80
● 健康檢查功能(故障隔離)測試
通過手工的方法,使真實伺服器提供的服務實效,然後再從用戶端發起通路請求,檢驗lvs提供的服務是否可用。這種測試,有兩種方式:停止某個真實伺服器的服務(本例為varnish)、關閉網絡服務。
1、 關閉真實伺服器125.38.38.99的varnish服務。先 telnet 125.38.38.99 80 ,不能通路為正常。然後再從本地計算機執行 telnet 125.38.38.64 80,如通路正常,再檢查負載均衡器的輸出。這時停止服務的機器125.38.38.99 将被lvs從轉發清單中删除,系統日志也會有被删除的消息列印出來,如圖6-6所示:
<a href="http://img1.51cto.com/attachment/200909/28/403325_1254108283pjG5.jpg"></a>
圖6-6 服務停止,真實伺服器從轉發隊列删除
2、 關閉主機的網絡。可以關閉網絡接口或關閉伺服器,然後再按第“1”步的方法測試,檢查用戶端的通路請求是否不受影響;轉發隊列是否把關閉網絡服務的對象删除。圖6-7為某個真實伺服器網絡啟停時ipvsadm輸出對比。
<a href="http://img1.51cto.com/attachment/200909/28/403325_1254108285Ocp2.jpg"></a>
圖6-7 關閉伺服器前後ipvsadm輸出對比
3、 關閉lvs的用戶端配置腳本/usr/local/bin/lvs_real。這個測試不會成功,關閉真實機器的vip以後,負載均衡器依然會把使用者請求轉發過來,可是tcp連接配接卻不能成功,部分使用者的通路失敗。是以在部署和運維lvs環境時,要特别注意這一點。
從上面的測試可知,關閉或停止服務,負載均衡器通過健康檢查自動把實效的機器從轉發隊列删除掉,實作故障隔離,保證使用者的通路不受影響。
● 失敗切換(FailOver)測試
正常情況下,當主負載均衡器(MASTER)實效時,備份負載均衡器(BACKUP)能立即接替轉發任務(接替時間由keepalived.conf檔案的advert_int指定)。在确認主負載均衡器(MASTER)的keepalived程序關閉後,我們來看看備份負載均衡器的運作情況。這裡我們觀察兩個地方:ipvsadm的輸出及系統日志的輸出。
1、 ipvsadm輸出變化。未接替轉發任務前,ipvsadm的輸出字段ActionConn、InActionConn對應的值皆為“0”(因為沒有請求轉發);接替轉發任務後,這兩個字段的值立即發生變化。
2、 系統輸出日志将記錄備份負載均衡器從BACKUP向MASTER切換過程,下面截取系統日志關于keepalived輸出的部分:
Jul 6 21:04:32 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Transition to MASTER STATE
Jul 6 21:04:32 telcom-dl-1 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to MASTER state
Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Entering MASTER STATE
Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) setting protocol VIPs.
Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Sending gratuitous ARPs on eth1 for 218.24.35.105
Jul 6 21:04:37 telcom-dl-1 Keepalived_vrrp: Netlink reflector reports IP 125.38.38.64 added
Jul 6 21:04:37 telcom-dl-1 Keepalived_healthcheckers: Netlink reflector reports IP 125.38.38.64 added
Jul 6 21:04:42 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Sending gratuitous ARPs on eth1 for 125.38.36.64
現在再回來啟動主負載均衡器(MASTER)的keepalived程序,接着察看輔助負載均衡器(BACKUP)的系統日志,截取一段輸出如下:
Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) Received higher prio advert
Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CAHCE) Entering BACKUP STATE
Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Instance(VI_CACHE) removing protocol VIPs.
Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: VRRP_Group(VGM) Syncing instances to BACKUP state
Jul 6 21:18:12 telcom-dl-1 Keepalived_vrrp: Netlink reflector reports IP 125.38.38.64 removed
Jul 6 21:18:12 telcom-dl-1 Keepalived_healthcheckers: Netlink reflector reports IP 125.38.38.64 removed
這段輸出顯示,備份伺服器盡管曾經行使了一段MASTER的職權,一旦原來的MASTER複活,它就得把控制權乖乖地交給原MASTER,自己打回原形BACKUP。是什麼東西在起作用呢?是配置檔案裡設定的那個優先級“priority”。為了保證FailOver正常發揮作用,應確定主負載均衡器的“priority”值大于備份負載均衡器的“priority”值。同樣,輔助負載均衡器的ipvsadm的輸出也會發生變化,這裡不再多做說明。
本文轉自sery51CTO部落格,原文連結: http://blog.51cto.com/sery/207574,如需轉載請自行聯系原作者