一、lvs简介

    LVS是 Linux Virtual Server 的简称,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。这是一个由章文嵩博士发起的,是中国国内最早出现的自由软件开源项目之一,现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

    在已有的IP负载均衡技术中,主要有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的、高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation)。在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出了通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性。VS/NAT、VS/TUN和VS/DR技术是LVS集群中实现的三种IP负载均衡技术。

二、lvs组成

1. 安装包

[root@mumu 7-1 ~]# yum -y install ipvsadm

2. 组成

    LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

2.1 ipvs(ip virtual server)

    工作在内核空间,是真正生效实现调度的代码。
2.2 ipvsadm

    工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。

三、lvs工具的简单使用

1、管理集群服务

    添加一条新的虚拟服务

ipvsadm -A -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags] 
    -A:添加一条新的虚拟服务     
    -t:TCP协议的端口,VIP:TCP_POPT
    -u:UDP协议的端口,UIP:UCP_POP
    -f:FWM: 防火墙标记;firewall MARK,是一个数字
    -p:timeout 指定持久连接时长,默认为360秒,单位是秒,即6分钟
    -M:定义Mac地址
    --pe:定义持久化引擎
    -b:定义进程调度标记
    service-address:某集群服务的IP地址
    -s:指定集群的调度算法,如:rr, wrr, lc等,默认为wlc

    删除一条虚拟服务

ipvsadm  -D -t|u|f service-address
    -D:删除一条虚拟服务

    修改一条虚拟服务

ipvsadm  -E -t|u|f service-address
    -E:修改一条虚拟服务

2、管理集群服务中的RS

    在一个虚拟服务中添加一个新的真实服务器

ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]            
    -t|u|f service-address:事先定义好的某类型集群服务            
    -r server-address: 定义某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
     [-g|i|m]: LVS类型    
        -g: gateway, dr类型                
        -i: ipip, tun类型                
        -m: masquerade, nat类型
    [-w weight]: 定义服务器权重

    删除某个真实服务器

ipvsadm -d -t|u|f service-address -r server-address
    -d:删除某个真实服务器,即RS

    修改某个真实服务器

ipvsadm -e -t|u|f service-address -r server-address
    -e:修改某个真实服务器,即RS

    查看某个真实服务器

ipvsadm -L|l  -t|u|f service-address -r server-address
    -L|l :查看某个真实服务器,即RS
    -n: 数字格式显示主机地址和端口            
    --stats:统计数据           
    --rate: 速率            
    --timeout: 显示tcp、tcpfin和udp的会话超时时长            
    -c: 显示当前的ipvs连接状况

3、管理ipvs规则

ipvsadm -S|R > 文件路径
    -C:清除所有的集群服务规则   
    -S = ipvsadm-save:保存之前所定义的集群服务规则
    -R = ipvsadm-restore:重载此前所定义的集群服务规则      
    文件路径:指定的保存或重载的文件路径
ipvsadm 
    -C:清除所有的集群服务规则
ipvsadm -Z -t|u|f service-address
    -Z:将当前定义的所有集群服务清零

4、查看统计

查看当前配置的虚拟服务和各个RS的权重

  ipvsadm -Ln

查看当前ipvs模块中记录的连接(可用于观察转发情况)

  ipvsadm -lnc

查看ipvs模块的转发情况统计

  ipvsadm -Ln --stats | --rate

四、lvs的三种工作模式

1、NAT 模式-网络地址转换

1. 模式流程图

2、NAT模式原理

(1)当客户端发送请求报文请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链,此时报文的源IP为CIP,目标IP为VIP 

(2)内核空间中的PREROUTING链会检查数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链

(3)判断IPVS比对数据包请求的服务是否为集群服务,若是,调度器会把数据包的目标IP地址修改为后端真实服务器的IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP (此RIP地址是根据调度算法得出的)

(4)POSTROUTING链根据调度算法决定将数据包发送给后端的真实服务器(Real Server)

(5)Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 

