
# 配置NSCD服务实现缓存加速并提高DNS可用性
VPC内每台ECS机器每秒最高DNS峰值为2000次，单机每秒请求DNS峰值超过阈值后，将面临限速风险，无法保证可用性SLA。
为了缓解此类情况，建议您从如下两个方面考虑：
- 扩容ECS数量，使得DNS查询请求能够负载分摊到更多的ECS，从而降低每个ECS的DNS查询请求量。
- ECS主机开启NSCD（Name Service Cache Daemon）服务进行缓存加速。
  ![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/note_3.0-zh-cn.png)
  NSCD服务开启情况下，会导致变更解析记录的生效时间更长。
  
本文主要介绍通过开启NSCD服务进行缓存加速，降低ECS的DNS查询请求数。
#### 什么是NSCD？
NSCD（Name Service Cache Daemon）是一个系统缓存服务，用于缓存名称服务信息，例如passwd、group、hosts、services以及netgroup等，它可以提高系统查询缓存命中率，从而减少对名称服务的查询次数和流量消耗，进而加快服务响应速度。
#### NSCD常用Linux指令
表1NSCD常用Linux指令 
| **指令**                 | **说明**                                                               |
|:---|:---|
| yum install -y nscd    | 安装nscd。                                                              |
| systemctl start nscd   | 启动nscd。                                                              |
| systemctl stop nscd    | 停止nscd。                                                              |
| systemctl restart nscd | 重新启动nscd。                                                            |
| systemctl status nscd  | 查询nscd的运营状态。                                                         |
| nscd -g                | 输出生效后的各个参数选项配置情况和缓存命中率统计。                                            |
| nscd -i                | 使指定的缓存失效，可以指定passwd、group、hosts、services、netgroup等，例如：nscd -i hosts。 |
| cat /etc/nscd.conf     | 查询当前nscd配置详情。                                                        |
| vi /etc/nscd.conf      | 修改nscd配置参数。                                                          |
   
#### 安装NSCD
NSCD一般在Linux操作系统中默认安装的，如果不确定当前ECS是否已经安装了NSCD，可以执行以下指令检测NSCD运行状态：
```
systemctl status nscd#检查nscd的运行状态
```
如果检测结果如下，则说明没有安装nscd。
![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000001897882441.png "点击放大")
执行以下指令安装NSCD：
```
yum install -y nscd
```
再执行指令查看NSCD的运行状态，此时NSCD已经安装但是处于未启动状态。
#### 开启NSCD
执行以下指令开启nscd服务：
```
systemctl start nscd
```
此时再执行查看NSCD已经处于运行状态。
![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/note_3.0-zh-cn.png)
- CentOS/RedHat操作系统安装nscd指令：yum install -y nscd
- Debian/Ubuntu操作系统安装nscd指令：apt-get install -y nscd
 
NSCD的默认配置文件路径在/etc/nscd.conf，可以通过执行如下指令查看NSCD配置：
```
cat /etc/nscd.conf
```
**具体参数请参考** [表2]
 表2NSCD参数配置说明 
| **参数**                | **说明**                                                                                                                               |
|:---|:---|
| reload-count          | 跟缓存主动刷新有关，此配置参数决定了请求成功缓存主动去查询并更新缓存的次数。                                                                                               |
| paranoia              | 偏执模式，如果开启则NSCD会周期性的重启。                                                                                                               |
| restart-interval      | 如果paranoia开启，此参数表示重启间隔时间。                                                                                                            |
| enable-cache          | 开启缓存服务。                                                                                                                              |
| positive-time-to-live | 请求成功响应缓存的生存时间。                                                                                                                       |
| negative-time-to-live | 请求失败响应缓存的生存时间，建议设置为0，以免失败的缓存影响业务请求。                                                                                                  |
| check-files           | 定期检查/etc/passwd、/etc/group、/etc/hosts等缓存文件的修改时间，如果文件从上次检查之后做过更改，则缓存失效。                                                               |
| persistent            | 开启时，NSCD在重启之后会保留之前的缓存内容，如果paranoia开启，建议开启此功能。                                                                                        |
| shared                | 用于服务NSCD数据库的内存映射与客户端共享，默认：yes。 如果想利用nscd -g指令查询缓存命中率，则shared需要设置为no。 |
| max-db-size           | NSCD缓存数据库的最大大小，单位为Byte。                                                                                                              |
   
![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/caution_3.0-zh-cn.png)
- positive-time-to-live无实际意义，TTL值以DNS查询请求返回的TTL为准。
- shared参数值设置为no时，才能通过执行nscd -g查询缓存命中率。
 
#### NSCD缓存效果监测
**NSCD关闭时拨测**
1. 在ECS上执行如下命令对53端口UDP报文进行抓包：
   ```
   tcpdump -i any udp and port 53
   ```
   
2. 在NSCD的状态为关闭情况下，在ECS上执行多次如下指令，连续拨测三次。
   ```
   ping -c 1 -n www.huaweicloud.com#对域名www.huaweicloud.com发一次ping指令。
   ```
   
3. 查看相应的抓包情况，能够发现53端口3次DNS请求查询，并且每次DNS请求查询都返回域名解析记录，证明DNS请求查询记录并未被缓存，ECS每次都要通过53端口发送DNS请求查询。
**NSCD开启时拨测**
1. 执行启动指令将NSCD服务开启，并通过状态查询指令确定NSCD为开启状态。
2. 在NSCD的状态为开启情况下，在ECS上执行如下指令，连续拨测6次。同时需要对ECS的53端口进行抓包。
   ```
   ping -c 1 -n www.huaweicloud.com
   ```
   
3. 查看相应的抓包情况，能够发现53端口只抓到1次DNS请求查询，证明DNS请求查询命中NSCD缓存，没有通过53端口发送DNS请求查询。
![](https://support.huaweicloud.com/bestpractice-dns/public_sys-resources/note_3.0-zh-cn.png)
- 您在抓包的过程中会发现即使ping指令已经执行完毕，但是每隔一段时间tcpdump依旧可以查到相关域名DNS查询请求报文，这是由于NSCD的主动刷新机制导致的，属于正常现象。可以通过将reload-count参数设置为0关闭主动刷新机制。
- 您也可以通过执行以下指令来查询缓存命中信息，在一段时间内多次执行ping指令后然后查看缓存命中情况。
  ```
  nscd -g#输出生效后的各个参数选项配置情况和缓存命中率统计等。
  ```
  
 
