一、LVS 概述与核心概念

1.1 LVS 是什么

Linux Virtual Server 是一个高度集成于 Linux 内核、性能卓越、高可用的负载均衡集群解决方案。由章文嵩博士设计并贡献给开源社区,现已成为 Linux 内核的标准模块。其核心作用是将前端大量的客户端请求,智能、高效地分发到后端多台真实服务器上,从而达成:

  • 提升整体服务并发处理能力

  • 增强系统的可用性与可扩展性

  • 实现业务流量的透明调度

1.2 实验环境说明(基础示例)

主机名 角色 说明
server1 调度器 (VS) 负责接收请求并进行分发
server2 真实服务器 (RS) 实际提供应用服务的后端主机
server3 真实服务器 (RS) 另一台提供相同服务的后端主机
server4 测试机 (Client) 用于模拟客户端,发起访问请求

二、集群与分布式系统理论

2.1 系统性能扩展方式对比

扩展方式 核心思想 优点 缺点/挑战
Scale Up (向上扩展) 增强单台服务器的性能,如增加CPU、内存、存储。 实现简单,无需复杂的集群管理。 存在物理极限;成本高昂;单点故障风险高。
Scale Out (向外扩展) 增加服务器数量,多台服务器共同提供服务。 成本相对较低;理论上扩展性无限;高可用性。 引入调度分配、数据一致性、网络通信等复杂问题。

2.2 集群 (Cluster) 详解

定义:将多台计算机组合起来作为一个单一系统协同工作,共同解决特定问题(如高并发、高可用)。

常见集群类型:
  1. LB (负载均衡集群)

    • 目标:将工作负载分摊到多个计算节点。

    • 特点:各节点功能相同,数据通常同步或共享;通过调度器对外提供单一访问入口。

    • 典型代表LVS、Nginx、F5。

  2. HA (高可用集群)

    • 目标:消除单点故障(SPOF),确保服务持续可用。

    • 核心指标

      • MTBF (平均无故障时间):系统正常运行的平均时长。

      • MTTR (平均修复时间):系统从故障到恢复的平均时长。

      • 可用性 (A) = MTBF / (MTBF + MTTR)

    • 可用性等级

      • 99%:年停机时间约3.65天。

      • 99.9%:年停机时间约8.76小时。

      • 99.99%:年停机时间约52.6分钟。

      • 99.999%:年停机时间约5.26分钟。

    • SLA (服务等级协议):服务提供商对可用性和性能的承诺,是运维的核心目标之一。

  3. HPC (高性能计算集群)

    • 目标:通过并行处理解决复杂的科学计算问题。

    • 特点:计算密集,对网络延迟和带宽要求极高。(本课程不涉及)

2.3 分布式系统 (Distributed System)

定义:一个业务被拆分成多个不同的子业务,或本身就是多个独立业务,部署在多台服务器上。每台服务器的功能、数据和代码通常不同。

对比维度 集群 (Cluster) 分布式 (Distributed)
业务耦合度 同一业务部署在多台服务器 一个完整业务被拆分为多个子业务
节点功能 每个节点功能完全相同 每个节点功能不同,各司其职
数据/代码 数据和代码基本相同 数据和代码按功能划分,各不相同
效率提升点 提高单位时间内完成任务的数量 缩短单个任务的执行时间
故障影响 某节点故障,其他节点可接管 某节点故障,可能导致整个业务链部分功能失效
典型技术 LVS, Keepalived 微服务, Hadoop, Ceph

分布式常见技术栈

  • 分布式存储:Ceph, GlusterFS, FastDFS

  • 分布式计算:Hadoop, Spark

  • 分布式应用架构:微服务

  • 分布式缓存:Redis, Memcached


三、LVS 核心原理与架构

3.1 LVS 相关术语 (Terminology)

术语 全称 说明
CIP Client IP 客户端主机的IP地址
VIP Virtual IP 对外提供服务的虚拟IP地址,客户端直接访问的目标
DIP Director IP 调度器与内网通信的IP地址
RIP Real Server IP 真实服务器的IP地址
VS Virtual Server 指负载均衡调度器本身
RS Real Server 后端实际处理请求的服务器

请求流转路径
CIP -> VIP -> DIP -> RIP
(VS在VIP和DIP之间,负责调度;RS在RIP上响应)

3.2 LVS 集群体系结构

    Internet
           |
        [ Client ]
       (CIP: x.x.x.x)
           |
           v
    +----------------+
    |  Load Balancer | (VS)
    |   VIP: v.v.v.v |
    |   DIP: d.d.d.d |
    +----------------+
           |
   (负载均衡调度算法)
    /      |       \
   /       |        \
  v        v         v
+----+  +----+    +----+
| RS1|  | RS2| ...| RSn|
|RIP1|  |RIP2|    |RIPn|
+----+  +----+    +----+

工作原理简述
VS监听在VIP上。当客户端请求到达VIP,VS根据配置的负载均衡算法,从RS池中选择一台服务器,并通过特定的转发模式(NAT/DR/TUN)将请求发送给该RS。RS处理完请求后,按特定模式返回响应给客户端。


四、LVS 四种工作模式深度解析

4.1 LVS-NAT (Network Address Translation)

核心原理
  • VS作为网关,进行目标地址转换 (DNAT)

  • 收到客户端请求(CIP->VIP)后,将目标地址和端口改为选中的RIP和PORT,转发给RS。

  • RS将响应(RIP->CIP)发送回VS,VS再将源地址改为VIP,返回给客户端。

关键特点与限制
  • RS要求:RIP必须与DIP在同一私有网络;RS的默认网关必须指向DIP

  • 流量路径请求和响应报文都必须经过VS,VS容易成为性能瓶颈。

  • 支持端口映射:可以修改请求报文的目标端口。

  • 透明性:对客户端和后端服务器网络环境要求低,RS可使用任意OS。

数据流逻辑图

   Client                VS (Director)               RS
      |                     |                         |
      | CIP->VIP            |                         |
      |-------------------->|                         |
      |                     | CIP->RIP (DNAT)        |
      |                     |------------------------>|
      |                     |                         |
      |                     | RIP->CIP                |
      |                     |<------------------------|
      | VIP->CIP (SNAT)     |                         |
      |<--------------------|                         |

4.2 LVS-DR (Direct Routing) 【最常用模式】

核心原理
  • 数据链路层(二层)通过重写MAC地址进行转发。

  • VS收到请求后,保持源/目标IP不变(CIP/VIP),仅将帧的目标MAC地址改为选中的RS的MAC,然后转发。

  • RS必须配置与VIP相同的IP在非ARP广播接口上(如lo:0)

  • RS处理请求后,直接使用VIP作为源地址,将响应包发回给客户端,不再经过VS

关键特点与优势
  • 高性能:响应数据不经过VS,极大减轻调度器压力。

  • RS要求:必须在同一物理网络/广播域;需进行ARP抑制,防止VIP冲突。

  • 不支持端口映射:不能修改目标端口。

  • 透明性:对客户端透明,RS可使用大多数OS。

解决VIP地址冲突 (ARP抑制) 的三种方法:
  1. 静态绑定:在前端网关(路由器)上静态绑定VIP与VS的MAC地址(不灵活)。

  2. arptables:在RS上配置arp过滤规则(已被淘汰,不推荐)。

  3. 修改内核参数推荐方法):

    # 在每台RS上执行
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    # 或者写入 /etc/sysctl.conf 永久生效
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    • arp_ignore=1:只回答目标IP地址是本机接口IP的ARP请求。

    • arp_announce=2:始终使用最佳本地地址(即RIP)向外宣告,绝不宣告VIP。

数据流逻辑图

Client                VS (Director)               RS (with VIP on lo)
      |                     |                         |
      | CIP->VIP [MAC_VS]   |                         |
      |-------------------->|                         |
      |                     | CIP->VIP [MAC_RS]       |
      |                     |------------------------>|
      |                     |                         |
      |                     |                         | (处理请求)
      |                     |                         |
      | VIP->CIP [MAC_Client]                         |
      |<----------------------------------------------|

4.3 LVS-TUN (IP Tunneling)

核心原理
  • 在网络层(三层)通过IP隧道技术进行封装转发。

  • VS收到请求后,在原有IP报文(CIP->VIP)之外,再封装一个新的IP头部(DIP->RIP),形成“IP in IP”的数据包,发送给RS。

  • RS解封装后,得到原始请求包,处理后将响应(VIP->CIP)直接发回客户端。

关键特点与适用场景
  • 跨越网络:RIP、VIP、DIP可以是公网地址,支持跨机房、跨地域部署

  • RS要求:RS的OS必须支持IP隧道协议(如ipip模块)。

  • 流量路径:请求经VS,响应直回客户端。

  • 应用场景:当RS分布在不同物理网络,且对性能要求较高时使用。

4.4 LVS-FULLNAT

核心原理
  • VS同时修改请求报文的源地址和目标地址

  • 请求进入:CIP->VIP 被改为 DIP->RIP。

  • 响应返回:RIP->DIP 被改为 VIP->CIP。

关键特点与注意
  • 灵活部署:RIP和DIP可以不在同一网络,RS网关也无需指向DIP。

  • 流量路径:请求和响应都经过VS。

  • 支持端口映射

  • 重要提示FULLNAT模式默认不在标准内核中,需要为内核打补丁(如阿里云、字节跳动等公司的定制内核支持)。

4.5 四种工作模式对比总结

特性 NAT DR TUN FULLNAT
RS与VS网络要求 同一网络 同一广播域 可跨网络 可跨网络
RS网关指向 必须指向DIP 指向路由器,不能指向DIP 指向路由器 指向路由器
响应路径 经过VS RS直连Client RS直连Client 经过VS
支持的RS OS 任意 多数(需VIP配置) 需支持隧道 任意
端口映射 支持 不支持 不支持 支持
典型瓶颈 VS(双向流量) VS(仅请求) 隧道开销 VS(双向流量)
部署复杂度 中(需ARP抑制) 高(隧道配置) 高(需定制内核)

五、LVS 负载均衡调度算法

5.1 静态调度算法 (不考虑RS当前负载)

算法 名称 原理与特点 适用场景
RR 轮询 依次将请求分配给每个RS。简单公平。 RS配置相同,无状态服务。
WRR 加权轮询 根据RS的权重(如处理能力)分配请求。权重越高,获得请求越多。 RS配置不一致(如CPU、内存不同)。
SH 源地址哈希 对请求源IP进行哈希运算,同一客户端的请求始终发往同一RS。 需要会话保持(Session Persistence)的应用。
DH 目标地址哈希 对请求目标IP(通常是缓存对象地址)进行哈希,相同目标的请求发往同一RS。 缓存服务器集群(如CDN反向代理缓存)。

5.2 动态调度算法 (考虑RS当前负载)

系统为每个RS维护一个Overhead值,值越小越优先被调度。

