Keepalived 负载均衡
Keepalived 可以与 LVS(Linux Virtual Server)结合,提供强大的四层负载均衡功能。它通过 IPVS(IP Virtual Server)内核模块实现高性能的负载分发。
核心组件
- Virtual Server:虚拟服务器,对外提供服务的 VIP
- Real Server:真实服务器,实际处理请求的后端服务器
- IPVS:Linux 内核中的负载均衡模块
- 健康检查:监控后端服务器状态
工作模式
模式 | 说明 | 特点 | 适用场景 |
---|---|---|---|
DR(Direct Routing) | 直接路由 | 性能最高,要求在同一网段 | 大流量场景 |
NAT(Network Address Translation) | 网络地址转换 | 配置简单,性能较低 | 小规模应用 |
TUN(IP Tunneling) | IP 隧道 | 可跨网段,性能中等 | 跨机房部署 |
完整的环境配置
这两个服务在 Keepalived 中通过分别定义不同的 virtual_server
来区分。
由于 IPVS 是基于 <虚拟IP,端口,协议> 三元组建立映射的,因此 80 和 443 互不影响,各自的健康检查、调度算法和会话保持配置都可以独立设置。
bash
global_defs {
router_id LB_MASTER
enable_script_security
}
# HTTP 负载均衡
virtual_server 10.20.230.32 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 300 # HTTP 会话保持,时间相对较短
protocol TCP
real_server 192.168.1.10 80 {
weight 2
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
real_server 192.168.1.11 80 {
weight 1
HTTP_GET {
url {
path /health
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
}
# HTTPS 负载均衡
virtual_server 10.20.230.32 443 {
delay_loop 6
lb_algo wlc # 加权最少连接算法
lb_kind DR
persistence_timeout 600 # HTTPS 会话保持时间更长
protocol TCP
# 后端服务器1 - 高性能服务器
real_server 192.168.1.10 443 {
weight 3 # 更高的权重
inhibit_on_failure # 失败时禁用
SSL_GET { # HTTPS 健康检查
url {
path /health
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
# 后端服务器2 - 普通服务器
real_server 192.168.1.11 443 {
weight 1
inhibit_on_failure
SSL_GET {
url {
path /health
status_code 200
}
connect_timeout 3
retry 3
delay_before_retry 2
}
}
}
高级配置技巧
会话保持配置
会话保持(Session Persistence)适用于需要 长时间维持客户端和同一后端服务器交互 的业务场景:
- 流媒体(视频点播/直播):避免反复切换服务器导致播放卡顿
- WebSocket 长连接:必须确保连接持续性
- 在线文档/协作系统:会话中断会影响用户体验
bash
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
protocol TCP
persistence_timeout 1800 # 30分钟会话保持
# 基于客户端 IP 的会话保持
persistence_granularity 255.255.255.0 # 按 C 类网段
real_server 192.168.1.10 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
基于防火墙标记的负载均衡
这种方式提供了更灵活的流量控制能力:
bash
# 步骤1:设置防火墙标记
# 标记 HTTP 和 HTTPS 流量
iptables -t mangle -A PREROUTING -d 10.20.230.32 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 100
# 标记来自内网的流量
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 200
# 标记来自外网的流量
iptables -t mangle -A PREROUTING ! -s 192.168.0.0/16 -d 10.20.230.32 -p tcp --dport 443 -j MARK --set-mark 300
# 步骤2:Keepalived 配置
# 多端口服务
virtual_server fwmark 100 {
delay_loop 6
lb_algo wlc
lb_kind DR
protocol TCP
real_server 192.168.1.10 0 { # 端口0表示所有端口
weight 2
MISC_CHECK {
misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.10 80 443"
}
}
real_server 192.168.1.11 0 {
weight 1
MISC_CHECK {
misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.11 80 443"
}
}
}
# 内网服务器组
virtual_server fwmark 200 {
delay_loop 6
lb_algo rr
lb_kind DR
protocol TCP
real_server 192.168.1.20 443 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
# 外网服务器组
virtual_server fwmark 300 {
delay_loop 6
lb_algo wlc
lb_kind DR
protocol TCP
real_server 192.168.2.10 443 {
weight 2
TCP_CHECK {
connect_timeout 3
}
}
}
什么是四层负载均衡
四层负载均衡是指在 OSI 模型第四层(传输层) 工作的负载均衡方式。第四层包含 TCP/UDP 协议,所以四层负载均衡的调度依据主要是:
- IP 地址(源 IP/目的 IP)
- 端口号(源端口/目的端口)
- TCP/UDP 会话信息
在这种模式下,负载均衡器并不关心 HTTP、HTTPS、MQTT 等应用层协议的具体内容,而是根据 五元组 (源 IP, 源端口, 目的 IP, 目的端口, 传输协议) 来分发流量。
四层负载均衡的工作原理
假设有一台四层负载均衡器(LB),前面接收用户请求,后面挂着多台真实服务器(Real Server):
- 客户端发起连接:客户端向负载均衡器的 VIP(虚拟 IP)发起 TCP/UDP 请求。
- 负载均衡器选择后端:LB 根据四层信息(IP+端口+协议),使用一定的调度算法(如轮询 Round Robin、最少连接 Least Connection、一致性哈希等)选中一个真实服务器。
- 转发数据 :LB 会把客户端的请求报文转发给选中的后端服务器。
- 可能是 NAT 模式:对请求包头的目的 IP 和端口进行修改,再转发。
- 可能是 DSR(直接路由模式):只修改二层 MAC,不修改 IP。
- 可能是 TProxy(透明模式):保持源 IP 不变,直发后端。
- 返回给客户端 :
- 如果是 NAT,返回流量需要经由 LB,由 LB 改写后返回客户端。
- 如果是 DSR,后端服务器直接把结果返回给客户端(高性能,但需要配置 VIP)。