
# 在服务器开启系统缓存优化域名解析
#### 典型场景
客户的ECS在业务高峰期瞬时发起针对同一域名、同一类型的解析请求，当请求量超出一定阈值时，DNS服务器将丢弃超出阈值的请求，进而引发应用偶发性错误。
如下图所示，在一个服务器上启动了大量docker应用，docker通过服务器/etc/resolv.conf配置的DNS服务器进行域名解析，在业务高峰期，大量容器并发相同的域名解析请求，达到了DNS服务的同名请求丢包阈值，造成部分容器业务处理失败。
![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002413985757.png "点击放大")
#### 解决方案一：docker镜像安装NSCD服务
在制作docker镜像时，需要开启NSCD缓存服务，减少单个docker域名解析的数量，提高解析效率。
详细请参见[如何配置NSCD服务实现缓存加速并提高DNS可用性？](https://support.huaweicloud.com/dns_faq/dns_faq_140218.html)开启NSCD缓存服务。
![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002380509118.png "点击放大")
![](https://support.huaweicloud.com/dns_faq/public_sys-resources/caution_3.0-zh-cn.png)
如果应用使用GO代码的net.Resolver库做域名解析，要使能NSCD缓存，必须在代码中创建Resolver时，将PreferGo设置为false。
![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002414001181.png "点击放大")
其他语言无需特殊设置，默认通过操作系统的域名解析函数，优先走NSCD解析。
#### 解决方案二：宿主机开启dnsmasq服务
在宿主机安装并启动dnsmasq，容器启动时指定dnsmasq的监听IP做域名解析。
![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002414122845.png "点击放大")
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的地址，用于转发请求。**
   

3. 启动dnsmasq。
   ```
   systemctl start dnsmasq.service
   systemctl status dnsmasq.service
   ```
   执行结果如下截图时，表示dnsmasq启动成功。
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002414158085.png "点击放大")
   
4. 执行命令获取监听的53端口的IP地址，用于容器启动时使用。
   ```
   netstat –nalp | grep dnsmasq
   ```
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002380550472.png "点击放大")
   
5. 测试IP可解析域名
   ```
   dig @${IP} www.baidu.com
   ```
   ![](https://support.huaweicloud.com/dns_faq/zh-cn_image_0000002380584674.png "点击放大")
   

6. docker启动的命令中使用参数"--dns"，指定dnsmasq的IP进行域名解析。
   ```
   docker run --dns ${IP} image_name
   ```
   **需要同步修改docker守护进程配置(全局设置)**
   ```
   vim /etc/docker/daemon.json
   ```
   添加如下dns配置
   ```
   { "dns": ["${IP}"] }
   ```
   
 
