架构之LVS (Linux Virtual Server)

目录

  1. 简介
  2. 架构概览
  3. LVS 组件
  4. 工作模式
  5. 调度算法
  6. 部署架构
  7. 配置
  8. 高可用性
  9. 性能优化
  10. 最佳实践
  11. 使用场景
  12. 与其他负载均衡器的对比

简介

Linux Virtual Server (LVS) 是 Linux 系统上的高性能四层负载均衡解决方案。LVS 由章文嵩于 1998 年开发,自 Linux 2.4 版本起成为 Linux 内核的一部分,通过 IP 负载均衡技术提供可扩展的网络服务。

核心特性

  • 四层负载均衡:在传输层(TCP/UDP)工作
  • 内核级实现:高性能,开销极小
  • 多种工作模式:NAT、隧道和直接路由
  • 灵活的调度:多种负载分配算法
  • 高可用性:支持 keepalived 故障转移
  • 开源:免费且是 Linux 内核的一部分

为什么选择 LVS?

  • 性能:每秒可处理数百万个连接
  • 稳定性:在生产环境中已验证数十年
  • 成本效益:无许可费用,可在普通硬件上运行
  • 可扩展性:通过添加真实服务器实现水平扩展

架构概览

LVS 实现了三层架构:

                    ┌─────────────────┐
                    │   客户端        │
                    └────────┬────────┘
                             │
                    ┌────────▼────────┐
                    │  LVS 调度器     │
                    │  (负载均衡器)    │
                    └────────┬────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
   ┌────▼────┐         ┌────▼────┐         ┌────▼────┐
   │  真实   │          │  真实   │         │  真实    │
   │ 服务器 1│          │ 服务器 2 │         │ 服务器 N │
   └─────────┘         └─────────┘         └─────────┘

核心概念

调度器(负载均衡器)

  • 接收入站流量的 LVS 服务器
  • 将请求分发到后端真实服务器
  • 可以是主备模式或双主模式

真实服务器

  • 实际处理请求的后端服务器
  • 可以是物理机或虚拟机
  • 运行实际的应用服务

虚拟服务(VS)

  • 向客户端暴露的服务
  • 由 IP 地址、端口和协议(TCP/UDP)定义

虚拟服务器(VIP)

  • 客户端连接的 IP 地址
  • 可以是用于高可用的浮动 IP

LVS 组件

1. IPVS (IP Virtual Server)

IPVS 是实现负载均衡的核心内核模块。它在网络层工作,提供传输层负载均衡。

主要功能:

  • 连接跟踪
  • 数据包转发
  • 调度决策
  • 健康检查(通过用户空间工具)

2. ipvsadm

用于管理 IPVS 的用户空间命令行工具:

  • 添加/删除虚拟服务
  • 添加/删除真实服务器
  • 配置调度算法
  • 监控统计信息

3. keepalived

LVS 的高可用框架:

  • VRRP(虚拟路由冗余协议)实现
  • 真实服务器的健康检查
  • 自动故障转移
  • 邮件通知

工作模式

LVS 支持三种主要的转发模式,每种都有不同的特点:

1. NAT 模式(网络地址转换)

工作原理:

  • 调度器同时修改源 IP 和目的 IP
  • 响应流量通过调度器返回
  • 真实服务器使用调度器作为默认网关
客户端 → VIP (调度器) → RIP (真实服务器) → VIP (调度器) → 客户端
        [SNAT/DNAT]          [默认网关]      [反向 NAT]

特点:

  • 优点:
    • 真实服务器可以使用任何操作系统
    • 配置简单
    • 真实服务器不需要公网 IP
  • 缺点:
    • 调度器成为瓶颈
    • 延迟较高(两次穿越)
    • 可扩展性有限

适用场景:

  • 中小型部署
  • 异构服务器环境
  • 当真实服务器在私有网络上时

2. TUN 模式(IP 隧道)

工作原理:

  • 调度器使用 IP-in-IP 隧道封装数据包
  • 真实服务器解封装并直接响应客户端
  • 响应不经过调度器
客户端 → VIP (调度器) → [IP 隧道] → 真实服务器 → 客户端
        [封装]                     [解封装]

特点:

  • 优点:
    • 高可扩展性
    • 低延迟
    • 调度器不在返回路径上
    • 支持地理分布的服务器
  • 缺点:
    • 真实服务器需要支持 IP 隧道
    • 配置较复杂
    • 轻微的封装开销

适用场景:

  • 大规模部署
  • 分布式数据中心
  • 当性能至关重要时

3. DR 模式(直接路由)

工作原理:

  • 调度器重写数据包的 MAC 地址
  • 真实服务器使用 VIP 直接响应
  • 所有服务器必须在同一网段
