LVS负载均衡技术全解析
LVS负载均衡技术全解析
一、LVS简介
LVS(Linux Virtual Server,Linux虚拟服务器)是由章文嵩博士主导开发的开源负载均衡项目,目前已深度集成到Linux内核模块中,成为Linux系统原生支持的高性能负载均衡解决方案。其核心是在Linux内核层面实现基于IP地址的数据请求负载均衡调度,通过将终端用户的请求合理分配到后端多台真实服务器(Real Server),显著提升服务的并发处理能力、可用性与扩展性。
核心工作流程
- 请求接收:终端互联网用户从外部访问企业服务时,Web请求首先发送至LVS调度器(Director Server),用户仅感知调度器对外提供的统一虚拟IP(VIP)。
- 请求调度:调度器根据预设的负载均衡算法(如轮询、最少连接等),决定将请求转发至后端某一台真实服务器。例如,轮询算法(rr)会将请求平均分配给所有正常运行的真实服务器,确保负载均衡。
- 服务处理与透明化:真实服务器接收到请求后进行处理,若所有真实服务器连接相同的存储设备(如磁盘阵列)且提供一致的服务(如相同的Web内容、数据库数据),则无论请求被转发到哪台真实服务器,用户最终获取的服务内容完全一致,整个集群对用户保持透明。
- 数据回传:根据LVS工作模式的差异,真实服务器采用不同方式将处理结果回传至用户,LVS支持三种核心工作模式:NAT模式(Network Address Translation)、TUN模式(IP Tunneling)和DR模式(Direct Routing)。
关键术语与官方资源
- VIP(Virtual IP Address):虚拟IP地址,是LVS集群对外提供服务的统一入口,用户通过访问VIP发起请求。
- RIP(Real IP Address):真实服务器的IP地址,仅在集群内部网络中生效(部分模式除外),用于接收调度器转发的请求。
- 官方站点:http://www.linuxvirtualserver.org,可获取最新的项目文档、源码及技术支持。
二、LVS体系结构
LVS集群系统采用分层架构设计,从逻辑上分为三个核心层级,各层级功能独立且协同工作,确保集群对用户透明(用户仅感知一个高性能虚拟服务器),同时实现功能解耦与灵活扩展。
1. 负载均衡层(Load Balancer Layer)
- 组成:位于集群最前端,由1台或多台负载调度器(Director Server)组成,是请求调度的核心。
- 核心组件:
- LVS内核模块(ipvs):安装在Director Server上,维护预设的路由表,存储集群服务配置(如VIP、端口、调度算法)与真实服务器列表,负责将用户请求分发到后端真实服务器。
- Ldirectord监控模块:实时监测后端真实服务器的健康状态(如服务是否正常运行、端口是否开放、响应是否超时)。当某台真实服务器故障时,自动将其从LVS路由表中剔除;当服务器恢复正常后,重新将其加入路由表,确保集群服务不中断。
- 功能:接收用户请求,按算法分配请求,监控后端节点,相当于集群的“大脑”。
2. 服务器群组层(Server Array Layer)
- 组成:由多台运行实际应用服务的真实服务器(Real Server)组成,是集群的“业务处理单元”。
- 支持服务类型:可部署WEB服务器(如Apache、Nginx)、MAIL服务器(如Postfix)、FTP服务器(如vsftpd)、DNS服务器、视频服务器等,也可混合部署多种服务。
- 连接方式:真实服务器之间通过高速局域网(LAN)或广域网(WAN)连接,适用于本地集群(LAN)或跨地域分布式集群(WAN)。
- 灵活配置:在实际部署中,Director Server可同时兼任Real Server角色,充分利用硬件资源(需注意避免调度器负载过高)。
3. 数据共享存储层(Shared Storage Layer)
- 组成:为所有真实服务器提供统一的共享存储空间,确保服务内容一致性,通常由磁盘阵列设备(如RAID阵列、SAN存储区域网络)组成。
- 数据共享方案:
- NFS(Network File System):适用于简单场景,配置便捷,但在高并发业务中性能有限(存在IO瓶颈)。
- 集群文件系统:适用于高并发场景,如Red Hat的GFS(Global File System)、Oracle的OCFS2(Oracle Cluster File System 2),支持多台服务器同时读写,避免NFS的性能问题。
- 功能:保证所有真实服务器访问的数据源一致,避免因数据差异导致用户体验不一致。
4. 系统兼容性
角色 | 支持操作系统 |
---|---|
负载调度器(Director Server) | 仅支持Linux(2.6+内核原生支持LVS,无需额外配置)和FreeBSD(应用较少、性能一般) |
真实服务器(Real Server) | 支持几乎所有系统平台,包括Linux、Windows、Solaris、AIX、BSD系列 |
三、LVS管理工具
LVS的管理依赖内核层的ipvs
模块与用户空间的ipvsadm
命令行工具,二者协同实现集群配置、规则管理与状态监控。
1. ipvs(内核模块)
ipvs是LVS的核心组件,运行于Linux内核协议栈,实现IP层负载均衡,是LVS功能的“底层引擎”。
(1)总体结构
ipvs由三个核心模块与两个链表组成:
- IP包处理模块:接收用户请求数据包,解析IP地址、端口号、协议类型,判断请求是否匹配集群服务规则;若匹配,将数据包传递给调度算法模块。
- 负载均衡算法模块:实现LVS支持的所有调度算法(如轮询、最少连接),根据真实服务器的负载状态(连接数、权重)计算最优目标服务器,返回结果给IP包处理模块。
- 系统配置和管理模块:接收
ipvsadm
工具的配置命令(如添加集群服务、修改真实服务器权重),将配置同步到内核规则表,维护规则的持久化。 - 虚拟服务器与真实服务器链表:存储集群服务(虚拟服务器)与真实服务器的配置信息,是ipvs的数据核心。
(2)核心特性
- 支持同时定义多个集群服务(如同时提供HTTP服务与HTTPS服务),但过多服务可能增加调度器计算开销,影响性能,需根据硬件配置合理规划。
- 每个集群服务至少需关联1台真实服务器,否则无法提供实际服务,请求会被丢弃。
2. ipvsadm(用户空间命令行工具)
ipvsadm是LVS的用户交互工具,用于创建、修改、删除集群规则,查看集群状态,是运维人员管理LVS的主要入口。
(1)核心命令选项
命令选项 | 功能分类 | 具体作用 |
---|---|---|
-A | 集群服务管理 | 添加新集群服务,需配合-t (TCP协议)/-u (UDP协议)指定“VIP:Port”,-s 指定调度算法(如rr、wrr) |
-E/-D/-C | 集群服务管理 | -E 修改已有集群服务配置(如调整调度算法),-D 删除指定集群服务,-C 清空所有集群规则(谨慎使用) |
-R/-S | 规则备份/恢复 | -R 从标准输入(如文件)重载规则(用于恢复配置),-S 将当前规则保存到标准输出(如文件,用于备份) |
-a/-e/-d | 真实服务器管理 | -a 为指定集群服务添加真实服务器,-e 修改真实服务器配置(如权重),-d 从集群服务中删除真实服务器 |
-L/-l | 规则查看 | 列出所有集群服务与真实服务器规则,配合-n 以数字格式显示IP和端口(避免DNS反向解析延迟,提升查看效率) |
-t/-u | 协议指定 | -t 指定集群服务为TCP协议(格式:host[:port]),-u 指定为UDP协议(格式:host[:port]) |
-r | 真实服务器地址 | 指定真实服务器的IP和端口(格式:host[:port]),仅支持端口映射的LVS类型(如NAT模式)可使用与集群服务不同的端口 |
-g/-i/-m | 模式指定 | -g (默认)设置DR模式(Direct Routing),-i 设置TUN模式(IP Tunneling),-m 设置NAT模式(Network Address Translation) |
-w | 权重设置 | 为真实服务器指定权重(正整数,权重越高,分配到的请求越多),用于加权调度算法(如wrr、wlc) |
(2)核心功能与语法
ipvsadm的核心功能包括集群服务管理、真实服务器管理与规则查看,常用语法示例如下:
功能 | 语法示例 |
---|---|
添加TCP集群服务 | ipvsadm -A -t 172.16.30.10:80 -s rr (VIP:80,TCP协议,轮询算法) |
为集群服务添加真实服务器 | ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.20:80 -m (NAT模式,RIP:80) |
查看规则(数字格式) | ipvsadm -Ln (显示VIP、RIP、协议、调度算法、连接数等) |
备份规则 | ipvsadm -Sn > /etc/sysconfig/ipvsadm (推荐备份路径,避免重启丢失) |
恢复规则 | ipvsadm -R < /etc/sysconfig/ipvsadm 或 systemctl restart ipvsadm |
(3)注意事项
- ipvsadm命令需以root用户权限执行,否则无法修改内核层的ipvs规则。
- 备份规则时,建议使用
ipvsadm -Sn
(标准格式导出),而非直接复制文件,确保恢复时的兼容性。 - 若通过
systemctl restart ipvsadm
重启服务,需确保/etc/sysconfig/ipvsadm
文件存在且格式正确,否则服务可能启动失败。
四、LVS工作模式及原理
LVS支持三种核心工作模式,每种模式在请求转发机制、数据回传路径、网络架构要求和性能表现上差异显著,适用于不同的业务场景。以下详细解析每种模式的原理、注意事项、特点及优缺点。
1. NAT模式(Network Address Translation)
NAT模式基于网络地址转换技术实现请求调度,所有请求与响应数据包均需经过Director Server,适用于小规模内网集群
(2)工作原理
NAT模式的完整数据流向分为四个步骤,核心是通过地址转换实现请求转发与响应回传:
- 用户发起请求:客户端(CIP为客户端IP)向VIP发送请求,数据包源IP=CIP,目标IP=VIP,目标端口=集群服务端口(如80)。
- Director转发请求:Director Server接收到请求后,检查是否匹配集群规则。若匹配,按调度算法选择一台真实服务器(如RIP1=192.168.100.20),将数据包的目标IP改为RIP(目标端口可按需转换),转发至真实服务器。
- Real Server处理请求:真实服务器接收到数据包(目标IP=自身RIP),处理请求后生成响应数据包(源IP=RIP,目标IP=CIP)。由于真实服务器的默认网关已设置为Director的DIP,响应数据包会发送至Director Server。
- Director回传响应:Director Server接收到响应后,将数据包的源IP改为VIP(确保用户感知到响应来自虚拟服务器),然后回传至客户端,完成一次请求-响应流程。
(3)关键配置与注意事项
- Real Server网关设置:必须将所有真实服务器的默认网关指向Director Server的DIP(内网IP),否则响应数据包会直接发送至客户端(而非Director),导致客户端因无法识别RIP(内网IP)而丢弃响应。
- IP转发开启:Director Server需开启IP转发功能(
net.ipv4.ip_forward = 1
),否则无法转发数据包。 - 端口转换支持:NAT模式是唯一支持端口转换的模式,例如用户请求VIP:8080,可转发至真实服务器的80端口(通过
ipvsadm -a
命令的-r
选项指定真实服务器端口)。
(4)特点
- 性能瓶颈明显:所有请求与响应数据包均需经过Director Server,Director的网络带宽和处理能力成为集群瓶颈,仅支持小规模集群(通常≤20台真实服务器)。
- IP配置简单:仅Director需配置公网IP(VIP)和内网IP(DIP),真实服务器仅需内网IP(RIP),节省公网IP资源。
- 操作系统兼容性强:真实服务器可使用任何支持TCP/IP的系统(如Linux、Windows、Solaris),部署门槛低。
- 端口灵活性高:支持请求端口与真实服务器服务端口的映射,适用于后端服务端口不统一的场景。
(5)优缺点分析
优点 | 缺点 |
---|---|
真实服务器兼容性强,支持所有TCP/IP系统;仅Director需公网IP,成本低 | Director是性能瓶颈,集群规模受限;所有数据包经Director,延迟高 |
支持端口转换,后端服务端口配置灵活;真实服务器位于内网,安全性高 | 响应数据包需经过Director二次转换,增加内核处理开销;Director单点故障风险高 |
2. DR模式(Direct Routing)
DR模式基于数据链路层(MAC层)地址修改实现请求转发,响应数据包由真实服务器直接回传至客户端,无需经过Director Server,是LVS性能最优的模式,适用于局域网内大规模集群。
(2)工作原理
DR模式的核心是仅修改请求数据包的目标MAC地址(不修改IP),响应直接回传,大幅降低Director负载:
- 用户发起请求:客户端向VIP发送请求,数据包源IP=CIP,目标IP=VIP,目标MAC=Director外网网卡的MAC地址(通过ARP协议获取)。
- Director转发请求:Director接收到请求后,检查集群规则,按算法选择真实服务器,将数据包的目标MAC改为真实服务器的MAC地址(源MAC保持为Director的MAC),IP层信息(源IP、目标IP、端口)不变,通过局域网转发至真实服务器。
- Real Server处理请求:真实服务器接收到数据包(目标MAC=自身),解析后发现目标IP=VIP(已配置在lo接口),处理请求后生成响应数据包(源IP=VIP,目标IP=CIP),通过外网网卡直接回传至客户端(无需经过Director)。
- 客户端接收响应:客户端确认响应来自VIP,完成请求流程。
(3)关键配置与注意事项
- ARP抑制参数:由于所有真实服务器的lo接口均配置了VIP,需通过内核参数禁止真实服务器响应针对VIP的ARP请求(避免ARP风暴):
# 仅响应目标IP为自身接口IP的ARP请求 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 # ARP请求源IP使用发送接口的IP(RIP) net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2
- VIP配置规范:
- DR的VIP:配置在外网网卡的虚拟子接口(如ens33:0),子网掩码为32位(
/32
),确保VIP对外可见。 - 真实服务器的VIP:配置在lo接口(
ifconfig lo:0 192.168.100.100/32 up
),子网掩码32位,避免路由冲突。
- DR的VIP:配置在外网网卡的虚拟子接口(如ens33:0),子网掩码为32位(
- 网络架构要求:Director与所有真实服务器必须位于同一物理局域网(同一网段),因为MAC地址仅在局域网内有效,跨网段转发时MAC地址会被网关修改,导致DR模式失效。
- 端口限制:不支持端口转换,客户端请求端口与真实服务器服务端口必须一致(如请求80端口,真实服务器也需使用80端口)。
(4)特点
- 性能优异:仅请求数据包经过Director,响应直接回传,Director无性能瓶颈,支持大规模集群(≤数百台真实服务器)。
- 无隧道开销:相比TUN模式,无需封装IP隧道,数据包处理效率更高,延迟低。
- 网络依赖性强:必须部署在同一局域网,跨网段或跨地域场景无法使用,灵活性较低。
- 配置复杂度中等:需配置ARP抑制参数和VIP子接口,比NAT模式复杂,但比TUN模式简单。
(5)优缺点分析
优点 | 缺点 |
---|---|
响应不经过Director,无性能瓶颈,支持大规模集群;无隧道开销,延迟低 | 需同一局域网,不支持跨地域部署;不支持端口转换,端口需一致 |
真实服务器可直接回传响应,带宽利用率高;VIP仅在局域网可见,安全性高 | Windows真实服务器配置复杂(需修改注册表);需ARP抑制,配置门槛高 |
3. TUN模式(IP Tunneling)
TUN模式基于IP隧道技术(IP-over-IP encapsulation)实现请求转发,支持Director与真实服务器跨网段、跨地域部署,适用于分布式集群。
(2)工作原理
TUN模式的核心是IP隧道封装——Director将请求数据包封装在新的IP隧道中转发,真实服务器解封装后处理请求,响应直接回传至客户端:
- 用户发起请求:客户端向VIP发送请求,数据包源IP=CIP,目标IP=VIP,端口=集群服务端口(如80)。
- Director封装隧道数据包:Director接收到请求后,检查集群规则,按算法选择真实服务器,将原请求数据包(inner数据包)封装为新的IP隧道包(outer数据包):
- outer数据包源IP=Director的DIP,目标IP=真实服务器的RIP;
- 协议类型=4(IP-in-IP隧道协议),标识该数据包为隧道包。
封装完成后,通过公网或私网转发至真实服务器。
- Real Server解封装与处理请求:真实服务器需提前加载
ipip
隧道模块,配置tunl0隧道接口(IP=VIP)。接收到隧道数据包后,tunl0接口自动解封装,提取inner数据包(目标IP=VIP),处理请求后生成响应数据包(源IP=VIP,目标IP=CIP)。 - Real Server直接回传响应:响应数据包通过真实服务器的外网网卡直接回传至客户端,无需经过Director。
(3)关键配置与注意事项
- ipip隧道模块:
- 临时加载:
modprobe ipip
; - 永久加载:
echo "ipip" >> /etc/modules-load.d/ipip.conf
(系统重启后自动加载); - 验证:
lsmod | grep ipip
(输出ipip表示加载成功)。
- 临时加载:
- 反向路径过滤(RP Filter)关闭:真实服务器需关闭RP Filter,否则内核会认为隧道数据包的源IP(CIP)与接收接口(tunl0)的IP(VIP)不匹配,丢弃数据包:
net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.tunl0.rp_filter = 0
- VIP配置:Director与真实服务器均需在tunl0接口配置VIP(
ifconfig tunl0 192.168.100.55/32 up
),子网掩码32位。 - Real Server IP要求:真实服务器需配置公网IP或可直接路由至客户端的IP(如跨地域私网IP),否则响应数据包无法回传至客户端。
(4)特点
- 跨地域部署支持:Director与真实服务器可跨网段、跨地域部署(通过公网或私网隧道连接),适用于分布式集群(如多地灾备集群)。
- Director无性能瓶颈:仅请求数据包经过Director,响应直接回传,Director负载极低,支持大规模集群。
- 协议依赖性强:依赖IP-in-IP隧道协议,仅支持Linux真实服务器(需
ipip
模块),Windows、Solaris等系统支持较差。 - 隧道开销存在:IP隧道封装会增加数据包大小(额外20字节IP头部),导致带宽利用率下降约10%-15%,且封装/解封装过程增加内核处理延迟。
(5)优缺点分析
优点 | 缺点 |
---|---|
支持跨地域部署,灵活性高;Director无性能瓶颈,支持大规模集群 | 仅支持Linux真实服务器,兼容性差;隧道封装增加带宽开销与延迟 |
真实服务器可分散在不同地域,提升服务可用性(一地故障,其他地域接管) | 真实服务器需公网IP,IP资源成本高;需关闭RP Filter,安全性略有降低 |
4. 三种工作模式对比
对比维度 | NAT模式 | DR模式 | TUN模式 |
---|---|---|---|
网络架构要求 | Director接内外网,Real Server在内网 | Director与Real Server同一局域网 | 无地域限制,支持跨网段/跨地域 |
数据包流向 | 请求→Director→Real Server;响应→Real Server→Director→客户端 | 请求→Director→Real Server;响应→Real Server→客户端 | 请求→Director→Real Server;响应→Real Server→客户端 |
端口转换支持 | 支持(请求与Real Server端口可不同) | 不支持(端口必须一致) | 不支持(端口必须一致) |
Real Server IP需求 | 仅内网IP | 仅内网IP | 公网IP或可路由IP |
操作系统兼容性 | 所有TCP/IP系统(Linux、Windows等) | 主要支持Linux(Windows配置复杂) | 仅支持Linux(需ipip模块) |
集群规模 | 小规模(≤20台) | 中大规模(≤数百台) | 大规模(≤数百台) |
性能(延迟/吞吐量) | 低(所有包经Director,延迟高) | 高(无隧道开销,延迟低) | 中(隧道开销,延迟高于DR) |
适用场景 | 小规模内网服务(如企业内部Web) | 局域网大规模服务(如电商核心Web) | 跨地域分布式服务(如多地灾备) |
五、LVS调度算法
LVS调度算法决定请求如何分配到真实服务器,直接影响集群负载均衡效果与服务响应速度。根据是否考虑真实服务器的实时负载,算法分为静态调度算法(不考虑实时负载)和动态调度算法(基于实时负载调整),共10种核心算法。
1. 静态调度算法(4种)
静态算法不实时监测真实服务器的负载状态,仅按预设规则分配请求,实现简单、开销低,适用于服务器配置一致、负载稳定的场景。
(1)轮询调度(Round Robin,rr)
- 原理:将请求按顺序依次分配给所有真实服务器,不考虑服务器的连接数、负载或配置差异。例如,2台服务器时,请求分配顺序为“RS1→RS2→RS1→RS2”。
- 特点:公平分配,开销极低;适用于服务器配置完全一致、负载均匀的场景。
- 局限性:若服务器配置差异大,会导致低配置服务器过载,高配置服务器资源闲置。
(2)加权轮询调度(Weighted Round Robin,wrr)
- 原理:为每台真实服务器设置权重(正整数,权重与处理能力正相关),按权重比例分配请求。例如,RS1权重=2,RS2权重=1,请求分配顺序为“RS1→RS1→RS2→RS1→RS1→RS2”。
- 特点:支持按处理能力分配负载,权重可动态调整(无需重启服务);适用于服务器配置存在差异的场景。
- 局限性:权重是静态配置的,不实时考虑服务器当前负载(如高权重服务器临时过载,仍会分配大量请求)。
(3)源地址散列调度(Source Hashing,sh)
- 原理:根据客户端源IP(CIP)通过哈希函数计算哈希值,取模后分配到对应的真实服务器。同一客户端的IP固定,因此所有请求会分配到同一服务器。
- 特点:实现“会话粘滞”(Session Sticky),适用于需保持会话状态的服务(如未使用分布式会话的Web应用)。
- 局限性:若某一客户端请求量极大(如爬虫),会导致对应服务器过载;服务器数量变化时,哈希结果改变,会话状态丢失。
(4)目标地址散列调度(Destination Hashing,DH)
- 原理:根据请求的目标IP(如VIP或域名对应的IP)哈希计算,同一目标IP的请求分配到同一服务器。
- 特点:实现“目标IP粘滞”,适用于缓存服务(如DNS缓存、Web缓存),提升缓存命中率。
- 局限性:热门目标IP(如热门域名)会导致对应服务器过载;服务器数量变化时,缓存失效。
2. 动态调度算法(6种)
动态算法实时监测真实服务器的负载状态(如活跃连接数、响应时间),动态调整请求分配策略,适用于负载波动大、服务器配置差异大的场景。
(1)最少连接调度(Least Connections,lc)
- 原理:将请求分配给当前活跃连接数最少的服务器(活跃连接数指正在处理的请求连接)。
- 核心公式:
Overhead = 活跃连接数
,选择Overhead最小的服务器。 - 特点:动态平衡负载,避免单一服务器过载;适用于服务器配置相近、负载波动小的场景(如Web服务、API服务)。
- 局限性:不考虑服务器配置差异,高配置服务器可能因连接数少而资源闲置。
(2)加权最少连接调度(Weighted Least Connections,wlc)
- 原理:结合服务器权重与活跃连接数,计算“加权活跃连接数”,分配给加权活跃连接数最少的服务器。
- 核心公式:
Overhead = 活跃连接数 / 权重
,选择Overhead最小的服务器。 - 特点:兼顾处理能力与实时负载,是LVS最常用的动态算法;适用于服务器配置差异大、负载波动大的场景(如电商促销、高并发API)。
- 优势:权重可动态调整,适应服务器状态变化(如临时降低过载服务器的权重)。
(3)基于局部性的最少连接调度(Locality-Based Least Connections,lblc)
- 原理:按请求目标IP哈希,优先分配至缓存该目标IP内容的服务器;若该服务器过载或不可用,按wlc算法选择新服务器。
- 特点:兼顾缓存命中率与负载均衡,适用于缓存服务(如Web缓存、数据库查询缓存)。
- 局限性:仅适用于缓存服务,普通服务使用时缓存命中率提升不明显。
(4)复杂的基于局部性最少连接调度(Locality-Based Least Connections with Replication,lblcr)
- 原理:为每个目标IP维护多台服务器映射(而非单一映射),从映射列表中选择负载最低的服务器;若列表中服务器均过载,复制缓存内容到新服务器并加入列表。
- 特点:避免热门目标IP导致的单点过载,支持缓存复制;适用于高并发缓存服务(如CDN、热门新闻缓存)。
- 局限性:算法复杂度高,维护缓存复制的开销大。
(5)最少期望延迟调度(Shortest Expected Delay,sed)
- 原理:计算服务器处理新请求的期望延迟,分配给期望延迟最小的服务器。
- 核心公式:
Expected Delay = (活跃连接数 + 1) / 权重
,选择期望延迟最小的服务器。 - 特点:通过“+1”惩罚项,更倾向于分配给高权重服务器(即使有少量活跃连接),充分利用高配置服务器资源。
- 适用场景:服务器配置差异显著(如高性能物理机与虚拟机混合部署)。
(6)永不排队调度(Never Queue,nq)
- 原理:优先分配给活跃连接数为0的空闲服务器;若无空闲服务器,退化为sed算法。
- 特点:避免请求排队,降低响应延迟;适用于请求量波动大、需实时响应的场景(如实时交易系统、即时通讯)。
- 局限性:所有服务器繁忙时,退化为sed算法,仍需依赖权重与连接数分配。
3. 调度算法选择建议
业务场景 | 推荐算法 | 选择理由 |
---|---|---|
服务器配置一致,负载稳定(如企业内网Web) | rr/wrr | 简单高效,rr公平分配,wrr适应轻微配置差异 |
服务器配置差异大,负载波动(如电商Web) | wlc/sed | wlc兼顾负载与权重,sed优先利用高配置服务器 |
需保持客户端会话(如未用分布式会话) | sh | 实现会话粘滞,避免会话丢失 |
缓存服务(如CDN、DNS缓存) | dh/lblc/lblcr | dh实现目标IP粘滞,lblc提升缓存命中率,lblcr避免热门内容过载 |
实时服务(如交易系统) | nq | 优先分配空闲服务器,避免排队,确保实时响应 |
六、LVS实践配置
以下基于CentOS 7系统,提供NAT、DR、TUN三种模式的完整配置步骤。
1. 基础环境准备(所有主机)
# 1. 关闭防火墙与SELinux(避免网络拦截)
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
setenforce 0 # 临时关闭SELinux,重启后永久生效# 2. 安装基础工具
yum -y install curl vim net-tools # net-tools包含ifconfig、route等命令
2. 配置LVS-NAT模式(HTTP/HTTPS)
NAT模式适用于小规模内网集群,以下配置HTTP(80端口)和HTTPS(443端口)服务的负载均衡。
(1)环境信息
主机角色 | 网卡信息 | IP配置 | 安装应用 |
---|---|---|---|
Client | ens33(NAT模式) | 172.16.30.20/24 | 无 |
DR(Director) | ens33(DIP,内网)、ens36(VIP,仅主机) | DIP:192.168.100.10/24;VIP:172.16.30.10/24 | ipvsadm |
RS1 | ens33(RIP,内网) | RIP:192.168.100.20/24;网关=DIP | httpd、mod_ssl |
RS2 | ens33(RIP,内网) | RIP:192.168.100.30/24;网关=DIP | httpd、mod_ssl |
(2)配置真实服务器(RS1、RS2)
① 配置网络IP
RS1配置:
# 编辑ens33网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens133
# 配置内容(删除无关项)
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.20 # RIP
PREFIX=24
GATEWAY=192.168.100.10 # 网关指向DR的DIP(NAT模式核心)
DNS1=8.8.8.8# 重启网络服务并验证
systemctl restart network
ip a show ens33 # 确认IP与网关配置正确
RS2配置(仅IPADDR不同,其他与RS1一致):
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.30
systemctl restart network
ip a show ens33
② 部署HTTP服务(Apache)
RS1配置:
# 安装httpd
yum -y install httpd
# 创建测试页面(修正原文档的内容一致问题)
echo "RS1" > /var/www/html/index.html
# 启动服务并设置开机启动
systemctl restart httpd
systemctl enable httpd
# 本地验证
curl http://127.0.0.1 # 应输出"RS1"
RS2配置:
yum -y install httpd
echo "RS2" > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
curl http://127.0.0.1 # 应输出"RS2"
③ 部署HTTPS服务(自签名证书)
HTTPS服务需SSL证书,以下采用自签名证书(生产环境建议使用CA机构颁发的证书):
步骤1:在DR上创建CA根证书(证书颁发机构)
# 创建CA目录结构
mkdir -p /etc/pki/CA/{private,newcerts}
cd /etc/pki/CA
# 生成CA私钥(权限077,仅root可读写)
(umask 077; openssl genrsa -out private/cakey.pem 2048)
# 生成CA根证书(有效期1024天)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
# 填写证书信息(示例)
# Country Name (2 letter code) [XX]:CN
# State or Province Name (full name) []:HB
# Locality Name (eg, city) [Default City]:WH
# Organization Name (eg, company) [Default Company Ltd]:HY
# Organizational Unit Name (eg, section) []:Linux
# Common Name (eg, your name or your server's hostname) []:LVS-CA
# Email Address []:ca@example.com# 初始化CA数据库
touch index.txt # 证书索引文件
echo 01 > serial # 证书序列号(从01开始)
步骤2:在RS1上生成证书请求(CSR)并发送给DR
# 安装mod_ssl(Apache的SSL模块)
yum -y install mod_ssl
# 创建SSL证书目录
mkdir /etc/httpd/ssl
cd /etc/httpd/ssl
# 生成RS1的私钥
(umask 077; openssl genrsa -out httpd.key 2048)
# 生成证书请求文件(CSR)
openssl req -new -key httpd.key -out httpd.csr
# 填写证书信息(Common Name建议与服务器IP或域名一致)
# Country Name (2 letter code) [XX]:CN
# State or Province Name (full name) []:HB
# Locality Name (eg, city) [Default City]:WH
# Organization Name (eg, company) [Default Company Ltd]:HY
# Organizational Unit Name (eg, section) []:Linux
# Common Name (eg, your name or your server's hostname) []:192.168.100.20
# Email Address []:rs1@example.com
# 其他选项(Challenge Password、Optional company name)直接回车# 将CSR文件发送给DR
scp httpd.csr root@192.168.100.10:/root/
步骤3:在DR上签署证书并回传RS1
# 进入CA目录
cd /etc/pki/CA
# 签署证书(有效期1024天)
openssl ca -in /root/httpd.csr -out /root/httpd.crt -days 1024
# 确认签署(输入y两次)
# Sign the certificate? [y/n]:y
# 1 out of 1 certificate requests certified, commit? [y/n]:y# 将签署后的证书(httpd.crt)和CA根证书(cacert.pem)发送给RS1
scp /root/httpd.crt root@192.168.100.20:/etc/httpd/ssl/
scp cacert.pem root@192.168.100.20:/etc/httpd/ssl/
步骤4:配置RS1与RS2的HTTPS服务
RS1配置:
# 编辑Apache的SSL配置文件
vim /etc/httpd/conf.d/ssl.conf
# 修改以下三个参数(指向实际证书路径)
SSLCertificateFile /etc/httpd/ssl/httpd.crt # RS1的证书
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key # RS1的私钥
SSLCACertificateFile /etc/httpd/ssl/cacert.pem # CA根证书# 重启httpd服务
systemctl restart httpd
# 本地验证(-k忽略自签名证书警告)
curl -k https://127.0.0.1 # 应输出"RS1"
RS2配置(复制RS1的证书,简化配置):
# 安装mod_ssl
yum -y install mod_ssl
# 创建SSL目录
mkdir /etc/httpd/ssl
# 从RS1复制证书文件
scp root@192.168.100.20:/etc/httpd/ssl/{httpd.crt,httpd.key,cacert.pem} /etc/httpd/ssl/
# 配置SSL(同RS1)
vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
SSLCACertificateFile /etc/httpd/ssl/cacert.pem
# 重启服务并验证
systemctl restart httpd
curl -k https://127.0.0.1 # 应输出"RS2"
(3)配置调度器(DR)
① 配置网络IP(DIP与VIP)
# 配置ens33(内网,DIP)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.10 # DIP
PREFIX=24
DNS1=8.8.8.8# 配置ens36(仅主机模式,VIP)
nmcli connection add con-name ens36 ifname ens36 type ethernet # 创建连接
vim /etc/sysconfig/network-scripts/ifcfg-ens192
TYPE=Ethernet
BOOTPROTO=static
NAME=ens36
DEVICE=ens36
ONBOOT=yes
IPADDR=172.16.30.10 # VIP(对外服务IP)
PREFIX=24
DNS1=8.8.8.8# 重启网络服务并验证
systemctl restart network
ip a show ens33 # 确认DIP
ip a show ens36 # 确认VIP
② 开启IP转发(NAT模式必需)
# 编辑内核参数配置文件(修正原文档的文件名错误)
vim /etc/sysctl.conf
# 添加以下内容
net.ipv4.ip_forward = 1# 使内核参数生效
sysctl -p
# 验证IP转发是否开启(输出1表示开启)
sysctl net.ipv4.ip_forward
③ 安装ipvsadm并配置LVS规则
# 安装ipvsadm
yum -y install ipvsadm# 配置HTTP服务规则(VIP:80,轮询算法,NAT模式)
ipvsadm -A -t 172.16.30.10:80 -s rr # 添加HTTP集群服务
ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.20:80 -m # 添加RS1
ipvsadm -a -t 172.16.30.10:80 -r 192.168.100.30:80 -m # 添加RS2# 配置HTTPS服务规则(VIP:443,轮询算法,NAT模式)
ipvsadm -A -t 172.16.30.10:443 -s rr # 添加HTTPS集群服务
ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.20:443 -m # 添加RS1
ipvsadm -a -t 172.16.30.10:443 -r 192.168.100.30:443 -m # 添加RS2# 查看LVS规则(验证配置)
ipvsadm -Ln
# 预期输出:
# TCP 172.16.30.10:80 rr
# -> 192.168.100.20:80 Masq 1 0 0
# -> 192.168.100.30:80 Masq 1 0 0
# TCP 172.16.30.10:443 rr
# -> 192.168.100.20:443 Masq 1 0 0
# -> 192.168.100.30:443 Masq 1 0 0 # 保存规则(避免系统重启后丢失)
ipvsadm -Sn > /etc/sysconfig/ipvsadm
# 重启ipvsadm服务并设置开机启动
systemctl restart ipvsadm
systemctl enable ipvsadm
(4)客户端测试
# 配置客户端IP(与VIP在同一网段,172.16.30.0/24)
#配置仅主机模式
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=172.16.30.20 # 客户端IP(原文档已配置)
PREFIX=24
DNS1=8.8.8.8
systemctl restart NetworkManager# 测试HTTP服务(多次执行,验证轮询)
curl http://172.16.30.10
# 预期输出交替出现:RS1、RS2# 测试HTTPS服务(-k忽略证书警告,多次执行验证轮询)
curl -k https://172.16.30.10:443
# 预期输出交替出现:RS1、RS2
3. 配置LVS-DR模式(HTTP)
DR模式适用于局域网内大规模集群,以下配置HTTP服务的负载均衡(HTTPS配置类似,仅需调整端口为443)。
(1)环境信息
主机角色 | IP配置 | 安装应用 |
---|---|---|
Client | 192.168.100.200/24 | 无 |
DR | DIP:192.168.100.10/24;VIP:192.168.100.100/32(ens33:lo子接口) | ipvsadm |
RS1 | RIP:192.168.100.20/24;VIP:192.168.100.100/32(lo接口) | httpd |
RS2 | RIP:192.168.100.30/24;VIP:192.168.100.100/32(lo接口) | httpd |
(2)配置真实服务器(RS1、RS2)
① 配置网络IP与ARP抑制参数
RS1配置:
# 配置RIP(无需网关,DR模式响应直接回传)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.20 # RIP
PREFIX=24
DNS1=8.8.8.8
systemctl restart network# 配置ARP抑制参数(避免ARP风暴,核心步骤)
vim /etc/sysctl.conf
# 添加以下参数:
net.ipv4.conf.all.arp_ignore = 1 # 仅响应目标IP为自身接口IP的ARP请求
net.ipv4.conf.all.arp_announce = 2 # ARP请求源IP使用发送接口IP
net.ipv4.conf.lo.arp_ignore = 1 # lo接口同样抑制ARP
net.ipv4.conf.lo.arp_announce = 2# 使内核参数生效
sysctl -p# 在lo接口配置VIP(32位子网掩码,避免路由冲突)
ifconfig lo:0 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
# 验证VIP配置
ip a show lo # 应显示lo:0@lo: ... inet 192.168.100.100/32 ...route add -host 192.168.100.100 dev lo
RS2配置(与RS1一致,仅RIP不同):
# 配置RIP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.30 # RIP
systemctl restart network# 配置ARP抑制参数(同RS1)
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p# 配置lo接口VIP
ifconfig lo:0 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up
ip a show lo # 验证VIP
route add -host 192.168.100.100 dev lo
② 部署HTTP服务
RS1配置:
yum -y install httpd
echo "RS1 - DR Mode" > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
curl http://127.0.0.1 # 验证,输出"RS1 - DR Mode"
RS2配置:
yum -y install httpd
echo "RS2 - DR Mode" > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
curl http://127.0.0.1 # 验证,输出"RS2 - DR Mode"
(3)配置调度器(DR)
① 配置网络IP(DIP与VIP)
# 配置DIP(内网网卡ens33)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.10 # DIP
PREFIX=24
DNS1=8.8.8.8# 配置VIP(外网网卡ens33的虚拟子接口,修正原文档的lo接口错误)
ifconfig lo:0 192.168.100.100/32 broadcast 192.168.100.100 netmask 255.255.255.255 up# 重启网络服务并验证
systemctl restart network
ip a show ens33 # 验证DIP与VIP(ens33:0子接口)#配置#开路由转发
② 安装ipvsadm并配置LVS规则
yum -y install ipvsadm# 配置DR模式规则(-g指定DR模式,轮询算法)
ipvsadm -A -t 192.168.100.100:80 -s rr # 添加HTTP集群服务(VIP:80)
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.20:80 -g # 添加RS1
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.30:80 -g # 添加RS2# 查看规则(验证DR模式配置)
ipvsadm -Ln
# 预期输出:
# TCP 192.168.100.100:80 rr
# -> 192.168.100.20:80 Route 1 0 0
# -> 192.168.100.30:80 Route 1 0 0 # 保存规则并设置开机启动
ipvsadm -Sn > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
systemctl enable ipvsadm
(4)客户端测试
# 配置客户端IP(与DR、RS在同一局域网,192.168.100.0/24)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.200 # 客户端IP
PREFIX=24
systemctl restart network# 测试HTTP服务(多次执行,验证轮询)
curl http://192.168.100.100
# 预期输出交替出现:RS1 - DR Mode、RS2 - DR Mode
4. 配置LVS-TUN模式(HTTP)
TUN模式适用于跨地域集群,以下配置HTTP服务的负载均衡,需注意隧道模块加载与RP Filter关闭。
(1)环境信息
主机角色 | IP配置 | 安装应用 |
---|---|---|
Client | 192.168.100.40/24 | 无 |
DR | DIP:192.168.100.10/24;VIP:192.168.100.55/32(tunl0接口) | ipvsadm |
RS1 | RIP:192.168.100.20/24;VIP:192.168.100.55/32(tunl0接口) | httpd |
RS2 | RIP:192.168.100.30/24;VIP:192.168.100.55/32(tunl0接口) | httpd |
(2)配置真实服务器(RS1、RS2)
① 加载ipip隧道模块(永久生效)
# 临时加载ipip模块(立即生效)
modprobe ipip
# 永久加载(系统重启后自动加载)
echo "ipip" >> /etc/modules-load.d/ipip.conf
# 验证模块加载(输出ipip表示成功)
lsmod | grep ipip
② 配置网络IP与内核参数
RS1配置:
# 配置RIP(模拟跨网段,与DR的DIP不在同一网段)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.20 # RIP(跨网段)
PREFIX=24
DNS1=8.8.8.8
systemctl restart NetworkManager# 配置内核参数(关闭RP Filter,抑制ARP)
vim /etc/sysctl.conf
# 添加以下参数:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.rp_filter = 0 # 关闭反向路径过滤(隧道必需)
net.ipv4.conf.tunl0.rp_filter = 0# 使参数生效
sysctl -p# 在tunl0隧道接口配置VIP(32位子网掩码)
ifconfig tunl0 192.168.100.55/32 broadcast 192.168.100.55 netmask 255.255.255.255 up
# 验证VIP配置
ip a show tunl0 # 应显示tunl0: <POINTOPOINT,UP,LOWER_UP> ... inet 192.168.100.55/32 ...
RS2配置(与RS1一致,仅RIP不同):
# 配置RIP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.30 # RIP(跨网段)
systemctl restart network# 配置内核参数(同RS1)
vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.tunl0.arp_ignore = 1
net.ipv4.conf.tunl0.arp_announce = 2
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.tunl0.rp_filter = 0
sysctl -p# 配置tunl0接口VIP
ifconfig tunl0 192.168.100.55/32 broadcast 192.168.100.55 netmask 255.255.255.255 up
ip a show tunl0 # 验证VIP
③ 部署HTTP服务
RS1配置:
yum -y install httpd
echo "RS1 - TUN Mode" > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
curl http://127.0.0.1 # 验证,输出"RS1 - TUN Mode"
RS2配置:
yum -y install httpd
echo "RS2 - TUN Mode" > /var/www/html/index.html
systemctl restart httpd
systemctl enable httpd
curl http://127.0.0.1 # 验证,输出"RS2 - TUN Mode"
(3)配置调度器(DR)
① 开启IP转发与加载隧道模块
# 开启IP转发(TUN模式必需)
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p# 加载ipip模块(同Real Server)
modprobe ipip
echo "ipip" >> /etc/modules-load.d/ipip.conf
lsmod | grep ipip # 验证
② 配置网络IP(DIP与VIP)
# 配置DIP(与Real Server跨网段通信的IP)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.100.10 # DIP(跨网段)
PREFIX=24
DNS1=8.8.8.8# 配置VIP(tunl0隧道接口)
ifconfig tunl0 192.168.100.55/32 broadcast 192.168.100.55 netmask 255.255.255.255 up# 重启网络服务并验证
systemctl restart network
ip a show ens33 # 验证DIP
ip a show tunl0 # 验证VIP
③ 配置LVS规则(TUN模式)
yum -y install ipvsadm# 配置TUN模式规则(-i指定TUN模式,轮询算法)
ipvsadm -A -t 192.168.100.55:80 -s rr # 添加HTTP集群服务(VIP:80)
ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.20:80 -i # 添加RS1
ipvsadm -a -t 192.168.100.55:80 -r 192.168.100.30:80 -i # 添加RS2# 查看规则(验证TUN模式配置)
ipvsadm -Ln
# 预期输出:
# TCP 192.168.100.55:80 rr
# -> 192.168.200.20:80 Tunnel 1 0 0
# -> 192.168.200.30:80 Tunnel 1 0 0 # 保存规则并设置开机启动
ipvsadm -Sn > /etc/sysconfig/ipvsadm
systemctl restart ipvsadm
systemctl enable ipvsadm
(4)客户端测试
# 配置客户端IP(可访问DR的VIP,192.168.100.0/24)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.100.40 # 客户端IP
PREFIX=24
systemctl restart network# 测试HTTP服务(多次执行,验证轮询)
curl http://192.168.100.55
# 预期输出交替出现:RS1 - TUN Mode、RS2 - TUN Mode
七、总结
LVS作为Linux内核原生的负载均衡解决方案,凭借高性能、高稳定性与灵活的工作模式,成为构建高可用服务器集群的核心技术。本文基于原文档,系统梳理了LVS的简介、体系结构、管理工具、工作模式、调度算法及实践配置,纠正了原文档中的IP冲突、配置文件路径错误、VIP配置接口错误等问题,并补充了详细的原理说明与验证步骤。
核心要点回顾
- 体系结构:LVS由负载均衡层、服务器群组层、数据共享存储层组成,各层级功能解耦,确保集群透明性与可扩展性。
- 管理工具:
ipvs
(内核模块)实现负载均衡核心功能,ipvsadm
(用户工具)负责规则管理,二者协同工作。 - 工作模式:
- NAT模式:配置简单,适用于小规模内网集群,但Director是瓶颈。
- DR模式:性能最优,适用于局域网大规模集群,但需同一网段。
- TUN模式:支持跨地域部署,适用于分布式集群,但仅支持Linux真实服务器。
- 调度算法:静态算法(rr、wrr、sh、dh)适用于负载稳定场景,动态算法(wlc、lblc、sed、nq)适用于负载波动大、配置差异大的场景。
- 实践配置:需注意网络IP、内核参数、规则保存等细节,确保集群正常运行并通过客户端测试验证。
通过合理选择LVS工作模式与调度算法,结合健康监控(Ldirectord)与高可用方案(如Keepalived),可构建稳定、高效、自愈的负载均衡集群,满足从内网小规模服务到跨地域大规模服务的各类业务需求。
LVS三种工作模式对比:流程拆解+通俗讲解+可视化图表
LVS的NAT、DR、TUN三种模式,本质是“请求怎么分、响应怎么传”的三种不同方案。为了让大家更直观理解,我们先明确3个核心IP(类比物流中的关键地址),再拆解每种模式的完整流程,最后用流程图和表格总结差异。
一、先搞懂3个核心概念(基础必备)
就像物流需要“总仓地址、仓库地址、客户地址”,LVS也有3个关键IP,所有数据流转都围绕它们:
- VIP(虚拟IP):对外的“总仓地址”,用户只知道这个IP,是请求的入口。
- RIP(真实服务器IP):后端“仓库地址”,真实处理请求的服务器IP,用户看不到。
- DIP(调度器IP):“物流调度中心地址”,负责把用户请求分给真实服务器。
二、三种模式详解:流程拆解+流程图+通俗解读
1. NAT模式(网络地址转换):“调度中心包办收发”
(1)完整工作流程(分4步)
假设用户IP(CIP)=192.168.1.100,VIP=172.16.30.10,DIP=192.168.100.10,RIP1=192.168.100.20,RIP2=192.168.100.30:
- 用户发请求:用户向VIP(172.16.30.10)发送HTTP请求,数据包信息:
源IP=CIP(192.168.1.100),目标IP=VIP(172.16.30.10),目标端口=80
。 - 调度中心转发请求:调度器(DIP=192.168.100.10)收到请求,按轮询算法选RIP1(192.168.100.20),修改数据包的目标IP为RIP1,新数据包信息:
源IP=CIP,目标IP=RIP1,目标端口=80
,然后转发给RIP1。 - 真实服务器处理并回传:RIP1处理请求后,生成响应数据包,信息:
源IP=RIP1,目标IP=CIP
。由于RIP1的默认网关指向DIP,响应包会先发给调度器。 - 调度中心回传用户:调度器收到响应包,修改源IP为VIP,新数据包信息:
源IP=VIP,目标IP=CIP
,最后发给用户,完成一次交互。
(2)流程图(极简版)
graph LR
A[用户(CIP)] -->|请求:CIP→VIP| B[调度器(DIP)]
B -->|转发:CIP→RIP1(改目标IP)| C[真实服务器1(RIP1)]
C -->|响应:RIP1→CIP| B
B -->|回传:VIP→CIP(改源IP)| A
(3)通俗解读
NAT模式像“小区代收点”:用户把快递(请求)寄到代收点(调度器),代收点改地址后转给小区里的仓库(真实服务器);仓库发快递(响应)时,必须先寄回代收点,代收点改寄件人后再发给用户。所有快递都绕不开代收点,代收点忙了就会堵。
2. DR模式(直接路由):“调度中心只分单,仓库直接送货”
(1)完整工作流程(分3步)
假设CIP=192.168.1.100,VIP=192.168.100.100,DIP=192.168.100.10,RIP1=192.168.100.20,RIP2=192.168.100.30(所有设备在同一局域网):
- 用户发请求:用户向VIP(192.168.100.100)发请求,数据包信息:
源IP=CIP,目标IP=VIP,目标MAC=DIP的MAC(调度器网卡地址)
。 - 调度中心转发请求:调度器收到请求,按轮询算法选RIP1,不改IP(仍为VIP),只改目标MAC为RIP1的MAC,新数据包信息:
源IP=CIP,目标IP=VIP,目标MAC=RIP1的MAC
,通过局域网发给RIP1。 - 真实服务器直接回传用户:RIP1的lo接口已配置VIP(192.168.100.100),看到目标MAC是自己,就处理请求;生成响应包:
源IP=VIP,目标IP=CIP
,直接通过外网网卡发给用户,不经过调度器。
(2)流程图(极简版)
graph LR
A[用户(CIP)] -->|请求:CIP→VIP(目标MAC=DIP的MAC)| B[调度器(DIP)]
B -->|转发:CIP→VIP(改目标MAC=RIP1的MAC)| C[真实服务器1(RIP1)]
C -->|响应:VIP→CIP(直接发送)| A
(3)通俗解读
DR模式像“外卖调度”:用户下单时填“品牌总店名”(VIP),订单先到调度中心(DIP);调度中心不改“店名”,只改“配送员电话”(目标MAC),把订单转给对应外卖店(RIP);外卖店做好餐后,直接打电话联系用户(响应直达),不用再绕回调度中心。
3. TUN模式(IP隧道):“调度中心用隧道传单,仓库直接送货”
(1)完整工作流程(分3步)
假设CIP=192.168.1.100,VIP=192.168.100.55,DIP=192.168.200.10(调度器在A地),RIP1=192.168.300.20(真实服务器在B地,有公网IP):
- 用户发请求:用户向VIP(192.168.100.55)发请求,数据包信息:
源IP=CIP,目标IP=VIP
。 - 调度中心封装隧道转发:调度器收到请求,按轮询算法选RIP1,给原数据包套一层“隧道外壳”(新IP头部):外壳的
源IP=DIP(192.168.200.10),目标IP=RIP1(192.168.300.20)
,通过公网把“双层数据包”发给RIP1。 - 真实服务器解封装并直接回传:RIP1加载了ipip隧道模块,拆开“隧道外壳”,看到内层数据包的目标IP是VIP(已配置在tunl0接口),处理请求后生成响应包:
源IP=VIP,目标IP=CIP
,用自己的公网IP直接发给用户,不经过调度器。
(2)流程图(极简版)
graph LR
A[用户(CIP)] -->|请求:CIP→VIP| B[调度器(DIP)]
B -->|隧道封装:外层(DIP→RIP1)+内层(CIP→VIP)| C[真实服务器1(RIP1,公网IP)]
C -->|解封装→响应:VIP→CIP(直接发送)| A
(3)通俗解读
TUN模式像“跨城快递+同城配送”:用户寄快递到“品牌总仓”(VIP),先到本地调度中心(DIP);调度中心给快递套一个“跨城专用袋”(隧道封装),写清楚“跨城收件地址”(RIP的公网IP),通过长途物流(公网)寄到异地仓库;仓库拆开“专用袋”,处理完快递后,直接用本地配送(响应直达)发给用户,不用再绕回本地调度中心。
三、三种模式核心差异表(含流程特点)
对比维度 | NAT模式 | DR模式 | TUN模式 |
---|---|---|---|
数据流转特点 | 请求→调度器→真实服务器;响应→真实服务器→调度器→用户(全绕路) | 请求→调度器→真实服务器;响应→真实服务器→用户(响应不绕路) | 请求→调度器(隧道)→真实服务器;响应→真实服务器→用户(响应不绕路) |
关键修改内容 | 修改请求的目标IP、响应的源IP(改IP) | 只修改请求的目标MAC地址(不改IP) | 给请求套隧道外壳(双层IP),不修改内层IP |
真实服务器IP | 仅需内网IP(不用公网) | 仅需内网IP(同一局域网) | 必须公网IP(跨地域通信) |
跨地域支持 | 不支持(真实服务器在内网) | 不支持(需同一局域网) | 支持(隧道跨公网) |
端口转换 | 支持(用户请求8080→真实服务器80) | 不支持(端口必须一致) | 不支持(端口必须一致) |
最大集群规模 | 约20台(调度器是瓶颈) | 数百台(调度器压力小) | 数百台(调度器压力小) |
响应速度 | 慢(全绕路) | 快(无绕路、无隧道) | 中(无绕路、有隧道封装开销) |
系统兼容性 | 所有系统(Windows/Linux等) | 优先Linux(Windows配置复杂) | 仅Linux(需ipip隧道模块) |
适用场景 | 小规模内网服务(OA、测试环境) | 局域网高并发服务(电商、直播) | 跨地域分布式服务(CDN、多地灾备) |
四、选型口诀(帮你快速决策)
- 小规模、内网用NAT:用户少、不用跨地域,省IP成本;
- 同机房、高并发用DR:速度快、能扛大规模请求,性能优先;
- 跨地域、分布式用TUN:需要覆盖多地用户,灵活优先。
比如:
- 公司内部打卡系统 → NAT模式;
- 双11电商购物页面 → DR模式;
- 全国性视频网站的内容分发 → TUN模式。
虚拟机仅主机模式与NAT模式的区别:通俗解读+场景适配
在使用VMware、VirtualBox等虚拟机软件时,“仅主机模式”和“NAT模式”是最常用的两种网络配置,但很多人容易混淆。其实二者的核心差异在于“虚拟机能否上网”“虚拟机与外界如何通信”,下面从工作原理、通信范围、配置细节等维度拆解,结合通俗类比和场景举例,让你一次搞懂。
一、先明确2个基础概念(理解前提)
在对比前,先搞懂虚拟机网络中的两个关键“角色”,就像现实中的“路由器”和“网线”:
- 虚拟网卡:虚拟机软件在宿主机(你正在用的电脑)上创建的“虚拟网线接口”,比如VMware的“VMnet1”(默认对应仅主机模式)、“VMnet8”(默认对应NAT模式),负责连接虚拟机和宿主机/外部网络。
- 虚拟交换机:虚拟机软件创建的“虚拟路由器”,比如VMnet1和VMnet8各自对应一个虚拟交换机,负责转发虚拟机、宿主机、外部网络之间的数据。
二、核心区别:用“家庭网络”类比
我们把“宿主机”比作“你家的主电脑”,“虚拟机”比作“你家的副电脑”,“外网”比作“互联网”,用家庭网络场景类比两种模式的差异:
1. 仅主机模式(Host-Only):“副电脑只能连主电脑,不能上网”
(1)工作原理(像“主副电脑直连,不接路由器”)
- 虚拟机通过“VMnet1虚拟交换机”,只与宿主机建立连接,相当于给主电脑和副电脑拉了一根“专用网线”;
- 虚拟交换机不连接宿主机的物理网卡(相当于不接家里的路由器),所以虚拟机只能和宿主机通信,无法访问互联网,也无法被同一局域网的其他真实电脑(比如你同事的电脑)访问。
- IP地址特点:虚拟机和宿主机的“VMnet1虚拟网卡”会在同一个私有网段(比如192.168.137.0/24),比如宿主机VMnet1的IP是192.168.137.1,虚拟机的IP是192.168.137.100,二者能互相ping通,但虚拟机ping不通百度(www.baidu.com)。
(2)通俗通信范围(画个圈就懂)
[ 互联网 ] ←×→ [ 宿主机物理网卡 ] ←×→ [ VMnet1虚拟交换机 ] ←√→ [ 虚拟机 ]↓√[ 宿主机 ]
- 能通的:虚拟机 ↔ 宿主机(主副电脑互传文件);
- 不通的:虚拟机 ↔ 互联网(副电脑不能上网)、虚拟机 ↔ 其他真实电脑(副电脑不能连邻居家的电脑)。
(3)优缺点
优点 | 缺点 |
---|---|
1. 网络隔离性好:虚拟机只连宿主机,不会被外网或其他电脑干扰,适合做安全测试(比如测试病毒、漏洞,不怕影响其他设备); 2. 配置简单:无需额外设置网关、DNS,虚拟机软件自动分配网段,开箱即用; 3. 通信稳定:不依赖外网,即使宿主机断网,虚拟机和宿主机仍能正常通信。 | 1. 虚拟机不能上网:无法下载软件、更新系统,只能用宿主机提前传好的文件; 2. 无法与其他真实电脑通信:比如同一办公室的同事,不能访问你虚拟机里的服务(如Web页面)。 |
2. NAT模式(网络地址转换):“副电脑通过主电脑上网,像手机连WiFi”
(1)工作原理(像“副电脑连家里的路由器,通过主电脑转发上网”)
- 虚拟机通过“VMnet8虚拟交换机”连接,虚拟交换机同时关联宿主机的“VMnet8虚拟网卡”和“物理网卡”(相当于副电脑连到家里的路由器,路由器再连主电脑);
- 虚拟机的IP是私有网段(比如192.168.233.0/24),无法直接访问外网,需要通过“NAT转换”:虚拟机的请求先发给VMnet8虚拟交换机,再由宿主机的物理网卡把“虚拟机的私有IP”转换成“宿主机的公网IP”(或内网IP),转发到外网;外网的响应则按相反路径回传给虚拟机。
- IP地址特点:宿主机VMnet8的IP是192.168.233.1(默认网关),虚拟机的IP是192.168.233.100,虚拟机既能ping通宿主机,也能ping通百度(能上网),但同一局域网的其他真实电脑(比如同事的电脑)ping不通虚拟机(因为虚拟机是私有IP,未暴露到外网)。
(2)通俗通信范围(画个圈就懂)
[ 互联网 ] ←√→ [ 宿主机物理网卡 ] ←√→ [ VMnet8虚拟交换机 ] ←√→ [ 虚拟机 ]↓√[ 宿主机 ]
- 能通的:虚拟机 ↔ 宿主机、虚拟机 ↔ 互联网(副电脑能上网下载软件);
- 不通的:虚拟机 ↔ 其他真实电脑(同事的电脑看不到你的虚拟机,像手机连WiFi,外人找不到这台手机)。
(3)优缺点
优点 | 缺点 |
---|---|
1. 虚拟机能上网:可正常下载软件、更新系统、访问外网服务,满足大多数日常需求(比如虚拟机里装Linux系统,在线安装nginx); 2. 不占用公网IP:虚拟机用私有IP,通过宿主机NAT转换上网,不用额外申请公网IP,成本低; 3. 安全性较高:虚拟机隐藏在宿主机背后,外网或其他真实电脑无法直接访问,减少被攻击的风险。 | 1. 无法被其他真实电脑访问:如果想让同事访问你虚拟机里的Web服务(比如测试环境),需要额外配置“端口转发”,比较麻烦; 2. 依赖宿主机网络:如果宿主机断网,虚拟机也会跟着断网;宿主机关机,虚拟机无法与外界通信。 |
三、关键区别对比表(一目了然)
对比维度 | 仅主机模式(Host-Only) | NAT模式(Network Address Translation) |
---|---|---|
核心功能 | 虚拟机仅与宿主机通信,不能上网 | 虚拟机通过宿主机NAT转换上网,可与宿主机通信 |
上网能力 | ❌ 不能访问互联网 | ✅ 能访问互联网 |
与其他真实电脑通信 | ❌ 不能(无法被其他电脑访问,也不能访问其他电脑) | ❌ 默认不能(需额外配置端口转发才能被访问) |
依赖宿主机物理网卡 | ❌ 不依赖(虚拟交换机不连物理网卡) | ✅ 依赖(虚拟交换机连物理网卡,通过物理网卡上网) |
IP网段 | 固定私有网段(如VMware的192.168.137.0/24) | 固定私有网段(如VMware的192.168.233.0/24) |
网关配置 | 无需配置(仅需与宿主机同网段) | 需配置为虚拟网卡IP(如192.168.233.1) |
典型场景 | 安全测试、离线开发(不依赖外网) | 日常开发、软件安装、外网访问(依赖上网) |
四、场景举例:帮你选对模式
- 选仅主机模式的场景:
- 测试病毒/恶意软件:担心虚拟机连网上传数据,或病毒扩散到外网,用仅主机模式隔离;
- 离线搭建内网集群:比如在虚拟机里搭LVS、K8s集群,只需虚拟机之间和宿主机通信,不用上网;
- 保护敏感数据:虚拟机里存了涉密文件,不希望连外网,避免数据泄露。
- 选NAT模式的场景:
- 日常开发调试:比如在Linux虚拟机里写代码,需要在线安装gcc、python等依赖包;
- 访问外网服务:比如虚拟机里的程序需要调用百度API、微信支付接口,必须上网;
- 新手入门:不想折腾复杂配置,又需要虚拟机上网,NAT模式是“开箱即用”的最优选择。
五、补充:如何快速切换与验证
1. 切换方法(以VMware为例)
- 关闭虚拟机(部分软件支持开机切换,但建议关机操作,避免网络异常);
- 右键虚拟机 → 【设置】→ 【网络适配器】;
- 在“网络连接”中选择“仅主机模式”或“NAT模式”,点击【确定】;
- 启动虚拟机,通过
ip addr
(Linux)或“网络连接”(Windows)查看IP,确认网段是否正确。
2. 验证方法
- 验证仅主机模式:
- 虚拟机ping宿主机的VMnet1IP(比如
ping 192.168.137.1
),能通说明与宿主机连接正常; - 虚拟机ping百度(
ping www.baidu.com
),不通说明隔离生效,符合仅主机模式特性。
- 虚拟机ping宿主机的VMnet1IP(比如
- 验证NAT模式:
- 虚拟机ping宿主机的VMnet8IP(比如
ping 192.168.233.1
),能通说明与宿主机连接正常; - 虚拟机ping百度(
ping www.baidu.com
),能通说明NAT转换生效,可正常上网。
- 虚拟机ping宿主机的VMnet8IP(比如
总结
** | 固定私有网段(如VMware的192.168.137.0/24) | 固定私有网段(如VMware的192.168.233.0/24) |
| 网关配置 | 无需配置(仅需与宿主机同网段) | 需配置为虚拟网卡IP(如192.168.233.1) |
| 典型场景 | 安全测试、离线开发(不依赖外网) | 日常开发、软件安装、外网访问(依赖上网) |
四、场景举例:帮你选对模式
- 选仅主机模式的场景:
- 测试病毒/恶意软件:担心虚拟机连网上传数据,或病毒扩散到外网,用仅主机模式隔离;
- 离线搭建内网集群:比如在虚拟机里搭LVS、K8s集群,只需虚拟机之间和宿主机通信,不用上网;
- 保护敏感数据:虚拟机里存了涉密文件,不希望连外网,避免数据泄露。
- 选NAT模式的场景:
- 日常开发调试:比如在Linux虚拟机里写代码,需要在线安装gcc、python等依赖包;
- 访问外网服务:比如虚拟机里的程序需要调用百度API、微信支付接口,必须上网;
- 新手入门:不想折腾复杂配置,又需要虚拟机上网,NAT模式是“开箱即用”的最优选择。
五、补充:如何快速切换与验证
1. 切换方法(以VMware为例)
- 关闭虚拟机(部分软件支持开机切换,但建议关机操作,避免网络异常);
- 右键虚拟机 → 【设置】→ 【网络适配器】;
- 在“网络连接”中选择“仅主机模式”或“NAT模式”,点击【确定】;
- 启动虚拟机,通过
ip addr
(Linux)或“网络连接”(Windows)查看IP,确认网段是否正确。
2. 验证方法
- 验证仅主机模式:
- 虚拟机ping宿主机的VMnet1IP(比如
ping 192.168.137.1
),能通说明与宿主机连接正常; - 虚拟机ping百度(
ping www.baidu.com
),不通说明隔离生效,符合仅主机模式特性。
- 虚拟机ping宿主机的VMnet1IP(比如
- 验证NAT模式:
- 虚拟机ping宿主机的VMnet8IP(比如
ping 192.168.233.1
),能通说明与宿主机连接正常; - 虚拟机ping百度(
ping www.baidu.com
),能通说明NAT转换生效,可正常上网。
- 虚拟机ping宿主机的VMnet8IP(比如
总结
简单来说:仅主机模式是“封闭的内网”,只连宿主机;NAT模式是“能上网的内网”,通过宿主机连外网。日常用得多的是NAT模式,需要隔离或离线时用仅主机模式,根据“是否需要上网”和“是否需要隔离”两个核心需求,就能快速选对模式。