LVS(Linux Virtual Server)项目知识点总结

一、什么是集群(Cluster)

集群 是为了解决某个特定问题,将多台计算机组合起来形成的单个系统。对用户来说,集群看起来就像一个整体, 但它背后是由多台主机协同工作来分担任务、提升能力。

系统性能扩展的两种思路:

Scale UP(向上扩展) :增强单台机器的硬件(加 CPU、内存),但有物理上限、成本非线性增长。

Scale Out(向外扩展) :增加设备、横向堆机器,通过调度分配把任务分摊------这就是**集群(Cluster)**的思路。

集群 vs 分布式(易混点):

集群 :同一业务部署在多台服务器上,每台功能、代码、数据都一样;靠"单位时间内处理的任务数"提升效率。

分布式 :一个业务被拆成多个子业务(或不同业务)部署在多台服务器,每台功能/数据不同,合起来才是完整业务;靠"缩短单个任务执行时间"提升效率。

→ 大型网站常是:前端一个负载均衡器 + 后面几台做同一业务的集群;某台挂了其他顶上。分布式某个节点挂了,该业务就可能失败。

二、集群分类

常见集群按目标分为三类:LB(负载均衡)HA(高可用)HPC(高性能计算)

HA 关键指标速记:

MTBF :Mean Time Between Failures,平均无故障时间(越长越好)。

MTTR :Mean Time To Restoration,平均恢复时间(越短越好)。

A = MTBF / (MTBF + MTTR) ,取值 (0,1),常见 99% / 99.5% / 99.9% / 99.99% / 99.999%。

SLA :服务等级协议,约定达不到水平会有惩罚;运维核心目标就是达成 SLA(重点关注计划外停机)。

三、LVS 的作用

LVS(Linux Virtual Server)负载调度器 ,自内核集成 ,由章文嵩博士发起,阿里四层 SLB(Server Load Balance)即基于 LVS + keepalived 实现。官网:The Linux Virtual Server Project - Linux Server Cluster for Load Balancinghttp://www.linuxvirtualserver.org/

它的核心作用:作为 LB 集群的调度器(Director / VS) ,接收客户端请求,按调度算法挑选一台真实服务器(RS)并转发,使多台 RS 协同承担同一业务,从而提升并发能力、实现横向扩展。

3.1 LVS 核心术语(必背)

术语 英文 / 含义 说明
VS Virtual Server(调度器) 负责调度,即 Director
RS Real Server(真实服务器) 真正提供业务服务的主机
CIP Client IP 客户端主机的 IP
VIP Virtual Server IP VS 对外暴露、让客户端访问的 IP
DIP Director IP VS 内网 IP,负责访问后端 RS
RIP Real Server IP 真实业务主机的 IP

访问流程:CIP <--> VIP == DIP <--> RIP

工作原理: VS 根据请求报文的目标 IP、目标协议及端口,将其调度转发至某台 RS,具体挑哪台由调度算法 决定。 注意:IPVS 的作用点位于 PREROUTINGINPUT 链之间,因此做 LVS 时应把 iptables 的防火墙策略清空,避免干扰。

四、LVS 的四种工作模式及原理

LVS 集群类型(4 种):lvs-nat lvs-dr lvs-tun lvs-fullnat

4.1 NAT 模式(Network Address Translation)

本质: 多目标 IP 的 DNAT。把请求报文中的目标地址和目标端口修改为挑出的 RS 的 RIP 和 PORT 后转发。

  • RIP 与 DIP 应在同一 IP 网络,且用私网地址;RS 的网关必须指向 DIP
  • 请求报文和响应报文都必须经 Director 转发,Director 易成瓶颈。
  • 支持端口映射(可改目标 PORT)。
  • VS 必须是 Linux,RS 可以是任意 OS。

NAT 模式数据逻辑(6 步):

① 客户端发包,源 CIP、目标 VIP:端口(如 9000)。

② VS 做 DNAT,把目标由 VIP 换成 RS 的 RIP 及相应端口。

③ RS1 响应,源 RIP1、目标 CIP。

④ VS 收到响应,把源 RIP1 改回 VIP、端口 9000→80。

⑤ VS 把改写后的响应回传客户端。

⑥ 收/发都过 VS,故 VS 易阻塞。

4.2 DR 模式(Direct Routing,直接路由)

默认模式、应用最广。 通过为请求报文重新封装一个 MAC 首部 进行转发:源 MAC 是 DIP 所在接口 MAC,目标 MAC 是挑出的 RS 的 RIP 所在接口 MAC;源/目标 IP、PORT 均保持不变

  • Director 与各 RS 都配置有 VIP
  • 需解决 VIP 地址冲突(前端网关静态绑定 / arptables / 改内核参数限制 arp)。
  • 请求经 Director,响应由 RS 直接发往 Client(RS 与 VS 上都有 VIP)。
  • 不支持端口映射
  • RS 与 Director 须在同一物理网络;RIP 网关不能指向 DIP。
  • RS 可使用大多数 OS。

