Keepalived 负载均衡
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 互不影响,各自的健康检查、调度算法和会话保持配置都可以独立设置。
global_defs {router_id LB_MASTERenable_script_security
}# HTTP 负载均衡
virtual_server 10.20.230.32 80 {delay_loop 6lb_algo wlclb_kind DRpersistence_timeout 300 # HTTP 会话保持,时间相对较短protocol TCPreal_server 192.168.1.10 80 {weight 2HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}real_server 192.168.1.11 80 {weight 1HTTP_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}# HTTPS 负载均衡
virtual_server 10.20.230.32 443 {delay_loop 6lb_algo wlc # 加权最少连接算法lb_kind DRpersistence_timeout 600 # HTTPS 会话保持时间更长protocol TCP# 后端服务器1 - 高性能服务器real_server 192.168.1.10 443 {weight 3 # 更高的权重inhibit_on_failure # 失败时禁用SSL_GET { # HTTPS 健康检查url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}# 后端服务器2 - 普通服务器real_server 192.168.1.11 443 {weight 1inhibit_on_failureSSL_GET {url {path /healthstatus_code 200}connect_timeout 3retry 3delay_before_retry 2}}
}
高级配置技巧
会话保持配置
会话保持(Session Persistence)适用于需要 长时间维持客户端和同一后端服务器交互 的业务场景:
- 流媒体(视频点播/直播):避免反复切换服务器导致播放卡顿
- WebSocket 长连接:必须确保连接持续性
- 在线文档/协作系统:会话中断会影响用户体验
virtual_server 192.168.1.100 80 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPpersistence_timeout 1800 # 30分钟会话保持# 基于客户端 IP 的会话保持persistence_granularity 255.255.255.0 # 按 C 类网段real_server 192.168.1.10 80 {weight 1TCP_CHECK {connect_timeout 3}}
}
基于防火墙标记的负载均衡
这种方式提供了更灵活的流量控制能力:
# 步骤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 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.1.10 0 { # 端口0表示所有端口weight 2MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.10 80 443"}}real_server 192.168.1.11 0 {weight 1MISC_CHECK {misc_path "/usr/local/bin/check_multi_port.sh 192.168.1.11 80 443"}}
}# 内网服务器组
virtual_server fwmark 200 {delay_loop 6lb_algo rrlb_kind DRprotocol TCPreal_server 192.168.1.20 443 {weight 1TCP_CHECK {connect_timeout 3}}
}# 外网服务器组
virtual_server fwmark 300 {delay_loop 6lb_algo wlclb_kind DRprotocol TCPreal_server 192.168.2.10 443 {weight 2TCP_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)。