发新话题
打印

使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务

使用LVS(Linux Virtual Server)在Linux上搭建负载均衡的集群服务

一、基于于NAT的LVS的安装与配置。
1. 硬件需求和网络拓扑
                        ________
                       |        |
                       | 客户端 | (互连网)
                       |________|
                           |
                        (router)
                        202.99.59.1(director GW)
                           |
                           |
                       (202.99.59.110)Virtual IP
                       ____|_____
                      |          | (控制器有两块网卡)
                      | director |
                      |__________|
                    (192.168.10.254)DIP
                           |
          -----------------+----------------
          |                |               |
         RIP1             RIP2            RIPx
    ____________     ____________     ____________
   |192.168.10.1|   |192.168.10.2|   |192.168.10.x|
   |realserver1 |   |realserver2 |   |realserverx |
   |____________|   |____________|   |____________|


2.下载软件:

(1)、内核源代码:需要下载2.4.23以后版本的内核源代码。下载地址为http://www.kerner.org。本文中下载的内核源代为:linux-2.4.30.tar.bz2。

(2)、用户配置工具ipvsadm,下载地址:http://www.linuxvirtualserver.org/software/ipvs.html。本文下载的是:http://www.linuxvirtualserver.or ... sadm-1.21-11.tar.gz

3.安装软件:

在director(控制器,202.99.59.110)上安装支持LVS的内核和配置工具ipvsadm。

(1)、在内核配置时以下选项必须选:


Networking options  --->
        <*> Packet socket
        <*> Netlink device emulation
       
  • TCP/IP networking
           
  •    IP: advanced router
           
  • Network packet filtering (replaces ipchains)
            IP: Netfilter Configuration  --->
                    <*> Connection tracking (required for masq/NAT)
                    <*> IP tables support (required for filtering/masq/NAT)
                    <*>   Full NAT
                    <*>     MASQUERADE target support
            IP: Virtual Server Configuration  --->
                    <*> virtual server support (EXPERIMENTAL)
                    (12)   IPVS connection table size (the Nth power of 2)
                    --- IPVS scheduler
                    <M>   round-robin scheduling
                    <M>   weighted round-robin scheduling
                    <M>   least-connection scheduling
                    <M>   weighted least-connection scheduling
                    <M>   locality-based least-connection scheduling
                    <M>   locality-based least-connection with replication scheduling
                    <M>   destination hashing scheduling
                    <M>   shortest expected delay scheduling
                    <M>   never queue scheduling

    (2)、编译和安装内核

    分别执行: make bzImage;make modules;make modules_install;然后编辑启动配置文件,重新启动系统,在启动时选择新的内核。

    系统启动后要确认内核是否支持ipvs,只需要执行下面的命令即可:grep ip_vs_init /boot/System.map

    (3)、编译和安装ipvsadm
    ln -s /usr/src/linux-2.4.30 /usr/src/linux tar -zxvf ipvsadm-1.21-11.tar.gz
    cd ipvsadm-1.21-11
    make all
    make install


    然后运行:ipvsadm --version命令,应该有下面的内容输出:
    ipvsadm v1.21 2004/02/23 (compiled with popt and IPVS v1.0.12)

    4. 配置LVS

    (1)、在202.99.59.110上:
    echo "1" >/proc/sys/net/ipv4/ip_forward
    echo "0" >/proc/sys/net/ipv4/conf/all/send_redirects
    echo "0" >/proc/sys/net/ipv4/conf/default/send_redirects
    echo "0" >/proc/sys/net/ipv4/conf/eth0/send_redirects
    echo "0" >/proc/sys/net/ipv4/conf/eth1/send_redirects


    清除ipvsadm表:
    /sbin/ipvsadm -C


    使用ipvsadm安装LVS服务
    #add http to VIP with rr sheduling
    /sbin/ipvsadm -A -t 202.99.59.110:80 -s rr


    增加第一台realserver:
    #forward http to realserver 192.168.10.1 using LVS-NAT (-m), with weight=1
    /sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.1:80 -m -w 1

    增加第二台realserver:
    #forward http to realserver 192.168.10.2 using LVS-NAT (-m), with weight=1
    /sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.2:80 -m -w 1


    (2)、realserver配置
    在192.168.10.1(realserver1)和192.168.10.2(realserver2)上分别将其网关设置为192.168.10.254,并分别启动apache服务。

    在客户端使用浏览器多次访问http://202.99.59.110/,然后再202.99.59.110上运行ipvsadm命令,应该有类似下面的输出:


    IP Virtual Server version 1.0.12 (size=4096)
    Prot LocalAddressort Scheduler Flags
      -> RemoteAddressort           Forward Weight ActiveConn InActConn
    TCP  202.99.59.110:http rr
      -> 192.168.10.1:http           Masq    1      0          33        
      -> 192.168.10.2:http           Masq    1      0          33        

    从上面的结果可以看出,我们的LVS服务器已经成功运行。





    二、基于直接路由(DR)的LVS的配置

    1.硬件需求和网络拓扑:
                            ________
                           |        |
                           | 客户端 | (互连网)
                           |________|
                               |
                            (router)
                            202.99.59.1(director GW)
                               |
                 __________    |
                |          |   |   (VIP=202.99.59.110, eth0:110)
                | director |---|  (控制器有一块网卡,且与realserver1和realserver2在同一网段)
                |__________|   |   DIP=202.99.59.109 (eth0)
                               |
              -----------------------------------
              |                                 |
    RIP=202.99.59.108(eth0)             RIP=202.99.59.107(eth0)
    (VIP=202.99.59.110, lo:0)          (VIP=202.99.59.110, lo:0)
        ____________                       ____________
       |            |                     |            |
       |realserver1 |                     |realserver2 |
       |____________|                     |____________|
       

    2.安装软件:


    在director(202.99.59.109)上安装上面的方法安装内核和管理软件。


    3. 配置LVS

    (1)、在202.99.59.109上:


    修改内核运行参数,即修改/etc/sysctl.conf文件的内容如下:
    net.ipv4.ip_forward = 0
    net.ipv4.conf.all.send_redirects = 1
    net.ipv4.conf.default.send_redirects = 1
    net.ipv4.conf.eth0.send_redirects = 1

    然后执行下面的命令是对内核修改的参数立即生效:
    sysctl -p

    配置VIP地址:
    /sbin/ifconfig eth0:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up
    /sbin/route add -host 202.99.59.110 dev eth0:0

    清除ipvsadm表:
    /sbin/ipvsadm -C

    使用ipvsadm安装LVS服务:
    /sbin/ipvsadm -A -t 192.168.1.110:http -s rr

    增加realserver:
    #forward http to realserver using direct routing with weight 1
    /sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
    /sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1

    (2)在realserver1(202.99.59.108)和realserver2(202.99.59.107)上做下面的设置。


    修改内核运行参数,即修改/etc/sysctl.conf文件的内容如下:
    net.ipv4.ip_forward = 0
    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

    然后执行下面的命令是对内核修改的参数立即生效:
    sysctl -p

    配置VIP地址:
    /sbin/ifconfig lo:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up
    /sbin/route add -host 202.99.59.110 dev lo:0

    p>在客户端使用浏览器多次访问:http://202.99.59.110/,然后再202.99.59.110上运行ipvsadm命令,应该有类似下面的输出:

    IP Virtual Server version 1.0.12 (size=4096)
    Prot LocalAddressort Scheduler Flags
      -> RemoteAddressort           Forward Weight ActiveConn InActConn
    TCP  192.168.100.254:http rr
      -> 192.168.100.3:http           Route   1      0          28        
      -> 192.168.100.2:http           Route   1      0          29               

    从上面的结果可以看出,我们的LVS服务器已经成功运行。





    在面的实例中ipvsadm用到的几个参数含义如下:


    -A 增加一个虚拟服务,该服务由协议、IP地址和端口号组成,例如:
    -A -t 202.99.59.110:80 (增加一格虚拟服务,其协议(-t表示tcp,-u表示udp)为TCP、IP为202.99.59.110、端口号为80。

    -s 指定服务采用的算法,常用的算法参数如下:



    rr   轮叫(Round Robin)
    调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务 器,而不管服务器上实际的连接数和系统负载。

    wrr   加权轮叫(Weighted Round Robin)
    调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

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

    wlc   加权最少链接(Weighted Least Connections)
    在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    lblc   基于局部性的最少链接(Locality-Based Least Connections)
    "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

    lblcr   带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
    "带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

    dh   目标地址散列(Destination Hashing)
    "目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    sh   源地址散列(Source Hashing)
    "源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
    /sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1

    -a 表示往一个服务内增加一个real server

    -r 指定real server的IP地址

    -w 表示权重

    -g 表示使用DR方式,-m表示NAT方式,-i表示tunneling方式。
  • TOP

    在各种网络服务普遍应用的今天,随网络速度的提高以及用户的增加,在一些繁忙的场合,单凭一台机器已经无法就能应付所有的网络请求了。为了解决这个问题, 许多用户就采 用一组cluster(集群)来代替单一的机器。cluster可以将多台计算机连接起来协同运作以对外提供各种服务,比如Apache、FTP、 Mail等。
    在Linux上最常见的、也可能是运用最广泛的cluster方案就是LVS(Linux Virtual
    Server),很高兴LVS也是一个中国人创建和开发的开放源码项目。LVS自1998年开始,发展到现在已经是一个比较成熟的技术项目了。有 许多比较著名网站和组织都在使用LVS架设的cluster,比如:www.linux.com、sourceforge.net、 www.real.com等。
    下面就开始介绍一下,笔者是如何利用LVS来架设一组cluster来对外提供Apache和FTP服务的。

    安装操作系统
    笔者选用的是Red Hat 9.0作为些cluster的director机器和所有real server机器的操作系统。RH的安装过程从略,笔者根据实际需要,只安装了少数的包。对于成批安装Linux,建议试试Kickstart来进入批理安装。
    编译支持LVS的内核
    LVS对Linux的kernel进行了修改和增加,所以要重新编译 linux kernel。我们先从http://www.linuxvirtualserver.org下载到LVS的内核补丁,对原有内核源代码进行更新,然后重新编译Linux的kernel。
    下载LVS的内核补丁时要注意补丁版本要和kernel版本相一致,对于RH9.0,它的Linux核心版本是2.4.20,所以对应内核补丁应 该是http://www.linuxvirtualserver.org/sof ... /kernel-2.4/linux-2.4.20- ipvs-1.0.9.patch.gz
    另外还有一个补丁是用来解决某些情况下ARP协议不能正常工作问题的,从http://www.ssi.bg/~ja/hidden-2.4.20pre10-1.diff下载。
    把上面下载的两个补丁复制到/usr/src目录下,然后执行以下命令:
    cd /usr/src
    gzip -cd linux-2.4.20-ipvs-1.0.9.patch.gz
    cd /usr/src/linux
    patch -p1 < ../linux-2.4.20-ipvs-1.0.9.patch
    patch -p1 < ../hidden-2.4.20pre10-1.diff
    make mrproper
    make menuconfig
    执行make menuconfig时,我们将进入一个图形化的界面,在其中可以对Linux Kernel进行详细设置。与LVS相关的kernel选项都在“Networking options”中,进入“Networking options”,可以查看到“IP: Virtual Server Configuration”选项,将其它所有的子选项都选上:
    <M> virtual server support (EXPERIMENTAL)
  • IP virtual server debugging
    (12) IPVS connection table size (the Nth power of 2)
    --- IPVS scheduler
    <M> round-robin scheduling
    <M> weighted round-robin scheduling
    <M> least-connection scheduling scheduling
    <M> weighted least-connection scheduling
    <M> locality-based least-connection scheduling
    <M> locality-based least-connection with replication scheduling
    <M> destination hashing scheduling
    <M> source hashing scheduling
    <M> shortest expected delay scheduling
    <M> never queue scheduling
    --- IPVS application helper
    <M> FTP protocol helper
    另外,“Networking options”中的“IP: Netfilter Configuration"中的选项的所有子项,除了以下两项不要选之外,其它全可以选:
    < > ipchains (2.2-style) support
    < > ipfwadm (2.0-style) support
    还有,“Networking options”中还有一些关于网络的选项,要注意按自己的需要去选择:
    <*> Packet socket
    [ ] Packet socket: mmapped IO
    <*> Netlink device emulation
  • Network packet filtering (replaces ipchains)
  • Network packet filtering debugging
  • Socket Filtering
    <*> Unix domain sockets
  • TCP/IP networking
  • IP: multicasting
  • IP: advanced router
  • IP: policy routing
    [ ] IP: use netfilter MARK value as routing key
    [ ] IP: fast network address translation
    <M> IP: tunneling
    对于kernel的其它选项,你可以根据需要进行选择。kernel的配置是一项很需要经验、细心和耐心的工作,不当的配置可能会导致编译过程中出现错误或者是新的kernel不能驱动原有的设备等问题。
    退出保存,然后继续执行以下命令:
    make dep
    make clean
    make bzImage
    make modules
    make modules_install
    以上各步可能需要一点时间,如果出错请重新检查你的kernel配置,如果没有出现任何错误就继续执行以下命令:
    depmod –a
    cp arch/i386/boot/bzImage /boot/vmlinuz-lvs
    cp System.map /boot/System.map-lvs
    cd /boot
    rm System.map
    ln -s System.map-lvs System.map
    然后修改你的lilo.conf使用新的kernel启动,比如在lilo.conf中以增加下几行以增加关于新的支持LVS的kernel的启动项:
    image=/boot/vmlinuz-lvs
    label=lvs
    read-only
    root=/dev/sda1
    注:如果使用Grub做启动引导程序的,请自行做对应的修改,以增加关于新的支持LVS的kernel的启动项。
    重新启动Linux,选择lvs项进入Linux。
    安装ipvsadm
    如果正常启动了,就开始安装IP虚拟服务器软件ipvsadm。因为我们用的是RH,所以我们直接下载RPM包进行安装。RPM包从以下地址下载:
    http://www.linuxvirtualserver.org/sof ... .4/ipvsadm-1.21-7.src.rpm
    用以下命令来安装ipvsadm:
    rpmbuild --rebuild ipvsadm-1.21-7.src.rpm
    rpm -ivh /usr/src/redhat/RPMS/i386/ipvsadm-1.21-7.i386.rpm
    至此,LVS的安装算是完成了一半。就是说,现在的Linux已经具备了实现LVS的能力了,接下来的问题就是如果使用LVS来构建一组 cluster了。要想实现一组cluster,我们就要使用ipvsadm工具进行配置,而在我们开始使用ipvsadm进行配置之前,我们需要了解一 些基本的LVS的知识,特别是以下三个要点:LVS的结构、LVS的三种包转发方式、LVS的八种调度算法。只有了解了这些知识以后,我们才能理该如何使 用ipvsadm来进行配置。下面简单介绍LVS的这三个要点:
    1. LVS的结构
    LVS方式的cluster从结构上可分为两部分:前端的负载均衡器(称之为director)和后端的真实服务器(称之为real server)。cluster前端的director将来自外界的请求调度到cluster后端不同的real server去执行。real server负责真正的提供各种应用服务,比如:Web、FTP、Mail等服务。real server的数量可以根据实际需求进行增加、减少。
    2. LVS的三种包转发方式
    LVS提供了三种包转发方式:NAT(网络地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构,下面对三种转发方式分别介始:
    NAT(网络地址映射)
    NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户 的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。
    IP Tunneling(IP隧道)
    director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通 信,并且所有服务器必须支持IP隧道协议。
    Direct Routing(直接路由)
    与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。
    3. LVS的八种调度算法
    LVS已实现了以下八种调度算法:
    1.轮叫调度(Round-Robin Scheduling)
    2.加权轮叫调度(Weighted Round-Robin Scheduling)
    3.最小连接调度(Least-Connection Scheduling)
    4.加权最小连接调度(Weighted Least-Connection Scheduling)
    5.基于局部性的最少链接(Locality-Based Least Connections Scheduling)
    6.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
    7.目标地址散列调度(Destination Hashing Scheduling)
    8.源地址散列调度(Source Hashing Scheduling)
    注:如果想了解关于以上几点的技术细节,LVS的主页查询。LVS的主页是:
    http://www.LinuxVirtualServer.org/ http://www.linux-vs.org/
    了解了LVS的三个要点之后,接下来我们来配置一个采用Direct Routing包转发方式、加权最小连接调度算法的cluster。
    我们知道Direct Routing包转发方式是通过改写请求报文的MAC地址,将请求发送到real server。前台的director机器只需要接收和调度外界的请求,而不需要负责返回这些请求的反馈结果。director机器和real server都有一块网卡连在同一物理网段上。所以我们给出以下的网络拓扑图:

    director机器上需要进行如下配置:
    设置好本机的IP:192.168.2.1
    然后执行以下命令:
    ifconfig lo:0 192.168.2.254 netmask 255.255.255.255 broadcast
    192.168.2.254 up
    route add -host 192.168.2.254 dev lo:0
    echo 1 > /proc/sys/net/ipv4/ip_forward
    echo 1 >/proc/sys/net/ipv4/conf/all/hidden
    ipvsadm –C
    ipvsadm -A -t 192.168.2.254:80 -s wlc
    ipvsadm -a -t 192.168.2.254:80 -r 192.168.2.2 –g
    ipvsadm -a -t 192.168.2.254:80 -r 192.168.2.3 –g
    ......
    ipvsadm -A -t 192.168.2.254:21 -s wlc
    ipvsadm -a -t 192.168.2.254:21 -r 192.168.2.2 –g
    ipvsadm -a -t 192.168.2.254:21 -r 192.168.2.3 –g
    ......
    real server机器上需要进行如下配置:
    对于第一台real server(RS1),设置好本机的IP:192.168.2.2 然后执行以下命令:
    ifconfig lo:0 192.168.2.254 netmask 255.255.255.255 broadcast
    192.168.2.254 up
    route add -host 192.168.2.254 dev lo:0
    对于其它real server:RS2、RS3、RS4......,做相类的设定。
    完成以上设置后,所有对192.168.2.254的80端口的访问都会通过director机器分配到后面的real server上去,而real server的处理后结果将直接反馈给客户。至此,我们完成了一个cluster的例子。通过这个例子,相信您也可以轻松地利用Linux架设起一组 cluster来。其实在cluster架设到这里之后,还并不能达到正式应用的要求,实际应用中还有一些问题需要解决,比如要安装监视软件,监视集群的 运作,要能及时发现real server的故障并对应调整real server的列表。还有后台real server节点的数据一致性等问题。这些在一些商用的cluster软件产品中就得到了很好的解决,而网络也有一些非商用的软件,比如mon就是这样的 系统资源监控程序,可以监控网络服务可用性、服务器问题等,最重要的是mon提供了一个框架,用户可以自行定义和扩展。这些内容请参阅其它文章。
  • TOP

    发新话题