Linux运维最佳实践
上QQ阅读APP看书,第一时间看更新

最佳实践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