一、 LVS简介
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)等。

二、 LVS体系结构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层,用Load Balancer表示,中间的服务器群组层,用Server Array表示,最底端的数据共享存储层,用Shared Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
LVS体系结构如图1所示:
Linux负载均衡软件LVS-LMLPHP
下面对LVS的各个组成部分进行详细介绍:

Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。

Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为Director Server的应用还不是很多,性能也不是很好。

对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。

三、 LVS集群的特点

3.1 IP负载均衡与负载调度算法

1.IP负载均衡技术
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。

LVS的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务
这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,

IPVS实现负载均衡机制有三种,分别是NAT、TUN和DR,详述如下: 

VS/NAT: 即(Virtual Server via Network Address Translation)
也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求报文的目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时报文的目标端口也改成选定的Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server返回数据给用户时,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。
可以看出,在NAT方式下,用户请求和响应报文都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能力将称为瓶颈。

VS/TUN :即(Virtual Server via IP Tunneling) 
也就是IP隧道技术实现虚拟服务器。它的连接调度和管理与VS/NAT方式一样,只是它的报文转发方法不同,VS/TUN方式中,调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过前端调度器,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一个网段,也可以是独立的一个网络。因此,在TUN方式中,调度器将只处理用户的报文请求,集群系统的吞吐量大大提高。

VS/DR: 即(Virtual Server via Direct Routing) 
也就是用直接路由技术实现虚拟服务器。它的连接调度和管理与VS/NAT和VS/TUN中的一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上

2.负载调度算法
上面我们谈到,负载调度器是根据各个服务器的负载情况,动态地选择一台Real Server响应用户请求,那么动态选择是如何实现呢,其实也就是我们这里要说的负载调度算法,根据不同的网络服务需求和服务器配置,IPVS实现了如下八种负载调度算法,这里我们详细讲述最常用的四种调度算法,剩余的四种调度算法请参考其它资料。

轮叫调度(Round Robin)
“轮叫”调度也叫1:1调度,调度器通过“轮叫”调度算法将外部用户请求按顺序1:1的分配到集群中的每个Real Server上,这种算法平等地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。 

加权轮叫调度(Weighted Round Robin) 
“加权轮叫”调度算法是根据Real Server的不同处理能力来调度访问请求。可以对每台Real Server设置不同的调度权值,对于性能相对较好的Real Server可以设置较高的权值,而对于处理能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访问流量。充分合理的利用了服务器资源。同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。 

最少链接调度(Least Connections) 
“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。 

加权最少链接调度(Weighted Least Connections) 
“加权最少链接调度”是“最少连接调度”的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态的设置相应的权值,缺省权值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。

其它四种调度算法分别为:基于局部性的最少链接(Locality-Based Least Connections)、带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)、目标地址散列(Destination Hashing)和源地址散列(Source Hashing),对于这四种调度算法的含义,本文不再讲述,如果想深入了解这其余四种调度策略的话,可以登陆LVS中文站点zh.linuxvirtualserver.org,查阅更详细的信息。

3.2 高可用性
LVS是一个基于内核级别的应用软件,因此具有很高的处理性能,用LVS构架的负载均衡集群系统具有优秀的处理能力,每个服务节点的故障不会影响整个系统的正常使用,同时又实现负载的合理均衡,使应用具有超高负荷的服务能力,可支持上百万个并发连接请求。如配置百兆网卡,采用VS/TUN或VS/DR调度技术,整个集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s。
3.3 高可靠性
LVS负载均衡集群软件已经在企业、学校等行业得到了很好的普及应用,国内外很多大型的、关键性的web站点也都采用了LVS集群软件,所以它的可靠性在实践中得到了很好的证实。有很多以LVS做的负载均衡系统,运行很长时间,从未做过重新启动。这些都说明了LVS的高稳定性和高可靠性。
3.4 适用环境
LVS对前端Director Server目前仅支持Linux和FreeBSD系统,但是支持大多数的TCP和UDP协议,支持TCP协议的应用有:HTTP,HTTPS ,FTP,SMTP,,POP3,IMAP4,PROXY,LDAP,SSMTP等等。支持UDP协议的应用有:DNS,NTP,ICP,视频、音频流播放协议等。
LVS对Real Server的操作系统没有任何限制,Real Server可运行在任何支持TCP/IP的操作系统上,包括Linux,各种Unix(如FreeBSD、Sun Solaris、HP Unix等),Mac/OS和Windows等。

3.5 开源软件 
LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,因此,使用者可以得到软件的源代码,并且可以根据自己的需要进行各种修改,但是修改必须是以GPL方式发行。


一、 安装LVS软件


1.安装前准备工作
操作系统:统一采用Centos4.4版本。
地址规划,如表1所示:
表1
Linux负载均衡软件LVS-LMLPHP
更详细的信息如图2所示:
Linux负载均衡软件LVS-LMLPHP
图2中的VIP指的是虚拟IP地址,还可以叫做LVS集群的服务IP,在DR、TUN模式中,数据包是直接返回给用户的,所以,在Director Server上以及集群的每个节点上都需要设置这个地址

此IP在Real Server上一般绑定在回环地址上,例如lo:0,同样,在Director Server上,虚拟IP绑定在真实的网络接口设备上,例如eth0:0。

各个Real Server可以是在同一个网段内,也可以是相互独立的网段,还可以是分布在internet上的多个服务器。

2.安装操作系统
Centos4.4版本的Linux,内核默认支持LVS功能,为了方便编译安装IPVS管理软件,在安装操作系统时,建议选择如下这些安装包:

桌面环境:xwindows system、GNOME desktop environment。
开发工具:development tools、x software development、gnome software、development、kde software development。

系统安装完毕,可以通过如下命令检查kernel是否已经支持LVS的ipvs模块:

[root@localhost ~]#modprobe -l |grep ipvs
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.9-42.ELsmp/kernel/net/ipv4/ipvs/ip_vs_sh.ko

如果有类似上面的输出,表明系统内核已经默认支持了IPVS模块。接着就可以安装IPVS管理软件了。

3.在Director Serve上安装IPVS管理软件

IPVS提供的软件包有源码方式的也有rpm方式的,这里介绍下源码方式安装IPVS,首先从http://www.linuxvirtualserver.org/software/ipvs.html下载对应版本的ipvs源码,由于我们这里采用的操作系统为Centos4.4版本,因此,下载对应的ipvsadm-1.24版本,接着进行安装:

[root@localhost ~]#tar zxvf ipvsadm-1.24.tar.gz
[root@localhost ~]#cd ipvsadm-1.24
[root@localhost ~]#make
[root@localhost ~]#make install
注意:在make时可能会出现错误编译信息,这是由于编译程序找不到对应内核的原因,按照如下操作就可以正常编译:

[root@localhost ~]#ln -s /usr/src/kernels/2.6.9-42.EL-i686/ /usr/src/linux

也可以下载rpm安装包,通过rpm方式进行安装:

[root@localhost ~]#rpm –ivh ipvsadm-1.24-6.1.i386.rpm
然后执行:
[root@localhost ~]# ipvsadm --help 
如果看到帮助提示,表明IPVS已经成功安装。

4.ipvsadm的用法

(1)Ipvsadm常用的语法和格式如下:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f virtual-service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f virtual-service-address:port -r real-server-address:port
[-g|i|m] [-w weight]
ipvsadm -d -t|u|f virtual-service-address -r real-server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f virtual-service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm –h
其中:
virtual-service-address:是指虚拟服务器的IP地址,本文是192.168.60.200
real-service-address:是指Real Server的IP地址,本文是192.168.60.132/144
scheduler:指定调度算法

ipvsadm命令选项详细含义如表2所示:
表2
命令选项
含义
-A (--add-service) 在内核的虚拟服务器列表中添加一条新的虚拟IP记录。也就是增加一台新的虚拟服务器。虚拟IP也就是虚拟服务器的IP地址。
-E (--edit-service) 编辑内核虚拟服务器列表中的一条虚拟服务器记录
-D (--delete-service) 删除内核虚拟服务器列表中的一条虚拟服务器记录
-C (--clear) 清除内核虚拟服务器列表中的所有记录
-R (--restore) 恢复虚拟服务器规则
-S (--save) 保存虚拟服务器规则,输出为-R 选项可读的格式
-a (--add-server) 在内核虚拟服务器列表的一条记录里添加一条新的Real Server记录。也就是在一个虚拟服务器中增加一台新的Real Server
-e (--edit-server) 编辑一条虚拟服务器记录中的某条Real Server记录
-d (--delete-server) 删除一条虚拟服务器记录中的某条Real Server记录
-L|-l –list 显示内核中虚拟服务器列表
-Z (--zero) 虚拟服务器列表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
-t 说明虚拟服务器提供的是tcp服务,此选项后面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-u 说明虚拟服务器提供的是udp服务,此选项后面跟如下格式:
[virtual-service-address:port] or [real-server-ip:port]
-f fwmark 说明是经过iptables标记过的服务类型
-s 此选项后面跟LVS使用的调度算法

有这样几个选项: rr|wrr|lc|wlc|lblc|lblcr|dh|sh

