DNS TTL最佳实践

DNS TTL最佳实践

起源:

根据CDN小伙伴提供的数据发现,在印度,账号域名的DNS解析时间要比淘宝慢174ms。



看到这,然后有了这个文章。

DNS基础

TTL在域名的设置里,其实是相当重要但是不容易被提起的一个值。TTL的作用主要是告诉Resolving Name server对dns记录的一个缓存时间。用户在浏览器输入www.mi.com的域名解析过程如下:

第一步,User向resolving Nname Server发起dns查询请求,Resolving Name Server收到请求后,检查本地是否有该记录缓存,有没有www.mi.com的权威服务器,如果有则直接发送给www.mi.com的权威服务器,有没有mi.com的权威服务器,有没有com的名称服务器,到根后停止,因为每个名称服务器都知道root名称服务器的域名和地址。

第二步,Resolving Name Server发起一个向根服务器的查询(所有的根服务器都是提供迭代解析,iterative resolution),根服务器返回一个负责处理.COM的gTLD服务器域名列表。

第三步,Resolving Name Server接受到根服务器返回的gtld-servers,根据最小RTT 的算法选择一个服务器去查找www.mi.com

第四步,gtld 服务器也是和根服务器一样,只是提供迭代查询。Gtld服务器返回给resolving name server mi.com的权威服务器(authoritative name server)

第五步,resolving Name Server 从返回的列表里选一个去继续查询www.mi.com的a记录,权威服务器查询后将返回一个a记录。【PS,我们的www.mi.com其实这里是一个cname,一样的会继续第一步去查询这个过程】

第六步,resolving Name Server返回给浏览器ip地址,浏览器将发送特定的请求到给定的ip。

整个解析过程看起来似乎非常复杂和繁琐,实际上是相当快的,一个最主要的原因就是缓存机制的存在。名称服务器将所获得是数据放入缓存,是为了加快以后查询的速度,下次当解析器询问本地名称服务器关于某个已知的域名的数据时,解析过程将大幅缩短。BIND名称服务器还实现了否定缓存(negative cacheing),如果某个权威名称服务器返回的结果是所查询的域名或者数据类型不存在,则本地名称服务器也会将该信息暂时放入缓存中。

例如,假设名称服务器已经查询过www.mi.com的地址,在查询过程中,它会把www.mi.com以及mi.com名称服务器的名称和地址(包括www.mi.com的ip地址)加入缓存。现在如果某个解析器向该名称服务器询问test.app.mi.com的地址,则该名称服务器将跳过根查询这一步,名称服务器认为mi.com是它所知道的最接近test.app.mi.com的祖先,于是便会直接查询mi.com的名称服务器。

每次在浏览器输入域名进行查询时,以下两个问题有一个是否的话,都会去上一层进行查询。

  1. 这个记录我们有缓存吗?
  2. 如果缓存了,TTL还有效吗?

什么是TTL?

名称服务器不可能永久保存缓存数据,如果永久保存了当发生变更的时候记录无法进行传达。因此,通过定义一个生存时间(TTL),来定义数据在缓存中的存放时间,生存时间一到期,名称服务器就丢弃原有的缓存数据并从权威名称服务器获取新的数据。小米印度区域的账号域名ttl设置600,在此期间如果没有相应的访问,名称服务器丢弃缓存数据,导致频繁请求上层权威,一定程度上增大解析时长。

常见TTL设置

TTl通常用秒来表示。一些常见的TTL设置如下

300 seconds = 5 minutes = “Very Short”
3600 seconds = 1 hour = “Short”
86400 seconds = 24 hours = “Long”
604800 seconds = 7 days = “Insanity”

更改了DNS后什么时候生效?

平常会经常有业务问,hi 我修改完这个域名已经过去很久了,为什么还没有生效。有以下几个原因:

a.浏览器缓存,浏览器缓存是将文件保存在客户端,在同一个会话过程中会检查缓存的副本是否足够新,在后退网页时,访问过的资源可以从浏览器缓存中拿出使用。通过减少服务器处理请求的数量,用户将获得更快的体验。该缓存并不遵循DNS TTL值,在此不做过多介绍。

