負載均衡之三

6.3 cdn緩存服務器的負載均衡(lvs+keepalived
      作者:田逸([email protected]
在cdn的某個區域,需要部署多個緩存服務器,以集羣方式來應對大量用戶的訪問請求,提高系統的高可用性。在機器數量較少的時候,我曾用dns輪訓的方式把訪問負載分擔給服務器,效果不佳,因爲DNS不會做健康檢查。後來增加機器,做成lvs集羣,就很安心了。
6.3.1 cdn緩存服務器集羣場景
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)
接口ip、VIP
ipvsadm,keepalived
安裝ipvsadm及keepalived
真實服務器(server pool)
接口ip、VIP
Lvs 客戶端配置腳本
按“6.1.2”節內容編寫配置腳本
表6-2 緩存服務器集羣信息彙總
6.3.2 cdn緩存服務器集羣部署
儘管部署cdn緩存服務器集羣沒有先後順序之分,但爲了部署順利進行,我們可以先從簡單的部分開始,即先從lvs客戶端開始,然後再到負載均衡器這邊。
● 真實服務器上的操作(每個服務器都是一樣的操作)
1、 照“6.1.2節”的格式編寫lvs客戶端配置腳本,保存後給予執行權限。其完整的內容如下:
[root@huludao-2 ~]# more /usr/local/bin/lvs_real
#!/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" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/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 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.104 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.99 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
2、 BACKUP配置文件/etc/keepalived/keepalived.conf
#writed by sery , contact [email protected]
#guration File for keepalived
#global define
global_defs {
router_id LVS_CNC_2
}
vrrp_sync_group VGM {
group {
VI_CACHE
}
}
################################################################
# vrrp_instance setting #
################################################################
vrrp_instance VI_CACHE {
state BACKUP
interface eth1
lvs_sync_daemon_inteface eth1
virtual_router_id 51
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
125.38.38.64
}
}
##############################################################
# virtual server setting #
##############################################################
# setting port 80 forward
virtual_server 125.38.28.64 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
# persistence_timeout 50
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 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.104 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 125.38.38.99 80 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
在這樣只有一個vrrp_instance 的環境裏,主負載均衡器(MASTER)與備份負載均衡器(BACKUP)配置文件的差異一共只有3處: 全局定義的route_id、vrrp_instance state已經vrrp_instance的優先級priority。
6.3.3 負載均衡服務的啓用和驗證
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啓動輸出:
clip_image002
圖6-3 啓動keepalived時系統日誌的輸出(截取)
另外一個反映keepalived正常運行狀態的地方是網絡接口vip的啓用。通過執行ip add 即可看見vip已經被綁定在制定的網絡接口(注意:ifconfig 不能顯示 vip)。需要注意的是,BACKUP的vip暫時不綁定。圖6-4顯示了這種比較。
clip_image004
圖6-4 主負載均衡器(MASTER) 與備份負載均衡器(BACKUP)輸出對比
主負載均衡器(MASTER)和備份負載均衡器(BACKUP)的keepalived 都把它運行起來,然後我們進行功能測試。
● 測試前的準備
1、 保證所有服務器的網絡服務正常。這可以通過ping 所有機器的ip地址已經ping vip 來檢查。
2、 修改本地計算機的hosts文件,把域名跟vip綁定起來。然後再 ping 一下域名,看是否正常。如 125.38.38.64 www.sery.com
● 轉發功能測試
1、 在本地機器執行命令 telnet www.sery.com 80 ,檢查訪問是否正常。
2、 在本地計算機的瀏覽器地址欄輸入 http://www.sery.com ,看網站默認頁是否能正常訪問。
3、 登錄主負載均衡器,察看轉發情況。Lvs的轉發情況,是不能通過netstat –an這樣的方式來察看的。這時,前面我們安裝的ipvsadm終於上場了。執行不帶任何選項的 ipvsadm指令,即可察看tcp連接情況。圖6-5爲主負載均衡器的轉發情況:
clip_image006
圖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所示:
clip_image008
圖6-6 服務停止,真實服務器從轉發隊列刪除
2、 關閉主機的網絡。可以關閉網絡接口或關閉服務器,然後再按第“1”步的方法測試,檢查客戶端的訪問請求是否不受影響;轉發隊列是否把關閉網絡服務的對象刪除。圖6-7爲某個真實服務器網絡啓停時ipvsadm輸出對比。
clip_image010
圖6-7 關閉服務器前後ipvsadm輸出對比
3、 關閉lvs的客戶端配置腳本/usr/local/bin/lvs_real。這個測試不會成功,關閉真實機器的vip以後,負載均衡器依然會把用戶請求轉發過來,可是tcp連接卻不能成功,部分用戶的訪問失敗。因此在部署和運維lvs環境時,要特別注意這一點
從上面的測試可知,關閉或停止服務,負載均衡器通過健康檢查自動把實效的機器從轉發隊列刪除掉,實現故障隔離,保證用戶的訪問不受影響。
● 失敗切換(FailOver)測試
關閉主負載均衡器(MASTER)的keepalived進程,然後從客戶端訪問vip地址及本地綁定的域名。方法是telnet 125.38.38.64 80 及用瀏覽器訪問 http://www.sery.com . 檢查訪問是否正常。這是最直觀的表現方法。
正常情況下,當主負載均衡器(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的輸出也會發生變化,這裏不再多做說明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章