DNS低TTL配合负载均衡做故障切换,能不能秒级恢复

这个问题在生产环境里经常被问到,尤其是业务做多地域、多线路、海外回国链路、高防切换的时候。把域名TTL设置成10秒、30秒,然后后面接两组负载均衡,主站挂了就把DNS解析切到备站,看起来很自然:DNS很快刷新,流量很快过去,业务很快恢复。

实际使用中发现,DNS低TTL确实能缩短一部分切换时间,但它不是“秒级恢复”的保证。真正影响恢复时间的,不只是权威DNS里写的TTL,还有递归DNS缓存、客户端DNS缓存、应用连接池、浏览器连接复用、运营商解析策略、健康检查周期、负载均衡本身的探测和摘除机制。

简单说,低TTL更像是让“新发起解析的用户”更快拿到新地址,不等于让“所有正在访问的用户”马上切过去。

先把DNS切换链路拆开看

一次域名访问大概会经过这些环节:客户端发起解析,本地系统查缓存,浏览器或应用查缓存,本地DNS递归服务器查缓存,递归服务器再去权威DNS拿记录,拿到IP后客户端建立TCP或TLS连接,然后请求进入负载均衡。

TTL主要约束的是DNS记录在缓存里的存活时间。比如权威DNS返回A记录,TTL是30秒,理论上递归DNS最多缓存30秒。但这里的“理论上”很关键。

有些公共DNS会尊重TTL,30秒就30秒。有些运营商递归DNS可能会设置最小缓存时间,比如你写10秒,它实际按60秒甚至更长处理。还有些客户端应用自己做DNS缓存,Java、Go、Node.js、移动App SDK、浏览器都可能有自己的行为。这里一旦缓存没过期,权威DNS已经切了,客户端也未必马上知道。

所以DNS低TTL解决的是“解析结果多久有机会更新”,不是“故障流量多久一定切走”。

负载均衡的故障切换和DNS切换不是一回事

很多人把DNS切换和负载均衡切换混在一起看。其实它们处在不同层级。

负载均衡内部做故障切换,通常发生在同一个入口IP后面。比如一个公网VIP后面挂了3台后端Web服务器,健康检查发现其中1台502或者端口不通,就把这台摘掉。用户访问的域名和IP没变,请求只是被调度到健康后端。这种切换可以做到很快,5秒、3秒甚至更短都有可能。

DNS切换是把域名从一个IP切到另一个IP。比如主站在A机房,备站在B机房,A机房公网入口不可用,就把www.example.com从1.1.1.1切到2.2.2.2。这个动作要穿过DNS缓存链路,恢复时间更不稳定。

实际架构里,建议把两类切换分清楚:同机房后端故障,交给SLB、Nginx、HAProxy、LVS、云负载均衡处理;跨机房、跨地域、跨线路入口故障,才考虑DNS、GSLB、Anycast BGP或者业务层多活。

TTL设置成10秒,用户真的10秒后都切过去吗

不一定。

看一个生产里比较常见的时间线:

00:00 主机房入口异常,公网IP还通,但后端大量超时。

00:05 监控探测连续失败,触发DNS故障切换。

00:06 权威DNS记录从A入口切到B入口,TTL为30秒。

00:10 部分使用公共DNS的客户端重新解析,拿到B入口。

00:30 到00:90 大部分尊重TTL的递归DNS缓存过期,新解析逐步进入B入口。

02:00 仍有少量运营商递归DNS、企业内网DNS、移动端App缓存继续使用旧IP。

这个过程里,权威DNS切换只用了1秒,但用户侧流量迁移不是1秒。DNS系统天然是分布式缓存系统,不能按单点配置来估算全网行为。

多说一句,很多压测只在本机dig一下权威DNS,看到TTL变化很快,就认为线上也会这么快。这个判断不太稳。更接近真实的做法,是从不同网络、不同递归DNS、不同地区去测解析结果,比如电信、联通、移动、教育网、海外节点、公网DNS 8.8.8.8、1.1.1.1、114DNS、运营商默认DNS都测一遍。

常见TTL与实际恢复感受

下面这组数据不是协议标准,是生产环境里常见的体感区间,适合拿来做预估。

TTL 5秒到10秒:权威DNS变化很快,但部分递归DNS会忽略这么低的TTL;适合灰度、临时迁移、精细调度,但查询量会明显增加。

TTL 30秒:比较常用。公共DNS通常表现不错,切换后几十秒内会看到明显流量迁移。用于故障切换比较合适。

TTL 60秒:稳定性和查询压力比较均衡。多数业务可以接受1到3分钟内流量逐步收敛。

TTL 300秒:常规生产默认值。适合稳定入口,不适合对跨地域故障恢复要求很高的场景。

TTL 600秒以上:适合不频繁变更的记录,比如后台、管理域名、低频业务。拿它做故障切换,恢复时间通常不会好看。

实际使用中发现,TTL设置到30秒以下,收益会开始变窄。原因不是权威DNS做不到,而是递归DNS、客户端缓存和长连接开始成为主要限制。

长连接会让DNS切换看起来“没生效”

DNS只发生在建立连接之前。连接已经建立后,客户端不会因为DNS记录变了就自动断开旧连接。

比如HTTP/2、WebSocket、gRPC、数据库连接池、MQ连接、游戏长连接,这些场景里DNS低TTL的效果会被削弱。客户端只要还连着旧IP,就会继续走旧入口。旧入口如果半死不活,比如TCP能连上但业务响应很慢,客户端还可能卡很久。

这也是为什么有些故障里,DNS已经切到备用机房了,但监控里旧机房还有流量。不是DNS没切,而是连接没断、缓存没过、客户端没重新解析。

这里补充一点,故障切换要想快,旧入口的失败状态反而要明确。端口彻底不通、TCP快速失败,客户端更容易重连和重新解析。最麻烦的是“能连上但请求超时”,这种半故障会拖慢恢复。

健康检查周期比TTL更容易被低估

很多人只盯TTL,忽略健康检查。DNS故障切换通常依赖探测系统判断主入口不可用,然后才修改解析。探测策略如果太保守,前面已经浪费几十秒。

比如健康检查间隔10秒,失败3次判定故障,那最少就要接近30秒才触发。再加DNS缓存,用户侧恢复可能就是1到3分钟。

如果业务目标是更快恢复,健康检查可以设成间隔2秒到5秒,失败2到3次切换。但这也会带来误切风险。网络抖动、单个探测点异常、源站限流,都可能导致错误切换。

生产里更稳的做法是多探测点投票,不要只靠一个监控节点。比如北京电信、上海联通、广州移动、香港、美国西海岸同时探测,达到一定失败比例才切。否则某条线路抖一下,DNS就来回漂,用户体验会更差。

什么时候DNS低TTL能接近秒级效果

有些场景确实能看到接近秒级的切换效果,但条件比较苛刻。

客户端每次请求都重新解析,或者连接生命周期很短。

客户端使用的递归DNS尊重低TTL。

故障探测非常快,且不会误判。

备用入口长期热备,证书、配置、数据、缓存都已经准备好。

旧入口故障表现为快速失败,而不是长时间超时。

业务入口没有被企业内网DNS、代理、SDK缓存强行固定。

满足这些条件时,部分用户能在10秒到30秒内恢复。但要说全网所有用户稳定秒级恢复,DNS低TTL单独扛不住。

真正要秒级,通常要把故障控制在DNS下面

如果业务对恢复时间要求很高,应该尽量让入口IP不变,把故障切换放在负载均衡、Anycast BGP、GSLB调度、服务发现、客户端容灾这些层面。

同地域内,公网负载均衡后面挂多台后端,健康检查摘除异常节点,这类切换最直接。用户不需要重新解析DNS,不受递归缓存影响。

跨可用区,可以用云厂商的多AZ负载均衡。入口VIP不变,后端跨AZ。单AZ故障时,SLB调度到其他AZ。这个恢复速度通常比DNS切换稳定。

跨地域就复杂一些。可以用GSLB加低TTL,也可以用Anycast BGP把同一个IP在多个地域宣告出去。Anycast适合边缘接入、DDoS清洗、静态加速、DNS服务这类场景,但业务有状态、回源路径、会话保持都要额外设计。

