天天看點

負載均衡之三

<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" &amp;gt;/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" &amp;gt;/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1" &amp;gt;/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2" &amp;gt;/proc/sys/net/ipv4/conf/all/arp_announce

;;

stop)

/sbin/ifconfig lo:0 down

echo "close LVS Directorserver"

echo "0" &amp;gt;/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0" &amp;gt;/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0" &amp;gt;/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0" &amp;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,如需轉載請自行聯系原作者

繼續閱讀