DR 模式数据传输过程:

① 客户端发数据帧给 VS:客户端IP + 客户端MAC + VIP + VIP的MAC

② VS 把帧中"VIP 的 MAC"改成 RS1 的 MAC:客户端IP + 客户端MAC + VIP + RS1的MAC

③ RS1 收到后响应,回传:VIP + RS1的MAC + 客户端IP + 客户端MAC直接发给客户端

4.3 TUN 模式(IP Tunneling,隧道)

了解级。 不修改原请求报文 IP 首部(源 CIP、目标 VIP),而是在原 IP 报文外再封装一个 IP 首部(源 DIP、目标 RIP)发往 RS;RS 直接响应客户端(源 VIP、目标 CIP)。

  • DIP、VIP、RIP 都应是公网地址;RS 网关一般不能指向 DIP。
  • 请求经 Director,响应不经 Director。
  • 不支持端口映射;RS 的 OS 须支持隧道功能。

4.4 FullNAT 模式(全地址转换)

了解级。 同时修改请求报文的源 IP 和目标 IP 进行转发:CIP→DIP,VIP→RIP

  • VIP 公网、RIP/DIP 私网且通常不在同一网络;RIP 网关一般不指向 DIP。
  • RS 收到的请求源地址是 DIP,只需响应给 DIP,Director 再发往 Client。
  • 请求和响应都经 Director;支持端口映射
  • ⚠️ 此类型内核默认不支持,需打补丁或专用版本。

4.5 四种模式对比总结

对比项 NAT DR(默认/最常用) TUN FullNAT
RS 操作系统 不限 禁用 arp(需配置) 支持隧道 不限
调度器与服务器网络 可跨网络 不可跨网络(同物理网) 可跨网络 可跨网络
可承载 RS 数量
RS 网关 指向 DIP 指向路由(非 DIP) 指向路由 一般不指向 DIP
端口映射 ✅ 支持 ❌ 不支持 ❌ 不支持 ✅ 支持
响应是否经 Director ✅ 是 ❌ 否(RS 直回) ❌ 否 ✅ 是

**一句话记忆:**NAT / FullNAT ------ 请求和响应都经 Director;DR / TUN ------ 请求经 Director,响应由 RS 直回 Client。DR 靠封装新 MAC,TUN 靠外层套新 IP 头(支持远距离)。

五、LVS 的十三种调度算法

LVS 调度算法(ipvs scheduler)按调度时是否考虑 RS 当前负载 分为两类:静态方法 (只看算法本身)与动态方法 (看 RS 负载,Overhead 值较小者被调度)。

5.1 静态调度算法(4 种)

算法 全称 / 中文 说明
RR Round Robin 轮询 RS 轮流被调度;当 RS 配置有差别时不推荐
WRR Weighted RR 加权轮询 按 RS 配置加权调度,性能差的 RS 被调度次数少
SH Source Hashing 源地址哈希 实现 session sticky:同一 IP 请求始终发往第一次挑中的 RS(会话绑定)
DH Destination Hashing 目标地址哈希 第一次轮询调度至 RS,后续发往同一目标地址的请求始终转发至该 RS;典型场景:正向代理缓存负载均衡

5.2 动态调度算法(6 种)

算法 全称 / 中文 Overhead 计算 / 说明
LC Least Connections 最少链接 Overhead = activeconns×256 + inactiveconns;适用长连接
WLC Weighted LC 权重最少链接 默认调度方法;Overhead = (activeconns×256 + inactiveconns) / weight
SED Shortest Expectation Delay 最短期望延迟 Overhead = (activeconns+1+inactiveconns)×256 / weight;初始连接高权重优先
NQ Never Queue 永不排队 第一轮均匀分配,后续按 SED
LBLC Locality-Based LC 基于局部性最少链接 动态的 DH 算法;用于按负载实现正向代理
LBLCR LBLC with Replication 带复制的 LBLC 解决 LBLC 负载不均:从负载重的 RS 复制到负载轻的 RS

5.3 内核 4.15+ 新增算法(2 种)

算法 全称 / 中文 说明
FO Weighted Fail Over 加权故障转移 常用作灰度发布;遍历 RS 链表,找未过载(未置 IP_VS_DEST_F_OVERLOAD)且权重最高的 RS 调度。过载标记后不再被调度
OVF Overflow-connection 溢出连接 基于活动连接数与权重:新连接调度到权重最高 RS,直到其活动连接数超过权重值,再调度下一台;要求未过载、活动连接数<权重、权重≠0

