ECS DNS查询请求限速该如何缓解?

VPC内每台ECS机器每秒最高DNS峰值为5000次,单机每秒请求DNS峰值超过阈值后,将面临限速风险,可用性SLA将无法保证。为了缓解此类情况,建议您从如下两个方面考虑:

  • 扩容ECS数量,使得DNS查询请求能够负载分摊到更多的ECS,从而降低每个ECSDNS查询请求量;

  • ECS主机开启nscd(Name Service Cache Daemon)服务进行缓存加速;

    说明

    nscd服务开启情况下,会导致变更解析记录的生效时间更长。

什么是nscd?

nscd是一个系统缓存服务,用户缓存名称服务信息,例如passwd、group、hosts、services以及netgroup等,它可以提高系统查询缓存命中率,从而减少对名称服务的查询次数和流量消耗,进而加快服务响应速度,本实践主要用于降低ECSDNS查询请求数,所以重点介绍hosts配置。

nscd常用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,可以执行以下命令进行检测:

systemctl status nscd#检查nscd的运行状态。

如果检测结果如下,则说明没有安装nscd。

image.png

执行以下命令进行安装:

yum install -y nscd
image.png

此时再执行命令查看nscd的运行状态,nscd已经安装但是处于未启动状态。

image.png

开启nscd服务

输入如下指令开启nscd服务:

systemctl start nscd

此时再执行命令查看nscd的运行状态,nscd已经处于运行状态。

image.png
说明

CentOS/RedHat操作系统安装nscd指令:yum install -y nscd;

Debian/Ubuntu操作系统安装nscd指令:apt-get install -y nscd;

nscd配置参数

nscd的默认配置文件路径在/etc/nscd.conf,可以通过执行如下指令查看nscd配置:

cat /etc/nscd.conf
image.png

关键配置参数说明

配置参数

说明

debug-level

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。

重要
  • 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.taobao.com#对域名www.taobao.com发一次ping指令。
    image.png
  1. 查看相对应的抓包情况,能够发现53端口3DNS请求查询,并且每次DNS请求查询都返回域名解析记录,证明DNS请求查询记录并未被缓存,ECS每次都要通过53端口发送DNS请求查询。

    image.png

nscd开启时拨测

  1. 执行启动指令将nscd服务开启,并通过状态查询指令确定nscd为开启状态。

  2. nscd的状态为开启情况下,在ECS上执行如下指令,连续拨测6次。同时需要对ECS53端口进行抓包。

    ping -c 1 -n www.taobao.com
    image.png
  3. 查看相对应的抓包情况,能够发现53端口只抓到1DNS请求查询,证明DNS请求查询命中nscd缓存,没有通过53端口发送DNS请求查询。image.png

    重要

    您在抓包的过程中会发现即使ping指令已经执行完毕,但是每隔一段时间tcpdump依旧可以查到相关域名DNS查询请求报文,这是由于nscd的主动刷新机制导致的,属于正常现象。可以通过将reload-count 参数设置为0关闭主动刷新机制。

  4. 您也可以通过执行以下指令来查询缓存命中信息,在一段时间内多次执行ping指令后然后查看缓存命中情况。

    nscd -g#输出生效后的各个参数选项配置情况和缓存命中率统计等。
    image.png