客户端 → VIP (调度器) → [MAC 重写] → 真实服务器 → 客户端
        [同一网络]      [ARP 问题]      [直接响应]

特点:

  • 优点:
    • 最高性能
    • 最小开销
    • 无封装
    • 调度器不在返回路径上
  • 缺点:
    • 所有服务器必须在同一 L2 网络
    • 需要 ARP 处理(VIP 必须配置在 lo:0 上)
    • 配置较复杂

适用场景:

  • 高性能要求
  • 单数据中心部署
  • 当所有服务器在同一机架/交换机时

对比表

特性 NAT TUN DR
性能 最高
可扩展性 有限
网络要求 任意 任意 同一 L2
服务器操作系统 任意 Linux Linux
配置难度 简单 中等 复杂
返回路径 经过调度器 直接 直接
地理分布

调度算法

LVS 提供多种调度算法来分配流量:

静态算法

1. 轮询(rr)

  • 按顺序分发请求
  • 均匀分布,不考虑服务器容量
ipvsadm -A -t 192.168.1.100:80 -s rr

2. 加权轮询(wrr)

  • 向容量更大的服务器分配更多连接
  • 权重手动配置
ipvsadm -A -t 192.168.1.100:80 -s wrr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -m -w 3
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -m -w 1

3. 目标地址哈希(dh)

  • 对目标 IP 进行哈希以选择服务器
  • 确保相同目标访问同一服务器
  • 适用于缓存服务器

4. 源地址哈希(sh)

  • 对源 IP 进行哈希以选择服务器
  • 确保相同客户端访问同一服务器
  • 适用于会话保持

动态算法

5. 最少连接(lc)

  • 路由到活动连接数最少的服务器
  • 考虑当前负载
ipvsadm -A -t 192.168.1.100:80 -s lc

6. 加权最少连接(wlc)

  • 同时考虑连接数和服务器权重
  • 默认且最常用的算法
ipvsadm -A -t 192.168.1.100:80 -s wlc

7. 基于局部性的最少连接(lblc)

  • 用于缓存服务器
  • 路由到同一局部区域中连接数最少的服务器

8. 带复制的基于局部性的最少连接(lblcr)

  • 类似于 lblc,但带有复制
  • 更适合分布式缓存

9. 最短预期延迟(sed)

  • 考虑活动连接和服务器权重
  • 最小化预期响应时间

10. 从不排队(nq)

  • sed 的变体
  • 如果服务器空闲,立即分配,不考虑权重

算法选择指南

场景 推荐算法
相同容量的服务器 rr 或 lc
不同容量的服务器 wrr 或 wlc
需要会话保持 sh
缓存服务器 dh 或 lblc
通用用途 wlc(默认)

部署架构

单调度器部署

互联网
    │
    ▼
┌─────────────┐
│   防火墙    │
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ LVS 调度器  │  VIP: 203.0.113.10
└──────┬──────┘
       │
   ┌───┴───┬───┬───┐
   ▼       ▼   ▼   ▼
 RS1     RS2 RS3  RS4

高可用部署(主备模式)

互联网
    │
    ▼
┌─────────────┐
│   防火墙     │
└──────┬──────┘
       │
       ▼
┌─────────────────────────┐
│    VRRP 组              │
│  ┌─────────┐  ┌─────────┐│
│  │ 主节点   │  │ 备节点   ││
│  │  LVS    │  │  LVS    ││
│  │VIP:活跃  │  │VIP:待机 ││
│  └────┬────┘  └────┬────┘│
│       │            │      │
│       └─────┬──────┘      │
└─────────────┼─────────────┘
              │
         ┌────┴────┬────┬────┐
         ▼         ▼    ▼    ▼
        RS1       RS2  RS3  RS4

双主部署

互联网
    │
    ▼
┌─────────────┐
│   防火墙     │
└──────┬──────┘
       │
   ┌───┴────────┐
   ▼            ▼
┌─────────┐  ┌─────────┐
│ LVS-1   │  │ LVS-2   │
│VIP:203.0│  │VIP:203.0│
│.113.10  │  │.113.11  │
└────┬────┘  └────┬────┘
     │            │
     └─────┬──────┘
           │
      ┌────┴────┬────┬────┐
      ▼         ▼    ▼    ▼
     RS1       RS2  RS3  RS4

配置

NAT 模式基础配置

1. 在调度器上启用 IP 转发:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

2. 配置 IPVS:

# 安装 ipvsadm
yum install ipvsadm -y  # RHEL/CentOS
# 或
apt-get install ipvsadm -y  # Debian/Ubuntu

# 添加虚拟服务
ipvsadm -A -t 203.0.113.10:80 -s wlc

# 添加真实服务器
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.101:80 -m -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.102:80 -m -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.103:80 -m -w 1

