一、LVS简介
1、 简介:
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。
LVS是一个开源的负载均衡软件,运行在Linux操作系统上,通过IP负载均衡技术和基于内容请求分发技术来实现高性能、高可用的服务器集群。
2、组成结果
2.1LVS集群架构:
LVS通常由三部分组成:
- 负载均衡器(Load Balancer):这是集群系统的核心,它接收来自客户端的请求,并根据一定的调度算法将请求转发到后端的真实服务器上。
- 服务器池(Server Pool):由多个真实服务器组成,这些服务器负责处理具体的业务请求。
- 共享存储(Shared Storage,可选):用于存储集群系统中的共享数据,确保所有真实服务器可以访问到相同的资源。
2.2LVS软件组成:
- ipvs(ip virtual server):通过修改请求报文的目的地址(DNAT)或源地址(SNAT)来实现负载均衡。IPVS是LVS的核心组件,它工作在网络层,能够快速处理大量的网络请求,是真正生效实现调度的代码。
- ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。
3、LVS相关术语
- DS:Director Server:指的是前端负载均衡器节点。
- VS:Virtual Server:虚拟服务器。
- RS:Real Server:后端真实的工作服务器。
- CIP:Client IP:访问客户端的IP地址,即请求的来源ip。
- VIP: Virtual serve IP :VS外网的IP。
- DIP: Director IP :VS内网的IP。
- RIP: Real server IP:后端服务器的IP地址。
访问流程:CIP <--> VIP == DIP <--> RIP
二、LVS工作原理
LVS主要工作在网络的第四层(传输层),通过修改IP报文的头部信息来实现负载均衡。它支持多种负载均衡算法和调度策略,能够根据不同的需求进行灵活配置。
1、工作流程
- 客户端请求到达负载均衡器:客户端通过网络向负载均衡器发送请求,请求的目的IP地址是负载均衡器的虚拟IP地址(VIP)。
- 负载均衡器接收请求:负载均衡器接收到客户端的请求后,根据配置的调度策略(如轮询、最少连接、加权轮询等)选择一个后端服务器(Real Server)来处理该请求。
- 修改IP报文头部信息:负载均衡器将客户端请求的IP报文头部信息进行修改,将目的IP地址从虚拟IP地址(VIP)改为选定的后端服务器的IP地址(RIP),同时将源IP地址从客户端的IP地址(CIP)改为负载均衡器的IP地址(DIP)。
- 转发请求到后端服务器:负载均衡器将修改后的IP报文转发到选定的后端服务器。
- 后端服务器处理请求:后端服务器接收到请求后,根据请求的内容进行处理,并生成响应数据。
- 后端服务器返回响应:后端服务器将响应数据发送回负载均衡器。根据配置的负载均衡模式(NAT、DR、TUN),响应数据的返回路径可能不同。
- 负载均衡器返回响应给客户端:负载均衡器将后端服务器的响应数据转发回客户端,客户端收到响应后完成请求处理。
2、负载均衡模式
2.1 NAT(Network Address Translation)模式
- 请求处理:负载均衡器将客户端请求的IP报文头部的目的IP地址从VIP改为RIP,同时将源IP地址从CIP改为DIP。
- 响应处理:后端服务器将响应数据发送回负载均衡器,负载均衡器将响应数据的源IP地址从RIP改为VIP,然后将响应数据转发回客户端。
- 特点:所有后端服务器需要配置默认网关为负载均衡器的IP地址(DIP),适用于后端服务器不在同一网段的场景。
2.2DR(Direct Routing)模式
- 请求处理:负载均衡器将客户端请求的IP报文头部的目的IP地址从VIP改为RIP,但不修改源IP地址(CIP)。
- 响应处理:后端服务器直接将响应数据发送回客户端,无需经过负载均衡器。
- 特点:后端服务器需要配置一个虚拟IP地址(VIP),并且需要配置单播或广播的ARP响应策略,适用于后端服务器在同一网段的场景。
2.3TUN(Tunneling)模式
- 请求处理:负载均衡器将客户端请求的IP报文封装在另一个IP报文中,外层IP报文的目的IP地址是后端服务器的IP地址(RIP),源IP地址是负载均衡器的IP地址(DIP)。
- 响应处理:后端服务器解封装后将响应数据发送回负载均衡器,负载均衡器再将响应数据转发回客户端。
- 特点:后端服务器需要支持IP隧道协议,适用于后端服务器分布在不同网络环境的场景。
2.4FULLNAT(Full Network Address Translation)模式
- 请求处理 :负载均衡器将请求的源IP从CIP改为DIP(负载均衡器内网IP),目标IP从VIP改为RIP(真实服务器IP)。
- 响应处理:负载均衡器将响应的源IP从RIP改为VIP,目标IP从DIP改为CIP,然后转发给客户端。
- 特点 :支持真实服务器和负载均衡器不在同一网段,同时对源IP和目标IP进行转换。但是真实服务器无法直接获取客户端的CIP,需额外配置(如TOA)。
三、LVS实验
1、LVS-DR模式集群实验
1.1实验环境
主机名 | ip | vip | 角色 |
client | 172.25.254.111 NAT | null | 测试主机 |
router | NAT-eth0:172.25.254.100; 仅主机-eth1:192.168.221.100 |
null | 路由器 |
DR-LVS |
192.168.221.200,GW 192.168.221.100 仅主机
|
lo:192.168.221.220 | dr调度器 |
RS1 | 192.168.221.101,GW 192.168.221.100 仅主机 | lo:192.168.221.220 | web服务器1 |
RS2 | 192.168.221.102,GW 192.168.221.100 仅主机 | lo:192.168.221.220 | web服务器2 |
1.2配置命令
在LVS中安装ipvsadm
[root@lvs-dr ~]# yum install ipvsadm -y
配置VIP192.168.221.220/32:
[root@lvs-dr~]# ip addr add dev lo 192.168.221.220/32
[root@rs1~]# ip addr add dev lo 192.168.221.220/32
[root@rs2~]# ip addr add dev lo 192.168.221.220/32
在RS1和RS2中解决响应问题 :
在lvs中配置策略 :
测试结果:
2、防火墙标签解决轮询错误
2.1实验环境
在DR实验环境基础上。
2.2 轮询规则中可能会遇到的错误
如果在RS中同时开放80和443端口,那么默认控制是分开轮询的,这样我们就会出
现一个轮询错乱的问题,就是当我第一次访问80被轮询到RS1后下次访问443仍然可能会被轮询到RS1上。
配置策略:
测试问题:当访问vip时两次调度都到了102
2.3防火墙标记解决轮询调度问题
解决方法:
(1)在Director主机打标记:在dr-lvs调度器中设定端口标签,人为80和443是一个整体。
(2) 在Director主机基于标记定义集群服务:设定调度规则
测试结果:
3、NAT模式集群实验
3.1实验环境
主机名 | ip | vip | 角色 |
client | 172.25.254.111 NAT | null | 测试主机 |
LVS |
192.168.221.100 仅主机
|
172.25.254.220 | 调度器 |
RS1 | 192.168.221.101,GW 192.168.221.100 仅主机 | null | 真实服务器1 |
RS2 | 192.168.221.102,GW 192.168.221.100 仅主机 | null | 真实服务器2 |
3.2 配置命令
在LVS中启用内核路由功能
[root@lvs ~]# echo"net.ipv4.ip_forward=1">/etc/sysctl.d/ip_forward.conf
[root@lvs ~]# sysctl--system
在LVS中安装ipvsadm
[root@lvs ~]# yum install ipvsadm -y
在LVS中添加调度策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.220:80 -s rr
[root@lvs ~]# ipvsadm -a -t 172.25.254.220:80 -r 192.168.221.101:80
[root@lvs ~]# ipvsadm -a -t 172.25.254.220:80 -r 192.168.221.101:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.220:80 -r 192.168.221.102:80 -m
测试结果:
4、LVS持久链接
4.1问题
在我们客户上网过程中有很多情况下需要和服务器进行交互,客户需要提交响应信息给服务器,如果单纯的进行调度会导致客户填写的表单丢失。
4.2解决方法
在进行调度时,不管用什么算法,只要相同源过来的数据包我们就把他的访问记录在内存中,也就是把这个源的主机调度到了那个RS上。
在LVS调度器中设定
[root@lvs~]#ipvsadm -E -f 6666 -s rr -p [3000]
查看LVS当前持久连接信息
[root@lvs~]#ipvsadm -LnC
四、 LVS的调度算法
1、常用的静态调度算法
轮询(Round Robin,RR)
- 原理:按照顺序依次将请求分配给后端服务器。
- 特点:简单公平,适用于后端服务器性能相近的场景。
加权轮询(Weighted Round Robin,WRR)
- 原理:根据服务器的权重进行轮询调度,权重高的服务器会优先分配到更多的请求。
- 特点:适用于后端服务器性能差异较大的场景。
目标地址散列(Destination Hashing,DH)
- 原理:根据请求的目标IP地址进行散列,将请求分配到固定的服务器。
- 特点:适用于需要会话保持的场景,确保同一客户端的请求总是分配到同一服务器。
源地址散列(Source Hashing,SH)
- 原理:根据请求的源IP地址进行散列,将请求分配到固定的服务器。
- 特点:适用于需要会话保持的场景,确保同一客户端的请求总是分配到同一服务器。
2、常用的动态调度算法
最少连接(Least Connection,LC)
- 原理:优先将请求分配给当前连接数最少的服务器。
- 特点:适用于后端服务器性能差异较大的场景,能够动态平衡负载。
加权最少连接(Weighted Least Connection,WLC)
- 原理:结合服务器的权重和当前连接数进行调度,权重高且连接数少的服务器会优先分配到请求。
- 特点:综合考虑了服务器的性能和当前负载,适用于复杂的生产环境。
SED(Shortest Expected Delay)
- 原理:根据服务器的当前连接数和响应时间来选择服务器。选择当前预期延迟时间最短的服务器。
- 特点:综合考虑了服务器的负载和响应时间,适用于对响应时间敏感的应用场景。
NQ(Never Queue)
- 原理:如果服务器的当前连接数小于其权重值,则直接分配请求;否则,选择下一个服务器。
- 特点:尽量避免排队,适用于对延迟敏感的场景。
LBLC(Locality-Based Least Connections)
- 原理:基于局部性最少连接。优先选择与客户端IP地址相同的服务器,如果没有,则选择当前连接数最少的服务器。
- 特点:适用于需要会话保持的场景,同时兼顾负载均衡。
LBLCR(Locality-Based Least Connections with Replication)
- 原理:基于局部性最少连接并支持复制。优先选择与客户端IP地址相同的服务器,如果没有,则选择当前连接数最少的服务器,并将连接信息复制到其他服务器。
- 特点:适用于需要会话保持且对高可用性有要求的场景。