默认的调度算法是: wlc
-p [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为300 秒。例如:-p 600,表示持续服务时间为600秒。
-r 指定Real Server的IP地址,此选项后面跟如下格式:
[real-server-ip:port]
-g (--gatewaying) 指定LVS 的工作模式为直接路由模式(此模式是LVS 默认工作模式)
-i (-ipip) 指定LVS 的工作模式为隧道模式
-m (--masquerading) 指定LVS 的工作模式为NAT模式
-w (--weight) weight 指定Real Server的权值
-c (--connection) 显示LVS目前的连接信息 如:ipvsadm -L -c
-L --timeout 显示“tcp tcpfin udp”的timeout值,如:ipvsadm -L --timeout
-L --daemon 显示同步守护进程状态,例如:ipvsadm -L –daemon
-L --stats 显示统计信息,例如:ipvsadm -L –stats
-L --rate 显示速率信息,例如:ipvsadm -L --rate
-L --sort 对虚拟服务器和真实服务器排序输出,例如:ipvsadm -L --sort

注释:
在表2中,左边括弧中的内容为ipvsadm每个选项的长格式表示形式,linux命令选项中,有长格式和短格式,短格式的选项用的比较多,实际应用中可以用括弧中的长格式替代短格式,例如,可以用“ipvsadm --clear”代替“ipvsadm -C”。
(2)举例
[root@localhost ~]# ipvsadm -A -t 192.168.60.200:80 -s rr -p 600
以上表示在内核的虚拟服务器列表中添加一条192.168.60.200的虚拟服务器记录,并且指定此虚拟服务器的服务端口为80,然后指定此虚拟服务器的调度策略为轮询调度,并且在每个real server上的持续服务时间为600秒,即10分钟。

[root@localhost ~]# ipvsadm -A -t 192.168.60.188:21 -s wlc
以上表示在内核的虚拟服务器列表中又添加了一条192.168.60.188的虚拟服务器,此虚拟服务器的服务端口为21,即FTP服务。使用的调度策略为wlc,即加权最少链接算法。

[root@localhost ~]# ipvsadm -a -t 192.168.60.200:80 -r 192.168.60.132:80 –g
[root@localhost ~]# ipvsadm -a -t 192.168.60.200:80 -r 192.168.60.144:80 –g

以上两条设置表示在虚拟服务器192.168.60.200中添加两条新的Real Server记录,两个Real Server的IP分别为192.168.60.132和192.168.60.144,

参数“-g”指定了虚拟服务器的工作模式为直接路由模式,即DR模式。

这样设置完毕后,当用户访问192.168.60.200的80服务时,LVS会根据设置的调度策略和路由模式将请求分配到192.168.60.132以及192.168.60.144的80端口。

LVS集群有DR、TUN、NAT三种配置模式,可以对www服务、FTP服务、MAIL服务等做负载均衡,下面通过搭建www服务的负载均衡实例,讲述基于DR模式的LVS集群配置。


一、 Director Server的配置
在Director Server上配置LVS负载均衡集群,有两种方法:

通过ipvsadm命令行进行配置

通过Redhat提供的工具piranha来配置LVS

1、通过ipvsadm命令行方式配置LVS


安装IPVS后,就可以配置LVS集群了,首先在Director Server上绑定一个虚拟IP(也叫VIP),此IP用于对外提供服务,执行如下命令:

[root@localhost ~]#ifconfig eth0:0 192.168.60.200 broadcast 192.168.60.200 netmask 255.255.255.255 up

此处在eth0设备上绑定了一个虚拟设备eth0:0,同时设置了一个虚拟IP是192.168.60.200,也就是上面我们规划的IP地址,然后指定广播地址也为192.168.60.200,需要特别注意的是,这里的子网掩码为255.255.255.255。

然后给设备eth0:0指定一条路由,执行如下指令:

[root@localhost ~]#route add -host 192.168.60.200 dev eth0:0 

接着启用系统的包转发功能,从而使系统充当路由器,执行如下指令:

[root@localhost ~]#echo "1" >/proc/sys/net/ipv4/ip_forward

指令中,参数值为1时启用ip转发,为0时禁止ip转发。其实在DR模式中,开启系统的包转发功能不是必须的,而在NAT模式下此操作是必须的

然后开始配置ipvs,执行如下操作:

[root@localhost ~]#ipvsadm -C
[root@localhost ~]#ipvsadm -A -t 192.168.60.200:80 -s rr -p 600
[root@localhost ~]#ipvsadm -a -t 192.168.60.200:80 -r 192.168.60.132:80 -g
[root@localhost ~]#ipvsadm -a -t 192.168.60.200:80 -r 192.168.60.144:80 -g

上面操作中,
第一行是清除内核虚拟服务器列表中的所有记录,
第二行是添加一条新的虚拟IP记录。这个新的IP是192.168.60.200,同时指定持续服务时间为600秒。
第三、四行是在新加虚拟IP记录中添加两条新的Real Server记录,并且指定LVS 的工作模式为直接路由模式。

最后,启动LVS服务,执行如下操作:

[root@localhost ~]#ipvsadm
这样,LVS在Director Server上的配置就完成了。

为了管理和配置的方便,可以将上面的操作写出一个脚本文件,脚本内容如下:

#!/bin/bash
VIP=192.168.60.200
RIP1=192.168.60.132
RIP2=192.168.60.144
GW=192.168.60.1
# set the Virtual IP Address
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0 
echo "1" >/proc/sys/net/ipv4/ip_forward
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:80 -s rr -p 600
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
#Run LVS
/sbin/ipvsadm
#end
也可以写成可启动与停止的服务脚本,脚本内容如下:

#!/bin/sh
# description: Start LVS of Director server
VIP=192.168.60.200
RIP1=192.168.60.132
RIP2=192.168.60.144
./etc/rc.d/init.d/functions

case "$1" in

start)
echo " start LVS of Director Server"
# set the Virtual IP Address and sysctl parameter
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
echo "1" >/proc/sys/net/ipv4/ip_forward 
#Clear IPVS table
/sbin/ipvsadm -C
#set LVS
/sbin/ipvsadm -A -t $VIP:80 -s rr -p 600
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
#Run LVS
/sbin/ipvsadm
;;
stop)
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac

将此脚本命名为lvsDR文件,然后把文件放到/etc/init.d下,执行:

[root@localhost ~]#chomd 755 /etc/init.d/lvsDR

最后可以通过下面命令启动或停止LVS服务:

service lvsDR {start|stop}

到此为止,命令行方式配置Director Server完毕。

2、通过Redhat提供的工具piranha来配置LVS


Piranha是REDHAT提供的一个基于Web的LVS配置软件,可以省去手工配置LVS的繁琐工作,同时,也可单独提供cluster功能,例如,可以通过Piranha激活Director Server的后备主机,也就是配置Director Server的双机热备功能。

Piranha工具的安装非常简单,下载Piranha的rpm包,进行安装即可:

[root@localhost ~]#rpm –ivh piranha-0.8.2-1.i386.rpm

Piranha安装完毕后,会产生/etc/sysconfig/ha/lvs.cf文件,默认此文件是空的,可以通过Piranha提供的web界面配置此文件,也可以直接手动编辑此文件,编辑好的lvs.cf文件内容类似如下,注意,“#”号后面的内容为注释。

