LVS详解

概述

    LVS是工作在4层的负载均衡调度器,可根据请求报文的目标IP和目标协议及端口,根据指定的调度算法,将请求调度转发至某RealServer,本篇就针对LVS的原理,配置和使用进行简单介绍,具体包含:

    1、LVS的四种类型的介绍

    2、LVS调度算法的介绍

    3、ipvsadm命令的用法介绍

    4、LVS-NAT方式的配置示例

    5、LVS-DR方式的配置示例

    6、基于FWM(防火墙标记)的LVS的配置

    7、LVS的持久连接机制的使用

第一章    LVS的四种类型的介绍

    1、LVS的组成

        ipvs:内核空间的框架,工作于内核上的netfilter的INPUT钩子之上的程序,可根据用户定义的集群实现请求转发

        ipvsadm:用户空间的命令行程序,主要用于管理集群服务及集群服务器上的RS(后端真实服务主机)

    2、LVS集群类型:

        lvs-nat:修改请求报文的目标IP,相当于多目标的DNAT

        lvs-dr:操纵封装新的MAC地址

        lvs-tun:在原请求IP报文之外,新加一个IP首部

        lvs-fullnat:修改请求报文的源和目标IP

    3、LVS-NAT的介绍

    

        LVS-NAT相当于iptables的多目标的DNAT,通过将请求报文中的目标地址和目标端口为挑选出来的后端RS的IP地址和PORT,基于连接追踪机制,因此,其并发能力受到连接追踪表的限制(相关连接追踪表的内容,参考iptables相关内容),所以其并发量不大。一般后端调度的服务器数量不超过10台

           

        工作模型:

            客户端请求发往前端调度器,调度器在INPUT链上发现请求的是定义好的集群服务,然后将其报文的目标地址转为后端某个提供真实服务的RIP的地址,发送给该real server,而后端real server处理完后,将响应结果响应给调度器,调度器收到后,根据内部的连接追踪表,将响应报文的源地址改为自己VIP的地址,然后响应给客户端

        

        工作特性:

            <1>多目标的DNAT,通过将请求报文中的目标地址和目端口修改为挑选出的而某real server的RIP和PORT实现转发

            <2>RIP和DIP必须在同一IP网络,且应该使用私有地址,而且后端real server的网关要指向DIP(保证real server的响应报文必须经由调度器)

            <3>请求报文和响应报文都经过Director转发,较高负载下,Director容易成为系统瓶颈和单点故障所在

            <4>支持端口映射

            <5>director调度器必须是linux、后端real server可以是任意操作系统

        工作拓扑结构

        blob.png

    4、LVS-DR的介绍

        通过修改请求报文的mac地址进行转发(源MAC是DIP所在网卡的mac,目标mac是挑选出的某real server的RIP所在接口的MAC地址);IP首部不会发生变化(源地址是CIP,目标地址是VIP),因此为了让Real Server能够正常接收报文,要在Real Server上也配置VIP的地址

        在各个real server的本地回环接口的子接口上配置一个IP地址,该IP地址与VIP相同,从而能够实现由real server直接响应用户请求,而不用转交给director响应

        各个real server和director连接在一个网络中,相当于旁路部署的方式

               

        工作模型:

            director和real server上都只需要一个网卡,director的网卡IP是VIP,同时也会通过网卡别名的方式设置一个DIP,real server集群上的每个主机,也只有一个网卡,设置一个RIP,但会通过网卡别名设置一个跟director一样的VIP,只是这个别名设置的VIP是隐藏的,不会用来接收任何的报文,只是响应外部请求的是后,用来伪装以VIP的身份响应。

            当请求进来后,源IP为CIP,目标IP为VIP,但此时只有director的VIP会响应,拿到报文后,director将报文进行帧首部拆封,通过查看IP和端口,发现是定义了集群的应用,然后将源MAC转为自己的的MAC,目标MAC转为某个RIP的MAC,然后将报文抓发给那个real server,当real server拿到报文后,解封装,发现MAC是自己,然后目标IP是VIP,因为自己这里也有一个虚拟出来的VIP,故接受报文,然后响应,响应的时候,以VIP为源地址,CIP为目标地址进行相应。

        此中工作模型下,由于director只负责接受进站的请求,由real server直接相应出站请求,一般进站的请求报文都比较小,故此种方式下,负载均衡性能是非常好的。

      

        工作特性:

            <1>确保前端路由器将目标IP为VIP的请求报文发往Director

                有三种实现方法:

                1) 在路由器上静态绑定VIP和Director的MAC地址(但是不实用,因为如果对Director做了高可用,当当前绑定的MAC地址的Director故障后,那么在路由器上静态绑定就要随着修改)

                2) 禁止各个real server上配置的VIP响应报文目标IP为VIP的请求(也就是在real server上,禁止本机的VIP响应ARP请求,禁止本机VIP向外通告)

                    可通过:

                        (a) arptables工具实现

                        (b) 修改real server的内核参数,并把VIP绑定在lo本地环回接口的别名上

                            内核参数为arp_ignore、arp_announce

            <2>real server可以使用私有地址,也可以使用公网地址,RIP与DIP在同一网络

            <3>real server和director必须在同一物理网络,因为二者之间使用MAC地址进行通信,real server的网关必须不能指向DIP

            <4>请求报文必须由Director调度,但响应报文必须不能经过director,响应报文由RS直接发往Client

            <5>不支持端口映射

            <6>real server可使用大多数的操作系统

        工作拓扑结构:

        blob.png

    5、LVS-TUN介绍

        director和real server不在同一个网络中,当请求报文到达director时,此时源IP为CIP,目标IP为VIP。director进行转发时,不会动原来的报文,而是在原来报文的基础上,再加上一层IP报文,将外壳报文的源IP设置为DIP,目标IP设置为选定要转发到的那台real server的RIP,当real server收到报文后,解封装,发现里面还有一个IP首部,源IP为CIP,目标IP为VIP,此种模型下real server上跟DR模型时类似,也有一个隐藏的VIP,故继续解封装后由real server直接响应客户端,响应时源IP为VIP,目标IP为CIP。

       

        工作特点:

            <1>转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP首部之外再封装一个IP首部(源IP为DIP,目标IP为挑选出来的real server的RIP)

            <2>RIP、DIP、VIP全是公网地址

            <3>real server的网关不能,也不可能指向DIP

            <4>请求报文经由Director转发,但响应报文将由real server直接发往客户端CIP

            <5>不支持端口映射

            <6>real server的操作系统必须支持IP隧道功能

        工作拓扑:

        blob.png

    6、LVS-FULLNAT介绍

        主要是为了解决lvs-nat模型中,各个real server不能跨网络的问题,通过同时修改请求报文的源IP(CIP转为DIP)和目标IP(VIP转为RIP)全部进行NAT转换来实现,此类型默认不支持,如果要使用,需要向内核打补丁

        

        工作特点:

            <1>VIP是公网地址,RIP是DIP是私有网络地址,且通常不在同一网络中,但需要经由路由器互通

            <2>real server收到的请求报文源IP为DIP,因此响应报文将直接响应给DIP,Director再将报文处理后再发往Client

            <3>请求和响应报文都经由Director

            <4>支持端口映射

         

