云原生(LVS概述)
一、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) 详解

定义:将多台计算机组合起来作为一个单一系统协同工作,共同解决特定问题(如高并发、高可用)。
常见集群类型:
-
LB (负载均衡集群)
-
目标:将工作负载分摊到多个计算节点。
-
特点:各节点功能相同,数据通常同步或共享;通过调度器对外提供单一访问入口。
-
典型代表:LVS、Nginx、F5。
-
-
HA (高可用集群)
-
目标:消除单点故障(SPOF),确保服务持续可用。
-
核心指标:
-
MTBF (平均无故障时间):系统正常运行的平均时长。
-
MTTR (平均修复时间):系统从故障到恢复的平均时长。
-
可用性 (A) =
MTBF / (MTBF + MTTR)。
-
-
可用性等级:
-
99%:年停机时间约3.65天。
-
99.9%:年停机时间约8.76小时。
-
99.99%:年停机时间约52.6分钟。
-
99.999%:年停机时间约5.26分钟。
-
-
SLA (服务等级协议):服务提供商对可用性和性能的承诺,是运维的核心目标之一。
-
-
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抑制) 的三种方法:
-
静态绑定:在前端网关(路由器)上静态绑定VIP与VS的MAC地址(不灵活)。
-
arptables:在RS上配置arp过滤规则(已被淘汰,不推荐)。
-
修改内核参数(推荐方法):
# 在每台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
步骤:
-
VS上开启路由转发:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p -
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 -
保存并持久化规则:
ipvsadm -S > /etc/sysconfig/ipvsadm systemctl enable ipvsadm -
测试: 在客户端访问
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
步骤:
-
在所有RS上配置VIP(在lo接口)并做ARP抑制 (见4.2节)。
-
在VS上配置VIP(在eth0接口)。
-
在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 模式) -
测试: 在客户端访问VIP,查看响应是否来自不同的RS,且
ipvsadm -Ln的InActConn计数是否增加。
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(出入带宽)。 -
常见排错点:
-
NAT模式RS无法上网:检查RS网关是否指向DIP;检查VS是否开启
ip_forward。 -
DR模式访问不通:检查RS上VIP是否配置正确;检查ARP抑制是否生效(
arp_ignore/arp_announce);检查RS是否将响应包直接回了客户端(检查路由,网关不能指向DIP)。 -
规则不生效:检查
iptables/firewalld是否拦截了相关流量,建议在VS上清空防火墙规则进行测试。 -
调度不均衡:检查调度算法是否合适;检查RS权重(
-w)设置;使用ipvsadm -Ln --stats观察各RS的连接数分布。
-
更多推荐

所有评论(0)