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地址,提升后端节点的安全性
缺点:
-
请求与响应流量均经过调度器,易形成性能瓶颈
-
对调度器的带宽和处理能力要求较高
配置步骤
-
添加虚拟服务
-
添加真实服务器
-
设置真实服务器的网关地址
2.2 DR模式(Direct Routing)
工作原理
DR模式下,客户端请求经由负载均衡器转发至真实服务器,但真实服务器的响应数据直接返回给客户端,不再经过负载均衡器。
可以类比为快递调度中心(负载均衡器)负责将快递单(请求)分配给快递员(真实服务器),而快递员直接上门将快递(响应)送至客户手中,无需返回调度中心中转。
优缺点
优点:
-
响应流量不经过调度器,大幅降低负载均衡器的压力
-
并发处理能力强,适用于高流量、大规模分布式场景
缺点:
-
网络配置相对复杂
-
要求调度器与真实服务器处于同一物理网络(二层可达)
配置步骤
-
添加虚拟服务
-
添加真实服务器
-
配置真实服务器的回环接口(lo)并绑定虚拟IP
2.3 TUN模式(IP Tunneling)
工作原理
TUN模式下,负载均衡器通过IP隧道(如GRE隧道)将客户端请求封装并转发至真实服务器,真实服务器处理请求后,直接将响应数据返回给客户端,无需经过负载均衡器。
可以类比为通过地下专用通道(隧道)将信件送达远端目标地点,目标地点收件后直接将回信寄出,无需原路折返。
优缺点
优点:
-
支持跨网络部署,负载均衡器与真实服务器可位于不同的物理网络中
-
响应流量不经过调度器,性能较高
缺点:
-
网络配置复杂,依赖隧道协议支持
-
增加了网络管理和运维的复杂度
配置步骤
-
添加虚拟服务
-
添加真实服务器
-
配置真实服务器的隧道接口(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),其他常见算法如 wrr、lc、wlc等 |
示例
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,nginx01和hello 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.