Linux Virtual Server (LVS)

Linux Virtual Server (LVS)

Linux Virtual Server (LVS)

一、LVS基础认知

1.1 LVS简介

LVS(Linux Virtual Server)是Linux内核层实现的高性能、高可用负载均衡集群技术,由章文嵩博士开发,现为Linux内核标准模块。其核心作用是将前端请求流量分发到后端多台真实服务器(RS),提升服务的并发处理能力和可用性,阿里四层SLB就是基于LVS+keepalived实现。

1.2 集群与分布式核心区别

系统性能扩展分为向上扩展(Scale UP,增强单台设备性能)和向外扩展(Scale Out,增加设备数量),LVS属于Scale Out方案,核心解决多设备的调度分配问题。

特性集群(Cluster)分布式(Distributed)
部署逻辑同一业务部署在多台服务器,功能/数据/代码一致一个业务拆分为多个子业务,各服务器功能/数据/代码不同
效率提升方式提高单位时间内执行的任务数缩短单个任务的执行时间
故障影响单台服务器故障,其他服务器可顶替单台节点故障,对应子业务直接失效
典型应用LVS负载均衡集群、Nginx集群Hadoop计算、Ceph存储、微服务架构

1.3 LVS核心术语

LVS集群的网络交互依赖以下核心IP/角色定义,访问流程为:CIP <--> VIP == DIP <--> RIP

  • VS:Virtual Server,调度器,核心负责流量分发
  • RS:Real Server,真实服务器,负责实际提供业务服务
  • CIP:Client IP,客户端主机IP
  • VIP:Virtual IP,调度器外网IP,对外开放的客户访问IP
  • DIP:Director IP,调度器内网IP,用于和后端RS通信
  • RIP:Real Server IP,真实服务器的IP地址

二、LVS核心知识点梳理

2.1 LVS四大工作模式

LVS通过不同的报文转发方式实现负载均衡,分为NAT、DR、TUN、FullNAT四种模式,其中NATDR为实际应用中最常用的模式,TUN和FullNAT仅作了解。四种模式的核心差异在于报文修改方式、网络拓扑、数据转发路径,核心总结如下:

工作模式核心转发原理数据路径特点网络要求端口映射适用场景
NAT多目标IP的DNAT,修改目标IP/端口请求+响应报文均经过VSRIP与DIP同网段,RS网关指向DIP支持后端服务器数量少的场景
DR(默认)重新封装MAC首部,IP/端口不变请求报文经VS,响应报文由RS直连客户端VS和RS同物理网络,均配置VIP不支持高并发、大流量场景
TUN原IP报文外封装新IP首部请求报文经VS,响应报文由RS直连客户端DIP/VIP/RIP均为公网IP不支持跨地域的RS集群
FullNAT同时修改请求报文的源/目标IP请求+响应报文均经过VSRIP与DIP可不同网段支持复杂网络拓扑场景
重点模式:DR模式核心特点

DR是LVS默认且应用最广泛的模式,性能远高于NAT模式(避免VS成为瓶颈),但需解决VIP地址冲突问题(VS和RS均配置VIP,需防止ARP广播导致的地址解析异常),解决方案有3种:

  1. 前端网关做静态绑定(VIP与VS的MAC地址);
  2. RS上使用arptables工具限制ARP请求;
  3. RS上修改内核参数arp_ignorearp_announce(最常用)。

2.2 LVS调度算法

LVS的调度算法分为静态算法(仅按算法本身调度,不考虑RS负载)和动态算法(根据RS实时负载状态调度,负载值Overhead越小越优先),4.15版本内核新增了FO/OVF算法,适用于灰度发布等场景。

2.2.1 静态调度算法
算法英文全称核心逻辑适用场景
RRRound Robin轮询,平均分配请求RS配置性能一致的场景
WRRWeighted RR加权轮询,权重越高调度次数越多RS配置性能不一致的场景
SHSource Hashing源IP哈希,同一IP请求固定到同一RS需会话绑定的场景
DHDestination Hashing目标IP哈希,同一目标地址请求固定到同一RS正向代理缓存(如宽带运营商)
2.2.2 动态调度算法