对于游戏、金融交易、实时音视频这类长连接业务,DNS切换只能算入口容灾的一部分。客户端需要有重连策略、备用域名、备用IP列表,甚至要支持线路探测和主动切线。

海外回国和高防场景更要注意TTL预期

海外业务经常会遇到这种设计:正常流量走韩国、日本、香港精品线路,攻击来了切到美国高防或国内高防清洗,或者主线路拥塞时切备用线路。

这里DNS低TTL有用,但要看业务类型。网站类、API类、短连接业务,30秒TTL配合健康检查,切换效果通常可以接受。游戏长连接、WebSocket、TCP隧道类业务,DNS切换后老连接不会自动迁移,客户端重连策略才是关键。

如果你也在找这种高防、海外回国优化、企业建站用的云服务器,可以看看129云。比如美国高防-C型适合需要300G防御、三网精品线路的业务;韩国-E型带傲盾防火墙和回国优化,适合对亚洲访问延迟敏感的场景;内蒙电信-B型更偏建站和电信优化线路。需要按业务线路和防御量确认的话,可以直接打客服热线400-9177118。

DNS低TTL不是越低越好

TTL太低会增加权威DNS查询量。对普通业务来说,这个成本可能不明显,但对大流量站点、全球业务、频繁解析的移动端业务,查询量会很可观。

还有一个问题是稳定性。TTL低意味着解析变化更快,如果调度系统判断不准,用户会频繁拿到不同入口。对于有会话保持、地域缓存、源站数据一致性要求的业务,这种漂移不一定是好事。

生产里常见设置是:核心业务入口TTL设30秒到60秒;稳定后台域名设300秒;验证、迁移、灰度期间临时降到30秒;切换完成并稳定后再按业务情况调回去。

不建议长期把所有记录都设成1秒、5秒。很多递归DNS不会完全尊重,权威DNS压力上去了,用户侧收益却不明显。

故障切换前要提前把备用入口热起来

DNS切过去只是让流量到备用入口。备用入口能不能扛住,是另一件事。

实际事故里见过不少情况:DNS切换成功了,备用机房CPU打满;证书链不完整;Nginx配置少了一段;对象存储跨区权限没开;数据库只读副本不能写;缓存没预热,请求全打到数据库;高防IP回源白名单没加。

这些问题和TTL没关系,但会让人误以为“DNS故障切换不可靠”。更准确地说,是备用链路没有长期处于可接管状态。

比较稳的做法是让备用入口长期承接一小部分真实流量,比如1%到5%。这样证书、配置、日志、监控、链路质量都会持续暴露问题。完全冷备只在演练时跑一下,真故障时风险很高。

监控指标别只看域名解析

DNS切换类监控至少要看三层。

解析层:不同地区、不同运营商、不同递归DNS拿到的A记录或CNAME是否符合预期。

连接层:TCP握手、TLS握手、首包时间、丢包率、重传率。

业务层:HTTP状态码、接口耗时、登录成功率、支付成功率、房间连接成功率、消息发送成功率。

只看解析会漏掉很多问题。DNS已经返回备用IP,但备用IP的TLS握手慢、回源失败、数据库写入异常,用户还是不可用。

多说一句,健康检查也不要只探测/health返回200。很多业务的/health是本机进程活着就返回200,数据库挂了、Redis挂了、上游API挂了,它仍然健康。切换系统应该探测更接近真实业务的路径,至少要覆盖依赖项的关键状态。

DNS切换时还要考虑CNAME链路

很多域名不是直接A记录,而是CNAME到CDN、WAF、高防、GSLB平台。CNAME链路里每一层都有TTL。

比如www.example.com CNAME到a.gslb.example.net,a.gslb.example.net再返回A记录。你只把www的TTL设成30秒,但下一级A记录TTL是300秒,实际切换仍然可能被300秒拖住。

排查时不要只dig最终域名,要把CNAME链逐层展开,看每一层TTL。尤其是接入CDN、高防IP、海外加速节点时,这个问题很常见。

