LVS+Ldirectord实现Web服务器的负载均衡及故障转移

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改成License

vi 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/ipvsadm

7.从文件中加载设置

ipvsadm-restore < /etc/sysconfig/ipvsadm

默认会加载/etc/sysconfig/ipvsadm,或/etc/ipvsadm.rules
8.启动服务 service ipvsadm start

9.将服务设置为自动启动

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=eth0

IPADDR=192.168.100.10

NETMASK=255.255.255.0
ONBOOT=yes


虚拟

IP /etc/sysconfig/network-scripts/ifcfg-eth0:100
DEVICE=eth0:100

IPADDR=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=yes


DEVICE=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.rpm

1.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] received


Connection 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 6362


ab -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] received


Connection 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做负载均衡对性能基本没有消耗。

 

posted @ 2011-10-28 11:20  wwh  阅读(462)  评论(0编辑  收藏  举报