
LVS(Linux Virtual Server)是一种负载均衡解决方案,通过将网络流量分发到多个后端服务器上,提高服务的性能和可用性。
1. NAT模式(Network Address Translation,网络地址转换)
在LVS-NAT模式下,负载均衡是通过网络地址转换实现的。LVS调度器作为请求的中介,接收来自客户端的请求,将目标地址转换为后端服务器的真实IP地址(RIP),并通过自己将响应流量发送回客户端。
工作原理:
- 客户端到LVS调度器: 客户端将请求发送到LVS调度器的虚拟IP(VIP),此时数据包的目标IP是VIP。
- LVS调度器的NAT操作: LVS调度器接收到请求后,根据负载均衡算法(如轮询、最小连接数等)选择一台后端服务器。然后,它通过NAT将数据包的目标IP地址从VIP修改为所选后端服务器的RIP。
- 后端服务器响应: 后端服务器接收到修改后的数据包,处理请求并生成响应数据包,目标IP为LVS调度器。
- 返回客户端: LVS调度器再次进行NAT转换,将响应数据包的源IP地址从RIP改为VIP,然后将响应数据发送回客户端。
特点:
- LVS调度器在整个请求和响应过程中都参与,因此其负载较高。
- 后端服务器无需配置VIP,所有数据包都由LVS调度器处理。
- 后端服务器和LVS调度器可以位于不同的网络段。
适用场景:
- 适用于小规模网络,因为LVS调度器需要处理所有请求和响应数据包,容易成为性能瓶颈。
2. DR模式(Direct Routing,直接路由)
LVS默认的模式,在LVS-DR模式下,请求流量通过直接路由从LVS调度器转发到后端服务器,而响应流量则不再经过LVS调度器,后端服务器直接将响应发送给客户端。这种方式降低了LVS调度器的负载。
工作原理:
- 客户端到LVS调度器: 客户端将请求发送到VIP,LVS调度器接收到数据包。
- 修改目标MAC地址: LVS调度器根据负载均衡算法选择一台后端服务器,只修改数据包的目标MAC地址为所选后端服务器的MAC地址,保留IP头不变(目标IP仍为VIP)。然后将数据包直接发送给后端服务器。
- 后端服务器响应: 后端服务器接收到数据包后,处理请求。由于目标IP仍为VIP,但数据包通过直接路由到达后端服务器,因此后端服务器以VIP作为源IP,直接将响应数据包发送给客户端,不再经过LVS调度器。
特点:
- 仅在请求阶段经过LVS调度器,响应流量不再经过,减轻了调度器的负载。
- LVS调度器和后端服务器必须在同一网络段,因为调度器通过修改MAC地址直接发送数据包,无法跨越网络段。
- 后端服务器需要配置VIP,但必须禁止响应针对VIP的ARP请求(通过配置
arp_ignore
和arp_announce
),以避免IP冲突。
适用场景:
- 适用于高并发、高性能的场景,因为响应数据包不经过LVS调度器,极大地降低了其负载。
3. TUN模式(IP Tunneling,隧道模式)
在LVS-TUN模式下,不修改请求报文的IP首部 (源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源P是DIP,目标IP是RIP) ,将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目
标IP是CIP)
工作原理:
- 客户端到LVS调度器: 客户端请求发送到VIP,LVS调度器接收到请求数据包。
- IP隧道转发: LVS调度器根据负载均衡算法选择一台后端服务器,使用IP隧道技术(IPIP隧道)将数据包封装并转发给后端服务器。数据包的目标IP仍为VIP,但通过隧道传输。
- 后端服务器解封装处理: 后端服务器接收到封装的数据包,解封装并处理请求。由于目标IP仍为VIP,后端服务器识别这是发给它的请求。
- 直接响应客户端: 后端服务器以VIP作为源IP地址,直接将响应数据包发送给客户端,响应流量不再经过LVS调度器。
特点:
- 与DR模式类似,响应流量不经过LVS调度器,显著降低了调度器的负载。
- LVS调度器和后端服务器可以位于不同的网络段,因为请求通过IP隧道转发,可以跨越网络段。
- 后端服务器需要配置VIP。与DR模式不同的是,后端服务器可以部署在不同地理位置。
适用场景:
- 适用于跨地域、高延迟的网络环境,例如服务器分布在多个不同的地理位置。
4. FullNAT模式
FullNAT模式通过网络地址转换实现负载均衡,类似于NAT模式,但允许后端服务器和LVS调度器位于不同的网络段,并支持源IP和目标IP的双向地址转换。
工作原理:
- 客户端到LVS调度器: 客户端发送请求到VIP,LVS调度器接收到请求。
- 双向NAT转换: LVS调度器将请求的目标IP从VIP转换为后端服务器的RIP,同时也修改数据包的源IP地址。这意味着LVS调度器对数据包的源和目标IP地址都进行转换。
- 后端服务器处理请求: 后端服务器接收到修改后的请求,处理后生成响应数据包,目标IP为LVS调度器。
- LVS调度器返回响应: LVS调度器将后端服务器发来的响应数据包的源IP地址改为VIP,目标IP改为客户端的IP地址,然后将响应发送回客户端。
特点:
- 支持跨网络段的负载均衡,后端服务器和LVS调度器可以位于不同的网络环境。
- LVS调度器对数据包进行双向地址转换,客户端无法获取后端服务器的真实IP。
- LVS调度器必须处理所有的请求和响应数据包,因而负载较高。
适用场景:
- 适用于后端服务器和LVS调度器需要跨越不同网络段或网络环境的场景,适合大型分布式网络。
总结
- NAT模式: LVS调度器负责所有请求和响应的转发,负载较高,但配置简单。支持端口映射
- DR模式: 仅处理请求流量,响应流量不经过LVS调度器。要求LVS调度器和后端服务器在同一网络段,性能较好。不支持端口映射
- TUN模式: 通过IP隧道(IP+IP)转发请求流量,允许LVS调度器和后端服务器跨越网络段。不支持端口映射
- FullNAT模式: 通过双向NAT实现负载均衡,支持跨网络段,但增加了LVS调度器的负载。支持端口映射
调度算法
静态算法
1.轮询调度
轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
2.加权轮询调度
加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3.目标地址哈希调度(DH)
第一次轮询调度到RS,后续将发往同一目标地址的请求始终转发至第一次挑中的RS,如web缓存
4.源地址哈希调度(SH)
实现session stricky,将来自同一ip地址的请求始终发往第一次挑中的RS,实现会话绑定
动态方法 较小的overhead将被调度
1.最小连接调度
最少连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。
overhead = activeconns*256+inactiveconns(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
2.加权最少连接调度
加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。overhead = (activeconns*256+inactiveconns)/weight
3.最短期望延迟算法
最短的期望的延迟调度(Shortest Expected Delay 简称’SED’)算法基于WLC算法。解决了WLC中如果初始调度时,activeconns和inactiveconns都是0,算出来的overhead结果为0,可能调度到权重低的服务器上去的问题
overhead = (activeconns+1)*256/weight
6.最少队列调度
最少队列调度(Never Queue 简称’NQ’)算法,第一轮均匀分配,后续SED。解决SED中可能导致一直把请求调度到同一服务器上的问题
4.基于局部的最少连接
基于局部的最少连接调度(Locality-Based Least Connections 简称’LBLC’)动态的DH算法,该算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。
5.带复制的基于局部性的最少连接
带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication 简称’LBLCR’)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。