LVS 基础教程
内容:核心概念、三种模式、调度算法、实际架构、生产级配置、故障排查、最佳实践。
LVS = Linux Virtual Server
是 Linux 内核中的四层负载均衡框架,通过 虚拟 IP(VIP)+ 转发服务器(Director) + 后端 Real Server(RS) 的方式提供高并发、高可用、低延迟的负载均衡。
适用于:
- Web 服务(Nginx、Tomcat、Flask 等)
- TCP 服务(Redis、MySQL、MQ)
- 任意四层 TCP/UDP 服务
特点:
- 四层转发 -> 极高性能(百万级并发)
- 内核态转发 -> 极低延迟
- 搭配 Keepalived -> 自动故障切换(HA)
原理:Director 修改报文的源/目的地址,转发给 RS。RS 的回复也回到 Director,再 NAT 回客户端。
特点:
- 流量进出都经过 Director -> 容易成为瓶颈
- RS 可以使用任意操作系统
- RS 必须把默认路由指向 Director
适用:小中型流量、简单部署
原理:
- Director 只负责请求流量;
- RS 通过自己的 lo 绑定 VIP,并 直接回包给客户端(不经过 Director)。
关键:VIP 需要在所有 RS 的 loopback 绑定,并关闭 ARP:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
特点:
- 性能极高:出口流量不经过 Director
- RS 必须在同一 LAN(二层网络)
- VIP 要特殊处理 ARP
适用:高并发 Web 服务(行业内最常用)
原理:Director 使用 IPIP 隧道转发请求给 RS,RS 解封装后直接回包客户端。
特点:
- RS 可以跨地域/跨机房(三层网络都行)
- 性能高于 NAT(回包不走 Director)
- 需要 RS 支持 Tunnel
适用:大规模跨网络负载场景(不常见)
静态算法
| 算法 | 说明 |
|---|---|
| RR | 轮询 |
| WRR | 带权重轮询 |
| SH | 源地址哈希(固定来源分配到固定 RS) |
| DHL | 目标地址哈希 |
动态算法
| 算法 | 说明 |
|---|---|
| LC | 最少连接 |
| WLC | 加权最少连接 |
| SED | 最短期望延迟算法 |
| NQ | 从不排队(No Queue)算法 |
生产常用:WLC / WRR / SH
LVS-DR + Keepalived 热备 HA
+---------------------+
| Keepalived VIP |
+-----------+---------+
|
+------------+------------+
| LVS Master |
+-------------------------+
| DR Mode (VIP on lo) |
+-------------------------+
|
(仅请求流量)
|
+-----------+-------------+------------+
| | | |
+--+--+ +--+--+ +--+--+ +--+--+
| RS1 | | RS2 | | RS3 | | RS4 |
+--+--+ +--+--+ +--+--+ +--+--+
| | | |
+------------+-------------+------------+
直接回包
查看规则
ipvsadm -Ln
添加虚拟服务(示例:VIP:80)
ipvsadm -A -t 10.0.0.10:80 -s wlc
添加 RS(DR 模式)
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.11:80 -g -w 1
ipvsadm -a -t 10.0.0.10:80 -r 10.0.0.12:80 -g -w 1
选项说明:
- -t:TCP
- -s:调度算法
- -g:DR 模式(gateway)
- -w:权重
/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
priority 100
virtual_router_id 51
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.10
}
}
virtual_server 10.0.0.10 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
protocol TCP
real_server 10.0.0.11 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.0.0.12 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
ip addr add 10.0.0.10/32 dev lo
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- VIP 没绑到 loopback
- ARP 配置错误 -> RS 抢答了 VIP
- DR 模式 RS 不在同一二层网络
- DR 模式下必须 RS 直接回包客户端
- 路由错误导致回包走 Director
- Keepalived 没有权限绑定 VIP
- interface 写错
- VRRP id 重复
- 算法使用 RR 而不是 WRR/WLC
- Keepalived 重启时 reload
- 开机未启用服务
适合 Web / API 服务
TCP_CHECK / HTTP_GET
避免单机资源抢占
用于 Master/Backup 切换无感
sync_master
sync_backup
- ipvsadm 连接数
- Keepalived 切换次数
- RS 健康情况
- 网络/ARP 异常