5.4 内核 4.18+ 补充算法(第 13 种)

算法 全称 / 中文 说明
MH Maglev Hashing 一致性哈希 内核 4.18 引入,基于 Google Maglev 的一致性哈希,使 RS 扩缩容时最少连接被重新映射,常用于需要一致性哈希的场景(如 LVS 后端节点变动频繁时)

小计: 静态 4(RR/WRR/SH/DH)+ 动态 6(LC/WLC/SED/NQ/LBLC/LBLCR)+ 4.15 新增 2(FO/OVF)+ 4.18 补充 1(MH)= 共 13 种。本课程讲义 PDF 列出前 12 种,MH 为较新内核补充,使总数恰为 13。

六、LVS 多端口轮询问题解决方案(火墙标记 FWM)

问题: 以 http(80) 与 https(443) 为例,若在 RS 同时开放 80 和 443,默认控制是分开轮询 的:第一次访问 80 被轮询到 RS1,下次访问 443 仍可能被轮询到 RS1 ------ 出现轮询错乱/重复,同一客户的两个端口被调度到不同 RS,导致会话/证书异常。

错误现象示例: curl http://VIP ; curl -k https://VIP 两次都落到同一台 RS(如都到 RS1),本应分别到 RS1/RS2 才合理。

6.1 解决思路:防火墙标记(FWM)

MARK 给访问 VIP 的 80 和 443 数据包打上同一个标记 (如 6666),然后基于该标记定义集群服务,把多个端口当作"同一个服务"统一调度。

6.2 操作步骤(DR 模式环境,VIP=192.168.0.200)

1**RS 上开启 https:**在 RS1、RS2 安装 mod_ssl 并重启 httpd,使 80 与 443 同时可用。

复制代码
[RS1+RS2]# dnf install mod_ssl -y
[RS1+RS2]# systemctl restart httpd

2**(错误示范)分开定义 80 和 443 两个服务:**此时两者独立轮询,会出现轮询错乱。

复制代码
[vsnode]# ipvsadm -A -t 192.168.0.200:80  -s rr
[vsnode]# ipvsadm -a -t 192.168.0.200:80  -r 192.168.0.10 -g
[vsnode]# ipvsadm -a -t 192.168.0.200:80  -r 192.168.0.20 -g
[vsnode]# ipvsadm -A -t 192.168.0.200:443 -s rr
[vsnode]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[vsnode]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g

测试:curl 192.168.0.200; curl -k https://192.168.0.200 → 两次都到 RS2(错乱)。

3**打火墙标记:**在 Director 用 iptables mangle 表给目标 VIP 的 80、443 数据包打标记 6666。

复制代码
[vsnode]# iptables -t mangle -A PREROUTING -d 192.168.0.200 \
           -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666

4基于标记定义集群服务(替代分开的两个服务):

复制代码
[vsnode]# ipvsadm -A -f 6666 -s rr
[vsnode]# ipvsadm -a -f 6666 -r 192.168.0.10 -g
[vsnode]# ipvsadm -a -f 6666 -r 192.168.0.20 -g

5**验证:**客户端访问 80 与 443 被统一调度到不同 RS。

复制代码
[client]# curl 192.168.0.200; curl -k https://192.168.0.200
RS2 - 192.168.0.20
RS1 - 192.168.0.10      # 80→RS2, 443→RS1,错乱解决

七、LVS 会话粘滞解决方案(持久连接 Persistent)

问题: 客户上网常与服务器交互、提交表单。若每次调度都换 RS,会导致已填表单丢失。用 SH 算法虽能粘滞,但简单粗暴、易造成调度失衡。

**解决方案:持久连接(Persistent)。**无论用哪种调度算法,VS 把"某来源被调度到哪台 RS"记录在内存中;在短期(默认 360s)内同源再来,仍按记录调度到同一台 RS;超时后同源再访才会被调度到其他 RS。

核心命令: ipvsadm -A|-E -t|u|f 服务地址 [-s 算法] -p [timeout]

其中 -p 即设置持久连接超时(默认 360 秒)。配合防火墙标记 -f 时,可把 80 与 443 视为一个整体实现粘滞。

7.1 操作步骤(结合火墙标记,VIP=192.168.0.200)

1**先打标记(同第六节):**把 80/443 合并为 FWM 6666。

复制代码
[vsnode]# iptables -t mangle -A PREROUTING -d 192.168.0.200 \
           -p tcp -m multiport --dports 80,443 -j MARK --set-mark 6666

2定义带持久连接的集群服务:-f 6666 -s rr -p 1(此处 -p 1 表示 1 秒超时做演示;生产可按需设 3000 等)。

