01 引言
DNS技术在互联网得到了广泛应用,是一个相当成熟的网络技术,DNS 缓存为DNS技术中普遍使用的功能,在提升客户访问体验中发挥了重要作用,在实际配置使用过程中,DNS缓存使用不合理,可能会对客户体验及访问带来严重的影响。本文从DNS技术原理入手,结合应用实践重点描述了DNS缓存在实际应用中面临的问题及需要考虑的因素。
02 DNS域名解析过程
DNS域名解析系统把难于记忆的IP地址翻译为容易记忆的名字。企业的DNS域名解析系统一般分为互联网域名解析系统和企业内网域名解析系统。互联网域名解析系统主要实现互联网用户对企业系统的访问,如企业官方网站、电子商务平台、手机银行等,互联网域名解析系统需要企业自己的权威域名系统与运营商多级域名解析节点配合使用,以实现域名的解析功能。企业内网域名解析系统一般由企业自行搭建和维护,实现企业内部用户对企业内部系统的域名解析或企业内部系统间互访的域名解析功能。
针对具体某一具体域名的访问,DNS域名解析过程实际上是一个相当复杂的过程,需要经过多级迭代查询才能成功获取业务地址,以用户通过互联网访问民生银行官方网站系统www.cmbc.com.cn为例,其详细过程如下图所示:
- 当用户访问民生网站时,在WEB浏览器里输入www.cmbc.com.cn时,浏览器先检查是否有该网站的缓存(域名与IP的映射关系),有则直接使用访问,如果没有DNS请求发送到客户端解析器
- 假设后续环节都没有缓存,解析器将DNS请求发送给运营商Local DNS服务器处理,运营商Local DNS依次向cn.、com.cn.、cmbc.com.cn.域名服务器发起迭代查询,并缓存查询结果,同时将结果返回给用户,实现业务访问。
- 在高速缓存未超时的时间内,客户浏览器再次发送到域名www.cmbc.com.cn的访问将不再需要经过以上迭代查询过程,将直接由客户本地电脑解析器缓存或本地DNS服务器缓存直接返回域名对应的IP地址
企业内网域名解析系统一般设计为一级(仅权威DNS服务器)或两级架构(包含本地DNS服务器和权威DNS服务器),不需要经过上述运营商多级域名迭代查询过程,其它解析过程与上述过程基本一致,客户端和本地DNS服务器同样可提供高速缓功能。
03 DNS缓存作用
DNS域名系统给应用访问带来了额外的时延,另外由于DNS域名解析采用不可靠的UDP协议通讯,受内外部网络环境的影响较大,特别是在有丢包的情况下,导致的时延可能达到数秒。为缓解此问题,DNS解析采用了缓存(Cache)机制。如上节DNS解析过程可知,经过第一次客户访问之后,本地DNS服务器和客户端均会缓存之前解析到的域名和IP地址映射,并基于相关机制设置相应的缓存生存时间(TTL),在TTL超时时间段内,后续DNS域名解析直接通过客户端本地和本地DNS服务器高速缓存解析,不再需要经过迭代查询过程。DNS缓存可极大提升DNS域名解析的效率,一定程度上减少了客户端到用户之间环境对DNS域名解析的影响。
高速缓存的缺点在于它需要消耗一定的系统资源,并增加了域名系统的复杂性。决定解析结果在高速缓存中保留多长时间是在DNS域名建设和维护时需要重点考虑的问题。如果缓存时间过短,则可能会导致产生多余的不必要的解析请求,如果缓存时间过长,则可能导致域名变更时客户访问恢复时间过长。
04 DNS缓存使用面临的问题
缓存技术在用户业务访问过程中起到了加速访问、提升用户体验的重要作用,若缓存设置使用不当,则可能给用户访问体验带来负面影响,甚至影响用户正常业务访问。缓存被使用在互联网非受控环境和内网相对可控环境,在不同的环境会面临不同的使用问题,下面来看看缓存在互联网和内网环境使用中可能会面临哪些问题。
互联网环境缓存应用面临的问题
在互联网环境,缓存存在于浏览器、操作系统、运营商Local DNS服务器,其中运营商Local DNS是最重要且最不受用户和网站管理员控制的一个环节,如果缓存值设置不合理,将直接影响用户访问,会给企业形象带来负面影响。对于网站管理员来说,互联网环境的缓存面临两大方面问题:
缓存刷新不受控:一般企业为实现线路冗余都会使用多家运营商,因此域名就会被缓存在多家运营商Local DNS服务器,当企业域名发生改变时,涉及Local DNS服务器众多,在当前环境下,管理员无法刷新运营商Local DNS服务器缓存,在缓存未超时的情况下,客户无法获取到正确的域名进行业务访问,只能等待Local DNS服务器缓存超时后才能解析到正确的域名,正常访问业务,此种情况可能严重影响客户体验,导致大量的客户投诉。
解析权和缓存值被修改:一些小运营商出于规模、节约成本的考虑,将域名转发到其他运营商进行解析,并把收到的域名缓存值更改为较长的值,这会带来两个方面的问题:
1)权威DNS接收到的请求IP地址不是客户所在运营商IP地址,客户的请求可能会被引导至错误的线路,导致客户访问慢;
2)企业域名发生改变后将等待更长的超时时间才能正常访问业务;同样会给客户带来较差的体验。
企业内网缓存应用面临的问题
企业内网环境相对简单,通常情况下用户会直接向权威服务器发起域名解析请求,内网域名解析路径较互联网可控且环境稳定,无运营商递归查询环节,因此基本不存在不可控的三方服务器和缓存被修改的问题。
企业内网环境包括两类用户,一类为终端用户,例如柜员、业务管理人员、办公人员,这类用户使用电脑通过浏览器访问目标业务;另一类为生产系统,这类用户为服务器,通过应用软件访问目标业务。两类用户涉及的基础运行环境各不相同,缓存在使用中面临的问题也会有所不同。
终端用户面临的问题:内网终端用户与互联网用户类似,差异是内网无中间运营商,它的缓存存在于浏览器、终端操作系统,若缓存值设置过长,当出现业务地址变更的时候,用户将无法访问业务,可能会影响办公或者影响客户办理业务,须等待本地缓存超时方可恢复。在终端用户层面,目标业务域名改变一般为单个系统,不会出现大面积变更的情况,且对象为内网用户,可建立统一的标准规范,因此影响范围相对较小。
生产系统面临的问题:为实现业务快速切换以及运维便利,企业生产系统之间也开始大力推广通过域名方式访问,但生产系统使用的操作系统、编程语言等各不相同。
我们针对常用的操作系统和JDK环境的DNS缓存行为进行了全面测试,具体包括了Suse12、AIX7.1、JDK1.6/1.7等常用版本,经过测试得出以下结论:
1) Suse操作系统默认不开启缓存,当开启缓存时,继承DNS记录的缓存值
2)AIX操作系统默认不开启缓存,当开启缓存时,不继承DNS记录的缓存值,继承操作系统本地配置的缓存超时时间
3)JDK默认开启缓存,不继承DNS记录的缓存值,遵循自身配置的超时时间
从以上实际测试结果可以看出不同的操作系统和JDK环境对DNS缓存的处理机制不一样。中间件如Weblogic、Tomcat建立链接时会调用JDK,业务在实际部署中,会根据需求选择不同的操作系统和中间件,例如Suse和AIX的操作系统都可以选择Weblogic或者Tomcat部署应用,不同的组合DNS缓存处理机制会不一样,从而对应用访问产生不同的影响。以Suse和AIX两类操作系统、中间件使用Weblogic为例,来看看缓存的影响:
假设操作系统和中间件均开启缓存,场景为应用访问数据库,配置JDK缓存30s,操作系统缓存1分钟,DNS域名TTL值为2分钟,当APP成功访问一次DB后,JDK缓存域名时间为30s,Suse操作系统继承DNS TTL值缓存域名时间为2分钟,当域名发生变化时,JDK经历30s后超时,但是操作系统还未超时,获取到的域名仍然为老地址,导致业务访问不通,影响时间增加1分半钟。同样的场景,若操作系统为AIX,它不认可DNS TTL值,缓存为配置的1分钟,影响时间仅增加30s。由此可见,不同操作系统、不同JDK、不同DNS TTL配置,将会产生不一样的影响,当业务出现故障时由于缓存行为不一致,会给排障增加困难,运维变得复杂,无法满足快速恢复业务的需求,而且生产系统通常都不是孤立存在的,当一个系统出现问题时很有可能产生连锁反应,导致多个业务系统服务不可用,影响面更广,后果更严重。
05 DNS缓存在实际应用中的考虑
DNS缓存在使用中会面临缓存无法刷新、被修改以及缓存控制复杂等问题,无论在互联网还是内网,缓存设置不合理都将导致用户无法访问业务,影响用户体验,那么缓存设置就显得尤为重要,它在实际应用中应该如何考虑?
首先,哪些情况下域名会发生改变,从而出现影响用户访问的情况:
主动操作:由于系统新建迁移、灾备切换等有计划的变更操作
被动操作:当出现故障需要紧急更改域名对应的服务地址恢复业务
不同场景产生的影响时间以及紧迫程度有所不同,就有不同的考虑因素,下面针对不同的场景分别进行介绍。
1、主动操作之缓存考虑因素
针对主动操作的情况,有计划性,会有充足的时间准备,内网和互联网环境均可提前将域名对应的缓存值更改为更小的值,操作等待时间大于设置的缓存值即可,以确保递归服务器缓存了设置较小的TTL值,待操作完成后再更改回原有TTL值,无需人工干预。
另外,避免缓存带来影响,还可以规范架构部署,例如通过负载均衡或者虚地址方式对外提供服务,可减少域名变化的情况,负载均衡或者虚地址方式可把操作隐藏在服务端,不会传达到客户端,可直接避免缓存时间给用户带来的影响。
2、被动操作之互联网缓存考虑因素
互联网用户直接面向运营商,面临的问题是无法刷新缓存和缓存值被修改,要解决域名更改后无法快速生效的问题,需要从运营商入手:
刷新运营商Local DNS缓存
当我行一条运营商线路故障时,这条线路对应业务DNS记录被用户及对应运营商Local DNS服务器缓存,经了解,三大运营商正在开发刷新缓存的功能,电信和联通支持基於单个域名自助刷新全国对应Local DNS缓存,目前正处于测试阶段,预计三分钟可以完成全国Local DNS缓存强制刷新;移动目前支持北京地区Local DNS缓存记录刷新,其他地区正在计划开发中。三大运营商都支持刷新缓存的情况下,将很大程度解决缓存生效慢的问题。但是一些小运营商不在合作范围内,目前仍然没有办法更新他们的缓存,可能会有少量地区客户仍然会有所影响。
避免缓存被修改
互联网环境最大的问题是Local DNS缓存,缓存时间被修改,有没有方式可以避开Local DNS?近几年HTTP DNS技术出现了,它是基于HTTP协议向HTTP DNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,有效的避开了运营商Local DNS,就避免了缓存值被第三方修改。
HTTP DNS解析流程
1、客户端通过HTTP/HTTPS协议向HTTP DNS集群发起查询请求,携带用户域名和终端 IP
2、服务集群查询CDN内部调度系统,将域名最佳访问节点IP响应给客户端
3、客户端收到响应结果向节点发起请求
4、客户端拿到最优IP后,发起业务访问
5、若客户端访问HTTP DNS集群失败,可自动切换为传统方式通过运营商Local DNS进行解析查询
HTTP DNS优点
- 绕过运营商Local DNS,防劫持
- 能直接获取到客户端IP地址,更精准的返回结果,避免跨运营商
- 无运营商缓存,域名变更快速生效
- HTTP DNS可以在终端APP DNS缓存超时之前提前进行解析,规避了缓存再解析导致延时的问题
- 与传统方式互备,当HTTP DNS不可用时可选择传统方式备份访问
HTTP DNS适用场景
HTTP DNS主要是为APP类或桌面应用提供服务,如游戏、电商、金融、音视频、社交类APP。HTTP DNS需要在APP加载相应的SDK对默认的DNS请求方式进行修改,因此HTTP DNS的实现需要开发配合和深度介入,另外一般一个APP的访问会涉及多个域名,每个域名都使用HTTP DNS还是只是部分域名访问使用HTTP DNS需要评估。更细节的实现如缓存规则、更新规则、监控及切换规则也需要进行详细的考虑和设计。
被动操作之内网缓存考虑因素
内网生产环境的域名访问在推广初期,从无到有,看似简单的域名请求,需要增加到JDK、操作系统等环节的访问,这些环节缓存开启情况不同,要实施域名访问需重点考虑是否要开启缓存,缓存时间配置为多少合适。
是否开启缓存的考虑
生产系统之间的交互有别于终端与系统之间的交互,生产系统交互频次高、时延要求高,若不开启缓存会在哪些方面有所影响?
链接建立影响:经过测试,Weblogic和Tomcat中间件建立一个链接分别会发起2个DNS请求,且要求2个请求都成功后方可建立链接,此处行为一致,但中间件会部署在某个操作系统上,由于Suse和AIX操作系统的超时重传机制不同,当网络出现丢包时,两类中间件行为结果不一样,若开启缓存,有一个DNS请求成功了就会被缓存,就能成功建立链接,若不开启缓存,面对超时时间不同、重传次数不同的问题,就很难评估何时能正常建立链接,出现问题时就很难分析业务影响和业务恢复时间,为排障增加了难度。
时延影响:大部分系统为提高利用率以及实现高可靠性,应用采用双中心双活部署。在大二层的部署架构下,存在大量跨同城中心的访问流量,每一次跨中心访问都会增加一次时延,对于高频交互系统,在不开启缓存的情况下每次交互都会发起一次DNS请求,就会额外增加时延,会对系统带来访问缓慢的问题,严重时可能会影响交易。
生产系统计划使用域名访问时,每笔交易对于访问DNS增加的时延带来的影响很难进行评估以及精准的测试影响结果,为避免通过域名访问增加的时延对生产系统带来影响,考虑开启具备缓存功能环节的缓存,但若仅针对时延要求高的系统开启缓存,那么生产环境就会存在不同的配置标准,又增加了运维的复杂性,因此,从运维规范、统一的角度考虑开启缓存。缓存功能开启了,缓存时间设置多长才能既满足快速访问业务又满足缓存及时失效的需求?
缓存时间考虑
生产系统部署环境涉及的操作系统、中间件、系统程序等环节都存在缓存功能,导致DNS配置的域名缓存值对于业务系统的时间影响不可控,就无法真实了解缓存时间对业务的影响,以及更改域名对应的地址后业务恢复时间也无法掌握。要想解决生产系统面临的类型多和层级多的问题,可以从统一标准入手:
参考唯一TTL值:统一开启各节点缓存器认可DNS服务器配置的TTL值,参考标准唯一,超时时间明确;对于无法参考DNS TTL值的环节,统一配置为与DNS TTL相同的超时时间
统一操作系统超时重传机制:统一不同操作系统超时重传时间间隔、重传次数等参数
规范开发:部分用特殊语言编写的业务系统有自己独有的缓存规则,需要规范开发规则,可调整遵循DNS规则
如何设置TTL值
缓存超时间(TTL)是缓存技术中的一个重要参数,对缓存效果起着决定性的作用。TTL时间设置较长,域名就能缓存更长时间,用户就能更快实现访问,TTL时间设置较短,域名就更快超时,用户就需要等待域名解析才能正常访问。因此,TTL时间设置的长短将直接影响用户的体验效果。TTL值设置大小需要根据业务特性、业务环境、DNS服务器性能等因素综合考虑,针对不同应用场景的缓存值设置规则可参考如下建议:
互联网环境:互联网环境由于运营商Local DNS缓存服务器的存在,具有不可控性,因此不适宜配置较长的缓存时间,建议参考DNS性能配置较小缓存值,例如设置为分钟级。
内网终端环境:内网终端环境相对可控,且大部分业务都是通过标准模式虚服务方式对外提供服务,域名变更概率较小,为减少终端访问频率,缓存值建议配置稍长时间,例如设置为小时级。
内网生产环境:生产系统变更的概率较大,且若缓存更新不及时可能会带来重大的业务影响,因此生产系统不适宜配置较长的缓存超时时间,建议参考DNS性能配置为秒到分钟级。
06 小结
DNS技术实现了人易于记忆名字与IP地址之间的转换功能,为应用迁移、切换提供了便利,由于互联网环境的复杂性以及企业内部使用的系统及应用组件对DNS缓存处理机制存在差异,若DNS缓存规划设计不合理,则可能给用户体及应用访问带来严重的影响。DNS技术在实际应用过程中,DNS缓存设置的规范性、合理性是需要重点考虑的问题。另外,随着移动互联业务的高速发展,HTTP DNS技术相对传统的DNS解析和缓存技术,在安全性、可靠性、解析效率方面具备明显的优势,具备较好的推广前景。
作者介绍:
陈瑜
网络运维经理。2012年加入民生银行,任职于信息科技部网络管理中心。十年以上银行数据中心网络运维经验,目前重点负责网络需求分析、DNS平台规划建设工作,参与可视化分析平台建设。
兰庆白
网络资深运维经理。2011年加入民生银行,任职于信息科技部网络管理中心。负责数据中心网络规划、建设及相关运维工作,致力于新产品新技术研究。
本文转载自公众号民生运维(ID:CMBCOP)。
原文链接: