一、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:配置持久化时间 -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是本机,将数据包送至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. 模式流程图
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. 模式流程图
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可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。实际适用中这些算法的适用范围很多,工作中最好参考内核中的连接调度算法的实现原理,然后根据具体的业务需求合理的选型。