复制代码
[vsnode]# ipvsadm -A -f 6666 -s rr -p 1
[vsnode]# ipvsadm -Ln
FWM  6666 rr persistent 1
  -> 192.168.0.10:0   Route  1
  -> 192.168.0.20:0

Flags 中出现 persistent 即表示持久连接已生效。

3**验证粘滞:**客户端连续访问,同源在超时内始终落到同一 RS。

复制代码
[client]# curl 192.168.0.200
RS1 - 192.168.0.10
[client]# curl 192.168.0.200
RS1 - 192.168.0.10      # 同一源被粘滞到 RS1

4观察持久连接条目:

复制代码
[vsnode]# watch -n 1 ipvsadm -Lnc
IPVS connection entries
TCP 01:56 FIN_WAIT 172.25.254.99:42420 192.168.0.200:80  192.168.0.20:80
IP  00:57 ASSURED 172.25.254.99:0     0.0.26.10:0       192.168.0.20:0

其中 IP ... ASSURED 行即持久连接模板,保证同源后续请求继续发往 192.168.0.20。

**持久连接 + 火墙标记组合的价值:**把"多端口(80/443)"与"会话粘滞"两个问题一并解决------既避免轮询错乱,又保证同一客户的 http/https 都落在同一 RS,表单不丢、证书一致。

附:实战项目 ------ 用 LVS 对数据库读动作做负载均衡

思路:用 DR 模式把对 MySQL/MariaDB 3306 的读请求均衡到多台 RS。关键步骤(精简):

1部署 RS1/RS2 数据库: 安装 mariadb-server,配置不同 server-id(10 / 20),启动服务。

复制代码
[rs1+2]# dnf install mariadb-server -y
[rs1+2]# vim /etc/my.cnf.d/mariadb-server.cnf   # server-id=10 / 20
[rs1]# systemctl enable --now mariadb

2建立可远程登录授权用户(用于客户端经 LVS 连接)。

复制代码
[rs1+2]# mysql
MariaDB> create user root@'%' identified by 'lee';

3按 DR 模式完成网络设定:客户端设网关到路由器 NAT IP;路由器开内核路由 + SNAT;RS 的 lo 配 VIP、禁 arp 响应、网关指向路由。

4设定 LVS 调度策略(DR 模式,VIP=192.168.0.100:3306):

复制代码
[lvs]# ipvsadm -A -t 192.168.0.100:3306 -s rr
[lvs]# ipvsadm -a -t 192.168.0.100:3306 -r 192.168.0.10 -g
[lvs]# ipvsadm -a -t 192.168.0.100:3306 -r 192.168.0.20 -g

5客户端验证: 连 VIP 查询 @@server_id,可见读请求在 RS1/RS2 间轮询。

复制代码
[client]# mysql -uroot -p -h 192.168.0.100
MariaDB> select @@server_id;
+-------------+
|          20 |     # 第一次落到 RS2
MariaDB> exit
[client]# mysql -uroot -p -h 192.168.0.100
MariaDB> select @@server_id;
+-------------+
|          10 |     # 第二次落到 RS1,读负载均衡生效

**小结:**数据库读动作属无状态读请求,用 LVS(DR 模式,rr 算法)做负载均衡非常简单有效;若是写请求或需会话一致性,应叠加第六节的火墙标记与第七节的持久连接方案。

相关推荐
阿黎02142 小时前
Linux驱动
linux
tjjingpan2 小时前
HCIP-Datacom Core Technology V1.0_20 IPv6概述
linux·服务器·网络
云泽8082 小时前
Linux基础开发工具(三):Vim高级配置、Swap恢复机制与Sudo权限白名单详解
linux·运维·vim
Urbano2 小时前
服装厂入局自动化开袋设备:市场前景、机型选型与落地实效科普
运维·自动化
tju23333 小时前
Gitee Test是什么:从测试资产管理到自动化执行的工程化实践
运维·gitee·自动化
名字还没想好☜3 小时前
Kubernetes Pod 调度实战:nodeSelector、亲和性与 taint/toleration 把 Pod 放到指定节点
运维·云原生·容器·kubernetes·调度
qetfw3 小时前
CentOS 7 vsftpd.conf 配置文件详解:监听、用户、权限、被动模式与 TLS
linux·运维·centos·ftp·vsftpd
风曦Kisaki3 小时前
Kubernetes(K8s)笔记Day04:控制器(ReplicaSet 与Deployment),滚动更新及回滚,滚动更新策略,Pod 的 DNS 策略
linux·运维·笔记·docker·容器·kubernetes
code_whiter3 小时前
初阶linux2环境基础开发工具完整教程
linux