最佳实践2:构建域名解析缓存
域名解析缓存的必要性
在部署服务器时,很多应用程序需要调用域名解析服务,一般通过配置/etc/resolv.conf来指定DNS服务器的IP。但如果程序发起的请求量较大,那么服务器就容易被这些DNS服务器禁止访问;同时每次都去访问外部DNS服务器,会导致延时增大,遇到网络问题时,还会发生解析不成功的情况。在这种情况下,需要配置一个透明的DNS解析缓存服务,以达到如下的效果。
·优化DNS响应速度。通过缓存DNS的请求结果,后续相同的DNS请求不再通过访问任何外部网络服务器来获得结果,减少了网络访问的延时。
·减少DNS对外部网络的依赖。在缓存周期内,相同的DNS请求不再发生网络通信行为,可以减少短暂的外部网络不可用导致的影响。
NSCD安装配置方法
NSCD(Name Service Caching Daemon,名称服务缓存进程)不需要对应用程序或者解析器做任何修改,/etc/resovl.conf也不需要做任何变化,对于系统部署的影响最小。因此,NSCD成为Linux环境中得到最广泛的使用的域名缓存软件。本实践使用该软件构建域名缓存服务。在CentOS 6.6上,安装NSCD的方法比较简单,使用如下命令:
yum -y install nscd
NSCD的配置文件是/etc/nscd.conf,核心的配置代码段如下:
enable-cache hosts yes positive-time-to-live hosts 3600 negative-time-to-live hosts 20 suggested-size hosts 211 check-files hosts yes persistent hosts yes shared hosts yes max-db-size hosts 33554432
其中:
·enable-cache指定对DNS解析进行缓存。
·positive-time-to-live是指对解析成功的DNS结果进行缓存的时间。
·negative-time-to-live是指对解析失败的DNS结果进行缓存的时间。例如网络故障导致的DNS解析失败或者请求的DNS条目没有配置等。
·suggested-size是NSCD内部的哈希表的大小,如果缓存条目数量远大于默认的211(如10倍以上,则修改此值)。
·check-files是指是否检查/etc/hosts文件的变化。
·persistent是指是否在重启NSCD进程时保留已缓存的条目。
·shared是指是否允许客户端直接查询NSCD的内存镜像以获得结果。
·max-db-size是指DNS的缓存大小,以字节为单位。
域名解析缓存验证
在部署了NSCD后,可以使用如下命令检查结果:
wget http://www.xufeng.info/index.html
同时结合tcpdump抓包,可以发现连续的多次该请求,只是在第一次时产生了网络DNS请求,后续的wget命令,直接使用了NSCD的缓存结果,没有产生网络DNS请求。
另外,可以使用如下命令确认NSCD的缓存效果:
nscd -g hosts cache: 23 cache hits on positive entries #缓存命中的次数 0 cache hits on negative entries 13 cache misses on positive entries #缓存未命中的次数 0 cache misses on negative entries 63% cache hit rate #缓存命中率 12 current number of cached values #当前缓存的条目 13 maximum number of cached values
通过观察发现,cache hits on positive entries这个字段的值不断增加,由此可以确认域名解析缓存是生效的。
在Windows系统中,每次DNS请求后,系统会按照响应结果进行缓存,使用如下命令可以看到当前系统中缓存的条目:
ipconfig /displaydns edu.csdn.net ---------------------------------------- 记录名称. . . . . . . : edu.csdn.net 记录类型. . . . . . . : 1 #1为A记录,5为CNAME别名等 生存时间. . . . . . . : 123 #在此时间内,本缓存记录有效 数据长度. . . . . . . : 4 部分. . . . . . . . . : 答案 A (主机)记录 . . . . : 101.201.171.118 #对应的解析结果
使用如下命令可以清理本机的DNS缓存:
ipconfig /flushdns