LVS是1998年5月由章文嵩博士发起和领导的优秀的集群解决方案,许多商业的集群产品,比如RedHat的Piranha,TurboLinux公司的Turbo Cluster等,都是基于LVS的核心代码的。在现实的应用中,LVS得到了大量的部署。 1.3 LVS集群的特点

功能 有实现三种IP负载均衡技术和八种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每个虚拟服务有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of Service)攻击,实现了三种防卫策略。 有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行监测,能及时将故障屏蔽,实现系统的高可用性。主、从调度器能周期性地进行状态同步,从而实现更高的可用性。 适用性

后端服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows NT/2000等。 负载调度器能够支持绝大多数的TCP和UDP协议,无需对客户机和服务器作任何修改,可适用大多数Internet服务。

性能 LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。 可靠性 LVS服务器集群软件已经在很多大型的、关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。有很多调度器运行一年多,未作一次重启动。 软件许可证(免费)

LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。

1.4 Ldirectord简介 ldirectord(Linux Director Daemon)是Jacob Rief编写的一个独立程序,以实现对LVS中的realserver管理和监测,由于LVS本身不能实现realserver的故障转移,因此需要ldirectord来帮助实现。 1.5 LVS的安装 LVS是基于Linux内核的,目前的主流版本一般已经包含了LVS,所以不需要另外安装,如果没有包含,就需要手动编译linux内核来安装,这个过程比较复杂,这里不再描述。 ipvsadm是用来管理和加载LVS配置的,需要手工安装,过程如下:

1下载 http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24-6.src.rpm 注意ipvsadm-1.25版本只支持2.6.28以上的内核,需要升级系统内核 2安装

rpmbuild --rebuild ipvsadm-1.24-6.src.rpm
报错
error: Legacy syntax is unsupported: copyright 
error: line 7: Unknown tag: Copyright: GNU General Public Licence 
cd /usr/src/redhat/SPECS 
#编辑spec文件,把标签Copyright改成Licensevi ipvsadm.spec rpmbuild -ba ipvsadm.spec 
ln -s /usr/src/kernels/2.6.18-92.el5-i686 /usr/src/linux 
rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.24-6.i386.rpm 3 ipvsadm的使用
#清除配置 
ipvsadm -C#添加一个virtual Service,-t表示TCP service,-s rr:表示轮询的方法,缺省为wcl 
ipvsadm -A -t 192.168.100.200:80 -s rr#添加一个real server到virtual Service中,-r:realserver的地址,
#-g:DR(Direct Routing) -i(IP Tunneling) -m NAT(Network Address Translation)
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.2:80 -g
ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.3:80 -g 
#查看server列表 ipvsadm –Ln#查看连接状态 Ipvsadm -Lcn
6. 保存当前设置到文件中 
ipvsadm-save > /etc/sysconfig/ipvsadm7.从文件中加载设置
ipvsadm-restore < /etc/sysconfig/ipvsadm
默认会加载/etc/sysconfig/ipvsadm,或/etc/ipvsadm.rules 
8.启动服务 service ipvsadm start9.将服务设置为自动启动
chkconfig --level 35 ipvsadm on 
 当然,如果我们使用ldirectord来管理LVS,就不需要使用ipvsadm了,只是有时会需要使用ipvsadm查看LVS的连接状态。 
1.6 Ldirectord的安装 
由于最新版本的Ldirectord是包含在Heartbeat安装包中的,因此,安装好Heartbeat,就有了Ldirectord,Heartbeat的安装过程见《使用Heartbeat实现LVS的故障转移.doc》。 
1.7 LVS DIRECTOR的配置真实IP
/etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0IPADDR=192.168.100.10
NETMASK=255.255.255.0 
ONBOOT=yes虚拟
IP /etc/sysconfig/network-scripts/ifcfg-eth0:100 
DEVICE=eth0:100IPADDR=192.168.100.200
NETMASK=255.255.255.0 
ONBOOT=yes重启网络使配置生效
service network restart
1.8 ApacheServer的配置
ApacheServer1
/etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0 
IPADDR=192.168.100.2 
NETMASK=255.255.255.0 
ONBOOT=yesDEVICE=lo:100 
/etc/sysconfig/network-scripts/ifcfg-lo:100 
IPADDR=192.168.100.200 
NETMASK=255.255.255.255 
ONBOOT=yes 
service network restart 
 ApacheServer2 
/etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0 
IPADDR=192.168.100.3 
NETMASK=255.255.255.0 
ONBOOT=yes /etc/sysconfig/network-scripts/ifcfg-lo:100 
DEVICE=lo:100 
IPADDR=192.168.100.200 
NETMASK=255.255.255.255 
ONBOOT=yes service network restart 
两台ApacheServer都需要关闭 arp 
/etc/sysctl.conf中增加 
#foripvs 
net.ipv4.conf.lo.arp_ignore = 1 
net.ipv4.conf.lo.arp_announce = 2 
net.ipv4.conf.all.arp_ignore = 1 
net.ipv4.conf.all.arp_announce = 2 
net.ipv4.conf.default.rp_filter = 1 
#end of ipvs sysctl -p使其生效
1.9 Ldirectord的配置
chkconfig --add ldirectord 
chkconfig –level 35 ldirectord on 
vi /etc/ha.d/ldirectord.cf # Global Directives 
checktimeout=3 
checkinterval=1 
#fallback=127.0.0.1:80 
autoreload=yes 
#logfile="/var/log/ldirectord.log" 
#logfile="local0" 
#emailalert="admin@x.y.z" 
#emailalertfreq=3600 
#emailalertstatus=all 
quiescent=yes # Sample for an http virtual service 
virtual=192.168.100.200:80 
real=192.168.100.2:80 gate 
real=192.168.100.3:80 gate 
fallback=127.0.0.1:80 gate 
service=http 
request=".healthcheck.html" 
receive="OKAY" 
# virtualhost=some.domain.com.au 
scheduler=rr 
#persistent=600 
#netmask=255.255.255.255 
protocol=tcp 
checktype=negotiate 
checkport=80 
# request="index.html" 
# receive="Test Page" 
# virtualhost=www.x.y.z ApacheServer上需要增加检查文件 
echo "OKAY" > /usr/local/apache2/htdocs/.healthcheck.html 启动ldirectord 
/etc/rc.d/init.d/ ldirectord start 如果启动遇到错误starting ldirectord... Can't locate Mail/Send.pm ,则需要安装下面两个包: 
rpm -ivh perl-TimeDate-1.16-1.2.el5.rf.noarch.rpm 
rpm -ivh perl-MailTools-1.77-1.el5.noarch.rpm1.10 测试
1.10.1 测试负载均衡 
访问http://192.168.100.200/tests.php,第一次显示 
This is 100.2! 
1261385691 
1261387336 
eqqrp3g8ko3i9bqkr40tmo9pf1 过一会儿再刷新,显示 
This is 100.3! 1261385691 
1261387378 
 eqqrp3g8ko3i9bqkr40tmo9pf1 说明负载均衡正常
1.10.2 测试故障转移 
查看LVS当前状态 
ipvsadm –Ln 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.100.200:80 rr 
-> 192.168.100.2:80 Route 1 0 0 
-> 192.168.100.3:80 Route 1 0 0 Weight都为1,说明两个服务器正常 
停掉100.3上的apache再看 
IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.100.200:80 rr 
-> 192.168.100.2:80 Route 1 0 0 
-> 192.168.100.3:80 Route 0 0 0 
100.3的Weight为0,说明100.3已经被LVS从服务器列表中暂时排除掉 
启动100.3上的apache再看 
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.100.200:80 rr 
-> 192.168.100.2:80 Route 1 0 0 
-> 192.168.100.3:80 Route 1 0 0 100.3被重新加入到列表中。 
1.10.3 测试性能 
 单机 
ab -n 20000 -c 1000 http://192.168.100.2/tests.php 
Requests per second: 1561.95 [#/sec] (mean) 
Time per request: 640.224 [ms] (mean) 
Time per request: 0.640 [ms] (mean, across all concurrent requests) 
Transfer rate: 701.63 [Kbytes/sec] received Connection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 32 340.0 2 8999 
Processing: 1 242 1185.6 32 12740 
Waiting: 0 238 1186.1 27 12740 
Total: 18 275 1242.3 34 12801 Percentage of the requests served within a certain time (ms) 
50% 34 
66% 36 
75% 37 
80% 38 
90% 44 
95% 660 
98% 6272 
99% 6331 
100% 12801 (longest request)ab -n 20000 -c 1000 http://192.168.100.3/tests.php
Requests per second: 3142.92 [#/sec] (mean) 
Time per request: 318.175 [ms] (mean) 
Time per request: 0.318 [ms] (mean, across all concurrent requests) 
Transfer rate: 1411.80 [Kbytes/sec] receivedConnection Times (ms) 
min mean[+/-sd] median max 
Connect: 0 28 265.4 3 3008 
Processing: 1 193 819.5 36 6300 
Waiting: 0 186 820.3 28 6299 
Total: 22 222 866.8 39 6362ab -n 20000 -c 1000 http://192.168.100.3/tests.php
Percentage of the requests served within a certain time (ms) 
50% 39 
66% 41 
75% 43 
80% 45 
90% 242 
95% 670 
98% 3116 
99% 6325 
100% 6362 (longest request) 
 双机 ab -n 20000 -c 1000 http://192.168.100.200/tests.php Requests per second: 4858.15 [#/sec] (mean) 
Time per request: 205.840 [ms] (mean) 
Time per request: 0.206 [ms] (mean, across all concurrent requests) 
Transfer rate: 2182.28 [Kbytes/sec] receivedConnection Times (ms) min mean[+/-sd] median max 
Connect: 0 43 320.5 5 3041 
Processing: 1 124 322.2 64 3109 
Waiting: 0 108 321.7 45 3094 
Total: 7 167 456.1 69 3310 
 Percentage of the requests served within a certain time (ms) 
50% 69 
66% 86 
75% 97 
80% 105 
90% 274 
95% 631 
98% 3031 
99% 3105 
100% 3310 (longest request)

双机的性能基本是单机的总和,说明LVS做负载均衡对性能基本没有消耗。