在服务器开启系统缓存优化域名解析
典型场景
客户的ECS在业务高峰期瞬时发起针对同一域名、同一类型的解析请求,当请求量超出一定阈值时,DNS服务器将丢弃超出阈值的请求,进而引发应用偶发性错误。
如下图所示,在一个服务器上启动了大量docker应用,docker通过服务器/etc/resolv.conf配置的DNS服务器进行域名解析,在业务高峰期,大量容器并发相同的域名解析请求,达到了DNS服务的同名请求丢包阈值,造成部分容器业务处理失败。
解决方案一:docker镜像安装NSCD服务
在制作docker镜像时,需要开启NSCD缓存服务,减少单个docker域名解析的数量,提高解析效率。
详细请参见如何配置NSCD服务实现缓存加速并提高DNS可用性?开启NSCD缓存服务。

如果应用使用GO代码的net.Resolver库做域名解析,要使能NSCD缓存,必须在代码中创建Resolver时,将PreferGo设置为false。
其他语言无需特殊设置,默认通过操作系统的域名解析函数,优先走NSCD解析。
解决方案二:宿主机开启dnsmasq服务
在宿主机安装并启动dnsmasq,容器启动时指定dnsmasq的监听IP做域名解析。
- 以centOS为例,安装dnsmasq,执行如下命令。
yum -y install dnsmasq
- 修改dnsmasq配置
vim /etc/dnsmasq.conf
修改如下字段:
listen-address=127.0.0.1,${eth0口的IP} port=53 bind-interface max-cache-ttl=3600 min-cache-ttl=60 server=100.125.xx.xx server=100.125.xx.xx cache-size=10000 dns-forward-max=3000
server配置为服务器所属区域的云解析内网DNS的地址,用于转发请求。
- 启动dnsmasq。
systemctl start dnsmasq.service systemctl status dnsmasq.service
执行结果如下截图时,表示dnsmasq启动成功。
- 执行命令获取监听的53端口的IP地址,用于容器启动时使用。
netstat –nalp | grep dnsmasq
- 测试IP可解析域名
dig @${IP} www.baidu.com
- docker启动的命令中使用参数“--dns”,指定dnsmasq的IP进行域名解析。
docker run --dns ${IP} image_name
需要同步修改docker守护进程配置(全局设置)
vim /etc/docker/daemon.json
添加如下dns配置
{ "dns": ["${IP}"] }