LVS简介
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内核2.6版本以后,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
LVS 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之上,传输层上有我们熟悉的 TCP/UDP,LVS 支持 TCP/UDP 的负载均衡。LVS 的转发主要通过修改 IP 地址(NAT 模式,分为源地址修改 SNAT 和目标地址修改 DNAT)、修改目标 MAC(DR 模式)来实现。可以实现高性能,高可用的服务器集群技术。廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。易用,配置非常简单,且有多种负载均衡的方法。稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
LVS特点
优点
1、开源,免费
2、在网上能找到一些相关技术资源
3、具有软件负载均衡的一些优点
缺点
1、最核心的就是没有可靠的支持服务,没有人对其结果负责;
2、功能比较简单,支持复杂应用的负载均衡能力较差,如算法较少等;
3、开启隧道方式需重编译内核;
4、配置复杂;
5、主要应用于LINUX,目前没有专门用于WINDOWS的版本,不过可以通过配置,使windows成为LVS集群中的real server(win2003、win2008中)。
LVS术语
lvs 集群类型中的术语:
VS :Virtual Server, Director, Dispatcher( 调度器),Load Balancer
RS :Real Server(lvs), upstream server(nginx),backend server(haproxy)
CIP :Client IP
VIP: Virtual serve IP VS 外网的IP
DIP: Director IP VS 内网的IP
RIP: Real server IP
访问流程:CIP <--> VIP == DIP <--> RIP
LVS结构
一般来说,LVS集群采用三层结构,其主要组成部分为:
A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
LVS模式
LVS的工作模式即负载均衡机制,主要有4种,DR、NAT、TUNNEL、Full-NAT
LVS相对于其它负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。LVS的通过控制IP来实现负载均衡。IPVS是其具体的实现模块。IPVS的主要作用:安装在Director Server上面,在Director Server虚拟一个对外访问的IP(VIPLVS)。用户访问VIP,到达Director Server,Director Server根据一定的规则选择一个Real Server,处理完成后然后返回给客户端数据。这些步骤产生了一些具体的问题,比如如何选择具体的Real Server,Real Server如何返回给客户端数据等等。
IPVS为此有三种机制:
VS/NAT(Virtual Server via Network Address Translation),即网络地址翻转技术实现虚拟服务器。当请求来到时,Diretor server上处理的程序将数据报文中的目标地址(即虚拟IP地址)改成具体的某台Real Server,端口也改成Real Server的端口,然后把报文发给Real Server。Real Server处理完数据后,需要返回给Diretor Server,然后Diretor server将数据包中的源地址和源端口改成VIP的地址和端口,最后把数据发送出去。由此可以看出,用户的请求和返回都要经过Diretor Server,如果数据过多,Diretor Server肯定会不堪重负。
VS/TUN(Virtual Server via IP Tunneling),即IP隧道技术实现虚拟服务器。它跟VS/NAT基本一样,但是Real server是直接返回数据给客户端,不需要经过Diretor server,这大大降低了Diretor server的压力。
VS/DR(Virtual Server via Direct Routing),即用直接路由技术实现虚拟服务器。跟前面两种方式,它的报文转发方法有所不同,VS/DR通过改写请求报文的MAC地址,将请求发送到Real Server,而Real Server将响应直接返回给客户,免去了VS/TUN中的IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是必须要求Director Server与Real Server都有一块网卡连在同一物理网段上。
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换。不过内核是默认不支持Full-NAT,使用必须重新编译安装。
LVS调度算法
ipvs scheduler: :
根据其调度时是否考虑各RS 当前的负载状态
两种:静态方法和动态方法
静态调度方法
仅根据算法本身进行调度
1 、RR :roundrobin ,轮询
2 、WRR :Weighted RR ,加权轮询
3 、SH :Source Hashing ,实现session sticky ,源IP 地址 hash ;将来自于同一个IP 地址的请求始终发往第一次挑中的RS ,从而实现会话绑定
4 、DH :Destination Hashing ;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS ,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商
动态调度方法
主要根据每RS 当前的负载状态及调度算法进行调度较小的RS 将被调度
1 、LC :least connections 适用于长连接应用
Overhead=activeconns256+inactiveconns
2 、WLC :Weighted LC, , 默认调度方法
Overhead=(activeconns256+inactiveconns)/weight
3 、SED :Shortest Expection Delay, 初始连接高权重优先
Overhead=(activeconns+1)*256/weight
4 、NQ :Never Queue ,第一轮均匀分配,后续SED
5 、LBLC :Locality-Based LC ,动态的DH 算法,使用场景:
根据负载状态实现正向代理
6 、LBLCR :LBLC with Replication ,带复制功能的LBLC
解决LBLC 负载不均衡问题,从负载重的复制到负载轻的RS