lvs
简述
linux虚拟服务器(linux virtual Server,LVS)是一个虚拟的服务器集群系统,用于实现负载平衡。项目在1998年5月由章文嵩成立,是国内最早出现的自由软件项目之一,目前已经是Linux内核的一部分。
工作原理
IP负载
LVS采用了IP负载均衡技术(效率最高)来实现虚拟网络服务,而在IP负载均衡技术中,主要有三种实现方式:
NAT
网络地址转换(Network Address Translation,缩写为NAT),也叫做网络掩蔽或者IP掩蔽(IP masquerading),是一种在IP数据包通过路由器或防火墙时重写来源IP地址或目的IP地址的技术,最初是作为一种解决IPv4地址短缺而提出的解决方案。
NAPT(网络地址端口转换)是最常用的NAT,现在几乎每一个家庭的路由器都是采用这一方案,所有设备共享同一个公网IP。NAT还可以用来实现负载均衡,重定向数据包到其他服务器。
NAT的配置如下表所示,所有到IP地址为202.103.106.5和端口为80的流量都被负载均衡地调度的真实服务器172.16.0.2:80和 172.16.0.3:8000上。
代理ip地址 | Port | 真实地址 | Port |
---|---|---|---|
202.103.106.5 | 80 | 172.16.0.2 | 80 |
172.16.0.3 | 8000 |
访问Web服务的报文可能包含如下信息:
SOURCE | 202.100.1.2:3456 | DEST | 202.103.106.5:80 |
---|
负载均衡器从调度列表中选出一台服务器,例如是172.16.0.3:8000。该报文会被改写为如下地址,并将它发送给选出的服务器。
SOURCE | 202.100.1.2:3456 | DEST | 172.16.0.3:8000 |
---|
从服务器返回到调度器的响应报文如下:
SOURCE | 172.16.0.3:8000 | DEST | 202.100.1.2:3456 |
---|
响应报文的源地址会被改写为虚拟服务的地址,再将报文发送给客户:
SOURCE | 202.103.106.5:80 | DEST | 202.100.1.2:3456 |
---|
这样,无论是172.16.0.2还是172.16.0.3,其真实IP对用户都是透明的,从而实现反向代理的目的。
优点:
缺点:
- 可伸缩性容易受限,真实服务器节点增多时,负载均衡器可能会成为系统瓶颈,因为所有数据包都要通过负载均衡器修改
TUN
IP隧道(IP tunneling,缩写为IP TUN)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。
负载均衡器收到用户请求后,对报文进行封装,转发给真实服务器;真实服务器收到报文后,进行解封,并处理请求,根据路由表将响应报文直接返回用户,而无需经过负载均衡器中转处理。
这里需要注意的是,根据默认的TCP/ip协议栈处理,请求报文的目标地址为VIP,响应报文的源地址肯定也为VIP,所以响应报文的源地址仍为负载均衡器的IP地址,而非真实服务器地址。
优点:
- 因为负载均衡器只负责将用户请求调度到不同的后端服务器,后端服务器会将响应数据直接返回到用户,所以TUN的方式可以处理更多的请求,有更高的吞吐量。
缺点:
- 所有服务器均需要支持IP隧道协议。
DR
直接路由(Direct Route,缩写为DR),与IP隧道的方式类似,负载均衡器只负责请求调度,而后端服务器直接将响应返回给客户,但具体实现有所不同。负载均衡器和后端服务器需要在同一局域网中,属于同一物理段。
负载均衡器收到用户请求后,根据负载情况动态选择一台服务器,不修改也不封装IP数据报,而是将数据帧的MAC地址修改为所选服务器的MAC地址。因为是直接通过数据链路层进行转发,而未经网络层处理,响应报文的源地址仍然为VIP,所以响应报文的源地址仍为负载均衡器的IP地址,而非真实服务器地址。
优点:
- 同TUN的方式一样,DR可以处理更多的请求,有更高的吞吐量。
缺点:
- 要求负载均衡器和后端服务器处于同一物理网段,不做ARP(地址解析协议)响应,直接在数据链路层寻址,也就是说必须要在同一局域网内。
调度算法
IP负载技术解决了负载均衡服务器与后端服务器之间的连接问题,而调度算法则解决了如何选择后端服务器的问题。LVS已经实现了以下八种调度算法:
轮询(Round-Robin):依次调度不同的服务器,算法实现简洁,无需记录当前所有连接状态,是一种无状态调度。
加权轮询(Weighted Round-Robin):在轮询的基础上为各个服务器设置权值,可以解决服务器性能不一致的问题,性能好的服务器权值较大,处理更多的请求。
最小连接(least-Connection):把新的连接请求分配到当前连接数最小的服务器,需要记录当前所有连接状态,是一种动态调度算法。
加权最小连接(Weighted Least-Connection):在最小连接的基础上为各个服务器设置权值,不同的权值代表服务器相应的处理性能。
基于局部性最小连接(locality-based Least Connections,LBLC):根据请求报文的目的IP地址找出最近使用过的服务器,如果该服务器可用并且没有超出负载,就将请求发送到该服务器,从而提高各台服务器的访问局部性和主存命中率;如果该服务器已经超出负载,则使用“最小连接”的方式重新选择一个可用的服务器。
带复制的基于局部性最小连接(Locality-Based Least Connections with Replication,LBLCR):基于LBLC调度算法,所不同的是,LBLCR维护从一个目的IP地址到一组服务器的映射,按照“最小连接”原则从服务器组中选出一台服务器。
目的地址散列(Destination Hashing):通过一个散列(Hash)函数将一个目的IP地址映射到一台服务器,是一种静态映射算法。
源地址散列(Source Hashing):与目的地址散列相反,它根据源IP地址映射到一台服务器。
参考资料
- Linux虚拟服务器
- 网络地址转换
- The Linux Virtual Server Project
相关阅读
一、LVS简介LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块