渐进式切换优于一次性切换
蓝环境
100% 流量
加权分流
95/5,然后 50/50
绿环境
100% 流量
蓝绿部署与 DNS 切换
蓝绿部署会同时保留两套完整的生产环境:一套在线(“蓝”),一套闲置但已完整部署、随时待命(“绿”),然后在两者之间一次性快速切换流量,而不是滚动更新。实现这种切换的一种常见方式,尤其是跨独立基础设施或跨服务商时,就是修改 DNS:在确认绿环境健康之后,把域名的记录更新为指向绿环境的地址。
简单做法的不足之处
基于 DNS 的切换并不像切换负载均衡器的目标组那样瞬时生效。每个缓存了旧(蓝)应答的解析器,都会一直返回它,直到该记录的 TTL 过期。这意味着在与 TTL 成正比的一段时间内,仍有一部分流量落在您刚刚想要切走的环境上。如果 TTL 是一小时,那么在切换于各处全部完成之前,流量可能在两个环境之间分流长达一小时。
- 在计划切换之前,提前很久就调低 TTL,最好至少提前一个完整的旧 TTL 周期,这样到切换时,所有解析器都已按新的较短 TTL 重新缓存。
- 切换之后,旧(蓝)环境要在至少一个 TTL 窗口内保持完整运行且健康,不要立刻下线,因为在这段时间里它仍在接收真实流量。
- 直接查询 DNS 来验证切换,而不是只看应用日志,这样可以确认记录本身已经改变,与有多少流量已经跟上无关。
- 只有在确认切换已经完成且稳定之后,才把 TTL 调回正常值。
渐进式替代方案:加权 DNS
与其一次性把所有解析器都切过去,并寄希望于绿环境能立即扛住全部生产负载,不如使用多家 DNS 服务商支持的加权(或按百分比)路由策略:95% 的应答指向蓝环境,5% 指向绿环境,并随着对新环境信心的增强逐步调整比例,例如 80/20、50/50,依此类推。
| 一次性切换 | 加权灰度发布 | |
|---|---|---|
| 出问题时的影响范围 | 100% 的流量,立即生效 | 一小部分可控的流量 |
| 回滚速度 | 很快,但会一次性撤销全部变更 | 很快,并且可以细粒度地分步回退 |
| 配置复杂度 | 简单,只需修改一条记录 | 需要服务商支持加权记录 |
| 最适合的场景 | 小范围、经过充分测试的变更 | 对关键基础设施的高风险变更 |
它用一次干净利落的简单切换,换来了在问题只影响一小部分流量时就能发现的能力;而且如果绿环境尚未就绪,几秒钟内就能切回 100% 蓝环境,不必在压力之下去撤销一次完整的切换。
两种方式用同样的方法验证
无论采用哪种策略,验证步骤都是相同的:从多个观测点反复解析该域名,并确认实际观察到的分流比例与配置一致。一个本应把 10% 流量送往绿环境、实际却送去了 40% 的加权策略,可能是权重配置有误,也可能是部分解析器有缓存,不像预期那样频繁地重新抽取分流。这类偏差,只有检查真实的解析应答才能发现,而不能指望 DNS 服务商的仪表盘完美反映现实。
需要查看某个域名的公网 DNS 地址?使用 Domain IP Lookup 工具。
相关阅读
一个 IP 对应一台服务器,还是对应多台
单播
一个 IP 恰好对应一台服务器
任播
一个 IP,从多个位置同时通告
任播 DNS 详解
同一个 IP 地址,同时从数十个地点对外通告,这就是任播(anycast)。大型 DNS 服务商正是借助它,在全球各地都保持快速而稳定的服务。
为什么查询结果显示的是 CDN,而非源站
访客
查询该域名
CDN 边缘节点
104.21.x.x
DNS 返回的就是它
源站服务器
真实 IP,从不暴露
CDN 如何借助 DNS 调度全球流量
内容分发网络真正的奥妙发生在 DNS 层,早在任何一个字节的内容被请求之前,流量的去向就已经决定了。
一个主机名,多条 A 记录
第 1 个答案
93.184.216.34
第 2 个答案
93.184.216.35
第 3 个答案
93.184.216.36
解析器会返回所有记录,通常按轮换顺序
DNS 轮询详解:在多个 IP 之间分担流量
了解 DNS 轮询如何返回多个地址,它在负载分配方面能做什么、不能做什么,以及缓存如何影响实际观察到的结果。