零宕机切换策略
零宕机切换的核心是:新旧服务器同时运行,通过 DNS 逐步将流量从旧迁到新,确认无误后再关闭旧服务器。
切换时序总览
timeline
title 服务器迁移时序
T-24h : 把所有关键 DNS 记录 TTL 降到 300
T-1h : 确认 TTL 已在全球传播(300 秒已生效)
T-0 : 修改 A 记录,指向新服务器 IP
T+5m : 验证新服务器已开始接收流量
T+30m : 监控错误率、响应时间,确认无异常
T+2h : 确认稳定,开始关闭旧服务器
T+24h : 把 TTL 恢复到 3600,旧服务器下线
切换步骤
Step 1:修改 A 记录
# 切换前确认(旧 IP)
dig @8.8.8.8 example.com A
# → 203.0.113.5(旧服务器)
# 在 DNS 后台修改 A 记录
# 旧: 203.0.113.5
# 新: 203.0.113.6
Step 2:验证新 IP 已传播
# 切换后立刻查(可能还是旧 IP,因为缓存未过期)
dig @8.8.8.8 example.com A
# 等 5 分钟后再查(TTL=300)
dig @8.8.8.8 example.com A
# → 203.0.113.6(新服务器)✅
用多个 DNS 服务器交叉验证:
dig @1.1.1.1 example.com A # Cloudflare DNS
dig @8.8.8.8 example.com A # Google DNS
dig @208.67.222.222 example.com A # OpenDNS
Step 3:监控新服务器
切换后的 30 分钟是关键窗口:
# 持续检查响应状态
watch -n 5 "curl -s -o /dev/null -w '%{http_code} %{time_total}s' https://example.com"
# 查看新服务器错误日志(Nginx)
tail -f /var/log/nginx/error.log
告警阈值: - 错误率 > 1% → 立刻评估是否回滚 - 响应时间 > 3s → 检查新服务器性能 - 5xx 错误率上升 → 可能是应用配置问题
多种切换策略
策略 1:直接切换(最简单)
直接把 A 记录的 IP 改掉。适合: - 小型站点 - 新旧服务器配置完全一致 - 流量不大,可接受短暂异常
策略 2:蓝绿切换(推荐)
同时维护两套环境(蓝 = 旧,绿 = 新),通过 DNS 切换流量:
graph LR
A[DNS] -->|当前指向| B[蓝环境
旧服务器] A -.->|切换后指向| C[绿环境
新服务器] B -.->|切换后保留 30 分钟| D[随时可回滚]
旧服务器] A -.->|切换后指向| C[绿环境
新服务器] B -.->|切换后保留 30 分钟| D[随时可回滚]
切换操作:把 DNS A 记录从蓝色 IP 改为绿色 IP。出问题时,改回蓝色 IP(5 分钟 TTL,快速回退)。
策略 3:灰度切换(流量大时使用)
把新服务器加入负载均衡,先分配 10% 流量,观察正常后逐步提高到 100%。
这需要你有负载均衡层(如 Nginx upstream 或 Cloudflare Load Balancing)。
Cloudflare Load Balancing 实现灰度
如果你使用 Cloudflare,可以用 Load Balancing(付费功能)实现流量比例切换:
流量池:
- 旧服务器 (203.0.113.5): 权重 90
- 新服务器 (203.0.113.6): 权重 10
→ 90% 流量到旧服务器,10% 到新服务器
→ 逐步调整比例:50/50 → 10/90 → 0/100
→ 确认 100% 正常后,删除旧服务器,取消负载均衡
旧服务器保留策略
DNS 切换后,不要立刻关闭旧服务器。
| 时间点 | 旧服务器状态 | 原因 |
|---|---|---|
| 切换后 0–2h | 继续运行,接受流量 | 还有旧缓存用户在访问 |
| 切换后 2–24h | 运行,但可以只读 | 应急回滚用 |
| 切换后 24–48h | 确认稳定后停止服务 | 全球 TTL 已刷新 |
| 切换后 1 周 | 数据备份后销毁实例 | 确认无遗漏 |
下一节:迁移后验证与回滚——如何系统验证迁移是否成功,以及出问题时的回滚操作。