引言
单点故障与流量压力是服务化的两个宿敌。负载均衡把流量分到多台后端,高可用让一台挂了流量不中断。Linux 生态的经典组合是 HAProxy(L4/L7 负载均衡)+ Keepalived(虚拟 IP 漂移),进阶有 LVS 与 Pacemaker 集群。本文按「为什么需要 → 分层原理 → HAProxy 配置 → VIP 漂移 → 集群 → 会话保持 → 故障切换与脑裂」展开。
前置:/linux-network-commands/(网络与端口)、/linux-firewall-nftables/(NAT/转发)、/linux-systemd-services/(服务管理)。
目录
- 1. 高可用与负载均衡的目标
- 2. 分层原理:L4 与 L7 负载均衡
- 3. HAProxy 配置:frontend、backend 与算法
- 4. ACL 与高级路由:按路径、来源分流
- 5. Keepalived:虚拟 IP 与健康检查
- 6. LVS:内核级负载均衡
- 7. Pacemaker:资源级高可用集群
- 8. 会话保持与无状态设计
- 9. 故障切换与脑裂防护
- 10. 速查表与一句话记忆
- 延伸阅读
1. 高可用与负载均衡的目标
两个目标要分清:
负载均衡:把流量分摊到多后端 → 提升吞吐与利用率
高可用:后端/入口挂了流量不中断 → 提升可用性(SLA)
衡量指标:
- 可用性:9 个 9(99.9% = 每年停机 ~9 小时)
- 吞吐:QPS / 带宽
- 延迟:P50/P99
为什么不能只用一台:单点 → 故障即中断;单机 → 流量上限。
「入口」本身也要 HA:LB 自己也是单点 → LB 集群 + VIP 漂移(Keepalived)。
典型拓扑:
客户端 → VIP(Keepalived 管理)→ HAProxy 集群 → 后端多台 Web
记忆:负载均衡分流量、高可用保不中断;单点不止在后端,LB 自己也要集群 + VIP;指标看可用性/吞吐/延迟三件。
2. 分层原理:L4 与 L7 负载均衡
按网络层分两种:
L4(传输层):看 IP:端口 转发(内核态,快、状态少)
L7(应用层):看 HTTP 内容(Host/路径/头),智能但慢
对比:
| 维度 | L4(如 LVS) | L7(如 HAProxy HTTP 模式) |
|---|---|---|
| 转发依据 | IP:端口 | HTTP 报文内容 |
| 性能 | 高(内核态) | 中(用户态解析) |
| 智能路由 | 否 | 是(ACL、按路径) |
| 会话保持 | 源地址/算法 | Cookie 等 |
HAProxy 同时支持:mode tcp(L4)/ mode http(L7)。
选型:
- 单纯流量分发(数据库/Redis):L4
- Web 应用要按路径/会话保持:L7
- 常组合:L4 抗 DDoS + L7 应用路由
记忆:L4 看 IP:端口、内核态快;L7 看 HTTP 内容、能智能路由;HAProxy 用 mode tcp 或 mode http 二选;纯转发用 L4、应用路由用 L7。
3. HAProxy 配置:frontend、backend 与算法
HAProxy 三段式配置:
frontend:接收流量(监听 + 规则)
backend :后端服务器池
defaults:全局默认
最小配置:
global
log /dev/log local0
maxconn 4096
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http-in
bind *:80
default_backend web_servers
backend web_servers
balance roundrobin
server web1 10.0.0.11:8080 check
server web2 10.0.0.12:8080 check
负载均衡算法:
roundrobin:轮询(默认)
leastconn:最少连接(长连接友好)
source:源 IP 哈希(会话保持)
uri:URI 哈希(缓存友好)
健康检查:check 主动探测后端;可自定义检查路径:
backend web_servers
option httpchk GET /healthz
server web1 10.0.0.11:8080 check
记忆:HAProxy 三段——frontend 收流量、backend 后端池、defaults 默认;算法 roundrobin/leastconn/source/uri 按场景选;
check+option httpchk做健康检查自动摘除坏后端。
4. ACL 与高级路由:按路径、来源分流
ACL(访问控制列表):根据报文内容路由到不同 backend。
frontend http-in
bind *:80
# 按路径分流
acl is_api path_beg /api
use_backend api_servers if is_api
default_backend web_servers
# 按来源 IP 分流(灰度)
acl is_canary src 10.0.0.100
use_backend canary_servers if is_canary
backend api_servers
server api1 10.0.0.21:8080 check
backend canary_servers
server canary1 10.0.0.31:8080 check
常用 ACL 条件:
path_beg /path_start、path_end、hdr(host)、src、dst_port
HTTP 头改写与限速:
# 加响应头
http-response set-header X-Served-By haproxy
# 限速
stick-table type ip size 1m expire 10m
http-request track-sc0 src
HTTPS 终结:
frontend https-in
bind *:443 ssl crt /etc/ssl/haproxy.pem
default_backend web_servers
记忆:ACL 让 HAProxy 变智能网关——path_beg 按路径、src 按来源灰度、hdr(host) 按域名分流;加头/限速/HTTPS 终结(ssl crt)都在 frontend 配。
5. Keepalived:虚拟 IP 与健康检查
Keepalived = VIP(虚拟 IP)+ VRRP 协议:两台 LB 共用一个 VIP,主挂了 VIP 漂到备。
配置主节点(/etc/keepalived/keepalived.conf):
vrrp_instance VI_1 {
state MASTER # 主
interface eth0
virtual_router_id 51
priority 100 # 主 > 备
virtual_ipaddress {
10.0.0.50 # 虚拟 IP
}
track_script {
check_haproxy # 健康检查脚本
}
}
备节点:state BACKUP、priority 90。
健康检查脚本:HAProxy 挂了自动降级/漂移:
#!/bin/bash
# /etc/keepalived/check_haproxy.sh
systemctl is-active --quiet haproxy && exit 0 || exit 1
VIP 的作用:客户端只连 VIP,不感知后端切换——IP 不中断。
记忆:Keepalived 用 VRRP 管 VIP——主 MASTER priority 高、备 BACKUP 低,track_script 健康检查挂了就漂 VIP;客户端只认 VIP,切换无感知。
6. LVS:内核级负载均衡
LVS(Linux Virtual Server):内核态负载均衡,性能最高。
三种模式:
NAT :LB 转发并改地址(后端回包走 LB)
DR :LB 只转发请求,后端直接回包(最高性能)
Tunnel:IP 隧道封装(跨机房)
DR 模式配置(ipvsadm):
# LB 上配置
ipvsadm -A -t 10.0.0.50:80 -s rr
ipvsadm -a -t 10.0.0.50:80 -r 10.0.0.11:80 -g
ipvsadm -a -t 10.0.0.50:80 -r 10.0.0.12:80 -g
# 后端要配置 VIP 到回环并禁 ARP 响应
DR 关键:后端回包直连客户端 → LB 无回包瓶颈。
选型:LVS 快但配置内核化、HAProxy 功能多;常组合:LVS(L4 高吞吐)+ HAProxy(L7 应用路由)。
记忆:LVS 三模式——NAT 转发改地址、DR 后端直回最高性能、Tunnel 跨机房;DR 后端回环绑 VIP 禁 ARP;实战常 LVS 扛吞吐 + HAProxy 做应用层。
7. Pacemaker:资源级高可用集群
Pacemaker + Corosync:把「资源」(IP/服务/文件系统)做成可漂移的集群资源。
Corosync:成员通信与心跳
Pacemaker:资源编排与决策
资源漂移示例:VIP + 服务绑定,节点挂了整体漂移。
pcs cluster setup mycluster node1 node2 # 建集群
pcs resource create vip IPaddr2 ip=10.0.0.50
pcs resource create web systemd:nginx
pcs constraint colocation add web vip # 一起漂
用途:数据库主备(drbd + pacemaker)、NFS、多服务绑定漂移。
与 Keepalived 区别:
- Keepalived:简单(VIP 漂移)
- Pacemaker:复杂(资源编排、多资源、法定人数)
- 小规模用 Keepalived、关键资源集群用 Pacemaker
记忆:Pacemaker+Corosync 做资源级 HA——VIP/服务/文件系统作为资源整体漂移;colocation 约束绑定同漂;简单 VIP 用 Keepalived、多资源编排用 Pacemaker。
8. 会话保持与无状态设计
负载均衡的分流会「拆散」用户会话——需要会话保持或设计成无状态。
会话保持四法:
① 源 IP 哈希(source 算法):同一 IP 固定一台
② Cookie:HAProxy 注入 cookie 标识后端
③ Redis 集中会话:后端共享会话存储
④ 无状态:把状态外置(JWT/token、数据库)
HAProxy cookie:
backend web_servers
balance roundrobin
cookie SRV insert indirect nocache
server web1 10.0.0.11:8080 cookie w1 check
server web2 10.0.0.12:8080 cookie w2 check
最佳实践:能无状态就别做会话保持——JWT 外置状态,任意后端可服务,扩缩容无缝。
记忆:会话保持四法——源 IP 哈希、Cookie 注入、Redis 集中会话、无状态外置;能无状态就别保持(JWT/token),扩缩容才自由。
9. 故障切换与脑裂防护
故障切换流程:
后端故障 → 健康检查失败 → 摘除(HAProxy check)
LB 故障 → Keepalived 检测 → VIP 漂移 → 客户端无感
服务级故障 → Pacemaker 资源漂移
脑裂(Split-brain):集群节点都认为对方死了,各自主导 → 数据不一致。
脑裂防护:
- 法定人数(Quorum):多数节点投票才接管
- 仲裁盘/隔离(fencing):把故障节点强制隔离
- VRRP:优先级 + 抢占机制避免双主
- STONITH(Pacemaker):断电故障节点
切换注意事项:
- 会话迁移:有状态的会话需处理
- 双写风险:数据库切换要防双主(fencing 必须)
- 切换演练:定期演练故障切换
记忆:切换三层——后端挂被 check 摘除、LB 挂 VIP 漂移、服务挂资源漂移;脑裂防护用 Quorum 法定人数 + fencing/STONITH 强制隔离故障节点,数据库切换绝不可双主。
10. 速查表与一句话记忆
| 场景 | 方案 |
|---|---|
| L4 高吞吐 | LVS(DR 模式) |
| L7 应用路由 | HAProxy(mode http + ACL) |
| VIP 漂移 | Keepalived(VRRP) |
| 资源级 HA | Pacemaker + Corosync |
| 会话保持 | Cookie / 源 IP / 无状态外置 |
| 健康检查 | HAProxy check / Keepalived track_script |
| 脑裂防护 | Quorum + fencing/STONITH |
一句话记忆:高可用与负载均衡 = 负载均衡分流量(L4 内核态 LVS/HAProxy tcp、L7 应用路由 HAProxy http + ACL 按路径/来源/域名分流)+ 高可用保不中断(Keepalived VRRP 管 VIP 漂移、Pacemaker 做资源级集群、健康检查自动摘除坏节点);会话能无状态就别保持(JWT 外置);切换三层——后端挂被摘、LB 挂 VIP 漂、服务挂资源漂;脑裂用 Quorum 法定人数 + fencing 隔离防双主——让「一台挂了」从事故变成常态运维的自动动作。
延伸阅读
- /linux-network-commands/ — 网络与端口排查
- /linux-firewall-nftables/ — NAT/转发与网络防护
- /linux-systemd-services/ — 服务管理与自启
- /linux-containers-isolation/ — 容器网络与隔离
- [[network]] — 网络协议与路由
- [[infra]] — 基础设施与部署
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。