跳转至

缓存

SmartDNS提供了缓存能力,开启缓存的情况下,能提供更好的DNS查询请求;smartdns提供的过期缓存功能会将体验更进一步提升。

缓存配置

SmartDNS可以通过cache-size配置缓存的条数,同时也可以通过cache-persist来配置是否持久化缓存,也可以通过cache-file来指定缓存文件存储路径

cache-size 32768
cache-persist yes
cache-file /path/to/cache/file

注意:

  1. smartdns默认自动根据磁盘空间是否启用缓存。
  2. 缓存文件只有在进程正常退出的时候才会保存供下次使用。
  3. 缓存大小cache-size一般情况无需设置,smartdns会根据系统内存情况自动设置。

缓存预获取

Smartdns可以设置缓存预获取,避免缓存超时,配置预先获取后,smartdns将在域名超时前的5s内,重新进行域名查询。并对域名的热度进行排序。

prefetch-domain yes

注意:

  1. 此功能将会导致smartdns消耗更多的CPU。

过期缓存

过期缓存,也要乐观缓存,其功能指定是,当DNS域名的TTL到0时,其结果仍然存储在缓存中,等下次查询时,仍然将缓存的结果返回给客户端,避免客户端等待。乐观缓存的前提时,DNS的对应的IP地址不会频繁变化。

具体乐观缓存的原理可以参考(RFC 8767) (https://www.rfc-editor.org/rfc/rfc8767)

smartdns过期缓存处理流程


%%{init: {'theme':'forest'}}%%
sequenceDiagram
    participant client as 客户端
    participant smartdns as SmartDNS
    participant Server as 上游DNS服务器
    client->>smartdns: DNS查询
    smartdns->>smartdns: 域名在缓存中,且已经过期。
    smartdns->>client: 返回结果过期的域名结果,TTL为3
    smartdns->>+Server: 上游查询DNS
    Server->>-smartdns: 返回查询结果
    smartdns->>smartdns: 测速,并缓存结果
    client->>smartdns: 3s后客户端再次查询,获取最佳结果。

通过上述序列图可以看到,当缓存过期时,smartdns仍然将过期的IP地址发给客户端,这样客户端就能很快的进行连接服务器,这种机制的前提是服务器IP地址没有变化。

现实中,大部分情况下,修改域名IP地址后,是不会立即生效到千家万户的,因为一般IP变化域名后,全球域名系统刷新完成最长可能要72小时。
即时出现过期缓存中的IP地址,故障失效,smartdns返回给客户端过期IP的TTL只有3s,那么3s后,客户端就会重新使用新的IP,表现在客户端程序中,可能就是要刷新页面重试一次。
并且,针对实现场景,smartdns可以设置预获取prefetch-domain yes来尽量避免此问题发生。

所以,主要场景下开启过期缓存是比较好的实践。

注意:prefetch-domain yes功能,在开启过期缓存功能的情况下,行为和未开启有差别,开启过期缓存的情况下,仅当域名要从缓存中过期时,才进行预读取,而不是TTL超时获取。 所以,开启了过期缓存的情况下,推荐开启域名预获取功能。

配置步骤

  1. 开启过期缓存

    serve-expired yes
    
  2. 配置过期缓存超时时间

    此时间表示过期缓存多长时间未访问,则从缓存中释放。

    serve-expired-ttl 259200
    
  3. 配置过期缓存响应TTL

    此时间表示当缓存中域名TTL超时时,返回给客户端的TTL时间,让客户端在下列TTL时间后再次查询。

    serve-expired-reply-ttl 3
    
  4. 过期缓存预获取时间

    此时间表示,过期缓存在多长时间未访问,主动进行预先获取,以避免IP无效;开启过期缓存后,prefetch的功能将和未开启不同。

    prefetch-domain yes
    serve-expired-prefetch-time 21600
    

关闭特定域名的缓存

  1. 某些情况下,可能需要关闭特定域名的缓存,比如DDNS。可以使用下面的配置关闭。

    domain-rules /example.com/ -no-cache
    

设置cache定时保存

  1. 为避免cache因为系统或进程复位丢失,可以设置smartdns周期保存cache文件。

    cache-checkpoint-time 86400