一、LVS简介
LVS(Linux Virtual Server,Linux 虚拟服务器)是 Linux 内核原生的高性能四层(IP 层 / TCP/UDP 层)负载均衡方案,专为构建高可用、高并发的服务器集群设计。
1.1 核心定位与起源
- 本质:内核级 IP 负载均衡器,将用户请求按策略分发到后端多台真实服务器(Real Server, RS),对外表现为单一虚拟 IP(VIP)。
- 开发者:章文嵩博士,1998 年发起开源项目,自 Linux 2.4.24 起成为内核标准模块。
- 优势 :性能极高、开销极低、免费开源、Linux 原生,适合大规模流量场景。
1.2 核心架构(三层模型)
- 负载调度器(Director Server)
- 集群入口,持有VIP(Virtual IP),接收用户请求。
- 持有DIP(Director IP),用于与后端服务器通信。
- 核心:按调度算法转发请求、健康检查、故障屏蔽。
- 服务器池(Server Pool)
- 实际处理业务的真实服务器(RS),使用RIP(Real IP)。
- 所有 RS 提供相同服务(如 Web、DB),保证一致性。
- 共享存储(Shared Storage)
- 为 RS 提供统一数据存储,确保数据一致(如 NFS、分布式存储)。
1.3 关键术语
- VIP:对外服务的虚拟 IP,用户唯一访问入口。
- DIP:调度器内网 IP,用于与 RS 通信。
- RIP:后端真实服务器 IP,集群内部通信。
- CIP:客户端 IP 地址。
1.4 三种核心工作模式(转发机制)
1. NAT 模式(网络地址转换)
- 原理:调度器修改请求的目标 IP(VIP→RIP);响应时修改源 IP(RIP→VIP),所有流量经调度器。
- 特点:配置简单、支持跨网段;调度器易成瓶颈、带宽压力大。
- 适用:小规模集群、测试环境。
2. DR 模式(直接路由,最常用)
- 原理 :调度器仅修改数据包MAC 地址(目标为 RS 的 MAC),不修改 IP;RS 直接用 VIP 响应客户端,流量不回调度器。
- 特点 :性能最高、吞吐量最大;要求调度器与 RS 在同一物理网段。
- 适用:大规模高并发场景(如 Web 服务)。
3. TUN 模式(IP 隧道)
- 原理:调度器将请求封装在新 IP 包中,隧道转发给 RS;RS 解封装后直接响应客户端。
- 特点:支持跨地域、跨网段部署;有隧道封装开销。
- 适用:异地多活、跨机房集群。
1.5 常用调度算法(负载分配策略)
- 轮询(Round Robin, rr):按顺序轮流分发。
- 加权轮询(Weighted RR, wrr):按权重比例分发(性能强的 RS 权重高)。
- 最少连接(Least Connections, lc):发给当前连接数最少的 RS。
- 加权最少连接(WLC):结合权重的最少连接。
- 源地址哈希(SH):同一客户端 IP 始终转发到同一 RS(会话保持)。
- 目标地址哈希(DH):按目标 IP 哈希分发。
1.6 核心特性
- 四层负载均衡:工作在 IP/TCP 层,不解析应用层内容,性能远超七层(如 Nginx、HAProxy)。
- 内核级实现 :基于
ipvs内核模块,处理效率极高、资源占用极低。 - 高可用 :配合
Keepalived实现主备切换,VIP 漂移,无单点故障。 - 透明性:用户仅感知 VIP,无需修改客户端 / 服务端代码。
- 可扩展:可动态增删 RS,水平扩展集群能力。
1.7 适用场景 vs 不适用场景
✅ 适合用 LVS
- 追求极致性能、高并发、低延迟的四层转发。
- 大规模 Web、API、数据库、缓存等服务集群。
- Linux 环境、预算有限、需要内核级负载均衡。
❌ 不适合用 LVS
- 需要七层功能:SSL 卸载、URL 路由、内容缓存、请求改写。
- 复杂健康检查、会话保持、流量染色、灰度发布。
- 非 Linux 环境、需要图形化管理界面。
1.8 与七层负载均衡(Nginx/HAProxy)对比
| 特性 | LVS(四层) | Nginx/HAProxy(七层) |
|---|---|---|
| 工作层次 | IP/TCP 层 | HTTP / 应用层 |
| 性能 | 极高(内核级) | 较高(用户态) |
| 功能 | 仅转发 | 丰富(路由、缓存、SSL 等) |
| 配置复杂度 | 中(网络配置多) | 低(应用层配置) |
| 适用 | 大规模流量转发 | 应用层精细化控制 |
LVS 是构建高性能 Linux 集群的基石,DR 模式 + 加权最少连接 + Keepalived是生产环境最经典组合。
二、nat模式
2.1 nat模式原理
|-----|-----------------------------------------------------|----------------------------------------|---------------|
| 节点 | 网卡配置 | IP配置 | 网关 |
| VS | NAT模式( DIP:172.25.254.100) 仅主机模式(VIP:192.168.0.100) | 172.25.254.100(NAT) 192.168.0.100(仅主机) | |
| RS1 | 仅主机模式 | 192.168.0.10 | 192.168.0.100 |
| RS2 | 仅主机模式 | 192.168.0.20 | 192.168.0.100 |
2.2 nat模式实验环境搭建
VS主机中
bash
[root@vsnode ~]# vmset.sh eth0 172.25.254.100 vsnode
[root@vsnode ~]# vmset.sh eth1 192.168.0.100 vsnode noroute
RS1

RS2

测试:

2.3 nat模式实现过程
规则持久化:
利用自定义文件进行持久化

利用守护进程进行规则持久化

3.1 DR模式原理
环境搭建

router:

vsnode:



测试:

client:


RS1+RS2:
bash
[root@RS1 ~]# vmset.sh eth0 192.168.0.10 RS1 noroute
[root@RS1 ~]# nmcli connection modify eth0 ipv4.gateway 192.168.0.100
[root@RS1 ~]# nmcli connection reload
[root@RS1 ~]# nmcli connection up eth0
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.100 0.0.0.0 UG 100 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
#在lo上设定vip
[root@RS1 ~]# cd /etc/NetworkManager/system-connections/
[root@RS1 system-connections]# cp -p eth0.nmconnection lo.nmconnection
[root@RS1 system-connections]# vim lo.nmconnection
[connection]
id=lo
type=loopback
interface-name=lo
[ethernet]
[ipv4]
address1=127.0.0.1/8
address2=192.168.0.200/32
method=manual
[root@RS1 system-connections]# nmcli connection reload
[root@RS1 system-connections]# nmcli connection up lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@RS1 system-connections]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.0.200/32 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
bash
#arp禁止响应
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
测试:

