第六章 負載均衡及服務器集羣(lvs)
在互連網應用技術裏,負載均衡一直是熱門話題,本書討論的負載均衡技術,包括但不限於負載均衡本身。使用負載均衡技術主要的目的包括如下幾點:
◆ 系統高可用性。組成系統的某些設備或部件失效,並不會影響正常的服務。
◆ 系統可擴展性。用戶的增加,引起訪問數乃至流量的增加,這種情形下,需要對系統進行擴容,以應對這種快速增長。對於提供高可用服務的互聯網網站,其對可擴展的基本要求就是在保持系統服務不終止的情況下,透明的擴充容量,即用戶不知道擴容的存在,或者說是擴容不對現有的服務產生任何負面作用。這些擴展主要包括:帶寬擴展、服務器擴展、存儲容量擴展、數據庫擴展等,當然也包括主機增加內存等方面的擴展。
◆ 負載均衡能力。一個應用或服務由數個物理服務器提供,並且每個物理服務器運行的應用或服務是相同的,我們可以讓用戶的訪問通過某種控制策略,把負載分攤到不同的物理服務器,從而保持每個物理服務器有比較合理的負載。當整個系統的負載趨於飽和時,通過增加物理服務器和擴充物理帶寬來解決這個麻煩。增加物理服務器以後,系統的負載情況將重新在所有集羣的物理服務器之間按照指定的算法重新達到新的均衡。
一個完整的負載均衡項目,一般由虛擬服務器、故障隔離及失敗切換3個功能框架所組成。
虛擬服務器是負載均衡體系的基本架構,它分兩層結構:轉發器(Director)和真實服務器。圖6-1爲虛擬服務器的結構示意。
圖6-1 虛擬服務器結構
爲什麼稱虛擬服務器?因爲從用戶的角度看來,似乎只是一個服務器在提供服務。虛擬服務器最主要的功能是提供包轉發和負載均衡,這個功能可以通過撰寫ipvsadm腳本具體實現。虛擬服務器項目由章文嵩博士所貢獻,目前已被添加到各種linux發行版的內核。
故障隔離指虛擬服務器中的某個真實服務器(或某幾個真實服務器)失效或發生故障,系統將自動把失效的服務器從轉發隊列中清理出去,從而保證用戶訪問的正確性;另一方面,當實效的服務器被修復以後,系統再自動地把它加入轉發隊列。
失敗切換,這是針對負載均衡器Director 採取的措施,在有兩個負載均衡器Director的應用場景,當主負載均衡器(MASTER)失效或出現故障,備份負載均衡器(BACKUP)將自動接管主負載均衡器的工作;一旦主負載均衡器故障修復,兩者將恢復到最初的角色。
要從技術上實現虛擬服務器、故障隔離及失敗切換3個功能,需要兩個工具:ipvsadm和keepalived。當然也有heartbeat這樣的工具可以實現同樣的功能,但相對於keepalived,heartbeat的實現要複雜得多(如撰寫ipvsadm腳本,部署ldirectord,編寫資源文件等)。在採用keepalived的方案裏,只要ipvsadm被正確的安裝,簡單的配置唯一的文件keepalived就行了。
6.1 lvs 核心ipvs
Ipvs(IP Virtual Server)是整個負載均衡的基礎,如果沒有這個基礎,故障隔離與失敗切換就毫無意義了。在大部分linux發行版中,ipvs被默認安裝,而以本書前面介紹的方法定製安裝系統,則ipvs沒有被默認安裝。
除大部分linux發行版支持ipvs外,FreeBSD也可以支持LVS,只不過實現起來要麻煩一些。
Ipvs具體實現是由ipvsadm這個程序來完成,因此判斷一個系統是否具備ipvs功能,只需要察看ipvsadm 程序是否被安裝。察看ipvsadm程序最簡單的辦法就是在任意路徑執行命令ipvsadm。表6-1爲安裝ipvsadm及未安裝ipvsadm的輸出對比。
|
執行 ipvsadm 後的輸出 |
未安裝ipvsadm |
-bash: ipvsadm: command not foun |
安裝ipvsadm |
IP Virtual Server version
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn |
表6-1 ipvsadm輸出對比(樣例來源centos 5.2)
● Centos5.2安裝ipvsadm( 假定當前目錄爲/root)
1、 從官方網站下載ipvsadm,目前最新的版本爲ipvsadm-1.25.tar.gz ,其發佈時間是2008年11月5日 。Wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz 取得該版本[1]。
2、 創建一個連接文件,其命令爲:ln –sv /usr/src/kernels/2.6.18 -92.el5PAE-i686 /usr/src/linux .注意一定要與當前的運行的內核相一致,因爲/usr/src/kernels目錄下可多個目錄。如果不創建這個連接文件,在編譯時會出錯,從而不能繼續進行安裝。
3、 解包。 tar zxvf ipvsadm-1.24
4、 編譯並安裝。 cd ipvsadm-1.24; make;make install 可執行文件被安裝到/sbin/ipvsadm.
● 檢驗ipvsadm是否被正確安裝
1、 執行ipvsadm,看是否有表6-1第2欄的輸出。
2、 檢查當前加載的內核模塊,看是否存在ip_vs模塊。
[root@hd-4 ipvsadm-1.24]# lsmod|grep ip_vs
ip_vs 77569 0 |
注1、只有執行ipvsadm以後,纔會在內核加載ip_vs模塊。
注2、不能以查進程的方式判斷ipvs是否運行。
注[1]:如果下載最新的ipvsadm-1.25.tar.gz這個版本,在創建連接文件/usr/src/linux後,執行編譯時,可能需要修改/boot/grub/grub.conf啓動內核名稱。一旦當前運行內核與連接文件所代表的內核名不一致時,將出現找不到*.h這樣的錯誤,從而導致安裝不能正常進行。
Lvs的客戶端指負載均衡其/轉發器(director)後面提供服務的真實機器。負載均衡類型(lb_kind)一般分直接路由模式DR 、網絡地址轉換模式 NAT以及隧道模式TUN三種。Lvs客戶端的配置是根據其所採用的負載均衡種類(lb_kind)來做相應操作的。在我們的應用環境裏,爲了獲得最高的性能,採用的負載均衡種類(lb_kind)是直接路由模式DR。
不管採取哪一種模式,lvs客戶端都不需安裝額外的軟件。
Lvs可支持的客戶端包括:各種GNU/linux、大部分unix已經windows。目前我已經成功運行的lvs客戶端環境有centos、redhat、freebsd、windows等。需要注意的是,由於客戶端操作系統的不同,lvs客戶端的配置也就各不相同了。本書中,將以centos及freebsd兩種操作系統作爲lvs的客戶端,給出其直接路由模式DR的配置方法。
● lvs客戶端(真實服務器)操作系統是centos時的配置文件
[root@huludao-2 ~]# more /usr/local/bin/lvs_real
#!/bin/bash
#description : start realserver
VIP=61.135.20.16
/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 |
這裏對配置文件裏重要的一些項進行說明:
1、 vip(virtual ip)。直接路由模式的vip必須跟服務器對外提供服務的ip地址在同一個網段,並且lvs 負載均衡器和其他所有提供相同功能的服務器都使用這個vip.
2、 vip被綁定在環回接口lo0:0上,其廣播地址是其本身,子網掩碼是255.255.255.255。這與標準的網絡地址設置有很大的不同。採用這種可變長掩碼方式把網段劃分成只含一個主機地址的目的是避免ip地址衝突。
3、 echo “1” ,echo “2” 這段的作用是抑制arp廣播。如果不做arp抑制,將會有衆多的機器向其他宣稱:“嗨!我是奧巴馬,我在這裏呢!”,這樣就亂套了。
● lvs客戶端(真實服務器)操作系統是freebsd時的配置文件
fav1# more /usr/local/bin/lvs_real_bsd
#!/usr/local/bin/bash
#description : start realserver
VIP=61.135.20.16
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo0 $VIP netmask 255.255.255.255 alias -arp up
;;
stop)
/sbin/ifconfig lo0 alias down
echo "close LVS Directorserver"
/sbin/ifconfig lo0 127.0.0.1 arp up
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac |
在這裏,我們同樣對這個配置腳本的某些項進行說明:
1、vip地址設置和arp抑制用 /sbin/ifconfig lo0 $VIP netmask 255.255.255.255 alias -arp up
這麼一行就實現了。
我們把這兩種操作系統的lvs客戶端做個比較,發現freebsd的配置書寫上要簡潔一些,是不是可以認爲freebsd的網絡功能比linux強大呢?
6.1.3 lvs客戶端驗證
lvs客戶端不必依賴負載均衡器就可以獨立運行,只不過這種運行對負載均衡沒有任何作用,當然也沒有任何副作用,所以我們把lvs客戶端配置完成後(配置文件就是一個shell腳本),可以單獨運行它,來檢驗配置是否正確。
● centos 腳本
配置腳本寫好保存,給予腳本執行權限。腳本啓停以start和stop這兩個參數來控制。首先,我們來啓動配置腳本,執行命令 /usr/local/bin/lvs_real start ,接着我們來檢查網絡的狀態:
[root@huludao-2 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 61.135.20.16/32 brd 61.135.20.16 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100
link/ether 00:15:17:60:21:a0 brd ff:ff:ff:ff:ff:ff
inet 61.135.20.101/24 brd 125.38.38.255 scope global eth0
inet6 fe80::215:17ff:fe60:
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:15:17:60:21:a1 brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop
link/sit
|
從輸出可以看出,lo0:0確實綁定了我們指定的vip地址。那麼當我們執行 /usr/local/bin/lvs_real時,vip應當從lo0:0接口卸載。我們來看看輸出是什麼:
[root@huludao-2 ~]# lvs_real stop
close LVS Directorserver
[root@huludao-2 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100
link/ether 00:15:17:60:21:a0 brd ff:ff:ff:ff:ff:ff
inet 125.38.38.101/28 brd 125.38.38.111 scope global eth0
inet6 fe80::215:17ff:fe60:
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:15:17:60:21:a1 brd ff:ff:ff:ff:ff:ff
4: sit0: <NOARP> mtu 1480 qdisc noop
link/sit |
●freebsd腳本/usr/local/bin/lvs_real_bsd
啓停所使用的方法和參數與centos那個配置腳本是一樣的,但察看方法有所不同(freebsd無ip add工具)。這裏使用的方法是ifconfig,啓動時輸出如下:
fav1# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=19b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4>
ether 00:15:17:6e:c8:46
inet 61.135.20.69 netmask 0xffffffc0 broadcast 61.128.20.127
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet 61.135.20.16 netmask 0xffffffff |
當執行/usr/local/bin/lvs_real_bsd stop 時,vip被卸載。有時可能卸載不成功,可能需要多執行幾次停止命令。
●arp抑制驗證
如果不配置負載均衡器的轉發功能,那麼在這個步驟所設置的vip將不會提供任何ip功能,除了能用ifconfig輸出顯示而外。
在沒有配置或開啓lvs負載均衡器的情況下,我們用其他機器ping vip,應該是不通的。當然在網絡前面啓用了防火牆阻止ping 不算。爲了不影響測試,最好把你的防火牆打開。
Arp抑制生效後,再也沒有機器知道vip的存在,這是一個問題,誰來響應vip請求?這個問題交給負載均衡器吧,它知道這背後的一切。