Lazy loaded image
负载均衡:LVS, ipvsadm 和 keepalived
Words 5159Read Time 13 min
2026-2-1
2026-2-1
date
related_level
slug
loadbalance_lvs_keepalived
type
Post
relate_date
summary
LVS 是基于 Linux 内核的负载均衡方案,通过 IPVS 支持 TCP/UDP/SCTP 协议。它采用调度器、服务器池和共享存储三层架构,支持 NAT、TUN、DR 三种模式和多种调度算法,常与 Keepalived 配合实现高可用和健康检查
status
Published
tags
高可用
最新推荐
category
运维管理
last_updated
Feb 1, 2026 05:29 PM
是否已更新
orginal_page
是否推荐
参考资料
  • Linux Virtual Server(LVS)是一个基于 Linux 内核实现的高可伸缩、高可用的服务器集群解决方案
LVS 集群架构与关键技术
底层核心为在 Netfilter 上层构建,运行在 Linux 内核空间的 IP 虚拟服务器(IPVS)
  • IPVS 支持以下传输协议的负载均衡
    • TCP
    • UDP
    • SCTP
    • ESP (Encapsulation Security Payload)
      • 封装安全有效载荷
    • AH (Authentication Header)
      • 身份验证标头
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/arptables
    • systemctl 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 REDIRECT
    • firewall-cmd --reload
    • iptables -t nat -A PREROUTING -p <tcp|udp> -d <vip> --dport <port> -j REDIRECT
    • iptables-save > /etc/sysconfig/iptables
  • 启用相关服务
    • systemctl enable --now firewalld
    • systemctl 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 实现以下功能
  • 添加/删除虚拟服务(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|u|f service-address: 指定管理的集群
      • -t, --tcp-service 服务地址格式为 host[:port]
        • 可以省略 port ,此时将使用端口号 0,接受任何端口的连接
          • 仅在服务持久化(使用 -p|--persistent 选项)时有效
      • -u, --udp-service
      • -f,--fwmark-service 使用防火墙标记(一个大于零的整数值)来表示虚拟服务,而不是使用地址、端口和协议
查看集群状态信息 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 1 VRRP 通告间隔为 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
    上一篇
    通过 exporter 采集并暴露指标
    下一篇
    CKA & CKAD 备考笔记

    Comments
    Loading...