第二章    LVS调度算法的介绍

    1、调度算法分类:

        根据其调度是否考虑后端主机的当前负载的情况,可分为静态方法和动态方法两类:静态方法和动态方法

        静态方法包括:RR、WRR、SH、DH

        动态方法包括:LC、WLC、SED、NQ、LBLC、LBLCR

    2、静态调度方法:仅根据算法本身进行调度,不考虑后端RS当前负载情况

        <1>RR:round robin,轮询/轮调/轮叫,将请求轮流的调度到后端每一个RS上

        <2>WRR:weighted round robin,加权轮询,基于后端RS的权重,将请求按照权重,轮流调度到各个RS上

        <3>SH:source hash,

            源地址hash,主要用于会话保持,将来自于同一个源地址的请求,始终发往后端的同一台real server上,指的是在一段时间内,只要是来自同一个客户端的请求,一定会发往同一个后端real server服务器。主要目的是为了session affinity(会话绑定),实际是在WRR算法的基础上,维持了一张会话表,表中记录了源IP和其调度到的RS的对应关系

        <4>DH:destination hash,

            目标地址hash,将发往同一个目标地址的请求始终转发至第一次挑中的RS,多数用于缓存代理中,用于正向的web代理中(缓存),负载均衡内网用户对外部服务器的请求,hash的是目标地址,将访问目标IP一致的请求,都调度到同一个代理服务器上,用于提升在代理服务器上的缓存的命中率

    3、动态调度方法:根据算法及各个real server当前的负载状态进行调度

        <1>LC:least connection

            最少连接。通过计算每个real server的活动连接和非活动连接的总数,计算公式为 active*256+inactive,判断哪台服务器的连接数最小,就挑选谁作为调度对象

        <2>WLC:weight lc加权最小连接

            在lc的基础上,考虑服务器自身性能作为权重依据,性能越好,权重值越大,公式为(active*256+inactive)/weight,判断哪个的值最小,就将其作为调度对象,如果值一样,就按排列在上面的作为调度对象

        <3>SED:shortest expections delay,最短期望延迟

            改进了的wlc,计算方式为(active+1)*256/weight,谁小,选谁

        <4>NQ:never queue,永不排队

            改进了的sed,先根据权重,保证每个服务器上分配一个请求,然后再根据sed的算法,进行分配

        <5>LBLC:locality-based LC,基于本地的最少连接。

            有一个特点,类似动态的dh算法,将请求同一资源的客户端发往同一个后端的服务器,但是是在考虑服务器空闲状态的,利用wlc的计算方式。

        <6>LBLCR:基于本地的带复制功能的最少连接。利用缓存复制功能

     