默认调度算法为WLC(加权最少连接),核心计算负载值Overhead,值越小优先级越高:

  1. LC:最少连接,Overhead = 活动连接数×256 + 非活动连接数,适用于长连接应用;
  2. WLC:加权最少连接,Overhead = (活动连接数×256 + 非活动连接数)/权重
  3. SED:最短预期延迟,Overhead = (活动连接数+1+非活动连接数)×256/权重,高权重RS优先;
  4. NQ:永不排队,第一轮均匀分配,后续按SED调度;
  5. LBLC/LBLCR:基于本地的最少连接,解决DH算法的负载不均衡问题。
2.2.3 内核新增算法
  1. FO:加权故障转移,遍历找到未过载+权重最高的RS,适用于灰度发布;
  2. OVF:溢出连接,权重最高的RS直到活动连接数超过权重值,再调度至下一个RS。

2.3 LVS管理工具:ipvsadm

LVS的集群配置与管理依赖ipvsadm工具,其核心功能为集群服务管理、RS管理、规则查看/保存/重载,先通过yum install ipvsadm -y安装,核心信息如下:

组件路径/命令作用
主程序/usr/sbin/ipvsadm核心配置命令
规则保存ipvsadm-save / ipvsadm -S保存调度规则到文件
规则重载ipvsadm-restore / ipvsadm -R从文件重载调度规则
配置文件/etc/sysconfig/ipvsadm调度规则持久化文件
系统服务ipvsadm.service开机自启LVS规则
ipvsadm核心命令
功能核心命令格式关键参数说明
添加集群服务ipvsadm -A -tu
添加RSipvsadm -a -tu
查看规则ipvsadm -Ln [--rate]-n不解析IP,--rate查看流量速率
保存规则ipvsadm -Sn > 配置文件路径持久化规则,防止重启失效
重载规则ipvsadm -R < 配置文件路径从文件恢复规则
清空规则ipvsadm -C清空所有调度规则
持久连接ipvsadm -A -t 服务地址 -s 算法 -p 超时时间默认定时360s,实现会话保持

三、LVS实验

实验分为NAT模式集群部署DR模式集群部署

3.1 实验1:NAT模式LVS集群部署

3.1.1 实验说明

实验目的:掌握NAT模式LVS集群的部署流程,验证RR/WRR调度算法的效果;

实验原理:VS通过DNAT修改请求报文的目标IP/端口,将流量分发到RS,RS响应报文经VS回传给客户端,RS网关必须指向VS的DIP;

实验环境

主机名IP地址角色核心配置要求
VS172.25.254.100(DIP)调度器(VS)双网卡(NAT+仅主机),开启内核路由
RS1192.168.0.10真实服务器(RS1)仅主机网卡,网关指向192.168.0.100
RS2192.168.0.20真实服务器(RS2)仅主机网卡,网关指向192.168.0.100
预期结果:测试机多次访问VIP,请求会按RR/WRR算法均匀/加权分发到RS1和RS2。
3.1.2 操作步骤(所有操作在root用户下执行)
步骤1:VS开启内核路由功能

NAT模式依赖Linux内核的IP转发功能,需开启,执行以下命令:

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

验证:执行sysctl -p,输出net.ipv4.ip_forward = 1即为成功。

步骤2:VS安装ipvsadm工具
yum install ipvsadm -y 
在这里插入图片描述
步骤3:修改调度算法为WRR,验证加权效果

将RS1权重设为2,RS2权重设为1,请求分发比例应为2:1:

# 1. 添加集群服务算法为WRR ipvsadm -A -t 172.25.254.100:80 -s wrr # 2. 添加RS1权重为2 ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m -w 2 # 3. 添加RS2权重为1 ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m -w 1 # 4. 查看修改后的规则 ipvsadm -Ln 
在这里插入图片描述

