Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案

Linux 高可用与负载均衡实战:L4/L7 分层、HAProxy 配置与 ACL/会话保持、Keepalived 虚拟 IP 漂移、LVS 模式、Pacemaker 集群、故障切换与脑裂防护。

引言

单点故障与流量压力是服务化的两个宿敌。负载均衡把流量分到多台后端,高可用让一台挂了流量不中断。Linux 生态的经典组合是 HAProxy(L4/L7 负载均衡)+ Keepalived(虚拟 IP 漂移),进阶有 LVS 与 Pacemaker 集群。本文按「为什么需要 → 分层原理 → HAProxy 配置 → VIP 漂移 → 集群 → 会话保持 → 故障切换与脑裂」展开。

前置:/linux-network-commands/(网络与端口)、/linux-firewall-nftables/(NAT/转发)、/linux-systemd-services/(服务管理)。


目录


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)
资源级 HAPacemaker + 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]] — 基础设施与部署

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护
  3. Linux 虚拟化实战:KVM/QEMU、libvirt、virt-manager 与嵌套虚拟化