11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

浅析 DNS 缓存技术及应用考虑

  • 2019-11-19
  • 本文字数:6635 字

    阅读完需:约 22 分钟

浅析DNS缓存技术及应用考虑

01 引言

DNS 技术在互联网得到了广泛应用,是一个相当成熟的网络技术,DNS 缓存为 DNS 技术中普遍使用的功能,在提升客户访问体验中发挥了重要作用,在实际配置使用过程中,DNS 缓存使用不合理,可能会对客户体验及访问带来严重的影响。本文从 DNS 技术原理入手,结合应用实践重点描述了 DNS 缓存在实际应用中面临的问题及需要考虑的因素。


02 DNS 域名解析过程

DNS 域名解析系统把难于记忆的 IP 地址翻译为容易记忆的名字。企业的 DNS 域名解析系统一般分为互联网域名解析系统和企业内网域名解析系统。互联网域名解析系统主要实现互联网用户对企业系统的访问,如企业官方网站、电子商务平台、手机银行等,互联网域名解析系统需要企业自己的权威域名系统与运营商多级域名解析节点配合使用,以实现域名的解析功能。企业内网域名解析系统一般由企业自行搭建和维护,实现企业内部用户对企业内部系统的域名解析或企业内部系统间互访的域名解析功能。


针对具体某一具体域名的访问,DNS 域名解析过程实际上是一个相当复杂的过程,需要经过多级迭代查询才能成功获取业务地址,以用户通过互联网访问民生银行官方网站系统 www.cmbc.com.cn 为例,其详细过程如下图所示:



  1. 当用户访问民生网站时,在 WEB 浏览器里输入 www.cmbc.com.cn 时,浏览器先检查是否有该网站的缓存(域名与 IP 的映射关系),有则直接使用访问,如果没有 DNS 请求发送到客户端解析器

  2. 假设后续环节都没有缓存,解析器将 DNS 请求发送给运营商 Local DNS 服务器处理,运营商 Local DNS 依次向 cn.、com.cn.、cmbc.com.cn.域名服务器发起迭代查询,并缓存查询结果,同时将结果返回给用户,实现业务访问。

  3. 在高速缓存未超时的时间内,客户浏览器再次发送到域名 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 优点


  1. 绕过运营商 Local DNS,防劫持

  2. 能直接获取到客户端 IP 地址,更精准的返回结果,避免跨运营商

  3. 无运营商缓存,域名变更快速生效

  4. HTTP DNS 可以在终端 APP DNS 缓存超时之前提前进行解析,规避了缓存再解析导致延时的问题

  5. 与传统方式互备,当 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)。


原文链接


https://mp.weixin.qq.com/s/WLHjagbqN3V9Vn9qBdSlVA


2019-11-19 08:004035

评论 1 条评论

发布
用户头像
就是为了打一波httpDNS广告
2019-11-19 18:12
回复
没有更多了
发现更多内容

JavaWeb Ajax详解,linux操作系统基础教程安俊秀课后答案

Java 程序员 后端

Java中使用Spring-security(一),java做视频直播

Java 程序员 后端

Java中的容器,Java开发进大厂面试必备技能

Java 程序员 后端

Java在2018年的形势,MySQL优化原理分析及优化方案总结

Java 程序员 后端

Java 里面的异常,java语言程序设计教程pdf

Java 程序员 后端

java-集合-Map(双列)——迪迦重制版(1),关于线程池的五种实现方式

Java 程序员 后端

JavaFx:窗口切换和ListView以及TableView的值绑定,docker面试题

Java 程序员 后端

Java反射,mysql开发教程

Java 程序员 后端

Java发送邮件,字节跳动上千道精选面试题还不刷起来

Java 程序员 后端

java8实战读书笔记:Lambda表达式语法与函数式编程接口

Java 程序员 后端

Java中的几种阻塞队列,kalilinux渗透教程

Java 程序员 后端

Java中的初始化与清理,kafka参数调优

Java 程序员 后端

Java-进阶:集合框架1,java三个技术平台

Java 程序员 后端

Java中高级核心知识全面解析——消息队列,mybatis映射原理

Java 程序员 后端

java8实战读书笔记:初识Stream、流的基本操作,nginx架构原理

Java 程序员 后端

Java中的程序控制流程,java面试常问知识

Java 程序员 后端

Java中高级核心知识全面解析——Dubbo,kafka入门到精通文档

Java 程序员 后端

Java反射(1),java架构师薪资

Java 程序员 后端

java反射map转实体类 实体转map,微服务架构的优缺点

Java 程序员 后端

Java 高并发之设计模式,深入linux内核架构mobi

Java 程序员 后端

JavaWeb之Servlet技术(二),java基础程序设计题

Java 程序员 后端

Java中的Type类型详解,javase菜鸟教程

Java 程序员 后端

java响应重定向发送post请求,spring+mybatis基础知识

Java 程序员 后端

java-集合-Map(双列)——迪迦重制版,zookeeper面试

Java 程序员 后端

JavaWeb学习笔记6——事务实例,我的支付宝3面+美团4面+拼多多四面

Java 程序员 后端

Java中的几种阻塞队列(1),mybatis返回主键原理

Java 程序员 后端

Java-Parallel GC介绍,springmvc面试题高级

Java 程序员 后端

Java使用JDBC开发 之 DBCP连接池,保洁阿姨看完都会了

Java 程序员 后端

Java-进阶:集合框架1(1),java分布式系统面试题

Java 程序员 后端

Java中高级核心知识全面解析——消息队列(1),看完这一篇就够了

Java 程序员 后端

Java垃圾回收机制小结以及优化建议,kafka的工作原理图

Java 程序员 后端

浅析DNS缓存技术及应用考虑_技术管理_民生运维_InfoQ精选文章