[root@localhost ~]# more /etc/sysconfig/ha/lvs.cf
serial_no = 18 #序号。
primary = 192.168.60.56 #指定主Director Server的真实IP地址,是相对与有备用的Director Server而言的,也就是给Director Server做HA Cluster。
service = lvs #指定双机的服务名。
backup_active = 0 #是否激活备用Director Server。“0”表示不激活,“1”表示激活。
backup = 0.0.0.0 #这里指定备用Director Server的真实IP地址,如果没有备用Director Server,可以用“0.0.0.0”代替。
heartbeat = 0 #是否开启心跳,1表示开启,0表示不开启。
heartbeat_port = 539 #指定心跳的UDP通信端口。
keepalive = 5 #心跳间隔时间,单位是秒。
deadtime = 10 #如果主Director Server在deadtime(秒)后没有响应,那么备份Director
Server就会接管主Director Server的服务。
network = direct #指定LVS的工作模式,direct表示DR模式,nat表示NAT模式,tunnel表示TUNL模式。
debug_level = NONE #定义debug调试信息级别。
virtual www.gaojf.com{ #指定虚拟服务的名称。
active = 1 #是否激活此服务。
address = 192.168.60.200 eth0:0 #虚拟服务绑定的虚拟IP以及网络设备名。
port = 80 #虚拟服务的端口。
send = "GET / HTTP/1.0\r\n\r\n" #给real server发送的验证字符串。
expect = "HTTP" #服务器正常运行时应该返回的文本应答信息,用来判断real server是否工作正常。
use_regex = 0 # expect选项中是否使用正则表达式,0表示不使用,1表示使用。
load_monitor = none #LVS中的Director Server能够使用 rup 或 ruptime 来监视各个real server的负载状态。该选项有3个可选值,rup、ruptime和none,如果选择rup,每个real server就必须运行rstatd服务。如果选择了ruptime,每个real server就必须运行 rwhod 服务。
scheduler = rr #指定LVS的调度算法。
protocol = tcp #虚拟服务使用的协议类型。
timeout = 6 #real server失效后从lvs路由列表中移除失效real server所必须经过的时间,以秒为单位。
reentry = 15 #某个real server被移除后,重新加入lvs路由列表中所必须经过的时间,以秒为单位。
quiesce_server = 0 #如果此选项为1.那么当某个新的节点加入集群时,最少连接数会被重设
为零,因此LVS会发送大量请求到此服务节点,造成新的节点服务阻塞,
建议设置为0。
server RS1 { #指定real server服务名。
address = 192.168.60.132 #指定real server的IP地址。
active = 1 #是否激活此real server服务。
weight = 1 #指定此real server的权值,是个整数值,权值是相对于所有real server节点而言的,权值高的real server处理负载的性能相对较强。
}
server RS2 {
address = 192.168.60.144
active = 1
weight = 1
}
}
编辑完成,然后启动pulse服务,即启动lvs服务

[root@localhost ~]#service pulse start

同理,此种方式下也要启用系统的包转发功能:

[root@localhost ~]#echo "1" >/proc/sys/net/ipv4/ip_forward

到此为止,Piranha工具方式配置Director Server完毕。

二、Real server 的配置


在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server。

因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户,增加VIP地址的操作可以通过创建脚本的方式来实现,创建文件/etc/init.d/lvsrs,脚本内容如下:


#!/bin/bash
VIP=192.168.60.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

此操作是在回环设备上绑定了一个虚拟IP地址,并设定其子网掩码为255.255.255.255,与Director Server上的虚拟IP保持互通,然后禁止了本机的ARP请求。

上面脚本也可以写成可启动与停止的服务脚本,内容如下:

[root@localhost ~]#more /etc/init.d/lvsrs

#!/bin/bash
#description : Start Real Server 
VIP=192.168.60.200
./etc/rc.d/init.d/functions

case "$1" in
start)
echo " Start LVS of Real Server"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 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 
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Director server"
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
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
然后,修改lvsrs有可执行权限:
[root@localhost ~]#chomd 755 /etc/init.d/lvsrs

最后,可以通过下面命令启动或关闭lvsrs

service lvsrs {start|stop}
由于虚拟ip,也就是上面的VIP地址,是Director Server和所有的Real server共享的,如果有ARP请求VIP地址时,Director Server与所有Real server都做应答的话,就出现问题了,因此,需要禁止Real server响应ARP请求

而lvsrs脚本的作用就是使Real Server不响应arp请求。

对于2.4以下低版本,在Real Server上要安装ARP hidden内核补丁,幸运的是,在2.6内核中通过调整内核参数即可忽略ARP广播回应。

三、在Director上配置冗余策略 Ldirectord

Ldirectord的作用是监测Real Server,当Real Server失效时,把它从虚拟服务器列表中删除,恢复时重新添加到列表,在前面文章介绍heartbeat时默认已经安装了Ldirectord,因此。这里只需进行配置即可。

Ldirectord的配置文件是/etc/ha.d/ldirectord.cf。

下面是需要配置的选项,注意,“#”号后面的内容为注释:

# Global Directives
checktimeout=20 #判定real server出错的时间间隔。

checkinterval=10 #指定ldirectord在两次检查之间的间隔时间。
fallback=127.0.0.1:80 #当所有的real server节点不能工作时,web服务重定向的地址。

autoreload=yes #是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。
logfile="/var/log/ldirectord.log" #设定ldirectord日志输出文件路径。

quiescent=no #当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程序连接模板仍然保留在Director上。
注意:以上几行为ldirectord.cf文件的“全局”设置,它们可以应用到下面多个虚拟主机,下面是每个虚拟主机的配置。

# Sample for an http virtual service
virtual=192.168.60.200:80 #指定虚拟的IP地址和端口号,注意,在virtual行后面的行必

须缩进4个空格或以一个tab字符进行标记。
real=192.168.60.132:80 gate #指定Real Server服务器地址和端口,同时设定LVS工作模式,

