现场是这样的。蓝绿切换把域名指向绿集群,十分钟后监控显示旧集群还有 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 降下来再切,能少掉一半的灰度投诉。这类问题最好一次改到位,反复小改反而容易把原因搅混。
