基於LVS的互聯網應用

 
網絡環境
 
1、 硬件:服務器、網絡附屬存儲(NAS)和交換機。3個服務器用來做web,2個服務器
來做流媒體,1個服務器做LVS-DR,2mysql服務器,一個郵件服務器,2個交換機,一個NETAPP NAS
2、  運行環境:流媒體windows,其他的都是linux
邏輯結構:除數據庫服務器和NETAPP存儲外,其他的服務器都使用2個網絡地址,一個公網地址和一個私有網絡地址。設置爲公網ip的網絡接口連接在一個交換機,設置爲私有網絡ip的網絡接另外一個交換機,處於安全和網絡帶寬考慮,網絡存儲設備和數據庫只使用私有網絡地址。網絡拓撲圖如下所示:
基本原理:
 
傳統模式下,用戶的訪問請求通過DNS服務器解析後,把服務請求轉發給web服務器,取得數據後返回給用戶。這種模式有2個麻煩:同時訪問的用戶增加到某個程度後,服務器不能提供所需的正常訪問;遇到故障,所有的訪問請求都將失敗。要解決這樣一個難題,LVS是上上之選。當我們採用lvs方案之後,更改dns服務器的記錄,這樣用戶的訪問將首先到達LVS控制器所在的服務器,LVS把請求按照某種算法轉發給後面真正的服務器。那麼數據的返還是怎樣的一個過程呢?在採用DR方式的集羣形式下,真實服務器直接把數據返還給用戶而不再經過LVS控制器。訪問數據的流向在上圖中用帶箭頭的虛線標識出來了,這樣設計使得結構更簡單一些,lvs控制器的壓力也小很多。
 
根據應用的實際情況考慮,本項目採用LVS/DR方式。
 
技術實現
 
先列出個相關服務器的ip地址:
名稱
Ip地址
真實ip地址(RIP)
LVS/DR(控制器)
61.135.55.100/24
 