用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
real=192.168.60.144:80 gate
fallback=127.0.0.1:80 gate 
service=http #指定服务的类型,这里是对http服务做负载均衡。
request="index.html" #ldirectord将根据指定的Real Server地址,结合该选项给出
的请求路径,发送访问请求,检查Real Server上的服务是否正
常运行,确保这里给出的页面地址是可访问的,不然ldirectord
会误认为此节点已经失效,发生错误监控现象。
receive="Test Page" #指定请求和应答字串。
scheduler=rr #指定调度算法,这里是rr(轮叫)算法。
protocol=tcp #指定协议的类型,LVS支持TCP和UDP协议。
checktype=negotiate #指定Ldirectord的检测类型,默认为negotiate。
checkport=80 #指定监控的端口号。
virtualhost=www.gaojf.com #虚拟服务器的名称,随便指定。
配置完毕,就可以执行如下命令启动或关闭ldirectord服务
/etc/init.d/ldirectord {start|stop}

Ldirectord的核心作用是监控Real Server节点状态,同时,它还能调用ipvsadm自动创建LVS路由表,这点从ldirectord.cf中可以看出

这里需要说明的是,ldirectord和Piranha都具有监控Real Server的功能,如果要通过ldirectord监控节点状态,只需启动ldirectord服务,整个集群系统就可以运行起来,而无需执行上面我们配置的LVS脚本,因为ldirectord会自动调用ipvsadm创建LVS路由表,而我们上面讲述的利用ipvsadm命令行方式配置LVS,是为了让读者能更深入的了解ipvsadm的实现细节和实现机制。

如果是通过Piranha工具配置LVS,就无需使用ldirectord,Piranha工具对应的系统进程是pluse,此进程也会自动调用ipvsadm创建LVS路由表,同时会利用自身的nanny守护进程监控real server的状态!



一、启动LVS集群服务
LVS负载均衡管理和使用有两种方式,一种是以ipvsadm命令行脚步与ldirectord监控方式,一种是以Piranha工具进行管理和使用。下面分别介绍。

1、利用ipvsadm命令行脚步与ldirectord监控方式管理LVS

在一切配置完毕之后,依次执行下面的操作启动LVS集群服务。

首先,启动每个real server节点的服务:

[root@localhost ~]# /etc/init.d/lvsrs start
start LVS of REALServer
然后,在Director Server启动ldirectord服务:

[root@localhost ~]# /etc/init.d/ldirectord start
Starting ldirectord [ OK ]
此时查看ldirectord 输出日志信息如下:
ldirectord|2561] Invoking ldirectord invoked as: /usr/sbin/ldirectord start 
ldirectord|2561] Starting Linux Director v1.186 as daemon
ldirectord|2563] Added virtual server: 192.168.60.200:80
ldirectord|2563] Added fallback server: 127.0.0.1:80 (192.168.60.200:80) (Weight set to 1)
ldirectord|2563] Added real server: 192.168.60.132:80 (192.168.60.200:80) (Weight set to 1)
ldirectord|2563] Deleted fallback server: 127.0.0.1:80 (192.168.60.200:80)
ldirectord|2563] Added real server: 192.168.60.144:80 (192.168.60.200:80) (Weight set to 1)
从日志可以看出,ldirectord首先加载了一个虚拟IP的80端口,然后加载了两个real server节点的80端口以及Director Server本机的80端口,同时将real server两个节点的权值设置为1,由于两个节点均可用,最后将Director Server本机的80端口从LVS路由表中删除。

接着,在Director Server启动lvsDR主服务:

[root@xa_web1 ~]# /etc/init.d/lvsDR start 
start LVS of DirectorServer
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.60.200:http rr persistent 600
-> 192.168.60.132:http Route 1 3 22 
-> 192.168.60.144:http Route 1 9 22
到此为止,LVS负载均衡集群系统已经开始运行。

2、利用Piranha工具管理LVS

在这种方式下,启动LVS集群很简单,只需执行如下命令即可:

