一、簡介

? ?LVS是Linux Virtual Server的簡稱,也就是Linux虛擬服務器, 是一個由章文嵩博士發起的自由軟件項目,它的官方站點是www.linuxvirtualserver.org。現在LVS已經是 Linux標準內核的一部分,在Linux2.4內核以前,使用LVS時必須要重新編譯內核以支持LVS功能模塊,但是從Linux2.4內核以后,已經完全內置了LVS的各個功能模塊,無需給內核打任何補丁,可以直接使用LVS提供的各種功能。

? ?使用LVS技術要達到的目標是:通過LVS提供的負載均衡技術和Linux操作系統實現一個高性能、高可用的服務器群集,它具有良好可靠性、可擴展性和可操作性。從而以低廉的成本實現最優的服務性能。

? ?LVS自從1998年開始,發展到現在已經是一個比較成熟的技術項目了。可以利用LVS技術實現高可伸縮的、高可用的網絡服務,例如WWW服務、Cache服務、DNS服務、FTP服務、MAIL服務、視頻/音頻點播服務等等,有許多比較著名網站和組織都在使用LVS架設的集群系統,例如:Linux的門戶網站(www.linux.com)、向RealPlayer提供音頻視頻服務而聞名的Real公司(www.real.com)、全球最大的開源網站(sourceforge.net)等。

二、拓撲圖

wKiom1NNM8HDW5YMAACXkLGNMeI888.jpg

? ?說明:1.客戶端只知道我們的LVS的VIP的地址

? ? ? ? ?2.由于服務器有限,此處我們的apache和php做在一臺機器上

三。調度算法

? ?Director在接收到來自于Client的請求時,會基于"schedule"從RealServer中選擇一個響應給Client。ipvs支持以下調度算法:

? ?1、輪詢(round robin, rr),加權輪詢(Weighted round robin, wrr)——新的連接請求被輪流分配至各RealServer;算法的優點是其簡潔性,它無需記錄當前所有連接的狀態,所以它是一種無狀態調度。輪叫調度算法假設所有服務器處理性能均相同,不管服務器的當前連接數和響應速度。該算法相對簡單,不適用于服務器組中處理性能不一的情況,而且當請求服務時間變化比較大時,輪叫調度算法容易導致服務器間的負載不平衡。

? ?2、最少連接(least connected, lc), 加權最少連接(weighted least connection, wlc)——新的連接請求將被分配至當前連接數最少的RealServer;最小連接調度是一種動態調度算法,它通過服務器當前所活躍的連接數來估計服務器的負載情況。調度器需要記錄各個服務器已建立連接的數目,當一個請求被調度到某臺服務器,其連接數加1;當連接中止或超時,其連接數減一。

? ?3、基于局部性的最少鏈接調度(Locality-Based Least Connections Scheduling,lblc)——針對請求報文的目標IP地址的負載均衡調度,目前主要用于Cache集群系統,因為在Cache集群中客戶請求報文的目標IP地址是變化的。這里假設任何后端服務器都可以處理任一請求,算法的設計目標是在服務器的負載基本平衡情況下,將相同目標IP地址的請求調度到同一臺服務器,來提高各臺服務器的訪問局部性和主存Cache命中率,從而整個集群系統的處理能力。LBLC調度算法先根據請求的目標IP地址找出該目標IP地址最近使用的服務器,若該服務器是可用的且沒有超載,將請求發送到該服務器;若服務器不存在,或者該服務器超載且有服務器處于其一半的工作負載,則用“最少鏈接”的原則選出一個可用的服務器,將請求發送到該服務器。

? ?4、帶復制的基于局部性最少鏈接調度(Locality-Based Least Connections with Replication Scheduling,lblcr)——也是針對目標IP地址的負載均衡,目前主要用于Cache集群系統。它與LBLC算法的不同之處是它要維護從一個目標IP地址到一組服務器的映射,而 LBLC算法維護從一個目標IP地址到一臺服務器的映射。對于一個“熱門”站點的服務請求,一臺Cache 服務器可能會忙不過來處理這些請求。這時,LBLC調度算法會從所有的Cache服務器中按“最小連接”原則選出一臺Cache服務器,映射該“熱門”站點到這臺Cache服務器,很快這臺Cache服務器也會超載,就會重復上述過程選出新的Cache服務器。這樣,可能會導致該“熱門”站點的映像會出現在所有的Cache服務器上,降低了Cache服務器的使用效率。LBLCR調度算法將“熱門”站點映射到一組Cache服務器(服務器集合),當該“熱門”站點的請求負載增加時,會增加集合里的Cache服務器,來處理不斷增長的負載;當該“熱門”站點的請求負載降低時,會減少集合里的Cache服務器數目。這樣,該“熱門”站點的映像不太可能出現在所有的Cache服務器上,從而提供Cache集群系統的使用效率。LBLCR算法先根據請求的目標IP地址找出該目標IP地址對應的服務器組;按“最小連接”原則從該服務器組中選出一臺服務器,若服務器沒有超載,將請求發送到該服務器;若服務器超載;則按“最小連接”原則從整個集群中選出一臺服務器,將該服務器加入到服務器組中,將請求發送到該服務器。同時,當該服務器組有一段時間沒有被修改,將最忙的服務器從服務器組中刪除,以降低復制的程度。

