首先,我们再来回顾一下DNS缓存的相关知识。
1.DNS缓存知识回顾
1. 当用户希望访问www.zdns.cn网页时,在浏览器中输入www.zdns.cn,浏览器将DNS解析请求发送到客户端DNS解析器;
2. 客户端解析器向运营商LDNS发起解析请求;
3. LDNS执行DNS递归查询,此时会分别向根、cn、zdns.cn的权威解析服务器依次发起解析请求。最终获得www.zdns.cn域名对应的IP地址202.173.11.10,并将该结果应答给用户客户端;
4. 此时浏览器接收返回的www.zdns.cn对应的IP地址202.173.11.10,和本机建立http(s)访问连接;
执行一次上述完整DNS解析请求一般用时在几百毫秒乃至数秒的时间,对用户的网页访问造成了不好的体验。因此,在靠近客户端的位置,如浏览器、客户端本地、LDNS等位置设计了DNS缓存机制,当DNS解析请求命中某一级的缓存时会触发缓存拦截机制,直接将缓存的映射关系返回。通过DNS缓存机制可以将DNS解析时间大大缩减至数毫秒甚至微秒的级别。
此外,大量的DNS解析请求通过DNS缓存机制被拦截在靠近客户端的设备上也减少了到权威服务器上查询的流量,大大的缓解了权威服务器的负载压力。
2.各环节DNS缓存机制
综上所述,浏览器缓存和操作系统缓存位于客户端本地,用户可以根据自己的实际需求主动清空本地DNS缓存。但LDNS缓存时间受限于运营商的缓存策略,对最终用户来说是个黑盒子,通常不可知不可控,而且当某LDNS缓存数据错误后会影响解析请求到该LDNS上的大量用户。此外,由于TTL值设置异常导致触发LDNS机制,强制长时间缓存时,也缺少有效的缓存刷新手段。因此,我们应该更多的关注TTL值与LDNS缓存所产生的影响。
3.TTL配置对运营商LDNS缓存时间的影响
测试步骤:
1.首先创建三条解析记录,如下表,TTL时间分别是1秒,60秒,3600秒
2.使用DNS解析探测系统,对着三个域名进行周期性探测,探测频率为2分钟,持续一小时,确保运营商LDNS充分缓存。
3.分别修改这三条解析记录的记录值,如下表:
4.继续使用DNS解析探测系统,对LDNS上是否更新为修改后的结果进行检测,每2分钟记录一次生效率,生效率算法为(已生效节点/全部探测节点)X100%。
5.将统计数据绘制为LDNS缓存生效曲线图。
变更生效曲线图
上图纵轴为变更生效率,横轴为变更后经过的时间(单位为秒)。
4.测试结论
根据测试结果我们可以得出以下结论:
运营商递归并不严格遵守TTL值作为缓存生存时间,如图当TTL设置为1s、60s和3600s时,不同解析记录在相对应的TTL时间内,变更生效率均没有达到100%;
较小的TTL设置在早期会带来更高的变更生效率,如图TTL设置为1秒的解析记录,在30分钟内,变更生效率高于TTL设置为60秒和TTL设置为3600秒时的生效率;但当变更一段时间之后生效率会在95%附近波动,这是由于部分运营商LDNS强制将缓存时间提高导致的;
对于80%变更生效率阈值而言,TTL设置为1s和TTL设置为60s区别不大,仅相差大概两分钟左右,但因此TTL设置为1s时,因为缓存频繁过期,对权威解析服务器带来的流量压力,却几十倍于TTL设置为60s的情况;
5.小结
1. 设置TTL值较小
优点:
更快的变更生效时间,尽可能的减少由于DNS缓存未更新导致的终端用户解析异常;
缺点:
当TTL值设置过小时导致DNS解析时延边长,因为要频繁去权威服务器获取结果;
部分LDNS有特殊的缓存机制,过小的TTL设置会导致这些LDNS服务器强制更新TTL为一个较大的值,反而导致缓存长时间不过期;
更多的DNS解析请求发送至上游权威服务器,对权威服务器产生了更大的负载和带宽的压力,运营商也会为此支付更多的带宽费用;
2. 设置TTL值较大
优点:
更快的DNS解析响应时间,大部分解析请求由缓存直接响应;
更多的解析被拦截至LDNS的缓存中,较小的流量到达上游权威服务器,权威服务器负载和带宽压力更小,运营商运营所需的带宽费用也相对较低;
缺点:
变更生效时间长,当变更解析记录或触发宕机切换时,有更多的终端用户可能因为访问到未失效的缓存而导致业务访问异常;
在现网环境中,影响运营商LDNS缓存的因素还有很多,比如某域名某时段内的解析热度、LDNS当前的实时负载情况、LDNS集群不同节点的同步情况、根据国家监管要求的特定域名缓存策略等,都会影响缓存时长。本文仅通过测试不同TTL值对LDNS缓存的影响抛砖引玉,说明运营商LDNS缓存的重要和复杂程度。