/etc/init.d/pulse start
此时查看pulse服务的系统日志信息如下:
[root@localhost ~]# tail -f /var/log/messages
Nov 22 15:52:55 lvs lvs[7031]: starting virtual service www.gaojf.com active: 80
Nov 22 15:52:55 lvs lvs[7031]: create_monitor for www.gaojf.com/RS1 running as pid 7039
Nov 22 15:52:55 lvs nanny[7039]: starting LVS client monitor for 192.168.60.200:80
Nov 22 15:52:55 lvs lvs[7031]: create_monitor for www.gaojf.com/RS2 running as pid 7040
Nov 22 15:52:55 lvs nanny[7039]: making 192.168.60.132:80 available
Nov 22 15:52:55 lvs nanny[7040]: starting LVS client monitor for 192.168.60.200:80
Nov 22 15:52:55 lvs nanny[7040]: making 192.168.60.144:80 available
从日志可以看出,pulse服务启动了一个www.gaojf.com的虚拟服务,同时加载了RS1和RS2两个节点,然后检测到RS1和RS2两个节点对应的80端口可用,最后启动了虚拟IP的80端口,对外提供服务。
日志中“www.gaojf.com”、“RS1”、“RS2”等标识均在Piranha的配置文件/etc/sysconfig/ha/lvs.cf中定义。
Pulse服务启动完毕,通过“ps –ef”命令可以看到有如下进程在运行:
[root@localhost ~]# ps -ef|grep nanny
/usr/sbin/nanny -c -h 192.168.60.132 -p 80 -s GET / HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /
/usr/sbin/nanny -c -h 192.168.60.144 -p 80 -s GET / HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /
其中,nanny就是Pulse服务的守护进程,用于监控LVS服务节点的运行状态,类似与ldirectord的节点监控功能。
二、 测试负载均衡
这里假定两个real server节点配置www服务的网页文件根目录均为/webdata/www目录,然后分别执行如下操作:
在real server1 执行:
echo "This is real server1" /webdata/www/index.html
在real server2 执行: 
echo "This is real server2" /webdata/www/index.html
接着打开浏览器,访问http://192.168.60.200这个地址,然后不断刷新此页面,如果能分别看到“This is real server1”和“This is real server2”就表明LVS正常工作了。
三、测试故障切换功能
故障切换是测试当某个节点出现故障后,监控模块是否能及时发现,然后屏蔽故障节点,同时将服务转移到正常节点来执行,下面分别讲述用ldirectord监控时的故障切换过程和用nanny监控时的故障切换情形。
1、利用ldirectord监控LVS的故障切换
这里假定停掉real server1节点的www服务,然后观察ldirectord的日志变化,应该能看到类似如下的信息:
ldirectord|2614] Deleted real server: 192.168.60.132:80 (192.168.60.200:80)
由此可知,ldirectord监控到了192.168.60.132这个节点的服务出现故障,然后将此节点从LVS路由表中删除。
此时继续通过浏览器访问http://192.168.60.200,访问不受任何影响,但是仅仅显示“This is real server2”信息,这是由于real server1出现问题,被ldirectord屏蔽,整个LVS集群只有real server2在提供服务。
上面的日志输出信息是由于在ldirectord.cf中设置了“quiescent=no”,如果设置为“quiescent=yes”日志输出信息变为如下:
ldirectord|32454] Quiescent real server:192.168.60.132:80 (192.168.60.200:80) (Weight set to 0)
这段日志输出是将故障节点192.168.60.132的权值设置为0,而不从LVS路由表中删除这个主机,此时已经连接的客户端将出现无法访问现象,但是新的连接将不会分配到此节点。
如果重新启动Real server1的服务,ldirectord将能自动检测到节点已经激活,重新将此节点加入LVS路由表中,ldirectord会在日志中输出这些信息:
ldirectord|2614] Added real server: 192.168.60.132:80 (192.168.60.200:80) (Weight set to 1)
2、利用nanny监控LVS的故障切换
同样,这里也假定停掉real server1节点的www服务,然后观察pluse服务的日志信息,日志输出如下:
Nov 22 15:54:01 lvs nanny[7039]: shutting down 192.168.60.132:80 due to connection failure
可以看出,当停掉real server1的服务后,nanny守护进程监控到此节点故障,然后关闭了此节点的连接服务。
现在重启启动real server1节点的服务,然后观察pluse服务的日志输出:
Nov 22 16:49:41 lvs nanny[7158]: making 192.168.60.132:80 available
nanny守护进程在设定的检测时间内自动检测到real server1服务已经激活,重新使此节点变得可以连接。


Linux负载均衡软件LVS-LMLPHP

一、测试环境

计算机名

操作系统

IP地址

VIP

安装的软件

RH7-LVS01

Redhat  7.2

192.168.10.31

192.168.10.30

ipvsadm 1.27keepalived 1.2.13

RH7-LVS02

Redhat  7.2

192.168.10.32

ipvsadm 1.27keepalived 1.2.13

RH7-Web-01

Redhat  7.2

192.168.10.33

     ——

Apache  httpd 2.4

RH7-Web-02

Redhat  7.2

192.168.10.34

     ——

Apache  httpd 2.4


二、安装配置lvs与keepalived
1、分别在两台lvs服务器rh7-lvs01和rh7-lvs02上安装ipvsadm和keepalived


[root@rh7-lvs01 ~]# yum install ipvsadm keepalived -y


[root@rh7-lvs02 ~]# yum install ipvsadm keepalived -y


2、修改rh7-lvs01上的keepalived配置文件,按以下内容进行修改,将rh7-lvs01配置为MASTER节点,并设置LVS的负载均衡模式为DR模式


[root@rh7-lvs01 ~]# vi /etc/keepalived/keepalived.conf


! Configuration Filefor keepalived
  
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
  
vrrp_instance VI_1 {
    state MASTER #MASTER
    interface eno16777736
    virtual_router_id 52
    priority 100 #必须比BACKUP的值大
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.30 #VIP
    }
}
  
