LVS介绍与配置

1.概述

1.1LVS简介

LVS(Linux Virtual Server)是一款基于Linux内核的高性能负载均衡解决方案,通过将客户端请求智能分发至多台后端服务器,从而有效提升系统的并发处理能力、可扩展性与高可用性。目前,LVS已广泛应用于网站架构、数据库集群等高并发访问场景,是构建大规模分布式服务的重要基础设施之一。

1.2LVS架构

**IPVS(IP Virtual Server)**​

LVS的核心组件,运行在Linux内核空间,负责实现IP层的负载均衡功能。

**调度器(Director)**​

LVS的前端负载均衡节点,接收客户端请求,并根据预设的调度算法将其转发至后端的真实服务器。

**真实服务器(Real Server)**​

实际处理客户端请求的后端服务器,运行具体应用服务。

**虚拟IP(VIP)**​

对外暴露的IP地址,作为客户端访问的统一入口,由调度器统一管理和监控。

2. LVS工作模式

2.1 NAT模式(Network Address Translation)

工作原理

NAT模式下,负载均衡器(调度器)作为客户端与真实服务器之间的中间桥梁:接收客户端请求,根据调度算法转发至选定的真实服务器;后端服务器处理完成后,将响应数据回传至调度器,再由调度器统一返回给客户端。

调度器如邮递中转站,负责收集来自发件人的信件,分发至对应的收件地址,并将回信统一寄回给原发件人。

优缺点

优点:

  • 适用于私有网络环境,部署配置简单

  • 隐藏真实服务器的IP地址,提升后端节点的安全性

缺点:

  • 请求与响应流量均经过调度器,易形成性能瓶颈

  • 对调度器的带宽和处理能力要求较高

配置步骤

  1. 添加虚拟服务

  2. 添加真实服务器

  3. 设置真实服务器的网关地址

2.2 DR模式(Direct Routing)

工作原理

DR模式下,客户端请求经由负载均衡器转发至真实服务器,但真实服务器的响应数据直接返回给客户端,不再经过负载均衡器。

可以类比为快递调度中心(负载均衡器)负责将快递单(请求)分配给快递员(真实服务器),而快递员直接上门将快递(响应)送至客户手中,无需返回调度中心中转。

优缺点

优点:

  • 响应流量不经过调度器,大幅降低负载均衡器的压力

  • 并发处理能力强,适用于高流量、大规模分布式场景

缺点:

  • 网络配置相对复杂

  • 要求调度器与真实服务器处于同一物理网络(二层可达)

配置步骤

  1. 添加虚拟服务

  2. 添加真实服务器

  3. 配置真实服务器的回环接口(lo)并绑定虚拟IP

2.3 TUN模式(IP Tunneling)

工作原理

TUN模式下,负载均衡器通过IP隧道(如GRE隧道)将客户端请求封装并转发至真实服务器,真实服务器处理请求后,直接将响应数据返回给客户端,无需经过负载均衡器。

可以类比为通过地下专用通道(隧道)将信件送达远端目标地点,目标地点收件后直接将回信寄出,无需原路折返。

优缺点

优点:

  • 支持跨网络部署,负载均衡器与真实服务器可位于不同的物理网络中

  • 响应流量不经过调度器,性能较高

缺点:

  • 网络配置复杂,依赖隧道协议支持

  • 增加了网络管理和运维的复杂度

配置步骤

  1. 添加虚拟服务

  2. 添加真实服务器

  3. 配置真实服务器的隧道接口(tunl0)并绑定虚拟IP

3.LVS调度算法

**3.1 轮询(Round Robin)**​

简介:将请求按顺序依次循环分配给每个真实服务器。

工作原理:类似于轮流发牌,每台服务器轮流接收一个请求。

适用场景:适用于后端服务器处理能力相近、负载较均衡的场景。

**3.2 最小连接数(Least Connections)**​

简介:将请求分配给当前活动连接数最少的服务器。

工作原理:类似于优先选择最空闲的售货员接待顾客。

适用场景:适用于服务器处理请求时间差异较大的场景。

**3.3 加权轮询(Weighted Round Robin)**​

简介:根据服务器权重分配请求,权重越高,被分配到的请求越多。

工作原理:类似于根据员工能力分配任务,能力强者承担更多工作。

适用场景:适用于服务器性能差异明显的场景。

**3.4 加权最小连接数(Weighted Least Connections)**​

简介:在最小连接数基础上引入权重,优先将请求分配给连接数少且权重高的服务器。

工作原理:类似于在最空闲的售货员中优先选择经验更丰富的那位。

适用场景:适用于服务器性能和处理时间均存在较大差异的场景。

**3.5 目标地址散列(Destination Hashing)**​

