• Linux负载均衡软件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所示:

    下面对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,详述如下:

     (1)     VS/NAT: 即(Virtual Server via Network Address Translation)


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


     (2)    VS/TUN :即(Virtual Server via IP Tunneling)


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


     (3)   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

    更详细的信息如图2所示:

    图2  LVS DR模式安装部署结构图

    图2中的VIP指的是虚拟IP地址,还可以叫做LVS集群的服务IP,在DR、TUN模式中,数据包是直接返回给用户的,所以,在Director Server上以及集群的每个节点上都需要设置这个地址。

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


     各个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 "  #给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="ok"              #指定检测的关键字,这里的设置表示测试访问index.html页面是否包含ok关键字,如果有则说明该节点正常,否则认定为故障。

    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 -x HTTP -a 15 -I /
    /usr/sbin/nanny -c -h 192.168.60.144 -p 80 -s GET / HTTP/1.0 -x HTTP -a 15 -I /
    其中,nanny就是Pulse服务的守护进程,用于监控LVS服务节点的运行状态,类似与ldirectord的节点监控功能。

    二、 测试负载均衡


    这里假定两个real server节点配置www服务的网页文件根目录均为/webdata/www目录,然后分别执行如下操作:
    在real server1 执行:
    echo "real server1 ok" >/webdata/www/index.html
     在real server2 执行:
    echo "real server2 ok" >/webdata/www/index.html


    接着打开浏览器,访问http://192.168.60.200这个地址,然后不断刷新此页面,如果能分别看到real server1 ok;和real server2 ok就表明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,访问不受任何影响,但是仅仅显示real server2 ok信息,这是由于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服务已经激活,重新使此节点变得可以连接。

    转自:https://blog.51cto.com/ixdba/554029

  • 相关阅读:
    servicestack and redis
    图片服务器
    CRQS介绍
    javascript闭包之购物车加减及提示
    javascript best practices
    EOF
    2012年回顾
    volatile
    通过inode来操作文件
    采样问题
  • 原文地址:https://www.cnblogs.com/chengxuyonghu/p/14085205.html
Copyright © 2020-2023  润新知