Linux Virtual Server (LVS)是一套完整的基于IP的负载均衡的集群软件。LVS运行在一对有相似配置的计算机上:一个作为活动LVS Router(Active LVS Router),一个作为备份LVS Router(Backup LVS Router)。活动LVS Router服务有两个角色:
* 均衡负载到真实服务器上。
* 检查真实服务器提供的服务是否正常。
备份LVS Router用来监控活动的LVS Router,以备活动的LVS
Router失败时由备份LVS Router接管。
Pulse进程运行在活动LVS Router和备份LVS Router上。在备份LVS
Router上,pulse发送一个心跳(heartbeat)到活动LVS
Router的公网接口上以检查活动LVS Router是否正常。在活动LVS
Router上,pulse启动lvs进程并响应来自于备份LVS Router的心跳。
lvs进程调用ipvsadm工具去配置和维护IPVS路由表,并为每一个在真实服务器上的虚拟服务启动一个nanny进程。每一个nanny进程去检查
真实服务器上的虚拟服务状态,并将故障情况通知lvs进程。假如一个故障被发现,lvs进程通知ipvsadm在IPVS路由表中将此节点删除。
如果备份LVS Router未收到来自于活动LVS
Router的响应,它将调用send_arp将虚拟IP地址再分配到备份LVS
Router的公网接口上。并在公网接口和局域网接口上分别发送一个命令去关掉活动LVS
Router上的lvs进程。同时启动自己的lvs进程来调度客户端请求。
下面是一个两层结构的LVS架构:
下面是一个三层结构的LVS架构:
两层结构的LVS架构适合于Real
Server上的数据变化不是很频繁的情况,如果Real
Server上的数据变化很频繁应该考虑使用三层结构的LVS架构,将数据放到一个共享文件系统(GFS)上供所有的Real
Server同时读写。
你可以使用VS/NAT、VS/TUN和VS/DR来实现IP负载均衡:
* 使用VS/NAT方法:客户通过Virtual IP
Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址
Virtual
IP
Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash
表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务
器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual
IP
Address和相应的端口,再把报文发给用户。当使用VS/NAT方法时,如果有大量的响应数据经过调度器,调度器将成为整个集群的瓶颈。
* 使用VS/TUN方法:VS/TUN的连接调度和管理与VS/NAT中的一样,只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一 台服务器,将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器;服务器收到报文后,先将报文解封获得原来目标地址为VIP的报 文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
* 使用VS/DR方法:调度器和服务器组都必须在物理上有一个网卡通过不分断的局域网相连,如通过交换机或者高速的HUB相连。VIP地址为调度器和服务器 组共享,调度器配置的VIP地址是对外可见的,用于接收虚拟服务的请求报文;所有的服务器把VIP地址配置在各自的Non-ARP网络设备上,它对外面是 不可见的,只是用于处理目标地址为VIP的网络请求。在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文, 而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务 器肯定可以收到这个数据帧,从中可以获得该IP报文。当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应 报文直接返回给客户。
二、本实验拓扑图
在实际环境中可修改192.168.0.200、192.168.0.10、192.168.0.11为真IP。
三、LVS在RedHat 5上的安装
1、需要的安装包:
操作系统:RedHat 5
LVS安装包:
php-common-5.1.6-5.el5.i386.rpm
php-cli-5.1.6-5.el5.i386.rpm
php-5.1.6-5.el5.i386.rpm
ipvsadm-1.24-8.1-i386.rpm
piranha-0.8.4-7.el5.i386.rpm
如果系统中没有安装Apache还需要Apache的安装包。
2、在Active LVS Router上安装PHP
Shell # rpm -ivh php-common-5.1.6-5.el5.i386.rpm
Shell # rpm -ivh php-cli-5.1.6-5.el5.i386.rpm
Shell # rpm -ivh php-5.1.6-5.el5.i386.rpm
Shell # vi /etc/httpd/conf/httpd.conf
查找AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
在其下加入:
AddType application/x-tar .tgz
AddType application/x-httpd-php .php
AddType image/x-icon .ico
修改DirectoryIndex 行,添加index.php
修改为DirectoryIndex index.php index.html index.html.var
# vi /var/www/html/test.php
添加以下行:
//php标记(用<代替[)
[?php
phpinfo();
?]
wq保存退出。
Shell # /etc/init.d/httpd restart
//重新启动Apache
打开浏览器进行测试,输入http://localhost/test.php,如果能够成功显示PHP变量则说明PHP安装成功。
3、在Active LVS Router上安装LVS所需要的包
Shell # rpm -ivh ipvsadm-1.24-8.1-i386.rpm
Shell # rpm -ivh piranha-0.8.4-7.el5.i386.rpm
4、在Active LVS Router上打开数据转发
Shell # vi /etc/sysctl.conf
找到下面行:
net.ipv4.ip_forward = 0
将0 改成1,
net.ipv4.ip_forward = 1
执行如下命令来应用:
sysctl -p
5、在Backup LVS Router上重复2、3、4步。
6、在Active LVS Router上初始化piranha的密码
Shell # piranha-passwd
输入两遍密码即可。
在Active LVS Router上启动需要的服务
Shell # /etc/init.d/piranha-gui start
在Active LVS Router上配置LVS
首先在浏览器中输入http://localhost:3636打开piranha,输入用户名:piranha,密码:上面设置的密码。
登录后将看到监视屏幕。
配置Global Settings(是对Active LVS Router的配置),点击Direct Routing,然后输入公网IP,和局域网IP。点击ACCEPT按钮保存设置。
配置Redundancy(是对Backup LVS Router的配置),输入公网IP,和局域网IP。点击ACCEPT按钮保存设置。
点击ADD按钮添加一个服务。
按下面配置添加的服务。配置完成后不要忘记点击ACCEPT按钮保存设置。
点击REAL SERVER连接,配置Real Server。
点击ADD按钮添加一个节点,点击EDIT按钮编辑节点,点击(DE)ACTIVATE按钮激活节点。
点击MONITORING SCRIPTS连接修改监控设置,在此保持默认。
点击VIRTUAL SERVERS连接,然后点击(DE)ACTIVATE按钮激活上面设置的服务。
7、在Active LVS Router上启动pulse进程
Shell # /etc/init.d/pulse start
Shell # chkconfig --level 2345 piranha-gui on
Shell # chkconfig --level 2345 pulse on
拷贝配置文件到Backup LVS Router。
Shell # scp /etc/sysconfig/ha/lvs.cfg
root@192.168.0.21:/etc/sysconfig/ha/
8、在Backup LVS Router上启动pulse进程
Shell # /etc/init.d/pulse start
Shell # chkconfig --level 2345 pulse on
9、配置Real Server
在Real Server上创建一个脚本:
Shell # vi /root/lvsRealServer.sh
#!/bin/bash
#Description : RealServer Start!
#Write by:iStone
#Last Modefiy:2007.12.15
VIP=192.168.0.200
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255
up
/sbin/route add -host $VIP dev lo:0
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
sysctl -p
#end
保存退出,并给执行权限。
Shell # chmod u+x /root/lvsRealServer.sh
Shell # ./root/lvsRealServer.sh
将脚本加入/etc/rc.d/rc.local
Shell # vi /etc/rc.d/rc.local
/root/lvsRealServer.sh
在每个Real Server上重复本步。
10、测试,在其它机器上访问虚拟IP
回到Active LVS Router上,输入ipvsadm命令
如果看到以上输出,说明LVS配置成功。