RealServer1Web1
61.135.55.150/24
192.168.55.150/24
RealServer2Web2
61.135.55.151/24
192.168.55.151/24
RealServer3Web3
61.135.55.152/24
192.168.55.152/24
RealServer4 (流媒體1
61.135.55.153/24
192.168.55.153/24
RealServer5  (流媒體2 )
61.135.55.154/24
192.168.55.154/24
MysqlServer1
 
192.168.55.90/24
MysqlServer2
 
192.168.55.91/24
Netapp(網絡共享存儲)
 
192.168.55.92/24
虛擬ip地址(VIP
Web虛擬地址(VIP1
61.135.55.160
 
流媒體虛擬地址(VIP2
61.135.55.161
 
 
一、修改DNS記錄。
www   IN  A  61.135.55.160
media  IN   A  61.135.55.161
修改bind完成後測試一下,看是否被正確的解析。注意:主機記錄應該解析到虛擬地址。
 
二、配置LVS/DR
 
LVS/DR主要由控制器和真實服務器2部分構成,需要在控制器和真實服務器上做好配置才能提供正常的服務,下面分步來說明。
 
安裝控制器部分:安裝好系統(我用的是centos 5,指定ip地址61.135.55.100/24,關閉不必要的系統/網絡服務(執行ntsysv用上下鍵和空白鍵來完成)。實現LVS/DR最重要的兩個東西是ipvs內核模塊和ipvsadm工具包,幸運的是,當前的發行版已經包含ipvs內核模塊,不必再像舊的內核版本需要打這個補丁,ipvsadm需要從網上下載安裝,下面總結一下這個過程:
1、    檢查內核模塊,看ipvs 模塊是否被加載
上圖實現,ipvs模塊沒有被加載,可以手動加載,當然這不是必需的(當安裝好ipvsadm包後,執行ipvsadm命令就會把ip_vs加載到系統內核)。執行命令 modprobe ip_vs 就可以把ip_vs模塊加載到內核。現在再執行 lsmod –l | grep ip_vs 應該看見ip_vs模塊被列出。
2、安裝ipvsadmIpvsadm的官方下載地址爲 [url]http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz[/url] ,解壓後先做一個鏈接文件,把目錄/usr/src/kernels/2.6.18-8.el5-i686/ 鏈接爲/usr/src/linux,不這樣做的話,執行./configure腳本將報錯。運行命令 ln –s /usr/src/kernels/2.6.18-8.el5-i686 /usr/src/linux 做好鏈接,再運行不帶參數的腳本 ./configure,然後執行”make;make install完成安裝
(二)       控制器配置:既可以使用腳本也可以更改系統的配置文件 /etc/sysconfig/ipvsadm。在實際應用中,我建議用腳本,這樣的話,維護和移植lvs會很方便。下面給出本案使用的lvs/dr腳本:
[root@mysql2 ~]# more /usr/local/bin/lvsdr
#!/bin/bash
RIP1=61.135.55.150
RIP2=61.135.55.151
RIP3=61.135.55.152
 
VIP1=61.135.55.160
VIP2=61.135.55.161
 
/etc/rc.d/init.d/functions
 
case "$1" in
 
start)
echo " start LVS of DirectorServer"
 
# set the Virtual IP Address and sysctl parameter
/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up
/sbin/ifconfig eth0:1 $VIP2 broadcast $VIP2 netmask 255.255.255.255 up
/sbin/route add -host $VIP1 dev eth0:0
/sbin/route add -host $VIP2 dev eth0:1
echo "1" >/proc/sys/net/ipv4/ip_forward
 
#Clear IPVS table
/sbin/ipvsadm -C
 
#set LVS
#Web Apache
/sbin/ipvsadm -A -t $VIP1:80 -s wlc -p 120
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP3:80 -g
 
#Media (mms)
/sbin/ipvsadm -A -t $VIP2:1755 -s rr -p 3600
/sbin/ipvsadm -a -t  $VIP2:1755 -r $RIP3:1755 -g 
/sbin/ipvsadm -a -t  $VIP2:1755 -r $RIP4:1755 -g
/sbin/ipvsadm -A -t $VIP2:554 -s rr -p 3600
/sbin/ipvsadm -a -t $VIP2:554 -r $RIP3:554 –g
/sbin/ipvsadm -a -t $VIP2:554 -r $RIP4:554 –g
 
 
#Run LVS
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
/sbin/ifconfig eth0:1 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
.RIP1=61.135.55.150RIP3=61.135.55.152定義3個真實服務器的ip地址。
.VIP1=61.135.55.160VIP2=61.135.55.161定義2個虛擬ip地址,一個作web服務的虛擬地址,一個做流媒體服務的虛擬地址。
. /etc/rc.d/init.d/functions,執行這個系統腳本,以取得運行其他腳本所需的環境和參數。
.case語句是一個多路選擇,本腳本給出3個:start,stop*,31$1表示腳本帶一個參數。
. /sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 upweb服務所需的ip地址(虛擬地址)綁定在輔助接口eth0:0。在LVS方案中,虛擬ip地址與普通網絡接口大大不同,這點需要特別注意。虛擬ip地址的廣播地址是它本身,子網掩碼是255.255.255.255。爲什麼要這樣呢?因爲有若干機器要使用同一個ip地址,用本身做廣播地址和把子網掩碼設成4255就不會造成ip地址衝突了,否則lvs將不能正常轉發訪問請求。
. /sbin/route add -host $VIP1 dev eth0:0添加主機路由,這2條可有可無,較新的linux發行版能正確路由這個主機地址。
. echo "1" >/proc/sys/net/ipv4/ip_forward啓用ip轉發功能。
. /sbin/ipvsadm –C清空ipvs轉發表。
. /sbin/ipvsadm -A -t $VIP1:80 -s wlc -p 120 添加一個虛擬服務,服務協議是tcp(-t);服務類型是web$VIP1:80);-s 表示採用wlc這種調度算法轉發數據包(調度算法包括:rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq);-p表示連接的持續時間爲120秒,這個會話時間是根據實際情況調整的,如果這個值設置得不合理,用戶將得到非常糟糕的訪問效果。下面舉例簡單說明一下
從上圖我們可以看出,隨着時間的變化,用戶的請求將可能被lvs轉發到不同的服務器,而那些需要保持會話的請求將被丟失,導致訪問不能進行。
. /sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 –g 以直接路由的方式把請求轉發到LVS後面的真實服務器。我曾企圖把web80端口)請求轉發到真實服務器的其他端口(如8000),但不能如願。
餘下的行參照上面的解釋,理解起來應該不是問題,因此不再一一說明。腳本寫好後,把它放在目錄/usr/local/bin,然後授與執行權限(chmod 700 /usr/local/bin/lvsdr),運行這個腳本,LVS/DR控制器部分就算配置好了。如果腳本不能正常運行,多半情況是腳本書寫錯誤所致,如在windows用寫字板寫腳本再拷貝到linux,或者寫丟了某個“;”等等。不管真實服務器端是否正確設置lvs,LVS/DR控制器都能獨個運行。有2個方法檢驗LVS/DR是否正常運行了:(1)查看內核是否列出ip_vs模塊;(2)直接運行ipvsadm –l看輸出是否有轉發規則。
 
(三)       真實服務器配置虛擬ip地址。LVS可以把服務請求轉發到各種各樣的操作系統,在本案中有2種操作系統:centoswindows 2003 server。其他unix的處理跟centos(一種linux發行版)相似。
(1)           centos服務器設置虛擬服務器:與LVS/DR控制類似,既可以修改配置文件也可以用腳本,相對來講,還是腳本方便,下面是某個服務器設置虛擬ip地址的腳本:
[root@WEB2 ~]# more /usr/local/bin/lvs
#!/bin/bash
#description:start realserver
#chkconfig 235 26 26
VIP1=220.194.55.160
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP1 broadcast $VIP1 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
/sbin/ifconfig lo:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up LVS/DR控制器一樣,廣播地址設置爲虛擬地址本身,子網掩碼4255,不同的是,虛擬ip地址被綁定在環回(loopback)子接口,而不是物理接口的子接口。
. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore  一共四行,其目的是關閉arp響應。
 
2windows服務器設置虛擬地址。windows下設置子網掩碼爲255.255.255.255linux設置要麻煩些。要想在網上鄰居本地連接的tcp/ip屬性設置4255掩碼是不能得逞的,唯一的辦法是修改註冊表。默認狀況下,windows並沒有環回接口存在,配置之前得先安裝這個“設備”。接下來介紹一下環回接口設置步驟:
控制面板點擊添加新硬件
選“網絡適配器”,按“下一步”,選“Microsoft”及“Microsoft Loopback Adapter
點擊下一步安裝好loopback adapter.
 
設置loopbacktcp/ip參數值。
先設置ip,把子網掩碼設置成255.255.255.0
設置ip地址的目的是方便在註冊表中搜索loopback設置子網掩碼的位置,我們用設置的虛擬ip地址做搜索關鍵字,很快就找到位置了。
 
搜索“61.135.55.160
 
 
找到ip地址“61.135.55.160所在的位置,在這個項的下方,有個
項“SubnetMask”,它的值爲255.255.255.0.
 
 
把其修改爲255.255.255.255,但不幸的是,windows 2003 server 的註冊表修改編輯方式是2進制,修改時需要技巧。在windows xp的註冊表編輯器上修改好,然後轉換到2進制方式,windows 2003 server 對照這個值更改即可。
 
 
換成2進制方式
 
 
修改好一個項(SubnetMask)後,按F3修改餘下的幾個項的SubnetMask 值爲255.255.255.255,然後重啓windows就可以生效了。
 
一、運行LVS/DR
LVS/DR運行lvs腳本,在真實服務器上啓用虛擬地址,就可以把整個LVS/DR運行起來了。
 
幾個需要關注的問題
 
一、控制器高可靠性。一個普遍的做法是使用HA,2個服務器做雙機。在條件有限的情況下,又考慮不增加網絡結構的複雜性,可以把LVS/DR控制器腳本放在不同的服務器上,一旦當前使用的LVS/DR控制器出故障,立即啓用其它服務器的控制器腳本,可以把停機時間控制在可以接受的範圍。
 
二、安全。出來在真實服務器上啓用安全機制外,LVS/DR控制器也需要做防火牆策略的。下面是某個LVS/DR控制器的防火牆腳本,請大家參考:
[root@mysql2 ~]# more /usr/local/bin/firewall
#!/bin/bash
#this is a common firewall created by 2007-7-29
 
#define some variable
IPT=/sbin/iptables
CONNECTION_TRACKING="1"
INTERNET="eth0"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
BROADCAST_SRC="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
IPADDR=61.135.55.100
LOOPBACK_INTERFACE="lo"
 
#Remove any existing rules
$IPT -F
$IPT -X
 
#setting default firewall policy
$IPT --policy OUTPUT ACCEPT
$IPT --policy FORWARD DROP
$IPT -P INPUT DROP
 
 
#stop firewall
if [ "$1" = "stop" ]
then
echo "Filewall completely stopped!no firewall running!"
exit 0
fi
 
#setting for loopback interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
# Stealth Scans and TCP State Flags
# All of the bits are cleared
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
$IPT -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP
 
# Using Connection State to By-pass Rule Checking
if [ "$CONNECTION_TRACKING" = "1" ]; then
    $IPT -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -m state --state INVALID -j DROP
    $IPT -A OUTPUT -m state --state INVALID -j DROP
fi
 
##################################################################
# Source Address Spoofing and Other Bad Addresses
 
# Refuse spoofed packets pretending to be from
# the external interface.s IP address
$IPT -A INPUT  -i $INTERNET -s $IPADDR -j DROP
 
# Refuse packets claiming to be from a Class A private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_A -j DROP
 
# Refuse packets claiming to be from a Class B private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_B -j DROP
 
# Refuse packets claiming to be from a Class C private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_C -j DROP
 
$IPT -A INPUT -i $INTERNET -s 0.0.0.0/8 -j DROP
$IPT -A INPUT -i $INTERNET -s 169.254.0.0/16 -j DROP
$IPT -A INPUT -i $INTERNET -s 192.0.2.0/24 -j DROP
###################################################################
#setting access rules
 
#enable ssh connect
$IPT -A INPUT  -i $INTERNET -p tcp  --dport 22 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  --dport 80 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  --dport 1755 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  --dport 554 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p udp  --dport 554 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  --dport 8080 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p udp  --dport 1024:5000 -j ACCEPT
在這個防火牆腳本中,--dport 1024:5000 udp端口是用於mms協議的,在項目實施過程中,沒有注意這個端口,結果導致流媒體服務請求不能被轉發到真實服務器。
 
三、數據同步。所有相同服務的服務器掛接共享服務器的同一個目錄,寫入數據實際上是寫同一個文件或目錄,因此不再需要rsycn這樣佔資源的同步工具。
 
四、LVS/DR維護和監控。系統在運行過程中,某個真實服務器多運行的服務很可能出故障,但ipvsadm本身不探測這個事件,它仍然按照某種算法將一些用戶的請求轉發給出故障的服務器,導致一些用戶不能正常訪問。Ldirectord可以動態的處理這個麻煩,也可以自己寫個小工具,定期到真實服務器獲取訪問返還狀態碼,根據返還狀態碼執行相關的ipvsadm維護操作。監控報警方面,Nagios([url]www.nagios.org[/url])是非常好的選擇,當然,監控系統最好放在LVS/DR環境之外,關於Nagios的細節,請參照我的文章 Nagios遠程監控軟件的安裝與配置詳解([url]http://netsecurity.51cto.com/art/200706/48728.htm[/url]).
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章