文档首页/ 云解析服务 DNS/ 常见问题/ 产品咨询类/ 在服务器开启系统缓存优化域名解析
更新时间:2025-08-05 GMT+08:00
分享

在服务器开启系统缓存优化域名解析

典型场景

客户的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做域名解析。

  1. 以centOS为例,安装dnsmasq,执行如下命令。
    yum -y install dnsmasq
  2. 修改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的地址,用于转发请求。

  1. 启动dnsmasq。
    systemctl start dnsmasq.service
    systemctl status dnsmasq.service

    执行结果如下截图时,表示dnsmasq启动成功。

  2. 执行命令获取监听的53端口的IP地址,用于容器启动时使用。
    netstat –nalp | grep dnsmasq

  3. 测试IP可解析域名
    dig @${IP} www.baidu.com

  1. docker启动的命令中使用参数“--dns”,指定dnsmasq的IP进行域名解析。
    docker run --dns ${IP} image_name

    需要同步修改docker守护进程配置(全局设置)

    vim /etc/docker/daemon.json

    添加如下dns配置

    { "dns": ["${IP}"] }

相关文档