单点问题
前面的优化让一台 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 买不着)。无论哪条路,切换演练都是必做项。下一篇收官,把十五篇串成一张全景图。
评论 (0)