第三章    ipvsadm命令的用法介绍

    1、管理集群服务:增、改、删、查

        <1>增加、修改

            ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p timeout]

                -A:增加

                -E:修改

                -t:tcp协议的某个服务添加为集群服务

                -u:udp协议的某个服务添加为集群服务

                -f:firewall mark 防火墙标记

                service-address:

                    -t,TCP协议时,此地址对应为:VIP:PORT

                    -u,UDP协议时,此地址对应为:VIP:PORT

                    -f,防火墙标记时,此地址对应为:MARK(防火墙的标记)

                -s scheduler:指明调度算法,省略此项时,默认为wlc

                -p timeout:当定义LVS的持久连接时,指明持久连接时长

            如:

                ipvsadm -A -t 10.1.32.68:80 -s rr

                表示添加一个tcp类型的集群服务,服务监听的地址是10.1.32.68的80端口,采取的调度算法为rr算法

                ipvsadm -A -t 10.1.32.68:3306 -s wlc

                添加一个tcp类型的集群服务,服务监听的地址是10.1.32.68的3306端口,采用的调度算法是wlc

                ipvsadm -E -t 10.1.32.68:80 -s wlc修改集群服务

        <2>删除指定的集群服务

            ipvsadm -D -t|u|f service-address

            -D  删除

            如:

                ipvsadm -D -t 10.1.32.68:80

    2、集群上Real Server的管理

        <1>增加、修改

            ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

                -a   增加

                -e   修改,修改时不能修改real server的地址

                -t|u|f service-address :与之前添加的那种协议的集群服务,及其对应的地址(要实现存在)

                -r server-address:指明后端real server的地址,RIP[:PORT],可以不指定PORT,不加时,表示根定义集群服务时的端口一样

                [-g|i|m]  指明集群类型,不指名,则默认为lvs-dr模型

                    -g   表示gateway,也就是lvs-dr模型

                    -i   表示ipip,也就是lvs-tun模型

                    -m   表示masquerade,也就是lvs-nat模型

                -w weight  指明权重,对于在定义集群服务时,指明的算法如果支持权重,则-w指明该real server的权重

            如:

                ipvsadm -a -t 10.1.32.68:80 -r 10.1.32.72 -m -w 2

                表示向10.1.32.68:80这个tcp类型的集群服务添加一个real server,其地址为10.1.32.72,采用的集群工作模型为lvs-nat模型,该real server的权重为2

  

        <2>删除

            ipvsadm -d -t|u|f service-address -r server-address

                -d 删除

                -t|u|f service-address  指明从哪个集群服务中

                -r server-address   表示删除哪个real server

    3、查看集群的相关信息:    

        ipvsadm -L|l [options]

            options:

                -n  表示数字格式显示为IP和PORT,而不进行反解到主机名和服务

                -exact   表示显示大小单位时,不以M,G,而是以精确值来显示大小

                -c  表示显示当前ipvs的连接的情况

                –stats   表示显示ipvs的统计数据,如发送报文速量,接受报文数量…

                –rate   速率,显示集群服务及real server上的平均每秒接受的报文速率、每秒发送的报文数量…

ipvsadm -Ln显示出来的内容
Prot LocalAddress:Port Scheduler Flags
 -> RemoteAddress:Port  Forward Weight ActiveConn InActConn
TCP  10.1.32.68:80 rr   集群服务及其采用的调度算法
 -> 10.1.32.72:80                Masq    2      0          0 
后端的real server的地址和对应的端口,以及采用的lvs的工作模型(nat、dr、tun),权重,活动连接数,非活动连接数        
 -> 10.1.32.73:80                Masq    3      0          0     

ipvsadm -Ln --stats显示出来的内容
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
 -> RemoteAddress:Port
TCP  10.1.32.68:80                      0        0        0        0        0
集群服务及当前整个集群的连接数,总共的入站的报文数,出站的报文数,入站的字节数,出站的字节数
 -> 10.1.32.72:80                       0        0        0        0        0
当前real server的地址和端口,当前real server的总共的连接数,入站报文数,出站报文数,入站字节数,出站字节数
 -> 10.1.32.73:80                       0        0        0        0        0

ipvsadm -Ln --rate 显示出来的内容
Prot LocalAddress:Port                 CPS    InPPS   OutPPS    InBPS   OutBPS
 -> RemoteAddress:Port
TCP  10.1.32.68:80                       0        0        0        0        0
当前集群的平均每秒的连接数,每秒的入站报文数,每秒出站报文数,每秒入站字节数,每秒出站字节数
 -> 10.1.32.72:80                       0        0        0        0        0
当前real server上平均每秒的连接数,每秒的入站报文数,每秒出站报文数,每秒入站字节数,每秒出站字节数
 -> 10.1.32.73:80                       0        0        0        0        0

    4、清空所有ipvs规则:ipvsadm -C  表示清空当前ipvs上的所有的集群定义的规则

    5、清空ipvs的计数器(接受报文数、发送报文数…)

        ipvsadm -Z [-t|u|f service-address]

    6、ipvs规则的保存和重载:

        保存:

            ipvsadm-save > /PATH/TO/FILE

            ipvsadm  -S > /PATH/TO/FILE

        重载:

            ipvsadm-restore < /PATH/FROM/FILE

            ipvsadm  -R < /PATH/FROM/FILE

         

第四章    LVS-NAT方式的配置示例

    1、配置环境说明

    blob.png

    2、在Director上安装ipvsadm工具,在RS1和RS2上安装LAMP软件组合,验证LAMP组合服务是否可用

    blob.png

    blob.png

    blob.png

    修改LAMP组合的相关程序的配置文件,启动服务,在RS1和RS2上提供测试页面,启动服务,查看LAMP组合是否正常

    blob.png

    blob.png

    blob.png

    blob.png

    3、按照实验拓扑,配置各个节点的网络

    blob.png

    blob.png

    blob.png    

    blob.png

    4、在Director上定义集群服务,测试访问

    blob.png

    blob.png

    blob.png

    blob.png

    blob.png

    blob.png

    blob.png

  

