连载中 14/15

高可用:Keepalived 让 Nginx 自己不成为单点

2026-09-29 · 16 阅读 · 0 评论 · 0 赞

单点问题

前面的优化让一台 Nginx 无所不能,但架构图上它仍是那个单点:机器宕机、进程崩溃、网卡故障,全站跟着断。给大门做冗余有三条路:DNS 多 A 记录(简单但生效慢、无健康检查)、云 SLB(托管省心,花钱)、Keepalived 主备(自建免费,本篇主角)。

VIP 漂移原理

// VRRP(虚拟路由冗余协议)一句话版:
//   两台机器共享一个"虚拟 IP"(VIP),域名指向 VIP
//   主节点持有 VIP 并周期广播"我还活着"(默认每秒)
//   备节点收不到广播(超过 3 秒)→ 抢占 VIP,流量自动切过来
//
// 关键认知:VIP 不在任何一台机器的配置文件里写死
//   它由 Keepalived 动态挂载/摘除(ip addr 才看得到)
//   所以切换对客户端完全透明——DNS 不动,连接重新建立

Keepalived 配置要点

# /etc/keepalived/keepalived.conf(主节点)
vrrp_script check_nginx {
    script "/etc/keepalived/check_nginx.sh"   # 检查 Nginx 活没活
    interval 2
    weight -30                                # 检查失败降 30 分
}
vrrp_instance VI_1 {
    state MASTER               # 备节点填 BACKUP
    interface eth0
    virtual_router_id 51       # 主备必须一致
    priority 100               # 主 100 备 90,分高者为主
    advert_int 1               # 广播间隔 1 秒
    virtual_ipaddress {
        10.0.0.100             # 虚拟 IP
    }
    track_script {
        check_nginx            # Nginx 挂 → 降权 → 触发切换
    }
}
# check_nginx.sh:curl 本地健康接口失败则 killall keepalived
#   或让脚本返回非零——只看进程不看业务是假活

health check 的精髓

只检查 Keepalived 进程是没用的——进程活着不代表 Nginx 活着。检查脚本要打到业务:curl 一个真实接口,失败才算故障。这也呼应预案演练那篇的思想:切换机制必须演练过才算数——kill 掉主节点 Nginx,看 VIP 是不是真在几秒内漂过去、业务是不是真的无感,切过一次心里才有底。

脑裂:双主互抢

最阴险的故障是脑裂:主备之间广播被防火墙拦了(VRRP 协议是组播),双方都收不到对方心跳,各自认为"对方死了",同时挂上 VIP。ARP 表里一个 IP 对应两个 MAC,流量时通时断,极难排查。防护思路:放开 VRRP 组播的防火墙规则是第一要务;更保险的用 unicast(单播)指定对端地址;监控上检测"两台机器同时持有 VIP"直接告警。

自建还是托管

方案优点代价
Keepalived 主备免费、可控、配置透明备机平时闲置、脑裂风险、自运维
云 SLB/负载均衡托管高可用、自带监控、弹性花钱、深度定制受限
多机房 DNS/Anycast容灾级别最高复杂度最高,大厂方案

选择逻辑很简单:云上业务优先 SLB(把精力花在业务上),裸金属与私有化环境用 Keepalived(SLB 买不着)。无论哪条路,切换演练都是必做项。下一篇收官,把十五篇串成一张全景图。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#Keepalived#高可用#VRRP#VIP漂移#脑裂

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10100 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9872 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9293 阅读 · 21 评论 · 287 赞