在测试机执行循环curl命令,验证加权效果:

for N in {1..6};do curl 172.25.254.100;done 
在这里插入图片描述

预期效果:RS1被调度4次,RS2被调度2次,比例2:1。

步骤4:持久化LVS调度规则

默认ipvsadm配置为临时生效,重启后丢失,需保存规则并设置开机自启:

# 1. 保存规则到配置文件 ipvsadm-save -n > /etc/sysconfig/ipvsadm # 2. 设置ipvsadm服务开机自启并启动 systemctl enable --now ipvsadm.service # 3. 验证服务状态 systemctl status ipvsadm.service 
在这里插入图片描述

3.2 实验2:DR模式LVS集群部署

3.2.1 实验说明

实验目的:掌握DR模式LVS集群的部署流程,解决VIP地址冲突问题,验证WRR调度算法;

实验原理:VS仅修改请求报文的MAC地址,RS直接将响应报文回传给客户端,VS和RS均配置VIP,需修改RS内核参数限制ARP解析;

实验环境

主机名IP地址VIP角色核心配置要求
client172.25.254.10测试机NAT网卡,可访问路由器
router172.25.254.100/192.168.0.10路由器双网卡(NAT+仅主机)
lvs192.168.0.100192.168.0.200调度器(VS)仅主机网卡,lo口配置VIP
RS1192.168.0.100192.168.0.200真实服务器1仅主机网卡,lo口配置VIP,修改内核参数
RS2192.168.0.100192.168.0.200真实服务器2仅主机网卡,lo口配置VIP,修改内核参数
预期结果:测试机访问VIP,请求经VS分发到RS,响应报文由RS直连测试机,实现高并发负载均衡。
3.2.2 操作步骤(核心步骤,省略基础网卡配置)
步骤1:所有RS(RS1/RS2)配置VIP到lo回环口

DR模式要求VS和RS均配置VIP,将VIP绑定到lo口(避免网卡冲突),执行以下命令:

# 编辑lo口网络配置 vim /etc/NetworkManager/system-connections/lo.nmconnection # 添加以下配置 [connection] id=lo type=loopback interface-name=lo [ethernet] [ipv4] address1=127.0.0.1/8 address2=192.168.0.200/32 method=manual # 重启lo口连接 nmcli connection up lo # 验证VIP配置:查看lo口IP ip addr show lo 
在这里插入图片描述
步骤2:所有RS(RS1/RS2)修改内核参数,解决VIP地址冲突

修改arp_ignorearp_announce,限制ARP请求/通告,两台RS操作完全一致

# 临时生效(重启后丢失,可写入sysctl配置实现永久生效) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
在这里插入图片描述

参数说明

  • arp_ignore=1:仅对请求的目标IP配置在接收接口上时,才响应ARP;
  • arp_announce=2:仅向本网络通告本机接口信息,避免VIP暴露。
步骤3:添加策略
#router iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.0.200 iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.100 #vscode ipvsadm -A -t 192.168.0.200:80 -s wrr ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g 
步骤4:测试机(client)验证DR模式负载均衡效果

在测试机执行循环curl命令,访问VIP,查看请求分发结果:

for N in {1..10};do curl 192.168.0.200;done 
在这里插入图片描述

预期效果:请求在RS1和RS2之间交替分发,响应报文由RS直连测试机,VS仅处理请求分发,无响应瓶颈。

步骤5:持久化DR模式调度规则

与NAT模式一致,保存规则并设置ipvsadm服务开机自启:

ipvsadm -Sn > /etc/sysconfig/ipvsadm systemctl enable --now ipvsadm.service 

Read more

基于 Rust 与 DeepSeek 大模型的智能 API Mock 生成器构建实录:从环境搭建到架构解析

基于 Rust 与 DeepSeek 大模型的智能 API Mock 生成器构建实录:从环境搭建到架构解析

