LVS是Linux Virtual Server的简称,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,实现了四层交换。LVS的工作模式有:NAT模式,TUN模式,DR模式,FULL-NAT模式,ENAT模式。其他基于四层实现负载均衡的还有HAProxy和Nginx。

(1)常见的术语

  • CIP:Client IP,客户端IP
  • VIP:Virtual IP,虚拟IP
  • RIP:Real IP,后端RS的IP
  • RS:Real Server,后端真正提供服务的服务器
  • LB:Load Balance,负载均衡器
  • SIP:Source IP,源IP
  • DIP:Destination IP,目标IP
  • NAT:网络地址转换
  • SANT:源地址转换
  • DNAT:目的地址转换

(2)LVS的五种模式

(1)DR模式(直接路由模式)

请求的流量首先会到达LVS,然后LVS会修改本次请求的目的MAC地址,将数据包写入到交换机,RS侦测到MAC是属于自己的,就会处理本次请求。请求处理完成后,由于源MAC是Client的MAC,会直接返回请求结果。由于LVS和RS都会接收到DIP为VIP的数据包,因此VIP必须绑定在网卡上,考虑到VLAN内不能有多个设备对同一个VIP进行ARP的广播或者应答,RS需要将VIP配置在lo回环网卡上,并且对ARP进行相关的配置。

优点:LVS只修改请求的数据包,大大降低了LVS的压力。缺点:LVS和RS必须在同一个VLAN中。RS需要配置lo网卡,并且对ARP进行特殊的配置。

(2)NAT模式(网络地址转换模式)

请求和响应的数据都走LVS,LVS对SIP和DIP进行修改。入口流量修改DIP为RIP,出口流量修改SIP为VIP。优点:配置简单,通用性强。支持NAT映射。RIP可以位于私网。缺点:LVS和RS必须位于同一VLAN中如果不在同一VLAN,返回数据包会经过路由器网关直接走掉。RS需要将LVS配置为网关。进入口流量都走LVS,容易发生瓶颈。

(3)FULL-NAT模式(全网络地址转换模式)

为了解决LVS和RS必须在同一个VLAN中的不灵活,因此出现了该模式,进出口流量都会经过LVS,但是与NAT不同的是,客户端将请求发送给LVS,LVS会同时修改DIP和SIP,等同于LVS向RS发起请求,然后RS回复数据到LVS,LVS再次修改SIP和DIP,等同于LVS响应客户端。优点:解决了LVS和RS必须在同一个VLAN的问题,不要求配置LVS为RS的网关。缺点:RS看不到CIP,出入口流量全走LVS,容易瓶颈。

(4)ENAT模式(增强NAT模式)

优点:不要求LVS和RS在同一个VLAN,出口流量不走LVS,LVS压力小。缺点:自定义的方案,所有RS必须安装CTK组件。类似于FULL-NAT模式,但是会将CIP封装到TCP Option中,当请求数据到达RS后会被CTK截获,CTK读取TCP Option信息,RS响应数据包的时候也会被CTK截获,将CIP写入到响应数据中。

(5)IP TUN模式(IP隧道模式)

请求的数据包到达LVS后,LVS将请求的数据包再封装成一个新的IP报文。新的IP报文的DIP是RIP,然后将该数据包转发给RS。RS接收到报文以后通过IPIP内核模块解封装,取出用户报文。发现DIP是VIP,然而RS的tunl0网卡上刚好是VIP,从而处理该次请求。优点:集群节点可以跨VLAN。和DR模式一样可以直接响应数据发送到Client。缺点:RS上必须运行IPIP内核模块。多增加一个IP头。LVS和RS的tunl0网卡必须配置同一个VIP。

(3)十大LVS负载均衡调度算法

(1)轮询调度(RR)

按依次循环的方式将请求调度到不同的服务器上。

(2)加权轮询调度(WRR)

权值越高的服务器,处理的请求越多。

(3)最小连接调度(LC)

把新的连接请求分配到当前连接数最小的服务器。集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。

(4)加权最小连接调度(WLC)

加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

(5)基于局部的最少连接(LBLC)

针对请求报文的目标IP地址的 负载均衡调度,主要用于Cache集群系统,因为在Cache集群客户端请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用'最少连接'的原则选出一个可用的服务器,将请求发送到服务器。

(6)带复制的基于局部性的最少连接(LBLCR)

也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按'最小连接'原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按'最小连接'原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

(7)目标地址散列调度(DH)

先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。

(8)源地址散列调度(SH)

先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。

(9)最短的期望的延迟(SED)

基于WLC算法。SED=(权重+请求数)/ 权重,SED最小的处理新的请求。

(10)最少队列调度(NQ)

无需队列,如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。