一、LVS基本概念
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是http://www.linuxvirtualserver.org/.现在LVS已经是Linux内核标准的一部分。使用LVS可以达到的技术目标是:通过LVS达到的负载均衡技术和Linux操作系统实现一个高性能高可用的Linux服务器群集,它具有良好的可靠性,可拓展性和可操作性。从而以低廉的成本实现最优的性能。 LVS从1998年开始,发展到现在已经是一个比较成熟的项目了。利用LVS技术可以实现高性能,高可压缩的网路服务,例如WWW服务,FTP服务,MAIL服务等。比较著名的就是www.linux.com以及www.real.com.
二、 LVS集群的特点
IP负载均衡与负载调度算法
1.IP负载均衡技术
负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法、有基于客户端调度访问的方法、有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的是IP负载均衡技术。
LVS 的IP负载均衡技术是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
当用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡机制有三种,分别是NAT、TUN、FULLNAT和DR,详述如下:
lvs-nat:
多目标IP地址的DNAT,通过将请求报文中的目标地址和目标端口修改为某个利用调度算法挑选出来的后端RS的RIP和PORT的过程实现的转发;
注意下列几个问题:
1.RIP和DIP必须在同一网段,并且应该是私有IP地址;RS的网关应该指向DIP;
2.请求报文和响应报文都必须经过Director转发,Director易于成为系统性能瓶颈并引发单点故障;
3.可以实现端口重定向;CIP向VIP发送请求的端口号可以与后端的RIP所提供服务的服务端口不同;
4.VS必须是Linux系统,RS可以是任意操作系统;
lvs-dr:默认类型
dr:Direct Routing,直接路由;
通过为请求报文重新封装一个数据链路层首部(MAC地址)进行报文转发;重新封装之后的报文的源MAC地址是DIP所在网络接口的MAC地址;目的MAC地址是某个利用调度算法挑选出来的后端RS的RIP所在接口的MAC地址;源IP地址和源PORT,以及目的IP地址和目的PORT,在整个报文转发过程中保持不变;
注意以下几个问题:
1.确保前端路由器能够将目标IP地址为VIP的报文发往VS(Director);
1) 在路由器上静态绑定IP地址和MAC地址的映射关系;
2) 在RS上使用arptables;
3) 在RS上修改内核参数限制ARP的通告和对ARP请求的应答;
arp_announce
arp_ignore
2.RS的RIP可以是私有地址也可以是公有地址,RIP和DIP应该在同一逻辑网络;
3.请求报文必须要经过Director,但是所有的响应报文不需要经过Director直接通过路由转发给客户端即可;
4.不支持端口重定向;
5.RS必须是Linux操作系统;
6.RS上必须配置RIP和VIP,并且VIP应该配置在lo接口的lable上;
lvs-tun:tunnel,隧道;
不修改请求报文的IP首部(源IP为CIP,目的IP为VIP),而是在原有的IP报文的封装格式之外再次封装一个IP首部(源IP为DIP,目的IP为RIP),将重新封装的报文发往使用调度算法挑选出的后端RS上;
注意以下几个问题:
1.CIP,VIP,DIP,RIP都应该是公有IP地址;
2.RS的网关无法指向DIP,因此响应报文不会经过Director转发,而是直接发往CIP;
3.不支持端口重定向;
4.RS必须支持隧道协议;
5.RS上必须配置RIP和VIP;
lvs-fullnat:
非标准类型;
通过同时修改请求报文的源IP地址和目的IP地址实现报文转发;
CIP --> DIP
VIP --> RIP
注意以下几个问题:
1.VIP是公有地址,DIP和RIP是私有地址,且DIP和RIP可以不在同一网段;
2.RS对收到的请求报文的响应报文的目的地址是DIP,所以请求报文和响应报文都必须经过Director;
3.支持端口重定向;
4.此类型默认不支持;
2.负载调度算法
根据lvs在调度时是否考虑各RS当前的负载状态,可以将调度算法分为两类:
静态算法:根据算法本身的特点进行调度,注重起点公平;
RR:RoundRobin,轮询;
WRR:Weighted RR,加权轮询;
SH:Source Hashing,源地址哈希,将来自于同一个IP地址的请求始终发往后端第一次被挑中的RS,从而可是实现会话绑定;
DH:Destination Hashing,目的地址哈希,将发往同一个目标地址的请求,始终发送至后端第一次被挑中的RS,一般用于正向代理服务器集群;
动态算法:主要根据每个RS当前的负载状态进度调度,注重结果公平;
后端RS的负载,用Overhead表示;
LC:least connections,最少连接数;
连接有两种:一种是active connection;一种是inavtive connection;
Overhead=activeconnections*256+inactiveconnections
注意:第一次调度时,按照在ipvsadm中配置的顺序自上而下进行分配;
WLC:Weighted LC,加权最小连接;(默认算法)
Overhead=(activeconnections*256+inactiveconnections)/weight
注意:第一次调度时,按照在ipvsadm中配置的顺序自上而下进行分配;权重在第一次调度时不发挥作用;
SED:Shortest Expection Delay,最短期望延迟;
Overhead=(activeconnections+1)*256/weight
注意:SED可以解决起点不公问题,但是在权重差距比较大时候,可能会导致不公平;
NQ:Never Queue,改进版的SED算法,首次调度时,根据后端RS的权重依次为每台RS分配一个连接;然后再按照SED算法调度;必然会保证后端每台RS至少有一个activeconnection;
LBLC:Locality-Based Least Connections,基于本地的最少连接,动态的DH算法;
LBLCR:LBLC with Replication,带有复制功能的LBLC;