现场是这样的。蓝绿切换把域名指向绿集群,十分钟后监控显示旧集群还有 47% 的流量,部分用户看到的是旧版本页面,客服收到几通电话。

中间走过弯路,把「内部服务走服务发现缓存,没跟着刷新」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。DNS 记录的 TTL 是 600 秒,客户端缓存未过期;客户端连接池长连接不重连;旧集群的健康检查仍被注册中心保留。

第一件事是查权威记录的 TTL

dig +nocmd api.example.com +noall +answer

接着把 TTL 提前降到 60 秒再切换

curl -X PATCH https://dns.example.com/v1/zones/example.com/records/api -d '{"ttl":60}'

然后让旧集群主动关闭长连接

nginx -s reload && kill -HUP $(cat /run/nginx.pid)

剩下的就是等旧集群连接数归零后再下线

curl -s http://old-lb:9090/metrics | grep nginx_connections_active

别只看报错消失,验证要多做一步。旧集群活跃连接降到零,DNS 解析只返回新集群地址,前端版本号全部是新的。

容易忽略的是,蓝绿切换的真正难点是缓存和长连接,先把 TTL 降下来再切,能少掉一半的灰度投诉。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189