缓存
SmartDNS提供了缓存能力,开启缓存的情况下,能提供更好的DNS查询请求;smartdns提供的过期缓存功能会将体验更进一步提升。
缓存配置
SmartDNS可以通过cache-size
配置缓存的条数,同时也可以通过cache-persist
来配置是否持久化缓存,也可以通过cache-file
来指定缓存文件存储路径
cache-size 32768
cache-persist yes
cache-file /path/to/cache/file
注意:
- smartdns默认自动根据磁盘空间是否启用缓存。
- 缓存文件只有在进程正常退出的时候才会保存供下次使用。
- 缓存大小cache-size一般情况无需设置,smartdns会根据系统内存情况自动设置。
缓存预获取
Smartdns可以设置缓存预获取,避免缓存超时,配置预先获取后,smartdns将在域名超时前的5s内,重新进行域名查询。并对域名的热度进行排序。
prefetch-domain yes
注意:
- 此功能将会导致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超时获取。
所以,开启了过期缓存的情况下,推荐开启域名预获取功能。
配置步骤
-
开启过期缓存
serve-expired yes
-
配置过期缓存超时时间
此时间表示过期缓存多长时间未访问,则从缓存中释放。
serve-expired-ttl 259200
-
配置过期缓存响应TTL
此时间表示当缓存中域名TTL超时时,返回给客户端的TTL时间,让客户端在下列TTL时间后再次查询。
serve-expired-reply-ttl 3
-
过期缓存预获取时间
此时间表示,过期缓存在多长时间未访问,主动进行预先获取,以避免IP无效;开启过期缓存后,prefetch的功能将和未开启不同。
prefetch-domain yes serve-expired-prefetch-time 21600
关闭特定域名的缓存
-
某些情况下,可能需要关闭特定域名的缓存,比如DDNS。可以使用下面的配置关闭。
domain-rules /example.com/ -no-cache
设置cache定时保存
-
为避免cache因为系统或进程复位丢失,可以设置smartdns周期保存cache文件。
cache-checkpoint-time 86400