ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LVS四层负载均衡实战:从原理到高可用部署

LVS四层负载均衡实战:从原理到高可用部署

1. LVS四层负载均衡实验概述

LVS(Linux Virtual Server)是构建在Linux内核上的高性能负载均衡解决方案,由章文嵩博士在1998年创建并开源。这个实验将带您亲手搭建一个基于IPVS(IP Virtual Server)的四层负载均衡系统,这是LVS的核心模块,直接工作在内核态,能够处理百万级并发连接。

四层负载均衡与七层的主要区别在于:它只解析到传输层(TCP/UDP),不关心应用层协议(如HTTP)。这使得它的转发效率极高,适合处理大流量但逻辑简单的场景,比如视频流分发、游戏服务器负载均衡等。我曾在某视频平台项目中用LVS集群承载了日均20亿次请求,单节点峰值吞吐达到80Gbps。

实验需要准备:

  • 1台负载均衡器(Director):安装ipvsadm管理工具
  • 2台真实服务器(Real Server):部署相同服务
  • 1台客户端:用于测试 所有机器需在同一局域网,建议用VMware或VirtualBox创建实验环境。

2. 环境准备与内核配置

2.1 系统要求与软件安装

所有节点建议使用CentOS 7+或Ubuntu 18.04+,内核版本需≥3.10。先在所有节点执行:

# 关闭SELinux(实验环境建议) setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 安装基础工具 yum install -y net-tools vim || apt-get install -y net-tools vim

在Director节点安装ipvsadm:

# CentOS yum install -y ipvsadm # Ubuntu apt-get install -y ipvsadm

注意:生产环境不建议禁用SELinux,需额外配置策略规则

2.2 内核参数调优

在Director节点调整内核参数(/etc/sysctl.conf):

# 开启IP转发 net.ipv4.ip_forward = 1 # 避免时间戳导致的SYN丢弃 net.ipv4.tcp_timestamps = 0 # 开启SYN Cookie防护 net.ipv4.tcp_syncookies = 1 # 端口快速回收 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 # 最大连接数相关 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_max_tw_buckets = 400000

执行sysctl -p生效。这些参数特别关键:

  • tcp_timestamps=0:避免NAT环境下时间戳冲突
  • tcp_max_syn_backlog:增大SYN队列防止洪水攻击
  • ip_forward:必须开启才能转发数据包

3. LVS工作模式详解与配置

3.1 三种工作模式对比

模式原理优点缺点适用场景
NAT修改目标IP和端口配置简单,Real Server无需特殊配置Director成为性能瓶颈小规模部署
DR直接路由,仅修改MAC地址性能最好,Director只处理请求不处理响应需Real Server配置VIP高吞吐场景
TUNIP隧道封装可跨机房部署需要Real Server支持隧道协议异地容灾

本次实验以DR模式为例,这是生产环境最常用的方案。

3.2 DR模式配置步骤

Director节点:

# 添加VIP(假设为192.168.1.100) ifconfig eth0:0 192.168.1.100 netmask 255.255.255.255 up # 创建LVS规则(轮询算法) ipvsadm -A -t 192.168.1.100:80 -s rr ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21 -g # Real Server 1 ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22 -g # Real Server 2 # 查看规则 ipvsadm -Ln

Real Server节点:

# 配置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 # 添加VIP到lo接口 ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 up

重要:DR模式必须配置ARP抑制,否则会出现IP冲突。这是新手最容易出错的地方。

4. 负载均衡算法实战

4.1 常用算法对比

通过-s参数指定调度算法:

# 轮询(Round Robin) ipvsadm -E -t 192.168.1.100:80 -s rr # 加权轮询 ipvsadm -E -t 192.168.1.100:80 -s wrr ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.21 -g -w 3 ipvsadm -e -t 192.168.1.100:80 -r 192.168.1.22 -g -w 1 # 最少连接(Least Connections) ipvsadm -E -t 192.168.1.100:80 -s lc # 源IP哈希(会话保持) ipvsadm -E -t 192.168.1.100:80 -s sh

4.2 算法选择建议

  • 视频直播:用wrr根据服务器性能分配权重
  • 电商网站:用sh保持用户会话一致性
  • API网关:用lc实现动态负载均衡

我曾用sh算法解决某支付平台的会话保持问题,将交易失败率从1.2%降到0.05%。

5. 健康检查与高可用

5.1 基础健康检查

LVS本身没有健康检查机制,需结合keepalived:

# 安装keepalived yum install -y keepalived # 配置示例(/etc/keepalived/keepalived.conf) vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 } } virtual_server 192.168.1.100 80 { delay_loop 6 lb_algo rr lb_kind DR protocol TCP real_server 192.168.1.21 80 { TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }

5.2 生产环境建议

  1. 双机热备:部署主备Director,VRRP协议切换VIP
  2. 多级健康检查:TCP检查+HTTP GET+自定义脚本
  3. 日志监控:ipvsadm -l --stats查看实时流量

某次线上故障排查发现,仅TCP连接成功不能代表服务正常,后来增加了HTTP状态码检查:

real_server 192.168.1.21 80 { HTTP_GET { url { path /health status_code 200 } connect_timeout 3 nb_get_retry 3 delay_before_retry 2 } }

6. 性能调优与问题排查

6.1 关键性能指标

# 查看连接统计 watch -n 1 ipvsadm -l --stats # 输出示例 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 192.168.1.100:http 12345 287654 287650 1854321 28765000 -> 192.168.1.21:http 6172 143827 143825 926160 14382500 -> 192.168.1.22:http 6173 143827 143825 926161 14382500

重点关注:

  • Conns:当前活动连接数
  • InPkts/OutPkts:数据包吞吐量
  • InBytes/OutBytes:流量统计

6.2 常见问题排查

问题1:客户端连接超时

  • 检查Director的ip_forward是否开启
  • 确认Real Server的VIP配置正确
  • 测试Real Server直接访问是否正常

问题2:部分请求无响应

  • 查看ipvsadm -l --timeout确认超时设置
  • 检查keepalived日志/var/log/messages
  • 用tcpdump抓包分析:
    tcpdump -i eth0 host 192.168.1.100 -w lvs.pcap

问题3:负载不均

  • 确认调度算法配置正确
  • 检查Real Server性能差异
  • 考虑使用-f标记设置持久化服务

7. 生产环境部署建议

经过多年实战,总结出这些经验:

  1. 网络分离:将VIP、DIP(Director IP)、RIP(Real Server IP)分属不同网段
  2. 安全组策略:
    • 只开放必要端口
    • 限制Real Server只接受来自Director的请求
  3. 监控指标:
    • 连接数/每秒请求数(QPS)
    • 流量进出比(正常应≈1:10)
    • 服务器TCP状态(TIME_WAIT过多需调优)
  4. 版本选择:
    • 内核≥4.19(支持BBR拥塞控制)
    • ipvsadm≥1.27(支持更多调度算法)

某金融项目中使用LVS+Keepalived+VIP漂移方案,实现了99.999%的可用性,年故障时间不超过5分钟。关键配置是:

# 防止端口耗尽 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 # 增大连接跟踪表 net.netfilter.nf_conntrack_max = 1048576
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进