目录
- [CentOS、Ubuntu 等发行版与 LVS](#CentOS、Ubuntu 等发行版与 LVS)
- [Linux 集群基础概念](#Linux 集群基础概念)
- [LVS 简介与组成](#LVS 简介与组成)
- [LVS 三种类型详解](#LVS 三种类型详解)
- [LVS 调度算法](#LVS 调度算法)
- [ipvsadm 命令详解](#ipvsadm 命令详解)
- [LVS-NAT 模型配置](#LVS-NAT 模型配置)
- [LVS-DR 模型配置](#LVS-DR 模型配置)
- [LVS-TUN 模型配置](#LVS-TUN 模型配置)
- [ARP 问题解决](#ARP 问题解决)
- [LVS 持久连接](#LVS 持久连接)
- 后端服务健康检查
📌 核心概念一览
| 主题 | 核心概念 | 一句话 |
|---|---|---|
| 集群类型 | LB、HA、HP | LB 提升并发、HA 提升可用性、HP 提升计算能力 |
| LVS 类型 | NAT、DR、TUN | NAT 地址转换、DR 直接路由、TUN 隧道 |
| 调度算法 | 静态(rr/wrr/sh/dh)、动态(lc/wlc/sed/nq) | 静态固定规则、动态根据负载 |
| ipvsadm | 管理集群服务、管理 RS、查看规则 | 用户空间工具,与内核 ipvs 交互 |
| 持久连接 | PPC、PCC、PNMPP | 同一客户端请求定向到同一 RS |
| ARP 问题 | arp_ignore、arp_announce | DR/TUN 模式下避免 VIP 冲突 |
| 健康检查 | 脚本监控、自动添加/删除 RS | LVS 本身无健康检查,需脚本实现 |
CentOS、Ubuntu 等发行版与 LVS 🐧
包名与安装
| 项目 | CentOS / RHEL | Ubuntu / Debian |
|---|---|---|
| ipvsadm 包 | ipvsadm | ipvsadm |
| 安装命令 | yum install ipvsadm -y | apt install ipvsadm -y |
| 内核模块 | ip_vs(2.6+ 内核自带) | ip_vs(2.6+ 内核自带) |
| 配置文件 | /etc/sysconfig/ipvsadm | /etc/default/ipvsadm |
| 服务管理 | service ipvsadm start/stop | systemctl start/stop ipvsadm |
内核支持检查
bash
# 检查内核是否支持 ipvs
grep -i 'ip_vs' /boot/config-$(uname -r)
# 查看已加载的 ipvs 模块
lsmod | grep ip_vs
# 手动加载 ipvs 模块
modprobe ip_vs
使用场景与发行版选择
| 场景 | 建议 | 说明 |
|---|---|---|
| 企业/生产 | CentOS/RHEL 或 Ubuntu LTS | 长期支持、稳定性好、文档丰富 |
| 高并发 Web | 两者均可,配合 Nginx/HAProxy | LVS 四层 + Nginx 七层组合 |
| 内网服务 | CentOS 更常见 | 企业内网多用 RHEL 系 |
生活例子:LVS 像"交通指挥中心"------CentOS 是"老牌交警队"(企业常用),Ubuntu 是"新式智能交通系统"(社区活跃),都能指挥车流(请求分发),只是管理方式略有不同。
Linux 集群基础概念 🏢
集群分类
🏢 Linux 集群
⚖️ LB
负载均衡
🔄 HA
高可用
⚡ HP/HPC
高性能计算
提升并发处理能力
提升在线时间
99.9%/99.99%
提升计算能力
分布式计算
集群类型对比
| 类型 | 英文 | 目标 | 典型应用 | 关注指标 |
|---|---|---|---|---|
| 负载均衡 | Load Balancing (LB) | 提升并发处理能力 | LVS、HAProxy、Nginx | 并发连接数、吞吐量 |
| 高可用 | High Availability (HA) | 提升服务可用性 | Heartbeat、Keepalived、RHCS | 在线时间百分比(99.9%) |
| 高性能计算 | High Performance (HP/HPC) | 提升计算能力 | Hadoop、MPI、向量机 | 计算速度、并行效率 |
生活例子:
- LB 像"银行多开几个窗口"------提升服务能力,减少排队
- HA 像"备用发电机"------主电源断了,备用立即接管
- HP 像"多人协作搬砖"------把大任务拆成小任务,并行处理
为什么需要集群?
Scale Up(向上扩展)vs Scale Out(向外扩展)
| 对比项 | Scale Up(向上) | Scale Out(向外) |
|---|---|---|
| 方式 | 升级单机硬件(CPU、内存) | 增加服务器数量 |
| 成本 | 高(硬件价格非线性增长) | 相对低(廉价服务器) |
| 扩展性 | 有上限 | 理论无限 |
| 可用性 | 单点故障风险 | 分布式,容错性好 |
| 典型 | 4GB→16GB、2CPU→8CPU | 1 台→10 台 |
示例场景:
假设一个 LAMP 网站:
- 200 并发,每个请求 10MB 内存
- 需要:200 × 10MB = 2GB + 500MB(系统)= 2.5GB
- 如果增长到 1000 并发:
- Scale Up:升级到 16GB 内存、8 CPU(成本高)
- Scale Out:增加 4 台 4GB 服务器 + LVS(成本低、可靠)
LVS 简介与组成 🔧
LVS 是什么?
LVS (Linux Virtual Server,Linux 虚拟服务器)是由章文嵩博士于 1998 年创建的开源项目,是一个四层负载均衡 软件,工作在 TCP/IP 协议栈的传输层。
LVS 架构
👤 Client
客户端
🌐 VIP
虚拟 IP
📡 Director
调度器
ipvs + ipvsadm
🖥️ Real Server 1
RIP1
🖥️ Real Server 2
RIP2
🖥️ Real Server 3
RIP3
💾 共享存储
NFS/Samba
LVS 组成部分
| 组件 | 位置 | 作用 | 说明 |
|---|---|---|---|
| ipvs | 内核空间 | 负载均衡核心模块 | 工作在 INPUT 链,2.6+ 内核自带 |
| ipvsadm | 用户空间 | 管理工具 | 定义集群服务、RS、调度算法 |
对比:ipvs 与 iptables
| 对比项 | ipvs | iptables |
|---|---|---|
| 工作层 | 四层(传输层) | 二到七层 |
| 工作链 | INPUT | PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING |
| 性能 | 极高(内核级) | 较高 |
| 冲突 | 与 iptables INPUT 链冲突 | - |
| 用途 | 负载均衡 | 防火墙、NAT |
生活例子:ipvs 像"高速公路收费站"(四层,只看车牌分流),iptables 像"城市红绿灯"(全层,可以看车型、乘客等详细信息)。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| LVS | Linux Virtual Server,Linux 虚拟服务器 | 像"虚拟总机",把电话转接给不同部门 |
| Director | 调度器,负责分发请求 | 像"交通指挥中心",指挥车辆去不同路线 |
| Real Server (RS) | 真实服务器,提供实际服务 | 像"餐厅后厨",真正做菜的地方 |
| VIP | Virtual IP,虚拟 IP,客户端访问的地址 | 像"餐厅门牌号",客户只知道这个地址 |
| DIP | Director IP,调度器内网 IP | 像"后厨经理的内部电话" |
| RIP | Real Server IP,真实服务器 IP | 像"各个厨师的内部工号" |
| CIP | Client IP,客户端 IP | 像"顾客的座位号" |
LVS 三种类型详解 🔀
类型概览
🔀 LVS 类型
🔄 NAT
Network Address Translation
➡️ DR
Direct Routing
🚇 TUN
IP Tunneling
地址转换
类似 DNAT
直接路由
修改 MAC
IP 隧道
封装 IP
三种类型对比
| 对比项 | NAT | DR | TUN |
|---|---|---|---|
| 网络要求 | Director 与 RS 同一 IP 网络 | Director 与 RS 同一物理网络 | RS 可跨 Internet |
| RIP 地址 | 私有地址 | 可用公网地址 | 必须公网地址 |
| Director 角色 | 处理进出所有通信 | 仅处理入站请求 | 仅处理入站请求 |
| RS 网关 | 必须指向 DIP | 不能指向 DIP | 不能指向 DIP |
| 端口映射 | 支持 | 不支持 | 不支持 |
| RS 操作系统 | 任意 OS | 大多数 OS | 必须支持隧道 |
| 性能 | Director 易成瓶颈 | 高性能 | 高性能 |
| 响应路径 | 经过 Director | 直接返回客户端 | 直接返回客户端 |
| 配置复杂度 | 简单 | 中等(需配置 ARP) | 复杂(需隧道支持) |
| 默认模式 | - | ✓(LVS 默认) | - |
生活例子:
- NAT 像"代购"------你把钱给代购,代购去买东西再转交给你(进出都经过代购)
- DR 像"外卖配送"------餐厅接单后,外卖员直接把餐送到你家(响应不经过平台)
- TUN 像"国际快递"------包裹套多层包装(隧道),可以跨国运输
LVS-NAT 模型详解 🔄

NAT 工作原理
🖥️ Real Server RIP 📡 Director VIP/DIP 👤 Client CIP 🖥️ Real Server RIP 📡 Director VIP/DIP 👤 Client CIP 1️⃣ 客户端请求 2️⃣ Director 修改 DST: VIP → RIP SRC: CIP → DIP 3️⃣ RS 处理请求 4️⃣ Director 修改 SRC: RIP → VIP DST: DIP → CIP SRC: CIP DST: VIP SRC: DIP DST: RIP SRC: RIP DST: DIP SRC: VIP DST: CIP
NAT 模型特点
优点:
- ✅ 配置简单,RS 可用任意 OS
- ✅ 支持端口映射(VIP:80 → RIP:8080)
- ✅ RIP 可用私有地址,节省公网 IP
缺点:
- ❌ Director 处理进出所有流量,易成瓶颈
- ❌ RS 必须将网关指向 DIP
- ❌ 大规模场景性能受限
NAT 配置示例
网络拓扑:
Client: 192.168.0.253
↓
Director:
VIP (eth0:0): 192.168.0.220
DIP (eth1): 10.10.10.1
↓
Real Servers:
RS1: 10.10.10.11 (gateway: 10.10.10.1)
RS2: 10.10.10.22 (gateway: 10.10.10.1)
Director 配置:
bash
#!/bin/bash
# LVS-NAT Director 配置脚本
VIP=192.168.0.220
DIP=10.10.10.1
RIP1=10.10.10.11
RIP2=10.10.10.22
# 1. 配置 VIP
ifconfig eth0:0 $VIP netmask 255.255.255.0 up
# 2. 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 3. 清空 iptables 和 ipvs 规则
iptables -F
iptables -Z
ipvsadm -C
# 4. 添加集群服务(使用 rr 轮询算法)
ipvsadm -A -t $VIP:80 -s rr
# 5. 添加 Real Servers(-m 表示 NAT 模式)
ipvsadm -a -t $VIP:80 -r $RIP1:80 -m -w 1
ipvsadm -a -t $VIP:80 -r $RIP2:80 -m -w 1
# 6. 查看配置
ipvsadm -L -n
Real Server 配置:
bash
# RS1 配置
ifconfig eth0 10.10.10.11 netmask 255.255.255.0
route add default gw 10.10.10.1 # 网关指向 DIP
# 启动 Web 服务
yum install httpd -y
echo "RS1 - 10.10.10.11" > /var/www/html/index.html
service httpd start
# RS2 配置类似,IP 改为 10.10.10.22
NAT 模式端口映射
bash
# VIP:80 映射到 RS:8080
ipvsadm -a -t 192.168.0.220:80 -r 10.10.10.11:8080 -m
生活例子:NAT 像"公司前台"------所有访客(请求)都要通过前台登记(修改地址),离开时也要通过前台(修改回原地址),前台工作量大,容易成为瓶颈。
LVS-DR 模型详解 ➡️
DR 工作原理
🖥️ Real Server RIP/RMAC VIP(lo:0) 📡 Director VIP/DMAC 👤 Client CIP/CMAC 🖥️ Real Server RIP/RMAC VIP(lo:0) 📡 Director VIP/DMAC 👤 Client CIP/CMAC 1️⃣ 客户端请求 2️⃣ Director 仅修改 MAC DST MAC: DMAC → RMAC IP 不变 3️⃣ RS 直接响应客户端 SRC: CIP/CMAC DST: VIP/DMAC SRC: CIP/CMAC DST: VIP/RMAC SRC: VIP/RMAC DST: CIP/CMAC
DR 模型特点
优点:
- ✅ 性能极高,Director 仅处理入站请求
- ✅ 响应直接返回客户端,不经过 Director
- ✅ RIP 可用公网地址,便于远程管理
- ✅ 支持大规模应用场景
缺点:
- ❌ Director 与 RS 必须在同一物理网络
- ❌ 不支持端口映射
- ❌ 需要解决 ARP 问题(配置复杂)
DR 配置示例
网络拓扑:
Client: 192.168.1.253
↓
Director:
DIP (eth0): 192.168.1.215
VIP (eth0:0): 192.168.1.88
↓
Real Servers (同一网络):
RS1: 192.168.1.11 (VIP on lo:0)
RS2: 192.168.1.12 (VIP on lo:0)
Director 配置:
bash
#!/bin/bash
# LVS-DR Director 配置脚本
VIP=192.168.1.88
RIP1=192.168.1.11
RIP2=192.168.1.12
# 1. 配置 VIP(广播地址设为 VIP 自己)
ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
route add -host $VIP dev eth0:0
# 2. 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 3. 禁止发送 ICMP 重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
# 4. 清空规则
iptables -F
ipvsadm -C
# 5. 添加集群服务
ipvsadm -A -t $VIP:80 -s wlc
# 6. 添加 Real Servers(-g 表示 DR 模式)
ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
# 7. 保存配置
service ipvsadm save
chkconfig ipvsadm on
Real Server 配置:
bash
#!/bin/bash
# LVS-DR Real Server 配置脚本
VIP=192.168.1.88
# 1. 配置 VIP 在 lo:0(环回接口)
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
route add -host $VIP dev lo:0
# 2. 配置 ARP 参数(关键!)
# arp_ignore=1: 只响应目标 IP 是本接口的 ARP 请求
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
# arp_announce=2: 只通告本接口的 IP
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 3. 启动 Web 服务
yum install httpd -y
echo "RS1 - 192.168.1.11" > /var/www/html/index.html
service httpd start
为什么 DR 模式需要配置 ARP?
问题:Director 和所有 RS 都配置了 VIP,当客户端发送 ARP 请求询问 VIP 的 MAC 地址时,如果 RS 响应了,客户端会直接连接 RS,绕过 Director,导致负载均衡失效。
解决:
- RS 上配置
arp_ignore=1:只响应发送到本接口 IP 的 ARP 请求 - RS 上配置
arp_announce=2:只通告本接口的 IP 地址
未配置
已配置 ARP
❓ ARP 问题
Director 和 RS 都有 VIP
客户端 ARP 请求 VIP
谁响应?
RS 可能响应
❌ 绕过 Director
只有 Director 响应
✅ 正常工作
生活例子:DR 模式像"外卖平台"------平台(Director)接单后,把订单信息(修改 MAC)告诉餐厅(RS),餐厅直接把餐送到顾客家,不用再经过平台。ARP 配置就像"只有平台能接电话",餐厅不能直接接顾客电话。
ARP 问题解决 📡
ARP 参数详解
arp_ignore(定义接收 ARP 请求时的响应级别)
| 级别 | 行为 | 说明 |
|---|---|---|
| 0 | 响应所有 IP 的 ARP 请求 | 默认值,只要本机有该 IP 就响应 |
| 1 | 只响应目标 IP 在本接口上的 ARP 请求 | 推荐用于 LVS-DR/TUN |
| 2 | 只响应目标 IP 和源 IP 在同一子网的请求 | 更严格 |
| 8 | 不响应任何 ARP 请求 | 完全禁用 |
arp_announce(定义发送 ARP 通告时的通告级别)
| 级别 | 行为 | 说明 |
|---|---|---|
| 0 | 通告所有接口的所有 IP | 默认值 |
| 1 | 尽量避免通告非本接口的 IP | 折中 |
| 2 | 只通告本接口的 IP | 推荐用于 LVS-DR/TUN |

ARP 配置对比
| 场景 | arp_ignore | arp_announce | 说明 |
|---|---|---|---|
| LVS-DR RS | 1 | 2 | VIP 在 lo:0,只响应/通告本接口 |
| LVS-TUN RS | 1 | 2 | VIP 在 tunl0,同 DR |
| 普通服务器 | 0 | 0 | 默认值,无需修改 |
配置示例
bash
# 临时配置(重启失效)
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
# 永久配置(写入 /etc/sysctl.conf)
cat >> /etc/sysctl.conf << EOF
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
EOF
# 使配置生效
sysctl -p
生活例子 :ARP 配置像"门禁系统"------
arp_ignore=1是"只给自己房间的门铃响应",arp_announce=2是"只告诉别人自己房间的门牌号",避免串门。
LVS 调度算法 ⚖️
算法分类
⚖️ LVS 调度算法
📊 静态算法
固定规则
📈 动态算法
根据负载
rr 轮询
wrr 加权轮询
sh 源地址 hash
dh 目标地址 hash
lc 最少连接
wlc 加权最少连接
sed 最短期望延迟
nq 永不排队
lblc 基于局部性最少连接
lblcr 带复制的 lblc
静态调度算法
| 算法 | 全称 | 原理 | 适用场景 |
|---|---|---|---|
| rr | Round Robin | 轮流分配,不考虑服务器负载 | 服务器性能相近 |
| wrr | Weighted Round Robin | 按权重轮流分配 | 服务器性能不同 |
| sh | Source Hashing | 根据源 IP hash 分配 | Session 会话绑定 |
| dh | Destination Hashing | 根据目标 IP hash 分配 | 缓存服务器 |
静态算法特点:
- ✅ 简单高效,无需记录连接状态
- ❌ 不考虑服务器当前负载
- ❌ 可能导致负载不均
动态调度算法
| 算法 | 全称 | 计算公式 | 说明 |
|---|---|---|---|
| lc | Least Connection | active×256 + inactive | 最小者胜出 |
| wlc | Weighted Least Connection | (active×256 + inactive) / weight | 加权最少连接(默认) |
| sed | Shortest Expected Delay | (active+1)×256 / weight | 最短期望延迟 |
| nq | Never Queue | 改进的 sed | 有空闲直接分配,无需计算 |
| lblc | Locality-Based Least Connections | dh + lc | 针对目标 IP 的负载均衡(Cache) |
| lblcr | LBLC with Replication | lblc + 复制 | 维护目标 IP 到服务器组的映射 |
动态算法特点:
- ✅ 根据服务器当前负载动态调整
- ✅ 负载均衡效果更好
- ❌ 需要维护连接状态,开销稍大
调度算法对比
| 对比项 | 静态算法 | 动态算法 |
|---|---|---|
| 是否考虑负载 | 否 | 是 |
| 连接状态追踪 | 不需要 | 需要 |
| 性能开销 | 极小 | 稍大 |
| 负载均衡效果 | 一般 | 好 |
| 适用场景 | 服务器性能相近、请求处理时间相近 | 服务器性能不同、请求处理时间差异大 |
算法选择建议
相近
不同
是
否
是
否
选择调度算法
服务器性能
需要会话保持?
需要会话保持?
sh 源地址 hash
rr 轮询
sh + 持久连接
wlc 加权最少连接
(推荐)
生活例子:
- rr 像"排队取号"------不管你要办什么业务,按顺序来
- wrr 像"VIP 通道"------重要客户(权重高)优先处理
- lc 像"哪个窗口人少去哪个"------动态选择
- sh 像"专属客服"------同一个客户总是找同一个客服
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| active | 活动连接,正在传输数据的连接 | 像"正在通话的电话" |
| inactive | 非活动连接,已建立但暂无数据传输 | 像"保持通话但没说话" |
| weight | 权重,表示服务器处理能力 | 像"窗口数量",3 个窗口比 1 个窗口处理快 |
| session | 会话,一系列相关的请求 | 像"一次完整的购物流程" |
ipvsadm 命令详解 🛠️
命令结构
ipvsadm
管理集群服务
-A/-E/-D
管理 RS
-a/-e/-d
查看规则
-L/-l
规则管理
-C/-S/-R
管理集群服务
添加集群服务:
bash
# 格式
ipvsadm -A -t|u|f service-address [-s scheduler] [-p timeout]
# 参数说明
-A: 添加(Add)
-E: 修改(Edit)
-D: 删除(Delete)
-t: TCP 协议
-u: UDP 协议
-f: 防火墙标记(Firewall Mark)
-s: 调度算法(默认 wlc)
-p: 持久连接超时时间(秒,默认 300)
# 示例
ipvsadm -A -t 192.168.1.10:80 -s rr
ipvsadm -A -t 192.168.1.10:443 -s wlc -p 600
ipvsadm -A -f 10 -s wrr # 防火墙标记
修改集群服务:
bash
# 修改调度算法
ipvsadm -E -t 192.168.1.10:80 -s wrr
# 添加持久连接
ipvsadm -E -t 192.168.1.10:80 -s rr -p 600
删除集群服务:
bash
ipvsadm -D -t 192.168.1.10:80
管理 Real Server
添加 RS:
bash
# 格式
ipvsadm -a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
# 参数说明
-a: 添加 RS
-e: 修改 RS
-d: 删除 RS
-r: Real Server 地址
-g: DR 模式(Gateway,默认)
-i: TUN 模式(IPIP)
-m: NAT 模式(Masquerade)
-w: 权重(默认 1)
# 示例
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.11 -g -w 2
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.12 -g -w 1
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.13:8080 -m # NAT 端口映射
修改 RS:
bash
# 修改权重
ipvsadm -e -t 192.168.1.10:80 -r 192.168.1.11 -g -w 5
删除 RS:
bash
ipvsadm -d -t 192.168.1.10:80 -r 192.168.1.11
查看规则
bash
# 基本查看
ipvsadm -L -n
# 查看选项
-n: 数字格式显示 IP 和端口
-c: 显示当前连接
--stats: 显示统计信息(连接数、数据包数、字节数)
--rate: 显示速率信息
--timeout: 显示超时时间
--daemon: 显示守护进程状态
--sort: 排序显示
--persistent-conn: 显示持久连接
# 示例
ipvsadm -L -n --stats
ipvsadm -L -n --rate
ipvsadm -L -n -c # 查看当前连接
ipvsadm -L -n --timeout
规则管理
bash
# 清空所有规则
ipvsadm -C
# 保存规则
ipvsadm -S > /etc/sysconfig/ipvsadm
# 或
service ipvsadm save
# 恢复规则
ipvsadm -R < /etc/sysconfig/ipvsadm
# 或
service ipvsadm start
# 清零计数器
ipvsadm -Z
超时设置
bash
# 设置 TCP、TCP FIN、UDP 超时时间(秒)
ipvsadm --set tcp tcpfin udp
# 示例:设置 TCP 8 小时,TCP FIN 30 秒,UDP 10 分钟
ipvsadm --set 28800 30 600
# 查看超时设置
ipvsadm -L -n --timeout
常用命令组合
完整配置示例:
bash
# 1. 清空规则
ipvsadm -C
# 2. 添加集群服务
ipvsadm -A -t 192.168.1.10:80 -s wlc
# 3. 添加 RS
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.11 -g -w 2
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.12 -g -w 1
# 4. 查看配置
ipvsadm -L -n
# 5. 查看连接
ipvsadm -L -n -c
# 6. 查看统计
ipvsadm -L -n --stats
# 7. 保存配置
service ipvsadm save
ipvsadm 输出解读
bash
$ ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.10:80 wlc
-> 192.168.1.11:80 Route 2 5 10
-> 192.168.1.12:80 Route 1 3 5
| 字段 | 说明 |
|---|---|
| Prot | 协议(TCP/UDP) |
| LocalAddress:Port | VIP:PORT |
| Scheduler | 调度算法 |
| Forward | 转发方式(Route=DR, Masq=NAT, Tunnel=TUN) |
| Weight | 权重 |
| ActiveConn | 活动连接数 |
| InActConn | 非活动连接数 |
生活例子:ipvsadm 像"交通指挥系统的控制面板"------可以添加路线(集群服务)、指定路口(RS)、查看实时路况(连接状态)、保存配置(规则持久化)。
LVS 持久连接 🔗
什么是持久连接?
持久连接(Persistent Connection):无论使用什么调度算法,都能实现在一定时间内,将来自同一个客户端的请求派发至此前选定的 RS。
为什么需要持久连接?
❓ 为什么需要持久连接
Session 会话保持
SSL/TLS 连接
购物车/登录状态
用户登录信息
存储在单台服务器
SSL 握手开销大
需要保持连接
购物车数据
未做 Session 共享
典型场景:
- SSL/HTTPS:SSL 握手开销大,需要保持连接到同一 RS
- Session 未共享:用户登录信息、购物车等存储在单台服务器
- FTP:需要控制连接和数据连接到同一 RS
- 数据库连接:某些应用需要保持到同一数据库服务器
持久连接类型
| 类型 | 全称 | 说明 | 端口 |
|---|---|---|---|
| PPC | Persistent Port Connection | 持久端口连接,同一客户端访问同一服务(端口)定向到同一 RS | 指定端口 |
| PCC | Persistent Client Connection | 持久客户端连接,同一客户端的所有请求定向到同一 RS | 0(所有端口) |
| PNMPP | Persistent Netfilter Marked Packet Persistence | 持久防火墙标记连接,多个相关服务定向到同一 RS | 防火墙标记 |
PPC(持久端口连接)
特点:将来自同一客户端对同一集群服务的请求,始终定向至此前选定的 RS。
配置:
bash
# 添加持久连接(-p 600 表示 600 秒超时)
ipvsadm -A -t 192.168.1.10:80 -s rr -p 600
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.11 -g -w 2
ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.12 -g -w 1
注意:
- 持久连接期间,权重不起作用
- 超时后,新连接会重新调度
- 如果连接仍活跃,超时时间会重置为 2 分钟
生活例子:PPC 像"专属客服"------你打电话到客服中心(VIP:80),系统记住你,10 分钟内再打都是同一个客服接听。
PCC(持久客户端连接)
特点:将来自同一客户端对所有端口的请求,始终定向至此前选定的 RS。
配置:
bash
# 端口设为 0,表示所有端口
ipvsadm -A -t 192.168.1.10:0 -s rr -p 600
ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.11 -g -w 2
ipvsadm -a -t 192.168.1.10:0 -r 192.168.1.12 -g -w 1
注意:
- 所有端口的请求都会转发
- 无法区分不同服务
- 适用于客户端需要访问多个服务的场景
生活例子:PCC 像"家庭医生"------你去医院(VIP),无论看什么科(端口),都是同一个医生负责。
PNMPP(持久防火墙标记连接)
特点:将多个不同的服务(端口)标记为同一个集群服务,实现端口姻亲关系。

典型场景:HTTP(80)和 HTTPS(443)需要定向到同一 RS
配置:
bash
# 1. 在 PREROUTING 链打标记
iptables -t mangle -A PREROUTING -d 192.168.1.10 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 192.168.1.10 -i eth0 -p tcp --dport 443 -j MARK --set-mark 10
# 2. 使用防火墙标记定义集群服务
ipvsadm -A -f 10 -s rr -p 600
ipvsadm -a -f 10 -r 192.168.1.11 -g -w 2
ipvsadm -a -f 10 -r 192.168.1.12 -g -w 1
# 3. 查看持久连接
ipvsadm -L -n --persistent-conn
工作流程:
🖥️ RS 📡 Director ipvs 🔥 iptables PREROUTING 👤 Client 🖥️ RS 📡 Director ipvs 🔥 iptables PREROUTING 👤 Client 1️⃣ HTTP 请求 打标记 10 2️⃣ HTTPS 请求(同一客户端) 打标记 10 持久连接 仍转发到 RS1 DST: VIP:80 MARK: 10 转发到 RS1 DST: VIP:443 MARK: 10 转发到 RS1
生活例子:PNMPP 像"夫妻店"------你去买东西(HTTP)和退货(HTTPS),虽然是不同业务,但都是同一对夫妻接待你(同一 RS)。
持久连接对比
| 对比项 | PPC | PCC | PNMPP |
|---|---|---|---|
| 端口范围 | 单个端口 | 所有端口 | 指定多个端口 |
| 灵活性 | 低 | 低 | 高 |
| 配置复杂度 | 简单 | 简单 | 中等(需 iptables) |
| 典型场景 | 单一服务 | 多服务访问 | 相关服务(HTTP+HTTPS) |
持久连接查看
bash
# 查看持久连接模板
ipvsadm -L -n --persistent-conn
# 查看当前连接
ipvsadm -L -n -c
# 输出示例
IPVS connection entries
pro expire state source virtual destination
TCP 00:57 NONE 192.168.1.100:0 192.168.1.10:0 192.168.1.11:0
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| 持久连接 | 同一客户端请求定向到同一 RS | 像"专属客服",记住你的客服 |
| 持久连接模板 | 内存中的客户端到 RS 的映射关系 | 像"客户档案",记录客户和客服的对应关系 |
| 超时时间 | 持久连接的有效期(默认 300 秒) | 像"VIP 卡有效期" |
| 防火墙标记 | iptables 打的标记,用于关联多个服务 | 像"会员等级标签" |
后端服务健康检查 🏥
为什么需要健康检查?
LVS 本身不提供健康检查功能,如果某台 RS 宕机,LVS 仍会将请求分发给它,导致部分请求失败。
❓ 为什么需要健康检查
RS 宕机
服务异常
网络故障
❌ LVS 仍分发请求
导致请求失败
✅ 健康检查
自动摘除故障 RS
健康检查方案
| 方案 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 自定义脚本 | 定期检测 RS,自动添加/删除 | 灵活、可定制 | 需要自己编写维护 |
| Keepalived | 集成 LVS + 健康检查 + 高可用 | 功能完善、稳定 | 配置相对复杂 |
| ldirectord | Heartbeat 的 LVS 管理工具 | 与 Heartbeat 集成好 | 依赖 Heartbeat |
健康检查脚本示例
脚本功能:
- 定期检测 RS 的 HTTP 服务
- 如果 RS 不可用,从 LVS 中删除
- 如果 RS 恢复,重新添加到 LVS
脚本 v1(基础版):
bash
#!/bin/bash
#
# LVS 健康检查脚本
VIP=192.168.10.3
CPORT=80
RS=("192.168.10.7" "192.168.10.8")
RSTATUS=("1" "1") # 1=在线, 0=离线
RW=("2" "1") # 权重
RPORT=80
TYPE=g # DR 模式
# 添加 RS
add() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
# 删除 RS
del() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
# 主循环
while :; do
let COUNT=0
for I in ${RS[*]}; do
# 检测 RS(超时 1 秒)
if curl --connect-timeout 1 http://$I &> /dev/null; then
# RS 可用
if [ ${RSTATUS[$COUNT]} -eq 0 ]; then
add $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSTATUS[$COUNT]=1
fi
else
# RS 不可用
if [ ${RSTATUS[$COUNT]} -eq 1 ]; then
del $I
[ $? -eq 0 ] && RSTATUS[$COUNT]=0
fi
fi
let COUNT++
done
sleep 5
done
脚本 v2(增强版):
bash
#!/bin/bash
#
# LVS 健康检查脚本(增强版)
VIP=192.168.10.3
CPORT=80
RS=("192.168.10.7" "192.168.10.8")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3 # 检测 3 次才确认故障
LOG=/var/log/ipvsmonitor.log
# 添加 RS
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
# 删除 RS
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
# 检测 RS(重试 3 次)
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
# 初始化状态
initstatus() {
local I
local COUNT=0
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" &> /dev/null; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
fi
let COUNT++
done
}
# 初始化
initstatus
# 主循环
while :; do
let COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
# RS 可用
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && \
echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
# RS 不可用
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && \
echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done
脚本使用
bash
# 1. 保存脚本
vi /usr/local/bin/lvs_healthcheck.sh
chmod +x /usr/local/bin/lvs_healthcheck.sh
# 2. 后台运行
nohup /usr/local/bin/lvs_healthcheck.sh &
# 3. 查看日志
tail -f /var/log/ipvsmonitor.log
# 4. 停止脚本
pkill -f lvs_healthcheck.sh
curl 命令选项
| 选项 | 说明 |
|---|---|
| --connect-timeout | 连接超时时间(秒) |
| --max-time | 整个请求的最大时间 |
| -s, --silent | 静默模式,不输出进度 |
| -I, --head | 只获取 HTTP 头 |
| -o /dev/null | 丢弃输出 |
健康检查最佳实践
- 检测频率:5-10 秒一次(不要太频繁)
- 超时时间:1-2 秒(不要太长)
- 重试次数:3 次(避免误判)
- 日志记录:记录 RS 上下线时间
- 告警通知:RS 故障时发送邮件/短信
生活例子:健康检查像"医院体检"------定期检查员工(RS)健康状况,发现生病的(故障)就让他休息(摘除),康复后(恢复)再上岗(添加回来)。
📖 名词解释
| 名词 | 解释 | 生活例子 |
|---|---|---|
| 健康检查 | 定期检测 RS 是否正常工作 | 像"定期体检" |
| 探测 | 向 RS 发送请求,检测响应 | 像"打电话确认在不在" |
| 摘除 | 从 LVS 中删除故障 RS | 像"让生病员工回家休息" |
| 恢复 | 将修复的 RS 重新添加到 LVS | 像"康复后重新上岗" |
总结与最佳实践 🎯
LVS 部署架构
VRRP
🌐 Internet
🔀 Router
💚 Keepalived Master
Director 1
VIP
💚 Keepalived Backup
Director 2
🖥️ Real Server 1
Web + Health Check
🖥️ Real Server 2
Web + Health Check
🖥️ Real Server 3
Web + Health Check
💾 NFS/GlusterFS
共享存储
配置清单
| 组件 | 配置要点 |
|---|---|
| Director | 1. 配置 VIP 2. 开启路由转发 3. 配置 ipvsadm 规则 4. 配置 Keepalived 高可用 |
| Real Server | 1. 配置 RIP 2. DR 模式:配置 VIP 在 lo:0 + ARP 参数 3. NAT 模式:网关指向 DIP 4. 启动服务 |
| 健康检查 | 1. 编写检测脚本 2. 后台运行 3. 日志记录 |
| 共享存储 | 1. NFS/GlusterFS 2. 用户上传文件、Session 共享 |
常见问题与解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 无法访问 VIP | 1. VIP 未配置 2. 路由问题 | 检查 VIP 配置、路由表 |
| 请求不均衡 | 1. 持久连接 2. 权重设置不当 | 调整权重、检查持久连接 |
| DR 模式 ARP 冲突 | RS 响应 VIP 的 ARP 请求 | 配置 arp_ignore/arp_announce |
| 部分请求失败 | RS 故障未摘除 | 配置健康检查脚本 |
| Director 单点故障 | 无高可用 | 配置 Keepalived |
性能优化建议
-
选择合适的模式:
- 小规模:NAT(配置简单)
- 中大规模:DR(性能最好,推荐)
- 跨地域:TUN(支持异地)
-
选择合适的调度算法:
- 服务器性能相近:rr
- 服务器性能不同:wlc(推荐)
- 需要会话保持:sh + 持久连接
-
内核参数优化:
bash
# /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
# 连接追踪表大小
net.netfilter.nf_conntrack_max = 1000000
net.ipv4.netfilter.ip_conntrack_max = 1000000
# TCP 优化
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
- 监控指标 :
- 连接数:
ipvsadm -L -n --stats - 速率:
ipvsadm -L -n --rate - RS 状态:健康检查日志
- 系统负载:top、vmstat、iostat
- 连接数: