内网DNS主要可划分为四个功能模块:内置权威普通区、内置权威加速区、转发模块和递归模块。对于部署在云环境中的ECS或容器发出的域名查询请求,命中内置权威加速区的解析结果不会进行缓存,因而它们不受TTL值的限制。本文将重点讨论剩余三个模块的缓存TTL策略和缓存清除机制。
内置权威普通区&转发模块
内置权威普通区与转发模块共享相同的一级缓存结构,其工作原理如下图所示:
缓存TTL改写机制
内网DNS会针对命中内置权威普通区和转发模块的请求应答缓存TTL进行改写,缓存 TTL 改写机制主要包括以下几个方面:
肯定应答情况下,即当查询请求获取查询域名对应的确切解析结果:
若返回的解析记录TTL值超过86400秒,缓存系统将该记录的 TTL 改写为 86400 秒
若返回的解析记录TTL值小于10秒,缓存系统将该记录的 TTL 改写为 10 秒
若返回的解析记录TTL值处于10秒至86400秒之间(含10秒和86400秒),缓存将直接采用原始源站DNS的 TTL 值
否定应答情况下,即当应答结果为域名不存在(NXDOMAIN)或查询类型对应记录不存在(NXRRSET)时:
缓存系统将返回的解析记录TTL值统一改写为5秒。
NXDOMAIN:表示查询的域名不存在于域名系统中;
NXRRSET:表示域名是存在的,但所请求的特定类型的记录在该域名下不存在。例如请求AAAA记录,但是该域名并未配置AAAA记录;
解析记录缓存逻辑:应答结果在缓存队列中的实际TTL时间,按照修改后的TTL值执行。
缓存清除&更新机制
内网DNS的缓存可以保存一定容量的解析记录,按照解析记录访问的频次进行排序,热度低的域名解析记录会被从缓存中清除。所以缓存中的解析记录清除和更新机制受TTL是否到期和缓存队列是否占满两个因素的影响。
缓存队列不满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录,源站变更后的解析记录不会被获取
缓存过期后,解析记录保留在缓存中。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者响应超时,则继续返回老的缓存记录给终端
缓存队列占满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录(包括肯定应答和否定应答),源站变更后的解析记录不会被获取
缓存到期后,解析记录从缓存中清除。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者响应超时,则终端获取不到解析结果
递归模块
内网DNS为云上的终端及云产品提供公网递归服务,其缓存模块为二级缓存结构,原理图如下:
缓存TTL改写机制
一、缓存模块
肯定应答情况下,即当查询请求获取查询域名对应的确切解析结果:
缓存系统将返回的解析记录的 TTL 统一改写为 10 秒
否定应答情况下,即当应答结果为域名不存在(NXDOMAIN)或查询类型对应记录不存在(NXRRSET)时:
缓存系统将返回的解析记录TTL值统一改写为5秒。
解析记录缓存逻辑:应答结果在缓存队列中的实际TTL时间,按照改写后的TTL值执行。
二、递归模块
TTL值不做任何改写,遵循公网权威DNS设置的TTL值,包括肯定应答和否定应答。
解析记录缓存逻辑:应答结果在缓存队列中的实际TTL时间,按照修改后的TTL值执行。
缓存清除&更新机制
一、缓存模块
缓存队列不满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录,源站变更后的解析记录不会被获取
缓存到期后,解析记录从缓存中清除。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者 响应超时 ,则继续返回老的缓存记录给终端
缓存队列占满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录(包括肯定应答和否定应答),源站变更后的解析记录不会被获取
缓存到期后,解析记录从缓存中清除。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者 响应超时 ,则终端获取不到解析结果
二、递归模块
缓存队列不满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录,源站变更后的解析记录不会被获取
缓存到期后,解析记录从缓存中清除。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者 响应超时 ,则继续返回老的缓存记录给终端
缓存队列占满
缓存到期前,解析记录保留在缓存中。终端的访问均命中缓存中的解析记录(包括肯定应答和否定应答),源站变更后的解析记录不会被获取
缓存到期后,解析记录从缓存中清除。终端的访问会触发去源站DNS查询,然后将返回的解析记录更新在缓存中(包括肯定应答和否定应答);如果此时应答结果为 servfail 或者 响应超时 ,则终端获取不到解析结果