
# 通过Serving Stale提高自建DNS的解析成功率
#### 什么是Serving Stale
Serving Stale是RFC 8767描述的用于提高DNS解析可靠性的一个标准。当Local DNS上的域名缓存过期，由于权威DNS故障导致Local DNS无法刷新本地缓存时，可以通过Local DNS的Serving Stale的能力使用过期的缓存结果应答请求，避免客户端无法得到响应。
![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/note_3.0-zh-cn.png)
- 上游DNS服务器故障时，使用过期的缓存应答请求，可能导致域名在上游DNS更新后，自建DNS不能及时给客户端响应最新的结果。
- Serving Stale功能是使用在自建DNS缓存已经过期的缓存来应答客户端，未缓存过的域名不适用。
 
#### Serving Stale的使用场景
如下图中，容器/ECS使用了自建DNS做域名解析，当自建DNS的上游DNS由于故障而无法应答时：
- 如果自建DNS未开启Serving Stale能力，容器/ECS解析域名会失败。
- 如果自建DNS开启了Serving Stale能力，自建DNS使用过期的缓存来应答容器/ECS，解析不中断。
图1Serving Stale的使用场景   
![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002015093362.png)
#### 如何开启Serving Stale
- [bind9开启Serving Stale]：如果您的自建DNS用的是bind，可以在bind的options配置中增加相关配置项并重载/重启您的DNS服务来生效。
- [coreDNS开启Serving Stale]：如果您的自建DNS是coreDNS或者您需要优化k8s集群的域名解析时延，可以在cache配置项中开启Serving Stale。
 
 #### bind9开启Serving Stale
bind9支持版本：9.16.3及以上
- 配置文件：named.conf
- 配置位置：options
- 配置项说明
  
  | 配置项                 | 默认值                 | 建议值  | 功能说明                                          |
  |:---|:---|:---|:---|
  | stale-cache-enable  | no                  | yes  | 启用缓存保持功能。                                     |
  | stale-answer-enable | stale-answer-enable | yes  | 启用stale-cache来应答。                             |
  | max-stale-ttl       | 1day                | 1day | stale-cache缓存保持多长时间。                          |
  | stale-refresh-time  | 30s                 | 30s  | bind刷新stale-cache的时间间隔，即多长时间向权威DNS请求一次，并刷新缓存。 |
  | stale-answer-ttl    | 30s                 | 30s  | 使用stale-cache回复response时，报文中的TTL值。            |
     
  
- 配置样例：
  ```
  options {
      stale-cache-enable yes;
      stale-answer-enable yes;
  };
  ```
  
 
 #### coreDNS开启Serving Stale
coreDNS插件中已支持Serving Stale能力，允许coreDNS无法连接上游DNS服务器时使用已过期的本地缓存来应答。
coreDNS支持版本：1.6.6
- 配置格式：serve_stale \[DURATION\] \[REFRESH_MODE\]
- 配置项说明：
  - DURATION：过期缓存的使用时长，默认值为1h。
  
  - REFRESH_MODE：支持配置为verify、immediate。
    - verify：在将过期的缓存发送到客户端之前，先验证上游的DNS是否可用。该方式可能会增加客户端的解析时延。
    
    - immediate：立即将过期的缓存作为响应发送给客户端。
     
   
- 配置样例：
  ```
  cache {
  serve_stale 1h immediate
  }
  ```
  
 