第五章    LVS-DR方式的配置示例

LVS-DR模型的实验说明:
        1、在各主机(Director、RS)上均需要配置VIP,因此,要解决地址冲突的问题,目标是让RS上的VIP不可见,仅用于接受
        目标地址为VIP的报文,同时可作为响应报文的源地址,可实现的方法:
            <1> 在前端的网关上进行静态绑定,明确指明VIP的mac就是director的VIP对应的接口的mac地址
            <2> 在各个RS上使用arptables。arptables的功能类似iptables,只是iptables是在IP层做过滤,
                而arptables在可以基于mac地址做过滤,这样就可以在real server上设置不允许响应arp的请求包
            <3> 在各个RS上修改内核参数,内核上提供了两个内核参数:arp_ignore 和arp_announce
                arp_ignore:定义接收到ARP请求时的响应级别。默认是0,接受的值有0-8,其中,0表示请求的IP地址配置
                    在本地的任何接口上,都进行相应;1表示请求的IP地址在配置在请求进来的接口上时,才进行相应。
                arp_announce:定义将自己地址和MAC地址对应关系,向外通告时的通告级别。值为0,1,2。默认是0,
                    其中0表示将本机任何接口上的任何地址向每个接口进行通告;1表示试图仅向目标网络通告与其网络匹配的地址;
                    2表示仅向与本地接口上地址匹配的网络进行通告
                
                故可以通过在real server上将虚拟的VIP配置到lo接口的别名上,如:lo:0上,
                然后设置arp_ignore 为1,arp_announce为2,这样就符合要求了

        2、在使用了上述的第<3>方法阻止real server接受VIP的报文后,当director接收到请求报文,然后调度后,
        转发到某个real server上,当real server接收到请求,进行响应时,由于虚拟的VIP是配置在lo接口上,lo是
        不对外进行响应的,而linux系统上,对外响应报文的源地址,一定是报文出去的接口的IP地址,但是请求报文
        的目标地址是VIP,响应的源地址一定要是VIP,否则客户端在接收到响应报文后会认为是非法报文,为了解决这
        个问题,可以在real server上配置一条路由条目,将响应报文的源地址设置为lo上配置的假的VIP地址

    1、实验环境

    blob.png

    

    2、在Director上按照拓扑结构,搭建实验环境

    blob.png

    3、在RS1上配置实验所需的环境

    blob.png

    blob.png

    blob.png

    3、在RS2上配置实验所需环境

    blob.png

    blob.png

    4、设定客户端环境

    blob.png

    blob.png   

    5、在Director上定义集群,在客户端进行验证

    blob.png

    blob.png

    blob.png

    blob.png

   6、补充说明:
        通过以上几个配置,就可以进行负载均衡了,但是这样实现负载均衡的前提是,VIP、DIP、RIP在同一个网段内,
        如果是向外提供服务的应用,那么这些主机上都要是公网地址。但是在实际生产环境中,基本上只要VIP是公网
        地址,其他都是私有地址,为了实现这种情况的负载均衡,结构应该是这样的,进口路由设备通过交换机接到
        director上,这时路由接到交换机的口的地址,以及director的地址都是公有IP,然后各个real server连接到
        交换机上,交换机还有另外一条线路通过别的路由器出去,或者是还有另外一条线路,接到之前那个路由器的另
        外一个接口上,而路由器的这个接口上的IP为私有IP地址

    blob.png

  