# 保存配置
ipvsadm-save > /etc/sysconfig/ipvsadm  # RHEL/CentOS
# 或
ipvsadm-save > /etc/ipvsadm.rules  # Debian/Ubuntu

3. 配置真实服务器(设置默认网关为调度器):

route add default gw 192.168.1.100

DR 模式配置

1. 调度器配置:

# 将 VIP 添加到接口
ip addr add 203.0.113.10/32 dev eth0

# 配置 IPVS
ipvsadm -A -t 203.0.113.10:80 -s wlc
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.101:80 -g -w 1
ipvsadm -a -t 203.0.113.10:80 -r 192.168.1.102:80 -g -w 1

2. 真实服务器配置:

# 将 VIP 添加到回环接口
ip addr add 203.0.113.10/32 dev lo

# 抑制 ARP 响应
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

# 使更改持久化
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

Keepalived 配置

/etc/keepalived/keepalived.conf:

! Configuration File for keepalived

global_defs {
   notification_email {
     admin@example.com
   }
   notification_email_from lvs@example.com
   smtp_server localhost
   smtp_connect_timeout 30
   router_id LVS_DIRECTOR
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        203.0.113.10
    }
}

virtual_server 203.0.113.10 80 {
    delay_loop 6
    lb_algo wlc
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.1.101 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.1.102 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

高可用性

VRRP(虚拟路由冗余协议)

Keepalived 实现了 VRRP 用于自动故障转移:

核心概念:

  • 虚拟路由器:具有 VIP 的逻辑路由器
  • 主节点:处理流量的活动节点
  • 备节点:备用节点
  • 优先级:决定哪个节点成为主节点
  • 通告间隔:VRRP 数据包发送频率

故障转移过程:

  1. 主节点停止发送通告
  2. 备节点检测到主节点故障(丢失 3 个通告)
  3. 优先级最高的备节点成为新的主节点
  4. VIP 移动到新的主节点
  5. 发送免费 ARP 以更新网络

健康检查

Keepalived 提供多种健康检查方法:

1. TCP_CHECK

TCP_CHECK {
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
}

2. HTTP_GET

HTTP_GET {
    url {
        path /health
        status_code 200
    }
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
}

3. SSL_GET

SSL_GET {
    url {
        path /health
        status_code 200
    }
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
}

4. MISC_CHECK

MISC_CHECK {
    misc_path "/usr/local/bin/check_service.sh"
    misc_timeout 5
}

脑裂预防

为防止脑裂场景:

  • 使用奇数个节点
  • 配置正确的认证
  • 对于多节点设置使用单播而不是组播
  • 使用外部工具进行监控

性能优化

内核调优

1. 增加连接跟踪表:

echo "net.netfilter.nf_conntrack_max = 1000000" >> /etc/sysctl.conf

2. 调整超时:

echo "net.netfilter.nf_conntrack_tcp_timeout_established = 1200" >> /etc/sysctl.conf

3. 启用连接跟踪优化:

echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf

硬件考虑

CPU:

  • 多核用于处理大量连接
  • 对于大型部署考虑 NUMA 感知

网络:

  • 10GbE+ 用于高吞吐量
  • 多网卡用于冗余
  • 虚拟化使用 SR-IOV

内存:

  • 连接跟踪需要内存
  • 经验法则:每个连接约 350 字节

应用级优化

1. 启用 HTTP keep-alive:

  • 减少连接开销
  • 更适合长连接

2. 优化真实服务器性能:

  • 调整 Web 服务器(Nginx/Apache)
  • 启用缓存
  • 使用连接池

3. 持久化超时:

  • 平衡会话亲和性和负载分配
  • 典型值:50-300 秒

最佳实践

1. 安全

网络安全:

  • 将 LVS 放在防火墙后面
  • 限制管理访问
  • 对真实服务器使用私有网络
  • 实施速率限制

系统安全:

  • 保持内核更新
  • 使用最小化安装
  • 禁用不必要的服务
  • 定期安全审计

2. 监控

需要监控的关键指标:

  • 连接速率和数量
  • 服务器健康状态
  • CPU 和内存使用率
  • 网络吞吐量
  • 响应时间

工具:

  • ipvsadm -Ln --rate:实时统计
  • ipvsadm -Lnc:连接表
  • Prometheus + Grafana 用于可视化
  • ELK Stack 用于日志分析

3. 容量规划

计算需求:

  • 每秒峰值连接数
  • 平均连接持续时间
  • 每个连接的带宽
  • 所需真实服务器数量

公式:

所需连接数 = 峰值 CPS × 平均持续时间
所需带宽 = 峰值 CPS × 每连接平均字节数

4. 测试

负载测试:

  • 使用 ApacheBench、wrk 或 JMeter 等工具
  • 使用真实的流量模式进行测试
  • 测试期间监控系统
  • 验证故障转移是否正常工作

故障转移测试:

  • 模拟调度器故障
  • 验证 VIP 正确移动
  • 使用活动连接进行测试
  • 验证无数据包丢失

5. 文档

维护:

  • 网络拓扑图
  • 配置文件(版本控制)
  • 常见问题操作手册
  • 团队联系信息

使用场景

1. Web 服务器负载均衡

场景: 高流量网站,有多个 Web 服务器

配置:

  • 模式:DR(为了性能)
  • 算法:wlc
  • 持久化:0(无状态应用)
  • 健康检查:HTTP_GET /health

2. 数据库负载均衡

场景: 读密集型数据库,有多个读副本

配置:

  • 模式:NAT(为了简单)
  • 算法:wrr(主节点权重较低)
  • 持久化:源地址哈希(用于连接池)
  • 健康检查:TCP_CHECK 数据库端口

3. API 网关负载均衡

场景: 微服务 API,有多个实例

配置:

  • 模式:DR
  • 算法:最少连接
  • 持久化:基于 API 密钥(通过应用)
  • 健康检查:HTTP_GET /health

4. 内容分发网络

场景: 分布式缓存服务器

配置:

  • 模式:TUN(用于地理分布)
  • 算法:目标地址哈希
  • 持久化:基于内容哈希
  • 健康检查:HTTP_GET 带缓存验证

5. FTP 负载均衡

场景: FTP 服务,有多个服务器

配置:

  • 模式:NAT(FTP 需要 NAT 进行数据连接)
  • 算法:源地址哈希
  • 持久化:长持续时间(用于 FTP 会话)
  • 健康检查:TCP_CHECK 端口 21

与其他负载均衡器的对比

LVS vs Nginx

特性 LVS Nginx
层级 4 4/7
性能 更高
SSL 终止
内容交换
配置 复杂 简单
可扩展性 非常高
适用场景 高吞吐量 Web 应用

LVS vs HAProxy

特性 LVS HAProxy
层级 4 4/7
性能 更高
SSL 终止
健康检查 外部 内置
统计信息 基础 高级
配置 ipvsadm 声明式
适用场景 网络负载均衡 应用负载均衡

LVS vs 硬件负载均衡器(F5、Citrix)

特性 LVS 硬件 LB
成本 免费 昂贵
性能 非常高
功能 基础 全面
支持 社区 企业级
管理 CLI GUI/API
适用场景 成本效益 关键任务

结论

LVS 仍然是 Linux 环境中强大且具有成本效益的负载均衡解决方案。其内核级实现提供了卓越的性能,使其适用于高流量场景。虽然较新的软件负载均衡器在七层提供更多功能,但 LVS 在纯四层场景中表现出色,其中性能至关重要。

何时使用 LVS

  • 高性能要求
  • 四层负载均衡足够
  • 预算限制
  • 仅 Linux 环境
  • 需要内核级性能

何时考虑替代方案

  • 需要七层功能(SSL 终止、内容路由)
  • 需要高级健康检查
  • 异构环境
  • 更喜欢 GUI 管理
  • 需要企业级支持

延伸阅读

  • LVS 官方文档:http://www.linuxvirtualserver.org/
  • Keepalived 文档:https://keepalived.org/
  • IPVS 手册页:man ipvsadm
  • Linux 内核文档:Documentation/networking/ipvs-sysctl.txt

附录

A. 常用命令

查看统计信息:

ipvsadm -Ln --rate

查看连接表:

ipvsadm -Lnc

清除所有规则:

ipvsadm -C

保存配置:

ipvsadm-save > /etc/ipvsadm.rules

恢复配置:

ipvsadm-restore < /etc/ipvsadm.rules

B. 故障排除

连接未被分发:

  1. 检查 ipvsadm 规则:ipvsadm -Ln
  2. 验证真实服务器可达
  3. 检查防火墙规则
  4. 验证 IP 转发已启用

VIP 无响应:

  1. 检查 VIP 是否配置:ip addr show
  2. 验证 VRRP 状态:systemctl status keepalived
  3. 检查网络连接
  4. 验证无 ARP 冲突

CPU 使用率过高:

  1. 检查连接数:ipvsadm -Lnc | wc -l
  2. 增加 nf_conntrack_max
  3. 考虑添加更多调度器
  4. 检查调度算法

C. 性能基准测试

现代硬件上的典型性能:

模式 连接/秒 吞吐量
NAT ~100K ~10 Gbps
DR ~1M+ ~40 Gbps+
TUN ~800K ~30 Gbps

注意:实际性能取决于硬件、内核版本和配置

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