? ?5、目標地址散列調度(Destination Hashing,dh)算法也是針對目標IP地址的負載均衡,但它是一種靜態映射算法,通過一個散列(Hash)函數將一個目標IP地址映射到一臺服務器。目標地址散列調度算法先根據請求的目標IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。

? ?6、源地址散列調度(Source Hashing,sh)算法正好與目標地址散列調度算法相反,它根據請求的源IP地址,作為散列鍵(Hash Key)從靜態分配的散列表找出對應的服務器,若該服務器是可用的且未超載,將請求發送到該服務器,否則返回空。它采用的散列函數與目標地址散列調度算法的相同。除了將請求的目標IP地址換成請求的源IP地址外,它的算法流程與目標地址散列調度算法的基本相似。在實際應用中,源地址散列調度和目標地址散列調度可以結合使用在防火墻集群中,它們可以保證整個系統的唯一出入口。

四、實現步驟

? ?1.網絡規劃

用途ip地址版本號系統版本號
集群服務器192.168.1.202ipvsadm1.26
centos6.5
apache+php1
192.168.1.201

apache2.4.9

php5.4.26

centos6.5
apache+php2
192.168.1.100

apache2.4.9

php5.4.26

centos6.5
數據庫192.168.1.200MariaDB10.0.10centos6.5
對外提供服務的ip地址192.168.1.230

? ?2.本處的apache、php、MariaDB都為編譯安裝

? ? ?關于編譯安裝的操作,請移步本人的相關博客http://wangfeng7399.blog.51cto.com/3518031/1381688,本處就不再做累贅

? ? ? ?特別說明,如果是編譯安裝的話應該在httpd的配置文件中添加KeepAlive Off用來關閉httpd的會話保持

? ?3.集群配置方法

? ? ?①、前段LVS集群服務器的配置 ? ? ?

1
2
3
4
在eth0:0上設置對外提供的地址
[root@localhost ~]# ifconfig eth0:0?192.168.1.230/24?netmask?255.255.255.255?broadcast?192.168.1.230?up
設置路由
[root@localhost ~]# route add -host?192.168.1.230?dev eth0:0

? ? ?②、后臺兩個Real Server服務器的配置

1
2
3
4
5
6
7
8
設置網卡只對有eth0網卡上的ip地址做通告
[root@httpweb ~]# echo?1?> /proc/sys/net/ipv4/conf/all/arp_ignore
[root@httpweb ~]# echo?1?> /proc/sys/net/ipv4/conf/eth0/arp_ignore
[root@httpweb ~]# echo?2?> /proc/sys/net/ipv4/conf/eth0/arp_announce
[root@httpweb ~]# echo?2?> /proc/sys/net/ipv4/conf/all/arp_announce
在lo上設置集群服務的ip地址
[root@httpweb ~]# ifconfig lo:0?192.168.1.230?netmask?255.255.255.255?broadcast?192.168.1.230?up
[root@httpweb ~]# route add -host?192.l68.1.230?dev lo:0

? ? ?③、兩臺服務的配置均為一樣

? ? ?④、設置集群服務

1
2
3
[root@localhost ~]# ipvsadm -A -t?192.168.1.230:80?-s rr
[root@localhost ~]# ipvsadm -a -t?192.168.1.230:80?-r?192.168.1.100?-g
[root@localhost ~]# ipvsadm -a -t?192.168.1.230:80?-r?192.168.1.201?-g

? ? ?⑤、測試

1
2
3
4
5
6
7
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version?1.2.1?(size=4096)
Prot LocalAddress:Port Scheduler Flags
??-> RemoteAddress:Port?????????? Forward Weight ActiveConn InActConn
TCP??192.168.1.230:80?rr
??->?192.168.1.100:80?????????????Route???1??????0??????????0??
??->?192.168.1.201:80?????????????Route???1??????0??????????0

? ? ?我們會看到我們為兩個服務器單獨書寫的網頁

wKioL1NOTROT5CJlAADikoUcpEE190.jpg

wKioL1NOdOKT5_GiAAEGCSPhYt4941.jpg

提供Director服務腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Director腳本:
#!/bin/bash
#
# LVS script?for?VS/DR
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.0.210
RIP1=192.168.0.221
RIP2=192.168.0.222
PORT=80
#
case?"$1"?in
start)???????
??/sbin/ifconfig eth0:1?$VIP broadcast $VIP netmask?255.255.255.255?up
??/sbin/route add -host $VIP dev eth0:1
# Since?this?is?the Director we must be able to forward packets
??echo?1?> /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
??/sbin/iptables -F
# Reset iptables counters.
??/sbin/iptables -Z
# Clear all ipvsadm rules/services.
??/sbin/ipvsadm -C
# Add an IP virtual service?for?VIP?192.168.0.219?port?80
# In?this?recipe, we will?use?the round-robin scheduling method.
# In production, however, you should?use?a weighted,?dynamic?scheduling method.
??/sbin/ipvsadm -A -t $VIP:80?-s wlc
# Now direct packets?for?this?VIP to
# the real server IP (RIP) inside the cluster
??/sbin/ipvsadm -a -t $VIP:80?-r $RIP1 -g -w?1
??/sbin/ipvsadm -a -t $VIP:80?-r $RIP2 -g -w?2
??/bin/touch /var/lock/subsys/ipvsadm &> /dev/null
;;
stop)
# Stop forwarding packets
??echo?0?> /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
??/sbin/ipvsadm -C
# Bring down the VIP?interface
??/sbin/ifconfig eth0:1?down
??/sbin/route del $VIP
??????????????????????????????????????????????????????????????????????????
??/bin/rm -f /var/lock/subsys/ipvsadm
??????????????????????????????????????????????????????????????????????????
??echo?"ipvs is stopped..."
;;
status)
??if?[ ! -e /var/lock/subsys/ipvsadm ]; then
????echo?"ipvsadm is stopped ..."
??else
????echo?"ipvs is running ..."
????ipvsadm -L -n
??fi
;;
*)
??echo?"Usage: $0 {start|stop|status}"
;;
esac

? ?提供Real Server啟動腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash
#
# Script to start LVS DR real server.
# description: LVS DR real server
#
.? /etc/rc.d/init.d/functions
VIP=192.168.0.219
host=`/bin/hostname`
case?"$1"?in
start)
???????# Start LVS-DR real server on?this?machine.
????????/sbin/ifconfig lo down
????????/sbin/ifconfig lo 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
????????/sbin/ifconfig lo:0?$VIP broadcast $VIP netmask?255.255.255.255?up
????????/sbin/route add -host $VIP dev lo:0
;;
stop)
????????# Stop LVS-DR real server loopback device(s).
????????/sbin/ifconfig lo:0?down
????????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
;;
status)
????????# Status of LVS-DR real server.
????????islothere=`/sbin/ifconfig lo:0?| grep $VIP`
????????isrothere=`netstat -rn | grep?"lo:0"?| grep $VIP`
????????if?[ !?"$islothere"?-o !?"isrothere"?];then
????????????# Either the route or the lo:0?device
????????????# not found.
????????????echo?"LVS-DR real server Stopped."
????????else
????????????echo?"LVS-DR real server Running."
????????fi
;;
*)
????????????# Invalid entry.
????????????echo?"$0: Usage: $0 {start|status|stop}"
????????????exit?1
;;
esac

? ?提供LVS-NET的腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
#
# chkconfig: -?88?12
# description: LVS script?for?VS/NAT
#
. /etc/rc.d/init.d/functions
#
VIP=192.168.0.219
DIP=192.168.10.10
RIP1=192.168.10.11
RIP2=192.168.10.12
#
case?"$1"?in
start)???????
??/sbin/ifconfig eth0:1?$VIP netmask?255.255.255.0?up
# Since?this?is?the Director we must be able to forward packets
??echo?1?> /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
??/sbin/iptables -F
# Reset iptables counters.
??/sbin/iptables -Z
# Clear all ipvsadm rules/services.
??/sbin/ipvsadm -C
# Add an IP virtual service?for?VIP?192.168.0.219?port?80
# In?this?recipe, we will?use?the round-robin scheduling method.
# In production, however, you should?use?a weighted,?dynamic?scheduling method.
??/sbin/ipvsadm -A -t $VIP:80?-s rr
# Now direct packets?for?this?VIP to
# the real server IP (RIP) inside the cluster
??/sbin/ipvsadm -a -t $VIP:80?-r $RIP1 -m
??/sbin/ipvsadm -a -t $VIP:80?-r $RIP2 -m
?????????????????????????????????????????????????????
??/bin/touch /var/lock/subsys/ipvsadm.lock
;;
stop)
# Stop forwarding packets
??echo?0?> /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
??/sbin/ipvsadm -C
# Bring down the VIP?interface
??ifconfig eth0:1?down
?????????????????????????????????????????????????????
??rm -rf /var/lock/subsys/ipvsadm.lock
;;
status)
??[ -e /var/lock/subsys/ipvsadm.lock ] && echo?"ipvs is running..."?|| echo?"ipvsadm is stopped..."
;;
*)
??echo?"Usage: $0 {start|stop}"
;;
esac

本文轉自wangfeng7399 51CTO博客,原文鏈接:http://blog.51cto.com/wangfeng7399/1396717,如需轉載請自行聯系原作者