一、简介

   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.202 ipvsadm1.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.200 MariaDB10.0.10 centos6.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,如需转载请自行联系原作者