物理服务器资源切换的核心是VIP漂移与健康检查驱动的无感接管。通过Keepalived的VRRP协议实现VIP动态绑定,配合Nginx自定义脚本检测服务状态,确保故障时1–3秒内完成切换;需配置一致的Nginx环境与无状态设计,并通过nopreempt等策略控制回切。

物理服务器资源切换的核心是让备用节点在主节点故障时,快速、无感地接管服务入口(VIP)和业务流量,而不是迁移数据或应用进程。它不依赖共享存储或状态同步,而是靠网络层的虚拟IP漂移和健康检查机制驱动。
虚拟IP(VIP)绑定与漂移
VIP 是整个切换过程的“门面”。它不固定在某块网卡上,而由 Keepalived 通过 VRRP 协议动态管理:
- 主节点正常时,Keepalived 主动广播 ARP 告知局域网:“VIP 的 MAC 地址是我的”,流量全部导向主节点
- 主节点宕机或 Keepalived 检测到 Nginx 异常(如端口不可达、HTTP 返回非200),心跳中断,备节点在 1–3 秒内触发接管
- 备节点立即广播新的 ARP 响应,更新交换机/路由器的 ARP 缓存,后续请求自动转发到它
- 切换全程对客户端透明,无需改 DNS 或客户端重连
Keepalived 健康检查脚本联动
仅靠 Keepalived 自带的心跳不够可靠——它只检测 Keepalived 进程是否存活,不感知 Nginx 实际服务能力。必须配合自定义检查脚本:
- 写一个简单脚本(如
/etc/keepalived/check_nginx.sh),用curl -I http://127.0.0.1:80或kill -0 $(cat /var/run/nginx.pid)验证 Nginx 是否响应 - 在 keepalived.conf 中配置
vrrp_script,设置interval 2(每2秒执行一次)、weight -10(失败时降低主节点优先级) - 当主节点 Nginx 崩溃但系统还在运行时,脚本失败 → 优先级下降 → 触发 VIP 漂移,避免“活着但不能服务”的假高可用
配置一致性与无状态设计
切换后用户请求落到备节点,必须保证它能立刻正确响应。这要求:
-
所有 Nginx 配置文件(
/etc/nginx/下)完全一致:建议用 rsync + 定时任务或 Ansible 同步,或通过 Git + 部署脚本统一分发 - SSL 证书、静态资源、日志路径等路径和权限保持一致:避免因路径错误导致 404 或 502
- Nginx 本身无本地会话状态:反向代理场景下,会话应交由后端应用(如 Redis 存 Session)或客户端 Cookie 管理,Nginx 节点只需专注转发
切换后的验证与回切策略
切换不是终点,还需确认效果并控制恢复逻辑:
- 切换后立即检查:
ip addr show看 VIP 是否出现在备节点网卡;curl -I http://VIP验证响应;查 Nginx access.log 确认请求已流入 - 主节点修复后,默认行为是“抢占式回切”(priority 更高者夺回 VIP)。若希望人工确认再回切,可在备节点 keepalived.conf 中添加
nopreempt参数 - 生产环境建议关闭抢占,避免频繁切换造成抖动;可通过手动重启主节点 Keepalived 或临时调低其 priority 来安全回切


















