Linux 集群与负载均衡(LVS)

目录

  1. [CentOS、Ubuntu 等发行版与 LVS](#CentOS、Ubuntu 等发行版与 LVS)
  2. [Linux 集群基础概念](#Linux 集群基础概念)
  3. [LVS 简介与组成](#LVS 简介与组成)
  4. [LVS 三种类型详解](#LVS 三种类型详解)
  5. [LVS 调度算法](#LVS 调度算法)
  6. [ipvsadm 命令详解](#ipvsadm 命令详解)
  7. [LVS-NAT 模型配置](#LVS-NAT 模型配置)
  8. [LVS-DR 模型配置](#LVS-DR 模型配置)
  9. [LVS-TUN 模型配置](#LVS-TUN 模型配置)
  10. [ARP 问题解决](#ARP 问题解决)
  11. [LVS 持久连接](#LVS 持久连接)
  12. 后端服务健康检查

📌 核心概念一览

主题 核心概念 一句话
集群类型 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,导致负载均衡失效。

解决

  1. RS 上配置 arp_ignore=1:只响应发送到本接口 IP 的 ARP 请求
  2. 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 共享

典型场景

  1. SSL/HTTPS:SSL 握手开销大,需要保持连接到同一 RS
  2. Session 未共享:用户登录信息、购物车等存储在单台服务器
  3. FTP:需要控制连接和数据连接到同一 RS
  4. 数据库连接:某些应用需要保持到同一数据库服务器

持久连接类型

类型 全称 说明 端口
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

健康检查脚本示例

脚本功能

  1. 定期检测 RS 的 HTTP 服务
  2. 如果 RS 不可用,从 LVS 中删除
  3. 如果 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 丢弃输出

健康检查最佳实践

  1. 检测频率:5-10 秒一次(不要太频繁)
  2. 超时时间:1-2 秒(不要太长)
  3. 重试次数:3 次(避免误判)
  4. 日志记录:记录 RS 上下线时间
  5. 告警通知: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

性能优化建议

  1. 选择合适的模式

    • 小规模:NAT(配置简单)
    • 中大规模:DR(性能最好,推荐)
    • 跨地域:TUN(支持异地)
  2. 选择合适的调度算法

    • 服务器性能相近:rr
    • 服务器性能不同:wlc(推荐)
    • 需要会话保持:sh + 持久连接
  3. 内核参数优化

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
  1. 监控指标
    • 连接数:ipvsadm -L -n --stats
    • 速率:ipvsadm -L -n --rate
    • RS 状态:健康检查日志
    • 系统负载:top、vmstat、iostat

相关推荐
地球空间-技术小鱼1 小时前
搜罗Linux桌面环境(Desktop Environments)列表
linux·运维·服务器·笔记·学习·ubuntu·debian
gfdgd xi2 小时前
GXDE OS 25.3.1 更新了!修复更多 bug 了!
linux·c++·操作系统·bug·deepin
Trouvaille ~2 小时前
【Linux】TCP vs UDP深度对比:如何选择与用UDP实现可靠传输
linux·网络·c++·tcp/ip·udp·操作系统
岳清源2 小时前
LVS章节
linux
liu****2 小时前
5.Linux CGroups 资源控制实战(CPU+内存)超详细教程
linux·运维·服务器·docker
礼拜天没时间.4 小时前
Docker 部署分布式 Hadoop(超详细实战版)
linux·hadoop·分布式·docker·容器
比奇堡派星星12 小时前
awk命令
linux·运维·服务器
清水白石00812 小时前
Python 柯里化完全指南:从函数式思想到工程实践
linux·服务器·python
宸迪13 小时前
【python】使用uv管理项目包依赖
linux·python·uv