一、LVS简介
LVS(Linux Virtual Server)是一种基于Linux的高性能虚拟服务器集群系统,主要用于实现负载均衡。LVS通过Linux内核中的IPVS模块实现了基于IP负载均衡的功能,能够将来自网络的请求分配给后端的多个服务器,从而提供高可用性和伸缩性。这种技术在处理大规模网络请求时尤其有用,例如大型网站和在线服务,能够有效防止单点故障并提升服务的可靠性和性能。LVS的工作原理可以简要概括为“请求分发”和“响应返回”两个主要环节。当用户请求发送至LVS虚拟IP地址(VIP)时,LVS调度器会根据预设的算法(如轮询、最少连接等)决定将请求发送至哪一台后端服务器。后端服务器处理完请求后,将响应数据直接返回给用户,从而完成整个请求-响应流程。
二、LVS结构
使用LVS架设的服务器集群系统有三个部分组成:
1、最前端的负载均衡层:用Load Balancer表示,中间的服务器群组层,用Server Cluster表示,最底端的数据共享存储层,用Storage表示,在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务
2、Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Diector Server 管理服务器)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。
3、Server Cluster层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色
4、Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。
三、LVS三种工作模式
1、NAT(Network Address Translation):
基本流程:负载均衡器将客户端请求转发到实际的服务器,并在请求过程中修改IP地址。服务器返回数据时,负载均衡器再将数据包转发回客户端。
优点:实现简单,兼容性强,能够进行细粒度的流量控制。
缺点:负载均衡器成为数据传输的瓶颈,可能导致性能下降;需要更多的处理能力和网络带宽。
2、DR(Direct Routing):
基本流程:负载均衡器将请求转发到真实的服务器,但不修改目标IP地址。服务器直接将响应返回给客户端,绕过负载均衡器。
优点:减少了负载均衡器的处理负担,性能较高,适合高流量场景。
缺点:需要网络配置支持IP伪装,通常需要网络设备支持;对服务器的配置要求较高。
3、TUN(IP Tunneling):
基本流程:负载均衡器和服务器之间通过IP隧道进行通信,负载均衡器将请求通过隧道转发到服务器,服务器返回的数据也通过隧道返回。
优点:灵活性高,能够支持复杂的网络拓扑;适用于需要跨网络的数据传输。
缺点:配置复杂,可能增加网络延迟和开销;需要额外的网络设备或配置支持。
四、LVS负载均衡调度算法
轮询调度算法(Round Robin, RR):
这是一种简单且公平的算法。它按顺序依次将请求分配给后端的服务器。例如,有服务器 A、B、C,第 1 个请求分配给 A,第 2 个请求分配给 B,第 3 个请求分配给 C,然后再从 A 开始循环。这种算法的优点是简单易实现,能保证每个服务器都有机会处理请求;缺点是没有考虑服务器的性能差异,可能导致性能不均衡。
加权轮询调度算法(Weighted Round Robin, WRR):
为了解决轮询算法中服务器性能差异的问题,引入了权重的概念。服务器的权重越高,被分配到的请求就越多。比如,服务器 A 的权重为 3,B 的权重为 2,C 的权重为 1,那么在 6 次请求中,A 会分配到 3 次,B 会分配到 2 次,C 会分配到 1 次。这种算法能根据服务器的性能进行更合理的分配,但需要准确设置权重。
最小连接调度算法(Least Connections, LC):
该算法会将新的请求分配给当前连接数最少的服务器。它假设连接数少的服务器负载较轻,能够更快地处理新请求。例如,服务器 A 有 5 个连接,服务器 B 有 3 个连接,服务器 C 有 2 个连接,新请求就会分配给 C。但它没有考虑服务器的性能差异。
加权最小连接调度算法(Weighted Least Connections, WLC):
结合了最小连接算法和权重的概念。不仅考虑服务器当前的连接数,还考虑服务器的权重。权重越大的服务器,在连接数相同的情况下,更有可能被分配新请求。
基于局部性的最少链接调度算法(Locality-Based Least Connections, LBLC):
主要考虑请求的目标 IP 地址的拓扑结构。优先将请求分配给同一网段中连接数最少的服务器,旨在提高数据的局部性和缓存命中率。例如,如果大量请求来自同一网段,LBLC 会尽量将这些请求分配到该网段内连接数少的服务器。
带复制的基于局部性最少链接调度算法(Locality-Based Least Connections with Replication, LBLCR):
是对 LBLC 算法的改进。除了将请求分配给同一网段中连接数最少的服务器,还会在多个服务器上复制相同的内容,以应对热点数据的大量访问。这样可以减少同一网段内对热门数据的重复请求造成的延迟。
目标地址散列调度算法(Destination Hashing, DH):
根据请求的目标 IP 地址进行哈希运算,然后将请求分配到对应的服务器。这样可以确保来自相同目标地址的请求总是被分配到同一台服务器。比如,通过特定的哈希函数计算,目标地址为 192.168.1.10 的请求总是被分配到服务器 A。
源地址散列调度算法(Source Hashing, SH):
与目标地址散列算法类似,只是依据的是请求的源 IP 地址进行哈希运算来分配服务器。这能保证来自相同源地址的请求始终被分配到同一台服务器,有助于保持会话的一致性。
最短的期望延迟调度算法(Shortest Expected Delay Scheduling, SED):
在不考虑权重的情况下,将下一个请求分配给预计处理时间最短的服务器。计算预计处理时间时,会综合考虑服务器当前的连接数和处理速度。
无需队列调度算法(Never Queue Scheduling, NQ):
如果有服务器的预计处理时间为 0,就直接把请求分配给它,不会进行排队等待。这可以最大程度地减少请求的等待时间,提高响应速度。
五、实操
1、网络配置:
2、启用内核路由
3、安装ipvsadm
[root@lvs ~]# dnf install ipvsadm -y
4、添加调度策略
5、保存并启动
6、设置web
7、测试
DR模式
1、LVS配置
2、router配置
3、server配置
4、添加vip
ip a a 172.25.254.200/32 dev lo
5、配置lvs
6、测试
至此完成!