一、LVS 是什么?
LVS(Linux Virtual Server,Linux虚拟服务器) 是一个由章文嵩博士在1998年发起并领导的开源项目。它是一个基于Linux操作系统内核的负载均衡解决方案,其核心功能是将来自客户端的网络请求,通过特定的调度算法,分发到后端一组真实服务器(Real Server)上,从而构建一个高性能、高可用的虚拟服务器集群。
LVS工作在传输层(TCP/UDP) ,因此也被称为四层负载均衡。它不解析应用层协议(如HTTP、FTP),而是直接转发IP数据包,这使得它具有极高的处理性能和较低的延迟。
二、LVS 的核心组件与架构
一个典型的LVS集群包含以下几个核心角色:
- 负载均衡器(Load Balancer / Director) :运行LVS软件(通常是
ipvsadm)的Linux服务器。它对外提供一个虚拟IP(Virtual IP, VIP),接收所有客户端请求,并根据调度算法将请求转发给后端的真实服务器。 - 真实服务器群(Real Server Pool):一组真正提供应用服务的后端服务器。它们通过局域网与负载均衡器相连,处理负载均衡器转发过来的请求。
- 共享存储(可选):为了保证所有真实服务器提供一致的数据(例如Web内容),通常会使用NFS、分布式文件系统或数据库集群等共享存储。
LVS的架构主要分为三种工作模式,这是理解其概念的关键:
1. NAT 模式(Network Address Translation)
原理:负载均衡器同时作为客户端和真实服务器的网关。请求和响应数据包都需要经过负载均衡器进行地址转换。
- 请求过程:客户端访问VIP → 负载均衡器接收 → 负载均衡器修改目标IP为某台真实服务器的IP(DNAT)并转发 → 真实服务器处理请求。
- 响应过程:真实服务器将响应发送给负载均衡器 → 负载均衡器修改源IP为VIP(SNAT) → 返回给客户端。
优点:真实服务器可以使用任何操作系统,只需配置默认网关为负载均衡器。
缺点:负载均衡器容易成为性能瓶颈,因为所有进出流量都要经过它。
2. TUN 模式(IP Tunneling)
原理:负载均衡器将接收到的请求数据包封装在一个新的IP数据包中(IP隧道),发送给真实服务器。真实服务器解封装后直接响应客户端。
- 请求经过负载均衡器,但响应由真实服务器直接返回给客户端(不经过负载均衡器)。
- 真实服务器需要支持IP隧道协议,并配置隧道接口。
优点:响应流量不经过负载均衡器,减轻了其压力,支持跨网段部署。
缺点:真实服务器需要支持隧道协议,配置稍复杂。
3. DR 模式(Direct Routing)
原理 :最常用、性能最高的模式。负载均衡器和真实服务器在同一个局域网,且拥有相同的VIP。负载均衡器只修改请求数据包的目标MAC地址为某台真实服务器的MAC,然后通过二层交换转发。真实服务器收到后直接处理,并将响应直接返回给客户端。
- 请求经过负载均衡器调度,响应由真实服务器直接返回。
- 真实服务器需要配置VIP在lo(回环)接口上,并抑制该VIP的ARP响应。
优点:性能极高,负载均衡器只处理入站请求,出站响应压力小。
缺点:要求负载均衡器和真实服务器必须在同一物理网段(二层可达)。
三、LVS 的调度算法
LVS通过多种调度算法来决定将新连接分配给哪台真实服务器:
- 轮询(Round Robin, rr):将请求依次分配给每台服务器,循环进行。
- 加权轮询(Weighted Round Robin, wrr):根据服务器权重分配请求,权重高的服务器获得更多连接。
- 最少连接(Least Connections, lc):将新请求分配给当前连接数最少的服务器。
- 加权最少连接(Weighted Least Connections, wlc):在最少连接的基础上,考虑服务器的权重。
- 基于局部性的最少连接(Locality-Based Least Connections, lblc) & 带复制的基于局部性的最少连接(lblcr):适用于缓存集群,将相同目标IP的请求定向到同一台服务器。
- 目标地址散列(Destination Hashing, dh) & 源地址散列(Source Hashing, sh):根据目标或源IP地址的散列值分配请求,保证同一客户或同一目标总是访问同一台服务器。
四、LVS 的特点与优势
- 高性能:工作在四层,转发效率高,对服务器资源消耗小。
- 高可用性:可与Keepalived等工具结合,实现负载均衡器的故障转移。
- 可扩展性:可以透明地增加或减少真实服务器,以应对流量变化。
- 开源免费:作为Linux内核的一部分,无需额外付费。
- 适用性广:几乎可以为任何基于TCP/UDP的服务(如HTTP、HTTPS、FTP、DNS、数据库)做负载均衡。
五、LVS 的安装及使用
1.安装
bash
[root@lvs-server ~]# dnf install ipvsadm.x86_64 -y
2.lvs软件相关信息
-
程序包:ipvsadm
-
Unit File: ipvsadm.service
-
主程序:/usr/sbin/ipvsadm
-
规则保存工具:/usr/sbin/ipvsadm-save
-
规则重载工具:/usr/sbin/ipvsadm-restore
-
配置文件:/etc/sysconfig/ipvsadm-config
-
ipvs调度规则文件:/etc/sysconfig/ipvsadm
3.命令参数
bash
1.管理集群服务中的增删改
-A #添加
-E #修改
-t #tcp服务
-u #udp服务
-s #指定调度算法,默认为WLC
-p #设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一Realserver
-f #firewall mask 火墙标记,是一个数字
#增加
[root@DR-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@DR-server ~]# ipvsadm -A -f 66 -p 3000
#修改
[root@DR-server ~]# ipvsadm -E -t 172.25.254.100:80 -s wrr -p 3000
#删除
[root@DR-server ~]# ipvsadm -D -t 172.25.254.100:80
[root@DR-server ~]# ipvsadm -D -f 66
bash
2.管理集群中RealServer的曾增删改
-a #添加realserver
-e #更改realserver
-t #tcp协议
-u #udp协议
-f #火墙 标签
-r #realserver地址
-g #直连路由模式
-i #ipip隧道模式
-m #nat模式
-w #设定权重
-Z #清空计数器
-C #清空lvs策略
-L #查看lvs策略
-n #不做解析
--rate #输出速率信息
#添加
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.30 -m
[root@DR-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.40 -m -w 2
#更改
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -m -w 1
[root@DR-server ~]# ipvsadm -e -t 172.25.254.100:80 -r 192.168.0.30 -i -w 1
#删除
[root@DR-server ~]# ipvsadm -d -t 172.25.254.100:80 -r 192.168.0.30
4.lvs策略保存
bash
#创建策略
[root@lvs-server ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
[root@lvs-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
[root@lvs-server ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20 -m
#保存策略到/mnt/ipvsadm_save
[root@lvs-server ~]# ipvsadm-save
-A -t lvs-server:http -s rr
-a -t lvs-server:http -r 192.168.0.10:http -m -w 1
-a -t lvs-server:http -r 192.168.0.20:http -m -w 1
[root@lvs-server ~]# ipvsadm-save > /mnt/ipvsadm_save
#对策略进行清空
[root@lvs-server ~]# ipvsadm -C
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
#从保存的文件中重载策略
[root@lvs-server ~]# ipvsadm-restore < ipvsadm_save
5.配置ipvs策略开机生效
bash
#保存策略文件
[root@lvs-server ~]# ipvsadm-save > /etc/sysconfig/ipvsadm
#配置开机启动
[root@lvs-server ~]# systemctl enable --now ipvsadm.service
#重启
reboot
#重启后仍然生效
[root@lvs-server ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.100:80 rr
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0