b.运营商local dns会通过增加TTL来进行域名缓存,可以实现用户访问流量网内消化降低请求频率以及整体流量;有部分LocalDNS会把部分域名解析结果的所指向的内容缓存,并替换成第三方广告联盟的广告。

c.具有更多DNS服务器的复杂内部网络产生比预期更长的dns更改时间。


以上是大多数服务声明如下的原因,“注意:修改 DNS 服务器需要 0-72 小时的全球生效时间,如果发现某些地方记录没有生效,并且修改 DNS 的时间还不到 72 小时,请耐心等待。”

什么时候使用小的TTL?

  1. 知道域名会频繁更改记录。
  2. 一些重要的域名,一旦发生记录不可达则损失很大,这时候ttl建议设置的小一些。可以及时完成变更。(一些local dns会对TTL进行默认设置,所以在灾难恢复的时候时间不可控)
  3. 如果对dns记录进行增加或者修改时,碰巧打错了记录,这时候最好的操作方法是增加或修改记录时,先修改到一个小的TTL,然后对记录进行修改。
  4. 具体情境具体实现。在小米内部,办公网DNS和IDC DNS分为两部分,前者在信息部,后者在我们这,当办公网有IDC相关域名解析时,信息部的DNS管理员将解析forward到IDC,在之前,IDC的默认TTL($TTL)设置的是86400,这时候导致的一个问题是当IDC域名发生变更后,办公网要过很长时间才能进行同步过来新的记录。在经过几次抱怨后,调整默认TTL到600,当IDC域名发生修改,会在十分钟左右同步到办公网。

什么时候使用大的TTL?

  1. 考虑到一定成本的时候,例如,dnspod免费托管域名的最小ttl是600,在dnspod,越小ttl意味着价格更高的套餐也就是客户承担更大的成本。
  2. 一个大的ttl可以缩短查询时间。如果每次请求都去权威服务器,会增加解析的时间。
  3. MX 记录,DKIM and SPF,TXT记录,这几个记录可以设置更长的TTL
  4. 域名的指向记录很少发生更改,CDN域名,cname, A记录,如果这些都确定很少更改,可以将TTL设置为12h或者一天。
  5. 当根域或者ISP级别的dns服务器发生ddos时,如果攻击事件在TTL内,部分用户会无感知。

但是需要注意的是,在对这些长的TTL域名进行更改时,最好是同时更改TTL,等待缓存生效后,在进行其他更改。


TOP 500 Moz域名的TTL设置

TTL应该设置成怎样,有没有一个数据可以证明这个设置。Moz Top 500网站已经完成了将所有网站都放到CSV文件的复杂工作。这里通过ruby脚本来遍历列表,查找每个域名当前记录的TTL。这不是一个足够宽泛的范例,它是拉取当前(缓存)的结果。基于此前提,仍然有一些可以借鉴的结果。

查看修改代码:

gist.github.com/mbuckbe

查看top500 Moz域名:moz.com/top500

运行结果:

note.youdao.com/notesha


最低TTL为了负载均衡而进行更快的DNS记录更改,最高的TTL已经很久没有改变过记录值。从结果来看,可以用300s的TTL来作为一个默认的最佳TTL。


SOA TTL

在每个DNS区域的顶部,有几个TTL在DNS中发挥重要作用。

Refresh TTL – 从服务器向主服务器刷新的时间。Notify参数可以设置主发生改变时主动向从更新,关闭notify时会采用这个refresh时间。

Retry TTL – refresh失败后的重试时间。

Expiry TTL – 当refresh和retry都失败,从服务器无法和主服务器建连,过了expiry时间后将无法提供权威解析,从会删除自己的copy。

一般这几个TTL不建议自行修改,除非明确知道自己在做什么。


综上,针对一开始的问题,最佳TTL可以设置为86400或者其他更大的值,通过设置更高TTL后查看效果会发现dns解析时间缩短。


参考文章:

浏览器缓存:alloyteam.com/2016/03/d

Definitive Guide to DNS TTL Settings:blog.varonis.com/defini

全局精确流量调度新思路-HttpDNS服务详解:

mp.weixin.qq.com/s?

UNDERSTANDING TTL VALUES IN DNS RECORDS:ns1.com/articles/unders

《DNS与BIND》 [美]Cricket Liu & Paul Albitz

编辑于 2018-07-23 15:50