前言 在现代软件工程中,API 接口的开发与前端联调往往存在时间差。为了解耦前后端开发进度,Mock 数据(模拟数据)的生成显得尤为关键。传统的 Mock 数据生成依赖于静态 JSON 文件或简单的规则引擎,难以覆盖复杂的业务逻辑与语义关联。随着大语言模型(LLM)的兴起,利用 AI 根据 Schema 定义动态生成高保真的模拟数据成为可能。本文详细记录了使用 Rust 语言结合 DeepSeek-V3.2 模型构建智能 Mock 生成器的完整技术路径,涵盖操作系统层面的环境准备、Rust 工具链的深度配置、代码层面的异步架构设计以及编译期的版本兼容性处理。 第一部分:Linux 系统底层的构建环境初始化 Rust 语言的编译与链接过程高度依赖于底层的系统工具链。Rust 编译器 rustc 在生成二进制文件时,需要调用链接器(Linker)将编译后的对象文件(Object Files)与系统库(

By Ne0inhk
Flutter for OpenHarmony 实战:Flutter Rust Bridge — 极致计算性能方案

Flutter for OpenHarmony 实战:Flutter Rust Bridge — 极致计算性能方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter for OpenHarmony 实战:Flutter Rust Bridge — 极致计算性能方案 前言 在 Flutter for OpenHarmony 的高性能应用场景中(如:超大数据量加密、实时音视频处理、复杂物理模拟),Dart 的性能虽然出色,但在面对 CPU 密集型任务时,往往需要更底层的语言辅助。 Rust 凭借其内存安全与极致性能,成为了移动端计算的“无冕之王”。而 Flutter Rust Bridge (FRB) 则是将 Dart 与 Rust 缝合在一起的顶尖架构。它能自动生成繁琐的 FFI 胶水代码,并支持异步、流式传输以及复杂的对象映射。本文将带你在鸿蒙系统上构建一套“双擎驱动”

By Ne0inhk

【Node.js 安装报错解决方案:解决“A later version of Node.js is already installed”问题】

Node.js 安装报错解决方案:解决“A later version of Node.js is already installed”问题 问题现象 当你在 Windows 系统上尝试安装 Node.js 时,可能会遇到以下错误提示: A later version of Node.js is already installed. Setup will now exit. 这个错误通常发生在已经安装了较新版本的 Node.js,而又尝试安装较旧版本时出现。 问题分析 为什么会发生这个错误? 1. 版本冲突:系统检测到已安装的 Node.js 版本比你要安装的版本更新 2. 安装程序限制:Node.

By Ne0inhk
KingbaseES数据库:融合架构重塑数据管理,一库多能解锁企业数字化新可能

KingbaseES数据库:融合架构重塑数据管理,一库多能解锁企业数字化新可能

KingbaseES数据库:融合架构重塑数据管理,一库多能解锁企业数字化新可能 前言 做开发和架构设计的朋友应该都有过这样的体验:企业业务越做越复杂,数据类型也跟着五花八门——交易系统的关系数据、物联网设备的时序数据、智慧场景的GIS空间数据、AI应用的向量数据,再加上各种日志和文档的非结构化数据。为了处理这些数据,公司往往要搭好几个数据库,Oracle管交易、InfluxDB管时序、MongoDB管文档,最后还要做各种数据同步和接口开发。不仅运维成本居高不下,数据孤岛更是让跨类型数据分析变成了难题,想做一次全局的业务洞察,光数据打通就要花上大半个月。 其实这几年行业里一直在说“融合数据库”,核心就是想解决“一型一库”的痛点,而国产数据库里,金仓数据库KingbaseES(简称KES)算是把融合架构做到了极致的代表。作为国内最早拥有自主知识产权的数据库企业,电科金仓深耕这个领域二十多年,从最初的关系型数据库,一步步迭代到现在的多模融合架构,真正实现了“一库多能”——一个数据库就能搞定关系、时序、文档、GIS、向量等多种数据类型的存储和分析,还能兼容Oracle、MySQL、SQ

By Ne0inhk