一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 与 Keepalived 实现分布式服务的高可用支撑

时间:2026-08-16 20:00:47 编辑:袖梨 来源:一聚教程网

Nginx与Keepalived高可用需构建“可感知、可响应、可收敛”闭环:健康检查须穿透业务层,切换逻辑需权重+时间窗防抖动,配置与资源必须严格同步,验证须覆盖端到端故障链路。

要让 Nginx 与 Keepalived 真正支撑起分布式服务的高可用,关键不是堆机器,而是构建一套“可感知、可响应、可收敛”的闭环机制。它不单是 VIP 漂移,而是把服务健康状态、网络连通性、配置一致性、切换行为全部纳入可控范围。

健康检查必须穿透到业务层

只检测 Nginx 进程是否存活远远不够——进程在,但 upstream 全挂、SSL 加载失败、location 配置被误删,用户照样打不开报表或登录页。真实可用性检查得层层递进:

  1. 确认主进程存在且有权限:kill -0 $(cat /var/run/nginx.pid 2>/dev/null)
  2. 验证监听端口真实生效:ss -tln | grep -q ':443$'(别只查 80)
  3. 发起轻量级 HTTP 探针:curl -f http://127.0.0.1/healthz -s -o /dev/null -w '%{http_code}',需在 Nginx 中明确定义 location /healthz { return 200; }
  4. 脚本统一返回 exit 0 表示健康,非 0 触发降权,Keepalived 才会真正“信”

Keepalived 切换逻辑要可量化、防抖动

切换不是靠“感觉”,而是靠权重变化和时间窗口双重约束:

  1. 主节点 priority 100,备节点 priority 90,差值设为 5~10,留出缓冲空间
  2. vrrp_scriptweight -5 + interval 2 + timeout 3,确保两次失败才触发降权,避免瞬时卡顿误判
  3. 启用 preempt_delay 30,主恢复后等待半分钟再尝试抢主,防止网络抖动引发反复切换
  4. virtual_router_idauth_pass 主备必须完全一致,否则 VRRP 报文根本收不到

接管后行为必须零差异

VIP 漂过去只是第一步,备机能否无缝承接,取决于配置与资源是否同步:

  1. Nginx 配置文件(nginx.confinclude 的所有子配置)需用 rsync 或 Ansible 定期同步,禁止手工修改备机
  2. SSL 证书路径、私钥权限、静态资源目录(如 BI 前端 dist 包)必须完全一致,建议统一挂载 NFS 或对象存储
  3. 启用 notify_masternotify_backup 脚本,在角色变更时自动 reload Nginx、清理本地缓存、推送告警
  4. 所有日志路径、PID 文件位置、user/group 设置保持一致,避免启动失败

验证必须模拟真实故障链路

不能只 ping VIP 或看 ip addr,要走通端到端请求流:

  1. kill -9 $(cat /var/run/nginx.pid) 强制终止主节点 Nginx,观察 VIP 是否 3 秒内出现在备机 ip addr 输出中
  2. 同时运行持续探测:while true; do curl -s -w "%{http_code}n" http://VIP/healthz; sleep 0.5; done,确认 HTTP 状态码从 000 → 502 → 200 的完整过渡
  3. 检查备机 Nginx error.log 是否有 upstream timeout、connect refused 等残留错误,说明后端服务未同步就绪
  4. 用 tcpdump 抓包验证:VIP 切换后,客户端 SYN 包是否准确到达备机 eth0,而非被 ARP 缓存误导

热门栏目