简介:根据请求的目标IP地址计算哈希值,映射至对应服务器。

工作原理:类似于按邮政编码将邮件分发至对应的邮局。

适用场景:适用于需按目标地址固定分配请求的场景。

**3.6 源地址散列(Source Hashing)**​

简介:根据请求的源IP地址计算哈希值,映射至对应服务器。

工作原理:类似于按发件人地址将邮件分发至对应邮局。

适用场景:适用于需按客户端地址固定分配请求的场景。

4.LVS配置示例

4.1 NAT模式配置示例

|---------|------------------------------------------------|
| 节点 | IP |
| LVS | 192.168.200.170(VIP) 192.168.100.164(与真实服务器通信) |
| Nginx01 | 192.168.100.163 |
| Nginx02 | 192.168.100.162 |

需求 :LVS有2个网卡,一个为对外提供服务的网卡,网段为192.168.200.0/24,另一个是连接内部真实服务器的IP段192.168.100.0/24,现在要求配置LVS,使得客户端访问192.168.200.170:80,然后LVS会根据轮询策略来将请求转发到对应的Nginx服务器上。

4.1.1 安装LVS工具,开启内核转发模块
bash 复制代码
[root@lvs ~]# yum install ipvsadm -y
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward = 1
4.1.2 关闭所有节点的防火墙,selinux
bash 复制代码
# 所有节点执行这些命令
[root@lvs ~]# systemctl disable --now firewalld
[root@lvs ~]# setenforce 0
4.1.3 配置LVS
bash 复制代码
# 1. 添加虚拟服务
[root@lvs ~]# ipvsadm -A -t 192.168.200.170:80 -s rr
# 2. 添加真实服务器
[root@lvs ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.163:80 -m 
[root@lvs ~]# ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.162:80 -m
# 查看
[root@lvs ~]# 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.200.170:80 rr
  -> 192.168.100.162:80           Masq    1      0          0         
  -> 192.168.100.163:80           Masq    1      0          0 

LVS配置参数详解


第一步:添加虚拟服务

参数 说明
-A 添加一个虚拟服务(Virtual Service),即创建一个负载均衡入口
-t 指定协议为TCP,后面跟 VIP:端口(如 192.168.200.170:80),对外服务入口;若为UDP协议则用 -u
-s 指定调度算法,rr表示轮询(Round Robin),其他常见算法如 wrrlcwlc

示例

复制代码
ipvsadm -A -t 192.168.200.170:80 -s rr

创建一个TCP虚拟服务,VIP为 192.168.200.170,端口 80,采用轮询调度算法。


第二步:添加真实服务器

参数 说明
**-a**​ 添加一个真实服务器(Real Server)到已存在的虚拟服务中
**-t**​ 指定所属的虚拟服务,相当于"服务名",需与 -A中的 -t保持一致
**-r**​ 指定真实服务器的地址+端口(如 192.168.100.10:80
**-m**​ 指定转发模式为 NAT模式(Network Address Translation)
**-i**​ 指定转发模式为 TUN模式(IP隧道)
**-g**​ 指定转发模式为 DR模式(直接路由)

示例

bash 复制代码
ipvsadm -a -t 192.168.200.170:80 -r 192.168.100.10:80 -m

→ 为虚拟服务 192.168.200.170:80添加一台真实服务器 192.168.100.10:80,转发模式为 NAT。


常用模式对照表

模式 参数 响应路径 适用场景
NAT -m 响应经LVS返回 内网架构简单,调度器易成瓶颈
DR -g 响应直接回客户端 高性能,需同物理网络
TUN -i 响应直接回客户端 跨网络,需隧道支持

4.1.4 配置nginx

将2个nginx的index.html文件改为hello,nginx01hello nginx02

bash 复制代码
# 第一台nginx
[root@nginx01 ~]# echo "hello nginx01" > /usr/share/nginx/html/index.html
# 第二台nginx
[root@nginx02 ~]# echo "hello nginx02" > /usr/share/nginx/html/index.html

这样我们的Nginx就配置好了,但是你现在使用客户端去访问192.168.200.170这个地址的话是出不来的,我们还需要给nginx配置网关,网关指向LVS的192.168.100.164这个地址。

4.1.5 配置网关
bash 复制代码
[root@nginx02 ~]# ip route add default via 192.168.100.100 dev ens33
[root@nginx03 ~]# ip route add default via 192.168.100.100 dev ens33
4.1.6 访问集群
bash 复制代码
C:\Users\149>curl 192.168.200.170
hello nginx01
 
C:\Users\149>curl 192.168.200.170
hello nginx02
 
C:\Users\149>curl 192.168.200.170
hello nginx01
 
C:\Users\149>curl 192.168.200.170
hello nginx02

这里NAT模式就配置结束了。

4.2 DR模式配置实例

节点 IP 网卡模式
LVS 192.168.200.170 192.168.200.200(VIP) NAT模式
Nginx01 192.168.200.171 192.168.200.200(VIP) NAT模式
Nginx02 192.168.200.172 192.168.200.200(VIP) NAT模式
4.2.1 配置VIP

首先每个节点都要配置一个VIP

bash 复制代码
[root@lvs ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
 
[root@nginx01 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes
 
[root@nginx02 ~]# nmcli connection add type dummy ifname dummy02 con-name dummy02 ipv4.method manual ipv4.addresses 192.168.200.200/32 autoconnect yes

这个dummy就是一个本地的环回口,所有的节点的这个地址都配置的相同,因为这是个本地环回口,不会产生IP冲突,就像你的电脑的127.0.0.1一样,所以不用担心IP冲突

4.2.2 修改内核参数
bash 复制代码
# 开启IP转发
[root@lvs ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
[root@lvs ~]# sysctl -p
net.ipv4.ip_forward=1

接下来修改后端Nginx的内核,以下操作在RS(真实服务器)上,每个RS都要做。

bash 复制代码
[root@nginx01 02 ~]# vim /etc/sysctl.conf
net.ipv4.conf.dummy02.arp_ignore = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy02.arp_announce = 2

**net.ipv4.conf.dummy02.arp_ignore = 1**​

作用:当接收到ARP请求时,若目标IP地址不属于该网卡的本地地址,则不予以响应。

通俗解释 :让 dummy02网卡仅回应那些明确指向其自身IP地址的ARP请求,避免无效应答,减少网络干扰。

**net.ipv4.conf.all.arp_ignore = 1**​

作用:全局参数,作用于系统中所有网络接口。所有网卡均遵循"只响应目标IP为本网卡地址"的策略。

通俗解释:让整个系统只对发给自己IP的ARP请求作出应答,提升ARP通信的精准度与网络安全性。

**net.ipv4.conf.all.arp_announce = 2**​

作用 :全局参数,控制系统发送ARP请求时对源IP地址的选择策略。设置为 2表示强制使用与目标处于同一子网的最匹配本地IP地址。

通俗解释:避免系统用"错误"的源IP发送ARP请求,有效降低IP冲突风险,提高路由准确性。

**net.ipv4.conf.dummy02.arp_announce = 2**​

作用 :仅作用于 dummy02网卡,策略与全局 arp_announce = 2一致,限制该网卡发送ARP请求时也使用最匹配子网的源IP地址。

通俗解释 :让 dummy02网卡在发起ARP通信时选择更精准的源IP,从而减少地址冲突,优化网络稳定性。

4.2.3 配置LVS
bash 复制代码
[root@lvs ~]# ipvsadm -A -t 192.168.200.200:80 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.171:80 -g
[root@lvs ~]# ipvsadm -a -t 192.168.200.200:80 -r 192.168.200.172:80 -g
4.2.4 客户端验证
bash 复制代码
C:\Users\149>curl 192.168.200.200
hello nginx01
 
C:\Users\149>curl 192.168.200.200
hello nginx02
 
C:\Users\149>curl 192.168.200.200
hello nginx01
 
C:\Users\149>curl 192.168.200.200
hello nginx02

4.3 配置永久生效

bash 复制代码
[root@lvs ~]# ipvsadm --save  > /etc/sysconfig/ipvsadm
[root@lvs ~]# cat /etc/sysconfig/ipvsadm
-A -t oe01:http -s rr
-a -t oe01:http -r 192.168.200.171:http -g -w 1
-a -t oe01:http -r 192.168.200.172:http -g -w 1
[root@lvs ~]# systemctl enable --now ipvsadm
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
相关推荐
奇特認5 小时前
LVS(Linux virual server)四层负载均衡实验
linux·运维·lvs
cyber_两只龙宝5 小时前
Keepalived+LVS--实现IPVS的高可用+高性能的双主双业务架构详细配置流程及解析
linux·运维·集群·lvs·高性能·keepalived·高可用
xmlhcxr6 小时前
LVS(Linux virual server)
linux·运维·lvs
Forget_85501 天前
RHEL——LVS模式
java·开发语言·lvs
小李独爱秋1 天前
模拟面试:lvs常见的工作模式有哪些?各有什么特点?
linux·运维·面试·职场和发展·操作系统·职场发展·lvs
SakitamaX3 天前
LVS(Linux virual server)介绍与实验
linux·运维·lvs
之歆5 天前
LVS 负载均衡完全指南
运维·负载均衡·lvs
feng68_6 天前
LVS(linuxvirtualserver)
运维·服务器·lvs
feng68_6 天前
抓包理解LVS中的DR模式
服务器·网络·lvs