(6)Director Server在响应客户端前,此时会将包的源IP地址修改为自己的虚拟地址(VIP),然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

(7)响应报文最终送达至客户端

3、特点

(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;

(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;

(3)支持端口映射,可修改请求报文的目标PORT;

(4)vs必须是Linux系统,rs可以是任意系统;

4、优缺点

4.1 优点

    集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。

4.2 缺点

    扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!

2、DR模式-封装新的MAC地址

1. 模式流程图

2、DR模式原理

(1)当客户端发送请求报文请求请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP

(2)内核空间中的PREROUTING链会检查数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链

(3)IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址,此时报文的源IP为CIP,目标IP为VIP

(4)因为DR模式是通过MAC地址改写机制实现转发,因此所有RS节点和调度器LB只能在一个局域网里面,也可以简单的理解为在同一台交换机上,所以是通过二层来传输,。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server

(5)RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP 

(6)响应报文最终送达至客户端

3、特点

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

(2)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;

(3)RS跟Director要在同一个物理网络;

(4) 请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;

(5)不支持端口映射;

4、优缺点

4.1 优点

    和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。

4.2 缺点

    要求负载均衡器的网卡必须与物理网卡在一个物理段上。

3、Tun模式-IP Tunnel封装

1. 模式流程图

2、TUN模式原理

(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP

(2)PREROUTING检查发现数据包的目标IP是否是本机IP,若是,将数据包送至INPUT链

(3)IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部进行IP Tunnel封装,即在原有的包头加上IP Tunnel的包头,然后发送出去,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP

(4)POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP

(5)RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP Tunnel包头信息后,会发现里面还有一层IP首部,而且目标IP是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递,不需要经过负载均衡器。 此时的源IP地址为VIP,目标IP为CIP

(6)响应报文最终送达至客户端

3、特点

(1)DIP, VIP, RIP都应该是公网地址;

(2)RS的网关不能,也不可能指向DIP;

(3)请求报文要经由Director,但响应不能经由Director;

(4)不支持端口映射;

(5)RS的OS得支持隧道功能;

4、优缺点

4.1 优点

    负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。

4.2 缺点

    隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。

五、lvs的调度算法

1、算法分类

    Lvs的调度算法决定了如何在集群节点之间分布工作负荷。当director调度器收到来自客户端访问VIP的上的集群服务的入站请求时,director调度器必须决定哪个集群节点应该处理请求。Director调度器用的调度方法基本分为两类:

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr,sed,nq

2、算法介绍

1. 轮叫调度算法 rr(Round Robin)
    就是将请求按顺序调度到不同的 RS 上,即是将请求在 RS 中均摊分配,该算法是这些调度算法中最简单的。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去,但只适合于 RS 处理性能差不多的情况。

2. 加权轮询调度算法 wrr(weight Round Robin,加权轮询,以权重之间的比例实现在各主机之间进行调度)

    wrr算法是对rr算法的一种优化和补充,因此,wrr算法比rr算法多了一个权重的概念。lvs根据每台服务器的性能,判断给每台服务器要添加的权值,依据这个权值给不同服务器分配任务。如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,将优先获得任务,但处理的请求也越多,并且分配到的连接数将比权值低的服务器更多,权重的取值范围 0 – 100,相同权值的 RS 得到相同数目的连接数。

3. 最小连接数调度算法 lc(Least-Connection)

    这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1 

4. 加权最小连接数调度算法 wlc(Weighted Least-Connection Scheduling)

    wlc是lc的升级版,多了对权重的计算这一步。lvs获得权值后,LB会比较将连接请求发送到当前连接最少的RS。

5. 基于地址的最少连接调度算法 lblc(Locality-Based Least Connection)

    这个算法是请求数据包的目标 IP 地址的一种调度算法,这个算法会先根据请求的目标IP地址,寻找该IP地址最近所使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则就将这个请求分配给连接数最小的服务器,并以它作为下一次分配的首先考虑。

6. 复杂的基于局部性最少的连接算法 lblcr(Locality-Based Least Connections withReplication)
    记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

7. 目标地址哈希调度算法 dh(Destination hashing:目标地址散列。把同一个IP地址的请求,发送给同一个server。)
    该算法是根据目标 IP 地址为关键字通过散列函数查找一个静态hash表,将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

8. 源地址哈希调度算法 sh(source hashing,源地址散列。主要实现会话绑定,能够将此前建立的session信息保留了)
    与目标地址散列调度算法类似,但它是根据源地址为关键字通过散列函数查找一个静态hash表,发往该目标 IP 的请求会静态分配给固定的服务器。

9. 最短延迟调度算法 sed(Shortest Expected Delay)

    是wlc的进一步改进,为了解决当权限过大时,会导致空闲服务器一直处于无连接状态的问题,计算方式:Overhead=(Active+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目加一来实现,数目最小的接受下次请求,而+1的目的是为了考虑加权的时候,非活动链接过多。

10. 永不排队/最少对了调度算法 nq(Never Queue Scheduling)

    是sed的进一步升级,如果有台RS的连接数等于零就直接分配过去,不需要再进行sed运算,保证不会有任何一个主机空闲。如果RS的连接数不等于零,在sed基础上,无论计算结果如何,第二次客户请求一定会给下一个RS,保证不会有一个RS空闲。

3、算法的生产环境选型

(1)一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:

    a. 基本轮询调度rr

    b. 加权最小连接调度wlc

    c. 加权轮询调度wrc

(2)基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache。

(3)源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。

六、lvs的持久性连接

        对于电子商务网站来说,用户在挑选商品的时候使用的是80端口来浏览的,当付款的时候则是通过443的ssl加密的方式,当然当用户挑选完商品付款的时候,我们当然不希望https的443跳转到另外一台REAL SERVER上,很显然应该是同一REAL SERVER才对,这时候就要用到基于防火墙标记的持久连接,通过定义端口的姻亲关系来实现。在生产环境中用的最多的也是PNMP即基于防火墙标记的持久连接,好了引子就说到这下面我们就来详细说说LVS的持久连接; 

1、PPC(Persistent Port Connections)

        将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;(持久端口连接)
            例如:client---->LVS(80)---->RS1 或 client---->LVS(23)---->RS2
            缺陷:期望访问不同的端口到同一台RS上,无法实现。
            配置:

    ipvsadm -A -t 172.16.100.1:80 -s rr -p 3600 
    ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.10 -g -w 2 
    ipvsadm -a -t 172.16.100.1:80 -r 172.16.100.11 -g -w 2

2、PCC(Persistent Client Connections)

        将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;(持久客户端连接)
            说明:PCC是一个虚拟服务没有端口号(或者端口号为0),以"-p" 来标识服务。
            缺陷:定向所有服务,期望访问不同的Real Server无法实现。
            配置:

    ipvsadm -A -t 172.16.100.1:0 -s rr -p 3600 
    ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.10 -g -w 2 
    ipvsadm -a -t 172.16.100.1:0 -r 172.16.100.11 -g -w 2

3、PNMPP(Persistent Netfilter Marked Packet Persistence)

        持久防火墙标记连接,根据iptables 的规则,将对于某类服务几个不同端口的访问定义为一类;先对某一特定类型的数据包打上标记,然后再将基于某一类标记的服务送到后台的 Real Server上去,后台的Real Server 并不识别这些标记。将持久和防火墙标记结合起来就能够实现端口姻亲功能,只要是来自某一客户端的对某一特定服务(需要不同的端口)的访问都定义到同一台 Real Server上去。

            案例:一个用户在访问购物网站时同时使用HTTP(80)和HTTPS(443)两种协议,我们需要将其定义到同一台Real Server上,而其他的服务不受限制。
            配置:         

    iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 80 -j MARK --set-mark 8
    iptables -t mangle -A PREROUTING -d 172.16.100.1 -i eth0 -p tcp --dport 443 -j MARK --set-mark 8
    ipvsadm -A -f 8 -s rr -p 600
    ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
    ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1