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/端口 请求+响应报文均经过VS RIP与DIP同网段,RS网关指向DIP 支持 后端服务器数量少的场景
DR(默认) 重新封装MAC首部,IP/端口不变 请求报文经VS,响应报文由RS直连客户端 VS和RS同物理网络,均配置VIP 不支持 高并发、大流量场景
TUN 原IP报文外封装新IP首部 请求报文经VS,响应报文由RS直连客户端 DIP/VIP/RIP均为公网IP 不支持 跨地域的RS集群
FullNAT 同时修改请求报文的源/目标IP 请求+响应报文均经过VS RIP与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 静态调度算法
算法 英文全称 核心逻辑 适用场景
RR Round Robin 轮询,平均分配请求 RS配置性能一致的场景
WRR Weighted RR 加权轮询,权重越高调度次数越多 RS配置性能不一致的场景
SH Source Hashing 源IP哈希,同一IP请求固定到同一RS 需会话绑定的场景
DH Destination 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 -t u
添加RS ipvsadm -a -t u
查看规则 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地址 角色 核心配置要求
VS 172.25.254.100(DIP) 调度器(VS) 双网卡(NAT+仅主机),开启内核路由
RS1 <192.168.0.10> 真实服务器(RS1) 仅主机网卡,网关指向<192.168.0.100>
RS2 <192.168.0.20> 真实服务器(RS2) 仅主机网卡,网关指向<192.168.0.100>
预期结果:测试机多次访问VIP,请求会按RR/WRR算法均匀/加权分发到RS1和RS2。
3.1.2 操作步骤(所有操作在root用户下执行)
步骤1:VS开启内核路由功能

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

Bash 复制代码
echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

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

步骤2:VS安装ipvsadm工具
Bash 复制代码
yum install ipvsadm -y
步骤3:修改调度算法为WRR,验证加权效果

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

Bash 复制代码
# 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命令,验证加权效果:

Bash 复制代码
for N in {1..6};do curl 172.25.254.100;done

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

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

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

Bash 复制代码
# 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 角色 核心配置要求
client 172.25.254.10 测试机 NAT网卡,可访问路由器
router 172.25.254.100/192.168.0.10 路由器 双网卡(NAT+仅主机)
lvs 192.168.0.100 192.168.0.200 调度器(VS) 仅主机网卡,lo口配置VIP
RS1 192.168.0.100 192.168.0.200 真实服务器1 仅主机网卡,lo口配置VIP,修改内核参数
RS2 192.168.0.100 192.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口(避免网卡冲突),执行以下命令:

Bash 复制代码
# 编辑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操作完全一致

Bash 复制代码
# 临时生效(重启后丢失,可写入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:添加策略
Bash 复制代码
#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,查看请求分发结果:

Bash 复制代码
for N in {1..10};do curl 192.168.0.200;done

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

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

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

Bash 复制代码
ipvsadm -Sn > /etc/sysconfig/ipvsadm
systemctl enable --now ipvsadm.service
相关推荐
蜡笔小炘2 小时前
Haproxy -- 高级功能配置及实用案例
linux·运维·服务器·haproxy
礼拜天没时间.2 小时前
Linux运维实战:巧用mv命令管理多版本Go环境,避免采坑
linux·运维·golang·centos
期待のcode2 小时前
Kubernetes与Minikube
运维·容器·kubernetes
鸠摩智首席音效师2 小时前
如何在 Ubuntu 上安装 phpMyAdmin ?
linux·运维·ubuntu
lihao lihao2 小时前
页面自动化常见函数重点说明
运维·自动化
Doro再努力2 小时前
【Linux操作系统16】Linux进程管理深度解析:从fork到内核链表设计
linux·运维·链表
iambooo2 小时前
基于日志的故障定位与自动化分析体系
运维·自动化
又来敲代码了2 小时前
LVS(Linux virual server)
lvs
杨云龙UP2 小时前
Oracle ASM归档日志自动清理:RMAN+crontab一键闭环(生产可用)
linux·运维·服务器·数据库·oracle·centos·ux