算法 名称 原理与计算方式 (Overhead) 特点
LC 最少连接 ActiveConn * 256 + InactiveConn 将新请求发给当前连接数最少的RS。适合长连接。
WLC 加权最少连接(默认 (ActiveConn * 256 + InactiveConn) / Weight 在LC基础上引入权重,更合理。
SED 最短预期延迟 (ActiveConn + 1) * 256 / Weight 改进WLC,避免权重低的RS永远空闲。
NQ 永不排队 第一轮均匀分配,后续采用SED。 在SED基础上优化,绝对保证不会让任何RS空闲。
LBLC 基于局部性的最少连接 动态的DH算法。 针对缓存负载设计,将相同目标的请求导向最近最少连接的缓存节点。
LBLCR 带复制的LBLC LBLC的改进版,允许在缓存节点间复制热门内容。 解决LBLC可能导致的负载不均问题。

5.3 新版内核新增算法 (4.15+)

  • FO (Weighted Fail Over):类似于主备切换。将请求调度到未过载权重最高的RS。常用于灰度发布故障隔离。可手动标记RS为IP_VS_DEST_F_OVERLOAD使其不接收新流量。

  • OVF (Overflow-connection):将新连接调度到当前活动连接数小于其权重值的、权重最高的RS上。是一种结合了连接数和权重的精细调度算法。


六、LVS 实战部署与操作命令

6.1 软件管理

  • 安装

    yum install ipvsadm -y
  • 服务管理

    • 启动/开机自启:

      systemctl enable --now ipvsadm
    • 保存规则:服务启动时会自动从/etc/sysconfig/ipvsadm加载。

  • 核心文件

    • 主程序:/usr/sbin/ipvsadm

    • 规则保存:/usr/sbin/ipvsadm-save

    • 规则重载:/usr/sbin/ipvsadm-restore

    • 配置文件:/etc/sysconfig/ipvsadm-config

    • 规则文件:/etc/sysconfig/ipvsadm

    • 内核状态:/proc/net/ip_vs/proc/net/ip_vs_conn

6.2 ipvsadm 命令详解

集群服务管理
# 添加 (-A) / 修改 (-E) 一个虚拟服务
ipvsadm -A|E -t|u|f <service-address> [-s scheduler] [-p [timeout]]
# 删除 (-D) 一个虚拟服务
ipvsadm -D -t|u|f <service-address>
# 清空所有规则 (-C)
ipvsadm -C
# 保存规则 (-S),通常重定向到配置文件
ipvsadm -S > /etc/sysconfig/ipvsadm
# 从配置文件恢复规则 (-R)
ipvsadm -R < /etc/sysconfig/ipvsadm
真实服务器 (RS) 管理
# 向虚拟服务添加 (-a) / 修改 (-e) 一个真实服务器
ipvsadm -a|e -t|u|f <service-address> -r <server-address> [-g|i|m] [-w weight]
# 从虚拟服务删除 (-d) 一个真实服务器
ipvsadm -d -t|u|f <service-address> -r <server-address>
查看与监控
# 查看规则列表 (常用)
ipvsadm -Ln
# 查看速率统计信息 (监控用)
ipvsadm -Ln --stats
# 查看实时连接速率 (CPS: 连接数/秒)
ipvsadm -Ln --rate
# 清空计数器 (清零统计信息)
ipvsadm -Z

6.3 实战案例:NAT模式部署

环境:

  • VS (node1): DIP=192.168.0.100, VIP=172.25.254.100

  • RS1 (node2): RIP=192.168.0.101, GW指向192.168.0.100

  • RS2 (node3): RIP=192.168.0.102, GW指向192.168.0.100

步骤:

  1. VS上开启路由转发:

    echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
    sysctl -p
  2. VS上配置LVS规则:

    ipvsadm -A -t 172.25.254.100:80 -s rr
    ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.101:80 -m
    ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.102:80 -m
  3. 保存并持久化规则:

    ipvsadm -S > /etc/sysconfig/ipvsadm
    systemctl enable ipvsadm
  4. 测试: 在客户端访问 http://172.25.254.100,请求应被轮询分发到两个RS。

6.4 实战案例:DR模式部署

环境:

  • VIP: 192.168.0.100

  • VS: DIP=192.168.0.200

  • RS1: RIP=192.168.0.101

  • RS2: RIP=192.168.0.102

步骤:

  1. 在所有RS上配置VIP(在lo接口)并做ARP抑制 (见4.2节)。

  2. 在VS上配置VIP(在eth0接口)

  3. 在VS上配置LVS-DR规则:

    ipvsadm -A -t 192.168.0.100:80 -s wrr
    ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.101:80 -g -w 1
    ipvsadm -a -t 192.168.0.100:80 -r 192.168.0.102:80 -g -w 2

    (-g 代表 DR 模式)

  4. 测试: 在客户端访问VIP,查看响应是否来自不同的RS,且ipvsadm -LnInActConn计数是否增加。

6.5 高级技巧

1. 防火墙标记 (FWM) 实现多端口绑定

问题: HTTP(80)和HTTPS(443)希望被当作同一服务调度到同一台RS,以保证会话一致性。
解决方案:

# 在VS上,使用iptables给特定流量打标记
iptables -t mangle -A PREROUTING -d $VIP -p tcp -m multiport --dports 80,443 -j MARK --set-mark 66

# 使用防火墙标记来定义LVS集群服务
ipvsadm -A -f 66 -s rr -p 300 # -f 指定防火墙标记
ipvsadm -a -f 66 -r $RIP1 -g
ipvsadm -a -f 66 -r $RIP2 -g
2. 持久连接 (Persistent Connection)

用途: 保证同一客户端在一段时间内的所有请求都发往同一台RS,用于需要会话保持但RS本身无状态共享的场景。

# 在创建虚拟服务时,使用 -p 参数指定持久连接超时时间(秒)
ipvsadm -A -t $VIP:80 -s wrr -p 360
# 或修改已有服务
ipvsadm -E -t $VIP:80 -p 360

七、LVS 监控与排错

  • 查看连接状态cat /proc/net/ip_vs_conn,可看到CIP->VIP到DIP->RIP的映射关系及连接状态。

  • 监控流量速率ipvsadm -Ln --rate,关注CPS(每秒新建连接数)、InBPS/OutBPS(出入带宽)。

  • 常见排错点

    1. NAT模式RS无法上网:检查RS网关是否指向DIP;检查VS是否开启ip_forward

    2. DR模式访问不通:检查RS上VIP是否配置正确;检查ARP抑制是否生效(arp_ignore/arp_announce);检查RS是否将响应包直接回了客户端(检查路由,网关不能指向DIP)。

    3. 规则不生效:检查iptables/firewalld是否拦截了相关流量,建议在VS上清空防火墙规则进行测试

    4. 调度不均衡:检查调度算法是否合适;检查RS权重(-w)设置;使用ipvsadm -Ln --stats观察各RS的连接数分布。

更多推荐