业务侧重连策略比想象中重要

客户端如果拿到旧IP访问失败,下一步怎么做,决定了用户恢复速度。

浏览器访问普通网页,刷新一次可能就重新解析了。移动App不一定,有些HTTP客户端连接池会复用连接,有些SDK会缓存DNS结果,有些失败重试还是打同一个IP。

长连接业务更明显。客户端应该在连续失败后断开连接,清理DNS缓存或重新走系统解析;可以内置备用域名;可以做多个接入点测速;也可以在服务端下发备用入口列表。

这里不要把所有压力都交给DNS。DNS负责告诉客户端入口在哪里,客户端也要知道入口不可用时怎么重新选择。

一个比较接近真实的恢复时间估算

假设TTL为30秒,健康检查间隔5秒,失败3次切换,公共DNS和运营商DNS混合,业务以HTTPS短连接为主。

故障发现时间:10到15秒。

DNS记录切换时间:1到3秒。

递归DNS缓存过期:30到90秒内大部分完成。

客户端重新建连:几秒到几十秒。

这种情况下,大盘流量可能在1分钟左右明显恢复,2到3分钟趋于稳定。部分用户可以在30秒内恢复,少量用户会更慢。

如果是WebSocket或游戏TCP长连接,恢复时间更多取决于客户端超时和重连。客户端如果设置60秒读超时,再加DNS缓存,用户侧感知可能就是1到3分钟甚至更长。

哪些场景适合用DNS低TTL做故障切换

网站、API、管理后台、下载入口、短连接服务,适合用DNS低TTL配合GSLB或健康检查做主备切换。

多线路访问,比如电信、联通、移动、海外用户分线路解析,也适合。TTL设30秒到60秒,既能应对线路波动,也不会让DNS查询量过于夸张。

高防切换也适合,但要提前验证清洗线路、回源白名单、证书、源站隐藏、防护策略。DDoS场景下,攻击流量不会因为DNS切换马上消失,旧IP还会继续被打,源站暴露过的话也可能被绕过高防直打。

不太适合只靠DNS低TTL的场景,是强实时长连接、交易链路、状态强绑定业务、企业内网客户端大量固定DNS缓存的系统。这些业务需要入口层、客户端、服务端一起设计。

实际配置时可以这样取值

生产主入口TTL:30秒或60秒。

健康检查间隔:3秒到5秒。

失败判定:连续2到3次失败。

恢复判定:连续3到5次成功后再切回,避免抖动。

自动切回:谨慎开启。主站刚恢复时,缓存、连接、数据库复制、队列堆积都可能还没完全稳定,自动切回容易造成二次故障。

探测点:至少覆盖主要用户所在运营商和地区,海外业务要加海外探测点。

备用入口:长期小流量承载,不要只做冷备。

验证DNS故障切换不要只在办公室测

办公室网络经常走固定递归DNS,测出来的结果代表性很弱。更靠谱的验证方式是多点拨测。

可以从云服务器上测,比如国内电信、联通、移动各一台,香港一台,美国一台,韩国一台。用dig指定不同递归DNS,也用系统默认DNS测一遍。

命令层面可以看这些信息:dig 域名、dig @8.8.8.8 域名、dig @1.1.1.1 域名、dig +trace 域名。再配合curl看实际访问IP、握手耗时、HTTP状态码。

注意不要只看DNS返回值,还要看请求是否真的打到备用入口。可以在负载均衡日志里加入口标识,或者让备用入口返回特定Header,排查会快很多。

DNS低TTL能做什么,不能做什么

它能让新解析更快拿到新入口。

它能降低跨地域、跨线路故障时的流量迁移等待时间。

它能配合GSLB、健康检查、高防切换完成自动调度。

它不能强制所有递归DNS立即刷新。

它不能让已有TCP连接自动迁移。

它不能替代负载均衡后端摘除。

它不能修复备用机房配置、容量、数据一致性问题。

把TTL设低是必要动作,但秒级恢复更多依赖入口架构、探测策略、客户端重连、备用资源热备和线路质量。DNS这层能加速切换,但别把它当成唯一的故障恢复开关。