virtual_server192.168.10.30 80 {
    delay_loop 6
    lb_algo rr #轮询算法
    lb_kind DR #DR模式
    #persistence_timeout 50
    protocol TCP
  
    real_server 192.168.10.33 80 {
        weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
  
    real_server 192.168.10.34 80 {
        weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


3、修改rh7-lvs02上的keepalived配置文件,按以下内容进行修改,其实只有2处地方与主节点的配置文件不同,即state 要修改为Backup,priority数值要比master的小


[root@rh7-lvs02 ~]# vi /etc/keepalived/keepalived.conf


! Configuration Filefor keepalived
  
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
  
vrrp_instance VI_1 {
    state BACKUP #BACKUP
    interface eno16777736
    virtual_router_id 52
    priority 90 #必须比MASTER的值小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.30 #VIP
    }
}
  
virtual_server192.168.10.30 80 {
    delay_loop 6
    lb_algo rr #轮询算法
    lb_kind DR #DR模式
    #persistence_timeout 50
    protocol TCP
  
    real_server 192.168.10.33 80 {
        weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
  
    real_server 192.168.10.34 80 {
        weight 1
            TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}


4、在rh7-lvs01上设置keepalived开机自动启动,并启动keepalived服务


[root@rh7-lvs01 keepalived]# systemctl enable keepalived


[root@rh7-lvs01 keepalived]# systemctl start keepalived


5、观察rh7-lvs01的日志可观察到keepalived启动后所发生的一连串动作,根据配置文件的参数进入了MASTER状态,并绑定了VIP地址
[root@rh7-lvs01 ~]#tail -f /var/log/messages
Linux负载均衡软件LVS-LMLPHP

6、查看rh7-lvs01的IP地址,可以看到VIP已经绑定到网卡上

Linux负载均衡软件LVS-LMLPHP
7、在rh7-lvs02上设置keepalived开机自动启动,并启动keepalived服务
[root@rh7-lvs02 keepalived]# systemctl enable keepalived
[root@rh7-lvs02 keepalived]# systemctl start keepalived


8、观察rh7-lvs02的日志可观察到keepalived启动后所发生的一连串动作,根据配置文件的参数进入了BACKUP状态 
Linux负载均衡软件LVS-LMLPHP

9、查看rh7-lvs02的IP地址,可以看到VIP不在网卡上
Linux负载均衡软件LVS-LMLPHP

10、查看LVS的状态,可以看到VIP和两台Realserver的相关信息

Linux负载均衡软件LVS-LMLPHP
11、由于DR模式是后端两台realserver在响应请求时直接将数据包发给客户端,无需再经过LVS,这样减轻了LVS的负担、提高了效率,但由于LVS分发给realserver的数据包的目的地址是VIP地址

因此必须把VIP地址绑定到realserver的回环网卡lo上,否则realserver会认为该数据包不是发给自己因此会丢弃不作响应。另外由于网络接口都会进行ARP广播响应,因此当其他机器也有VIP地址时会发生冲突,

故需要把realserver的lo接口的ARP响应关闭掉。我们可以用以下脚本来实现VIP绑定到lo接口和关闭ARP响应。


Linux负载均衡软件LVS-LMLPHP
12、执行该脚本设置该脚本开机自动执行,查看IP地址,发现lo接口已经绑定了VIP地址
Linux负载均衡软件LVS-LMLPHP

13、同理,在RH7-Web-02上也绑定了VIP地址到lo接口上
Linux负载均衡软件LVS-LMLPHP



【实验配置环境】
服务器系统:CentOS-5.6
LVS主节点(lvs-master):192.168.2.250(eth0) 心跳直连接口:192.168.1.250(eth1)
LVS备节点(lvs-backup):192.168.2.251(eth0) 心跳直连接口:192.168.1.251(eth1)
Web Server-1:192.168.2.252
Web Server-2:192.168.2.253
VIP(虚拟IP):192.168.2.254

注:4台服务器已经配置好lnmp(Linux+Nginx+PHP(FastCGI模式)+Mysql)网站运行环境,当然使用apache也可以。这里主备节点也当作真实服务器使用,所以也配置了网站环境。 




一、 配置LVS主节点(lvs-master)

1. 安装libnet
# tar zxvf libnet-1.1.2.2.tar.gz
# cd libnet
# ./configure
# make && make install
# cd ..
2. 安装ipvsadm
# yum install kernel-devel //安装对应内核的kernel-devel
# tar zxvf ipvsadm-1.24.tar.gz
# cd ipvsadm-1.24
# ln -s /usr/src/kernels/`ls /usr/src/kernels/` /usr/src/linux //将当前使用内核连接到/usr/src/linux
# make && make install
# cd..
3. 安装Heartbeat
3.1 确认系统已经安装以下软件(系统光盘中有)
libxslt、libxslt-devel、libgcrypt-devel、autoconf、automake、pkgconfig、libgpg-error-devel、libtool、sgml-common、opensp、openjade、xml-common、docbook-dtds、docbook-style
如果在编译安装过程中出错,很有可能是因为缺少了相关的软件包
3.2 安装glue
# groupadd haclient
# useradd -g haclient -M -s /sbin/nologin hacluster
# tar jxvf glue-1.0.7.tar.bz2
# cd Reusable-Cluster-Components-glue--glue-1.0.7/
# ./autogen.sh
# ./configure
# make && make install
# cd ..
3.3 安装 agents
# tar zxvf ClusterLabs-resource-agents-agents-1.0.4-0-gc06b6f3.tar.gz
# cd ClusterLabs-resource-agents-c06b6f3/
# ./autogen.sh
# ./configure
# make && make install
# cd..
3.4 安装Heartbeat
# tar jxvf Heartbeat-3-0-STABLE-3.0.4.tar.bz2
# cd Heartbeat-3-0-STABLE-3.0.4
# ./ConfigureMe configure
# gmake && make install
# cd..

4. 配置lvs启动脚本

本实验采用的是lvs-DR模式,该模式的特点是客户端的请求从主/备节点进入分配到web server,然后web server的响应是直接交付给客户端的

# vim /etc/init.d/lvs
#!/bin/sh
#chkconfig: 2345 20 80
#description: start_lvs_of_dr

VIP1=192.168.2.254
RIP1=192.168.2.250
RIP2=192.168.2.251
RIP3=192.168.2.252
RIP4=192.168.2.253


./etc/rc.d/init.d/functions

case "$1" in
start)
echo "开启LVS DirectorServer..."

#设置虚拟IP地址
#LVS启动时添加VIP的网口eth0:0

/sbin/ifconfig eth0:0 $VIP1 broadcast $VIP1 netmask 255.255.255.255 up

/sbin/route add -host $VIP1 dev eth0:0

#清除IPVS表
/sbin/ipvsadm -C

#设置LVS
/sbin/ipvsadm -A -t $VIP1:80 -s lc
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP1:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP2:80 -g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP3:80 –g
/sbin/ipvsadm -a -t $VIP1:80 -r $RIP4:80 -g

#使用ipvsadm来转发客户端请求。-s lc为最小连接数算法,-g是采用DR模式。有多少RIP就添加几条记录。
#启动LVS
/sbin/ipvsadm
;;

stop)
echo "停止LVS DirectorServer..."
#关闭时清除ipvsadm表
/sbin/ipvsadm –C
;;

*)
echo "Usage: $0 {start|stop}"
exit 1
esac
注:这个脚本不要使用chkconfig管理,放入/etc/init.d内即可

5. 安装ldirectord相关组件
默认安装完上面的三个软件包之后,ldirectord已经安装到系统中,默认路径在 /usr/etc/ ,由于ldirectord是由perl语言编写的,所以必须安装相关的软件包:Socket6、libwww-perl、URI、MailTools、HTML-Parser

# yum -y install perl-Socket6 perl-libwww-perl perl-URI perl-MailTools perl-HTML-Parser

也可以在http://search.cpan.org/网站下载相关软件包安装

安装方法:
# perl Makefile.PL
# make && make install
6. 配置heartbeat
# cp -a /usr/etc/ha.d/ /etc/
# rm -fr /usr/etc/ha.d/
# ln -s /etc/ha.d/ /usr/etc/
# cp /usr/share/doc/haresources /etc/ha.d/
# cp /usr/share/doc/authkeys /etc/ha.d/
# cp /usr/share/doc/ha.cf /etc/ha.d/
# chmod 600 /etc/ha.d/authkeys //这个文件的权限必须是600

6.1 修改配置文件

6.1.1 authkeys文件配置(authkeys文件的作用是用来设置心跳信息的加密方式)

vim /etc/ha.d/authkeys
auth 1
1 crc
#2 sha1 HI!
#3 md5 Hello!
此设置是使用crc循环冗余校验,不采用加密的方式。

6.1.2 ha.cf为heartbeat的主配置文件,修改下面配置。

# vim /etc/ha.d/ha.cf
#日志文件位置
logfile /var/log/ha-log
#指定主备服务器多久发送一次心跳
keepalive 2
#指定30秒没有收到对方心跳就认为对方已经down机
deadtime 30
#10秒没有收到心跳,便发出警报。
warntime 10
#对方DOWN后120秒重新检测一次。
initdead 120
#指定监听端口
udpport 694
#心跳监听网口,这里为eth1
bcast eth1 //去掉后面#linux
#备份机的心跳线接口与接口IP
ucast eth1 192.168.1.251
#主节点恢复后,自动收回资源。
auto_failback on
#指定主备服务器的主机名称,即在hosts文件中指定的。第一个node为主服务器,第二个node为备服务器。
node lvs-master //服务器的主机名
node lvs-backup
#当192.168.2.1、192.168.2.2这两个IP都不能ping通时,对方即开始接管资源。
ping_group group1 192.168.2.1 192.168.2.2
#启用ipfail脚本
respawn root /usr/lib/heartbeat/ipfail
#指定运行ipfail的用户。
apiauth ipfail gid=root uid=root

6.1.3 haresources文件配置,这个文件是指定虚拟IP和改主机控制的脚本。
# vim /etc/ha.d/haresources
lvs-master 192.168.2.254 lvs ldirectord
// master.lvs.net可为主节点主机名,192.168.2.254为虚拟IP

6.1.4 ldirectord.cf是ldirectord进程的配置文件,该进程用来监视web server的运行状况,如果web server不能响应请求则把它排除在转发列表外。
复制安装文件ldirectord目录上的ldirectord.cf 到/etc/ha.d/conf下,如果找不到可以查找一下:find / -name ldirectord.cf 
# mkdir /etc/ha.d/conf
# cp ldirectord.cf /etc/ha.d/conf
# vim /etc/ha.d/conf/ldirectord.cf
# Global Directives
#设置真实web server的超时时间
checktimeout=30
#监视真实web server的时间间隔
checkinterval=10
#如全部真实web server失败,则转发至本地
fallback=127.0.0.1:80
#改变配置文件内容,不需要重新ldirectord
autoreload=yes
#指定日志位置
logfile="/var/log/ldirectord.log"
quiescent=no


# A sample virual with a fallback that will override the gobal setting
#指定虚拟IP
virtual=192.168.2.254:80
#指定真实web server IP及监听端口
real=192.168.2.250:80 gate
real=192.168.2.251:80 gate
real=192.168.2.252:80 gate
real=192.168.2.253:80 gate
fallback=127.0.0.1:80 gate
service=http
#指定转发算法
scheduler=lc //这里的算法要和LVS脚本的算法一样
protocol=tcp
#监视VIP服务器的方法
checktype=negotiate
checkport=80
#监听测试页面名称,这个页面放入真实web server web服务的根目录
request="lvs_testpage.html"
#指定测试页面返回内容
receive="Test Page"
virtualhost= lvstest.net
配置文件中的lvs_testpage.html必须存在网站根目录下,校验一下配置:
# ldirectord -d /etc/ha.d/conf/ldirectord.cf start //按Ctrl+C结束
# cp /etc/ha.d/shellfuncs /usr/lib/ocf/resource.d/heartbeat/.ocf-shellfuncs
以上lvs和heartbeat配置完成。
LVS备节点(lvs-backup)的配置和LVS主节点(lvs-master)完全一样。
只是在/etc/ha.d/ha.cf中“ucast eth1 192.168.1.251”此配置地址不一样。

二、配置真实web server脚本

在每台web server的/etc/init.d目录下放置realserver脚本,这里主备节点同时也作为web server使用。
# vim /etc/init.d/realserver
#!/bin/bash
# chkconfig: 2345 20 80
# description: lvs_dr_realserver


#指定虚拟IP
VIP=192.168.2.254
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 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
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0 | grep $VIP`
isrothere=`netstat -rn | grep "lo" | 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 Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac
# chmod +x /etc/init.d/lvs
# chmod +x /etc/init.d/realserver
# service heartbeat start //主备LVS调度器上执行
# /etc/init.d/lvs start //主备LVS调度器上执行
# /etc/init.d/realserver start //真实web服务器上执行
# chkconfig --level 35 heartbeat on
# echo “/etc/init.d/lvs start” >> /etc/rc.local //开机启动
# echo “/etc/init.d/realserver start” >> /etc/rc.local //开机启动

11-10 12:59