第六章    基于FWM(防火墙标记)的LVS的配置

    1、防火墙标记的相关概念

        防火墙标记:在netfilter上给报文打标签,应该在iptables的mangle表上实现,mangle表可在iptables的5个链(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)上都可以实现,标记的值为正整数

        对ipvs而言,所有报文都是在INPUT链上进行处理的,所以如果要基于防火墙标记进行集群配置,则可以在PREROUTING链上对报文打上防火墙标记,然后再到INPUT链上用ipvs定义集群

    2、利用防火墙标记定义LVS集群的意义

        基于防火墙标记定义集群,可以将多个服务定义一个集群服务(前提是后端的real server也同时提供对应的多个服务)

        还可以基于防火墙标记,进行LVS的持久连接

    3、基于防火墙标记定义集群的示例:

        在LVS-DR实验的基础上,利用防火墙标记,将httpd与mysql的服务定义为同一个调度对象,进行统一调度

    1.png

        

   

第七章    LVS的持久连接机制

    1、ipvs的持久连接的作用

        基于一个持久连接模板,能实现,无论使用任何算法调度,都能进行在一段时间内,将来自于同一源IP的请求,始终发往后端同一real server,利用持久连接模板(实际是一段内存缓冲区域),模板内保存了每个客户端及分配给他的real server 的映射关系

    2、持久连接的类型

        每端口持久(PPC):只持久一个服务

            来自于同一个源IP对ipvs上定义的多个集群服务,当访问某一个服务,如80端口的服务时,在定义的持久连接的时长内,都调度到某个real server上,但是当该客户端请求该ipvs上定义的其他集群服务时,如22端口,则是重新调度到另外的真正提供22端口服务的real server上

        每客户端持久(PCC): 持久所有服务

            只要是来自于同一客户端的请求,无论访问的是哪个集群服务,都调度到后端同一个real server上,前提是后端的real server要能同时提供多种集群定义的服务

        每FWM持久:每防火墙标记持久,持久自定义的服务

            将来自同一个防火墙标记的都发往同一个real server上,如此就可以灵活的将各种服务组织成同一个防火墙标记,然后对同一个防火墙标记进行持久连接的定义

    3、配置每端口持久示例

    blob.png

    blob.png

    4、配置每客户端持久示例

    blob.png

    blob.png

    

    5、定义每防火墙标记持久示例

    blob.png

    blob.png

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/54875

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-10-27
下一篇 2016-10-27

相关推荐

  • Linux基础命令 2017-07-12日课

    bc, lscpu, free, dd, rpm, lsblk, ldd, file, hexdump, uname, sha1sum, sha256sum, md5sum bc an arbitrary precision language scale=NUM ; precision quit lscpu display information about…

    Linux干货 2017-07-12
  • Linux 基础 (1)

    su nano shell type hash alias date cal screen echo $ tab (df bc rz(sz) ifconfig ping tty who whoami w) 1.用户  root为超级用户 1) useradd oracle  创建一个oracle用户     su &#…

    2017-07-13
  • cp复制软链接失效的原因

    在学习cp命令时我们会知道复制软链接时,如果要保留链接文件使用-d,但当我们实际操作时却常常出现如下情况 [root@localhost ~]# ls -l /etc/redhat-release     #此文件为链接文件 lrwxrwxrwx. …

    Linux干货 2016-10-25
  • 部分基本的文本处理工具

    一、   抽取文本的命令     1、cat     cat [option]… [file]…     常用选项:         -E &nb…

    Linux干货 2016-08-05
  • 启动流程与内核管理

    centos6和centos5启动流程与内核管理,启动过程中遇到的系统不能启动,各个阶段该怎么解决

    Linux干货 2018-01-02
  • Linux Kernel

    Linux Kernel 概述:文章将主要介绍Linux 内核的相关信息,包括内核各组成部分的详细介绍,其中有内核信息的获取命令,uname;内核模块管理类命令:lsmod,modinfo,modprobe,insomd,rmmod;ramdisk生成的相关命令,mkinitrd和dracut命令;以及linux中的两个为文件系统 /proc和/sys。最后…

    Linux干货 2016-09-19