参考资料
- Linux Virtual Server(LVS)是一个基于 Linux 内核实现的高可伸缩、高可用的服务器集群解决方案
LVS 集群架构与关键技术
底层核心为在 Netfilter 上层构建,运行在 Linux 内核空间的 IP 虚拟服务器(IPVS)
- IPVS 支持以下传输协议的负载均衡
- TCP
- UDP
- SCTP
- ESP (Encapsulation Security Payload)
- 封装安全有效载荷
- AH (Authentication Header)
- 身份验证标头
- iptable 与 ipvs 比较
LVS 集群采用三层分层架构:负载调度器,服务器池,共享存储
负载调度器(Load Balancer)
- 集群的唯一入口点,对外呈现一个虚拟 IP 地址(VIP)
- 负责接收客户端请求,并基于IP 负载均衡或基于内容的请求分发技术,将请求转发到后端服务器
- 所有调度逻辑在 Linux 内核空间完成,开销小、吞吐率高
服务器池(Server Pool)
- 一组真实服务器,实际处理 Web、Mail、FTP、DNS 等服务请求
- 节点数量可动态增减,系统性能随节点数近似线性扩展(适用于无状态、并行请求场景)
共享存储(Shared Storage)
- 为服务器池提供统一的数据存储,确保所有节点提供一致的服务内容
- 可选方案包括:
- 数据库:用于动态数据,保证并发一致性;
- 网络文件系统(NFS/CIFS):适合小规模集群(≤6 节点);
- 分布式文件系统(如 GFS、AFS、Coda):支持大规模集群,具备良好伸缩性与本地缓存加速能力。
- 支持分布式锁管理器(DLM),解决多节点并发写冲突问题。
LVS 高可用性机制
- 调度器冗余(防单点故障)
- 部署主-从调度器,通过心跳机制(Heartbeat)互相监测
- 主调度器失效时,从调度器通过 Gratuitous ARP 接管 VIP,继续提供服务
- 通过 Gratuitous ARP 主动广播通知网络设备更新其 ARP 表,用于 IP 地址迁移或 MAC 地址变更通知
- 服务器节点健康监测
- 调度器通过 ICMP ping 或服务探测监控后端服务器状态
- 故障节点自动从调度列表移除;恢复后自动重新加入
- 连接状态同步
- IPVS 在内核中实现高效状态同步机制,将主调度器的连接信息实时同步至从调度器
- 切换时大部分已有连接可保持不断,显著提升用户体验
支持三种 IP 层负载均衡技术
- VS/NAT(网络地址转换):调度器重写请求和响应的 IP 地址,适用于小规模集群
- VS/TUN(IP 隧道):调度器仅处理请求,响应由真实服务器直返客户,大幅提升吞吐量(可达10倍)
- VS/DR(直接路由):调度器通过改写 MAC 地址转发请求,响应直返客户,无隧道开销,要求调度器与服务器在同一物理网段
- RS 需要配置 ARP 抑制,详见后续章节
支持八种调度算法
- 轮询(Round Robin, RR)依次轮流分配请求,适用于服务器性能相近的场景
- 加权轮询(Weighted RR, WRR)根据服务器权重分配请求,适合异构服务器集群
- 最少连接(Least Connections, LC)将新请求分配给当前连接数最少的服务器
- 加权最少连接(Weighted LC, WLC)结合服务器权重和当前连接数,更精准均衡负载
- 基于局部性的最少连接(LBLC)针对目标 IP(如 Cache 服务),优先选择最近服务过该 IP 的服务器
- 带复制的 LBLC(LBLCR)维护“目标 IP → 服务器组”映射,提升缓存命中率,适用于大型 Cache 集群
- LBLC 算法仅维护从一个目标IP地址到一台服务器的映射
- 目标地址散列(Destination Hashing, DH)对请求的目标 IP 做哈希,固定映射到某台服务器(适合持久化需求)
- 源地址散列(Source Hashing, SH)对客户端源 IP 做哈希,确保同一客户端始终访问同一后端(类似会话保持)
三种基于 IP 层的负载均衡技术(VS/NAT、VS/TUN 和 VS/DR)
- 连接状态管理:三种模式均使用内核中的连接跟踪机制,确保同一连接的后续报文正确路由
- 三种负载均衡技术比较
特性 | VS/NAT | VS/TUN | VS/DR |
流量路径 | 请求+响应都经调度器 | 仅请求经调度器 | 仅请求经调度器 |
服务器网络 | 私有网络 | 可跨 WAN | 必须同 LAN |
最大服务器数 | ~10–20 台 | ~100+ 台 | ~100+ 台 |
服务器要求 | 任意 TCP/IP 系统 | 支持 IP 隧道 | 配置 VIP + 抑制 ARP |
性能开销 | 高(双向 NAT) | 中(隧道封装) | 极低(仅改 MAC) |
适用场景 | 小规模、简单部署 | 跨地域、大规模 | 同机房、高性能 |
VS/NAT(Virtual Server via Network Address Translation)
- ✅ 适用于小规模集群或对网络拓扑限制较多的场景
- 原理:
- 调度器位于客户端与服务器之间,所有请求和响应都必须经过调度器。
- 调度器通过 NAT 技术改写 IP 报文头:
- 请求:将目标地址(VIP)改为选定真实服务器的私有 IP 和端口;
- 响应:将源地址改回 VIP,再返回给客户端。
- 使用 连接 Hash 表 + 状态机 跟踪连接状态(如 TCP 的 SYN/ESTABLISHED/FIN,UDP 单状态),超时后自动清理。
- 特点:
- 优点:
- 后端服务器可使用私有 IP,无需公网地址
- 支持任意操作系统(只要支持 TCP/IP)
- 配置简单
- 缺点:
- 伸缩性差:调度器需处理双向流量,成为性能瓶颈(通常仅支持 10~20 台服务器)
- 对应用层嵌入 IP/端口的服务(如 FTP、H.323、PPTP 等)需额外开发应用层转换模块,增加复杂性和开销
- Checksum 优化:VS/NAT 使用增量算法更新 TCP 校验和,避免全包重算
- 应用层兼容性:VS/NAT 对“IP/端口嵌入数据”的协议需特殊处理,而 VS/TUN 和 VS/DR 因响应直返,通常不受影响
VS/DR(Virtual Server via Direct Routing)
- ✅ 适用于高性能、低延迟、同局域网的大规模 Web 或缓存集群
- 原理:
- 调度器与真实服务器必须在同一局域网(二层可达);
- 调度器不修改 IP 报文,仅改写数据帧的 MAC 地址为目标服务器的 MAC;
- 真实服务器收到帧后,因本地配置了 VIP(绑定在 non-ARP 接口或别名上),会处理该请求,并直接响应客户端。
- 特点:
- 优点:
- 性能最高:无 NAT 开销,无隧道封装开销
- 响应直返客户,吞吐量极高(可支持上百台服务器)
- 是生产环境中最常用的 LVS 模式
- 缺点:
- 要求调度器与服务器同处一个物理网段
- 服务器需抑制 ARP 响应(避免 VIP 冲突),配置较复杂
VS/TUN(Virtual Server via IP Tunneling)
- ✅ 适用于跨广域网(WAN)部署或大规模集群,且服务器支持隧道协议的场景
- 原理:
- 调度器仅处理请求,将请求封装在 IP 隧道(IPIP)中转发给选定的真实服务器
- 真实服务器解封装后直接响应客户端(不经过调度器)
- 所有服务器需在本地配置 VIP 地址(绑定在 tunnel 接口上)
- 特点:
- 优点:
- 高吞吐量:响应流量绕过调度器,极大提升系统容量(可支持上百台服务器)
- 调度器不再是瓶颈,适合构建高性能超级服务器
- 缺点:
- 后端服务器必须支持 IP 隧道协议(如 Linux 的 IPIP)
- 主要验证于 Linux,其他 OS 兼容性待确认
VS/DR 模式需要配置 ARP 抑制
参考资料
- VS/DR 模式要求调度器与所有 RS(Real Server)必须位于同一物理网络段(二层可达)
- RS 还需要能直接访问客户端所在网络(如通过独立或共享网关连接互联网)
- 由于 RS 都配置了相同的 VIP,会导致 ARP 响应冲突(多台机器回应同一个 VIP 的 MAC 地址),为了确保只有调度器响应 VIP 的 ARP 请求,RS 需抑制 ARP 响应
四种 ARP 抑制方案比较
实现工具 | 原理 | 优点 | 缺点 |
arptables | 用 arptables 丢弃入站 VIP 的 ARP 请求,并将出站 ARP 报文中的 VIP 替换为真实 IP | 性能高;支持多服务绑定不同 VIP(如多个 Apache 实例) | 配置复杂;
VIP 无法通过标准系统工具(如 ifcfg)开机自启 |
firewalld | 使用 firewalld 的 direct rule 将发往 VIP 的流量重定向到本地服务 | 配置简单;VIP 仅存在于调度器,避免 ARP 问题 | 性能较低(每包需 NAT 处理);
不支持端口复用(如不能运行两个监听 80 端口的服务) |
iptables | 类似 firewalld,用 iptables -t nat -j REDIRECT 实现透明代理 | 同 firewalld | 同 firewalld:性能开销大,不支持端口复用 |
sysctl | 设置内核参数:
arp_ignore=1(不响应非本机 IP 的 ARP 请求)
arp_announce=2(优先使用最佳本地地址响应 ARP) | 轻量、高效;无需额外规则 | 功能有限,通常需配合其他方法(如手动添加 VIP 别名) |
四种 ARP 抑制方案具体配置
- 接口 eth0 根据实际配置修改
arptables 方案
- 为每个 RS 上的每个虚拟 IP 地址创建 ARP 表条目
arptables -A IN -d <virtual_ip> -j DROP- RS 忽略所有针对 VIP 的 ARP 请求
arptables -A OUT -s <virtual_ip> -j mangle --mangle-ip-s <real_ip>- 将原本可能包含 VIP 的出站 ARP 响应更改为包含 RS 的真实 IP 地址
- 保存 arptables 配置,然后再启动网络
arptables-save > /etc/sysconfig/arptablessystemctl enable arptables.service
- 在所有 RS 上配置 VIP
ip addr add 192.168.76.24 dev eth0
firewalld / iptables 方案
- 添加相关规则
firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d vip -p tcp|udp -m tcp|udp --dport port -j REDIRECTfirewall-cmd --reloadiptables -t nat -A PREROUTING -p <tcp|udp> -d <vip> --dport <port> -j REDIRECTiptables-save > /etc/sysconfig/iptables
- 启用相关服务
systemctl enable --now firewalldsystemctl enable --now iptables.service
sysctl 方案
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore- 不响应非本机 IP 的 ARP 请求
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce- 优先使用最佳本地地址响应 ARP
或者添加到 /etc/sysctl.d/arp.conf 文件中
sysctl -p加载
- RS 检查 arp 缓存
arp -n
ipvsadm 是用于管理和配置 IPVS 的命令行工具
- 参考资料
ipvsadm(8): Virtual Server administration - Linux man page
ipvsadm(8): Virtual Server administration - Linux man page
Ipvsadm(8) is used to set up, maintain or inspect the virtual server table in the Linux kernel. The Linux Virtual Server can be used to build scalable ...
xxxx24.3 LVS 调度算法和 ipvsadmin24.3 LVS 调度算法和 ipvsadmin
ipvsadm 实现以下功能
- 添加/删除虚拟服务(Virtual Service)
- 添加/删除真实服务器(Real Server)
- 设置负载调度算法
- 查看当前负载均衡规则和连接状态
- 清空所有规则
- 保存/恢复配置
安装 ipvsadm
yum install ipvsadm
rpm -ql ipvsadm
service unit 文件管理启动后的规则加载和保存
ipvsadm 命令行工具
/usr/sbin/ipvsadm
/usr/sbin/ipvsadm-save- 可以用
ipvsadm -S调用
/usr/sbin/ipvsadm-restore- 可以用
ipvsadm -R调用
ipvsadm 规则文件存放路径
/etc/sysconfig/ipvsadm-config
ipvsadm 指令
- 常用选项说明
-t, --tcp-service服务地址格式为host[:port]- 可以省略 port ,此时将使用端口号 0,接受任何端口的连接
- 仅在服务持久化(使用
-p|--persistent选项)时有效 -u, --udp-service-f,--fwmark-service使用防火墙标记(一个大于零的整数值)来表示虚拟服务,而不是使用地址、端口和协议
-t|u|f service-address: 指定管理的集群
查看集群状态信息 ipvsadm -L|l
ipvsadm -L|l [options]
- 可用选项
-numeric, -n: 基于数字格式显示 ip 和端口-connection,-c: 显示当前的连接-exact: 显示统计数据精确值-stats: 显示统计数据-rate: 显示速率
增加或者修改集群服务 ipvsadm -A|E
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
- 可用选项
-A: 添加集群服务-E: 修改集群服务-t|u|f service-address: 指定管理的集群-s scheduler: 调度算法,默认为wlc
删除集群服务 ipvsadm -D
ipvsadm -D -t|u|f service-address
- 可用选项
-t|u|f service-address: 指定管理的集群
增加或者修改集群服务上的 RS ipvsadm -a|e
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
- 可用选项
-a: 添加 RS-e: 修改 RS-t|u|f service-address: 指定管理的集群-r server-address[:port]: 指定 RS 的 ip 地址端口-g|i|m: 指定 LVS 负载均衡类型,默认为 m-m: masquerade, VS/NAT-g: gateway, VS/DR-i: ipip, VS/TUN-w weight: 权重
删除集群服务上的 RS ipvsadm -d
ipvsadm -d -t|u|f service-address -r server-address
- 可用选项
-t|u|f service-address: 指定管理的集群-r server-address[:port]: 指定 RS 的 ip 地址端口
清空集群的计数器 ipvsadm -Z
ipvsadm -Z [-t|u|f service-address]-t|u|f service-address:指定管理的集群-t, --tcp-service-u, --udp-service-f,--fwmark-service使用防火墙标记(一个大于零的整数值)来表示虚拟服务,而不是使用地址、端口和协议
- 清空虚拟服务器表
ipvsadm -C
规则保存和重载 ipvsadm -R|-S
ipvsadm -R- 重载 == ipvsadm-restore
ipvsadm -S [-n]- 保存 == ipvsadm-save
keepalived 实现调度器故障转移以及后端服务健康监控
keepalived 的两大功能:健康检查和故障转移
- LVS 系统健康检查
- 实现 VRRPv2 协议栈以处理负载均衡器故障转移
keepalived 核心功能模块
- VRRP Stack
- 完整实现 RFC2338(支持 IPSEC-AH 认证)
- 支持 VRRP Sync Group(同步多个实例状态)
- 可独立于 LVS 使用(适用于通用路由器热备)
- 支持 VMAC(虚拟 MAC 地址),减少切换抖动(需 Linux
macvlan支持)
- Healthcheck Framework
- 支持多种健康检查类型:
- TCP_CHECK:四层连接测试
- HTTP_GET / SSL_GET:七层内容校验(支持 MD5 比对,使用
genhash工具生成摘要) - MISC_CHECK:执行自定义脚本,返回 0/1 判断状态
- 所有检查注册到全局调度器,基于有限状态机(FSM)实现
- IPVS Wrapper
- 将 Keepalived 内存中的负载均衡配置转换为内核 IPVS 规则
- 调用
libipvs与 Linux 内核 LVS 模块交互 - 实现 LVS 后端服务器的动态增删
- Netlink Reflector
- 通过 Netlink 与内核通信:
- 设置/删除 VRRP VIP
- 监听网络接口事件(如网卡 up/down、IP 变更),实时同步到用户态数据结构
- System Call & SMTP
- System Call:在 VRRP 状态切换或健康检查时触发外部脚本(fork 子进程执行,不影响主调度)
- SMTP:发送邮件通知(支持对接短信、寻呼等告警系统)
keepalived 核心配置概要
global_def 部分
VS 和 RS 部分
VRRP 实例部分
keepalived VRRP 配置样例
mkdir -p /etc/keepalived
touch /etc/keepalived/keepalived.conf
全局定义 global_defs
vim /etc/keepalived/keepalived.conf
router_id当前 keepalived 实例路由标识,可以改成主机名
VRRP 协议优化
vrrp_skip_check_adv_addr跳过对 VRRP 通告报文源地址的检查
vrrp_strict启用严格模式,强制遵循 VRRP 协议规范
vrrp_garp_interval 0设置免费 ARP(Gratuitous ARP)报文发送间隔- 默认值为
0,表示仅在切换为主节点时发送一次 GARP 消息
vrrp_gna_interval 0设置 IPv6 邻居通告(Gratuitous NA)间隔- 默认值为
0,表示仅在切换为主节点时发送一次 GNA 消息
- 剩余主要涉及邮件通知和 SMTP 服务设置,可以忽略
旁路由(单臂路由)的配置样例
vim /etc/keepalived/keepalived.conf
网络组 haproxy-vip 绑定 eth0 接口
virtual_router_id 51局域网内唯一虚拟路由ID,不同接口可以重复
state <STATE>区分主备# MASTER on lb-1, BACKUP on lb-2
priority <PRIORITY>定义优先级# 200 on lb-1, 100 on lb-2
virtual_ipaddress对局域网设备展示的虚拟 IP 地址
track_script使用检测脚本chk_haproxy
authentication 认证方式,可选 PASS 或 AH
- PASS 安全性较弱,无法防止中间人攻击
- 超过8字符会截断
- IPsec 的 Authentication Header (AH) 协议对整个 VRRP 报文(包括负载内容)进行完整性校验和身份验证
- 不加密数据,但生成哈希值防止篡改
- 需要设备支持含 AH 头的 VRRP 报文
检测脚本 chk_haproxy,用以实现某个检测功能
interval 2,timeout 1每间隔 2 秒检测 haproxy 进程,超时 1 s 算失败
rise 1连续成功 1 次视为健康
fall 2连续成功 2 次视为不健康- 失败时根据
weight -20调整优先级数值使其掉至备份
对称双网关(内部网关 + 外部路由)的配置样例
vim /etc/keepalived/keepalived.conf
- VRRP 同步组
G1确保内部网络组I1和外部网络组E1同步切换
内部网络组 I1 绑定 br-lan 接口
virtual_router_id 51局域网内唯一虚拟路由ID,不同接口可以重复
state backup,priority 101初始状态均为备份- 对称,priority 更高的成为 master
advert_int 1VRRP 通告间隔为 1s
nopreempt禁止抢占,即使优先级更高也不抢回 Master 状态
virtual_ipaddress对内部设备展示的虚拟 IP 地址
authentication 认证方式,可选 PASS 或 AH
- PASS 安全性较弱,无法防止中间人攻击
- 超过8字符会截断
- IPsec 的 Authentication Header (AH) 协议对整个 VRRP 报文(包括负载内容)进行完整性校验和身份验证
- 不加密数据,但生成哈希值防止篡改
- 需要设备支持含 AH 头的 VRRP 报文
外部网络组 E1 绑定 eth0.2 接口
virtual_routes定义虚拟路由- 通知该路由成为 master 时,流量通过
eth0.2的网关192.168.0.1转发
- 其余与内部网络组
I1类似
haproxy 和 keepalived 搭配的常见陷阱
haproxy 试图绑定到 VIP 时,VIP 尚未绑定到本机,系统会拒绝绑定
sysctl 设置参数 net.ipv4.ip_nonlocal_bind=1
sysctl -w net.ipv4.ip_nonlocal_bind=1
vim /etc/sysctl.d/bind_nonlocal.conf
- Author:白鸟3
- URL:https://blog.kun2peng.top/operation/loadbalance_lvs_keepalived
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
