Linux---负载均衡---lvs

一、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

}WC2H3TQI~G~A2HA@_GO4B5.png

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:配置持久化时间
    -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. 模式流程图

781035-20170208130339541-1597888386.png

2、NAT模式原理

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

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

(3)IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP 

(4)POSTROUTING链通过选路,将数据包发送给Real Server

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

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

1. 模式流程图

781035-20170208131643026-1985709106.png

2、DR模式原理

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

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

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

(4)由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server

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

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

3、Tun模式

1. 模式流程图

781035-20170208132504057-1671947616.png

2、TUN模式原理

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

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

(3)IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP

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

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

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

五、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可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。


猜你喜欢

转载自blog.51cto.com/12948961/2315229