LVS简介
LVS(Linux Virtual Server)是一种基于Linux内核的高可用性负载均衡软件。它通过将客户端请求分发到多个后端真实服务器,提高系统性能和可靠性。LVS支持多种调度算法,如轮询、最少连接、源地址哈希等,用于决定请求的转发方式。它还提供了高可用性的机制,包括热备份和故障自动切换。LVS具有灵活的配置和扩展性,适用于各种网络环境和应用场景。通过实现负载均衡,LVS能够提供稳定、高效的服务,满足大规模系统的需求。
工作原理:
- 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
- PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
- IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
- POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器
组成部分:
- ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
三种工作模式
原生只有3种模式(NAT,TUN,DR), fullnat工作模式默认不支持
LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
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、DR、TUN及FULLNAT。
1.LVS-NAT模式
Network Address Transaction,简称NAT模式
类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口
服务器节点使用私有IP地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式
NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,LVS需要作为RS的网关,当网络包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP,这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,对于客户端只知道是LVS直接返回给它的。
2.LVS-DR 模式
Direct Routing,简称DR模式
采用半开放式的网络结构,与TUN模式的结构类似,但各节点并不是分散在各地,而是与调度器位于同一个物理网络
负载调度器与各节点服务器通过本地网络连接,不需要建立专用的IP隧道
LVS-DR(Direct Routing)模式是LVS负载均衡的一种实现方式,通过在前端负载均衡器和后端真实服务器之间建立虚拟IP地址和ARP代理,将请求直接路由到后端服务器上,避免了数据包的二次复制和转发,提高了系统的性能和可靠性。这种模式需要在后端服务器上配置虚拟IP地址和直接路由规则,并保证后端服务器之间的网络互通。
3.LVS-TUN模式
IP Tunnel,简称TUN模式
采用开放式的网络结构,负载调度器仅作为客户机的访问入口,各节点通过各自的Internet连接直接回应客户机,而不再经过负载调度器
服务器节点分散在互联网中的不同位置,具有独立的公网IP地址,通过专用IP隧道与负载调度器相互通信
LVS-TUN(Tunneling)模式是LVS负载均衡的一种实现方式,通过在前端负载均衡器和后端真实服务器之间建立隧道连接,将客户端请求封装在隧道中传输到后端服务器上进行处理。这种模式需要在前端负载均衡器和后端服务器上配置隧道设备,并使用隧道协议进行数据传输。LVS-TUN模式适用于跨子网或跨网络的场景,可以实现灵活的负载均衡和高可用性,但会引入额外的网络开销和延迟。
三种工作模式优缺点
以下是LVS三种工作模式(LVS-NAT、LVS-DR、LVS-TUN)的优缺点对比表格:
模式 | 优点 | 缺点 |
---|---|---|
LVS-NAT | - 简单易配置,不需要对后端服务器进行额外配置 | - 性能较低,数据包需要经过两次NAT转发 |
- 支持跨子网负载均衡 | - 后端服务器的响应数据包需要经过前端负载均衡器再返回给客户端 | |
- 可以隐藏后端服务器的真实IP地址 | - 单个NAT节点成为性能瓶颈 | |
LVS-DR | - 性能高,请求直接路由到后端服务器,避免了数据包的二次复制 | - 需要在后端服务器上配置虚拟IP地址和直接路由规则 |
- 后端服务器可以直接与客户端通信,提高响应速度 | - 后端服务器之间需要保证网络互通 | |
- 可以支持大规模部署和高并发流量 | - 不支持跨子网负载均衡 | |
LVS-TUN | - 支持跨子网和跨网络负载均衡 | - 引入额外的网络开销和延迟 |
- 灵活配置,适用于复杂网络环境 | - 需要在前端负载均衡器和后端服务器上配置隧道设备及协议 | |
- 可以实现灵活的负载均衡和高可用性 | - 隧道连接的建立和维护需要额外的管理和资源消耗 |
需要注意的是,选择合适的工作模式取决于具体的应用场景和需求,每种模式都有其适用的情况和限制。
十种调度算法
1.轮询调度
按照顺序依次分配任务,每个处理器或资源依次处理一个任务,然后再循环到下一个任务。
2.加权轮询调度
在轮询调度的基础上,为不同的处理器或资源设置不同的权重,以实现更精细的负载均衡。
3.最小连接调度
将任务分配给当前连接数最少的处理器或资源,以保证负载均衡。
4.加权最小连接调度
在最小连接调度的基础上,为不同的处理器或资源设置不同的权重,以实现更精细的负载均衡。
5.基于局部的最少连接调度
根据客户端IP地址和服务器IP地址的局部性原则,将任务分配给距离客户端最近、连接数最少的处理器或资源。
6.带复制的基于局部性的最少连接调度
在基于局部的最少连接调度的基础上,将任务复制到多个处理器或资源上,以提高可用性和容错性。
7.目标地址散列调度
根据客户端IP地址或请求的目标地址,将任务分配给特定的处理器或资源,以实现精细的负载均衡。
8.源地址散列调度
根据客户端IP地址或请求的源地址,将任务分配给特定的处理器或资源,以实现精细的负载均衡。
9.最短的期望延迟
是一种基于网络拓扑结构的调度算法。它通过计算每个服务器到客户端的期望延迟,并将请求分配给具有最短期望延迟的服务器来实现负载均衡。
10.最少队列调度
最少队列调度算法根据服务器的队列长度来进行任务分配。它将任务分配给当前队列长度最短的服务器,以实现负载均衡。这个算法的思想是假设队列长度越短,服务器的处理能力越强,因此将任务分配给队列长度最短的服务器可以更好地利用服务器资源。
十种调度算法的优缺点
下面是一个表格,用于表示LVS中常见的调度算法及其优缺点:
调度算法 | 优点 | 缺点 |
---|---|---|
轮询调度 (Round Robin) | - 简单、公平<br>- 易于实现 | - 不能根据服务器负载动态调整<br>- 可能导致某些服务器负载过高,而其他服务器负载较低 |
加权轮询调度 (Weighted Round Robin) | - 可以为不同服务器设置不同权重,实现更精细的负载均衡<br>- 相对于轮询调度,更适合处理性能差异较大的服务器 | - 仍然无法根据服务器负载动态调整 |
最小连接调度 (Least Connection) | - 根据服务器当前连接数分配请求,实现负载均衡<br>- 能够自动适应服务器的负载情况 | - 需要实时监测服务器连接数,增加了一定的开销<br>- 可能会因为服务器处理速度不同而导致负载不均衡 |
加权最小连接调度 (Weighted Least Connection) | - 可以为不同服务器设置不同权重,实现更精细的负载均衡<br>- 能够自动适应服务器的负载情况 | - 需要实时监测服务器连接数,增加了一定的开销<br>- 仍然可能因为服务器处理速度不同而导致负载不均衡 |
基于局部的最少连接调度 (Locality-Based Least Connection) | - 考虑到客户端和服务器之间的网络距离,减少网络延迟和丢包率<br>- 能够自动适应服务器的负载情况 | - 需要使用专门的网络测量工具和算法来计算网络距离,增加了一定的开销<br>- 仍然可能因为服务器处理速度不同而导致负载不均衡 |
带复制的基于局部性的最少连接调度 (Locality-Based Least Connection with Replication) | - 考虑到客户端和服务器之间的网络距离,减少网络延迟和丢包率<br>- 能够自动适应服务器的负载情况<br>- 通过复制服务器,提高了可用性和容错性 | - 需要使用专门的网络测量工具和算法来计算网络距离,增加了一定的开销<br>- 需要维护复制服务器的同步和一致性 |
目标地址散列调度 (Destination IP Hash) | - 根据请求的目标地址进行散列,将请求分配给对应的服务器,实现负载均衡<br>- 可以保证相同目标地址的请求始终分配到同一台服务器 | - 如果目标地址变化频繁,可能导致负载不均衡 |
源地址散列调度 (Source IP Hash) | - 根据请求的源地址进行散列,将请求分配给对应的服务器,实现负载均衡<br>- 可以保证相同源地址的请求始终分配到同一台服务器 | - 如果源地址变化频繁,可能导致负载不均衡 |
最短的期望延迟调度 (Shortest Expected Delay Scheduling) | - 考虑服务器之间的网络距离,减少网络延迟和丢包率<br>- 提高用户体验 | - 需要使用专门的网络测量工具和算法来计算期望延迟,增加了一定的开销 |
最少队列调度 (Least Queue Length Scheduling) | - 将任务分配给队列长度最短的服务器,实现负载均衡<br>- 简单、易于实现 | - 不能考虑服务器的实际处理能力<br>- 可能存在某些服务器的负载过高问题 |