说明
启用 cache 后,除了区域转移和元数据记录的所有记录都将缓存长达 3600 秒。当从后端(上游、数据库等)获取数据成本高昂时,缓存更为有用。
cache 将通过插件转发 DNSSEC(DNSSEC OK;DO)选项以用于上游查询。
此插件每个服务器块只能使用一次。
语法
cache [TTL] [ZONES...]
- TTL 秒为单位的最大 TTL。如果未指定,将使用最大 TTL,为 NOERROR 响应 3600,为拒绝存在响应 1800。设置 TTL 为 300:
cache 300
将缓存记录长达 300 秒。 - ZONES 它应该为其缓存的区域。如果为空,将使用配置块中的区域。
缓存中的每个元素都按照其 TTL(最大值为 TTL)进行缓存。缓存分为 256 个碎片,每个碎片默认最多容纳 39 个项目 - 总大小为 256 * 39 = 9984 个项目。
如果你想要更多控制
cache [TTL] [ZONES...] {
success CAPACITY [TTL] [MINTTL]
denial CAPACITY [TTL] [MINTTL]
prefetch AMOUNT [[DURATION] [PERCENTAGE%]]
serve_stale [DURATION] [REFRESH_MODE]
servfail DURATION
disable success|denial [ZONES...]
keepttl
}
- TTL 和 ZONES 如上。
success
,覆盖缓存成功响应的设置。CAPACITY 指示在开始驱逐(随机)之前我们缓存的数据包的最大数量。TTL 覆盖缓存的最大 TTL。MINTTL 覆盖缓存的最小 TTL(默认 5),可以用来限制对后端的查询。denial
,覆盖缓存拒绝存在响应的设置。CAPACITY 指示在开始驱逐(LRU)之前我们缓存的数据包的最大数量。TTL 覆盖缓存的最大 TTL。MINTTL 覆盖缓存的最小 TTL(默认 5),可以用来限制对后端的查询。第三个类别(error
)存在,但那些响应永不缓存。prefetch
当热门项目即将从缓存中清除时将预取该项目。热门表示在它们之间不存在 DURATION 或更长的时间间隔的情况下已经看到 AMOUNT 条查询。DURATION 的默认值为 1m。当 TTL 低于 PERCENTAGE(默认为10%
)或在 TTL 过期前最新 1 秒时,将进行预取。取值范围为[10%, 90%]
。注意百分号是必需的。PERCENTAGE 作为int
对待。serve_stale
,当 serve_stale 设置为真时,无论缓存是否已过期,只要尚未过期的时间不长于 DURATION(默认为 1 小时),缓存将始终向客户端提供已过期的条目。默认情况下,cache 插件将尝试在向客户端发送过期的缓存条目后刷新缓存条目。响应的 TTL 为 0。REFRESH_MODE 控制过期缓存条目刷新的时间。verify
将首先验证一个条目在发送已过期的条目给客户端之前,是否仍无法从源获取。immediate
将在检查条目是否可以从源获得之前,立即向客户端发送已过期的条目。REFRESH_MODE 默认为immediate
。将此值设置为verify
可能会在提供陈旧响应时增加延迟,但将防止在可以从源检索到更新的响应时提供陈旧的条目。servfail
缓存 SERVFAIL 响应,时效为 DURATION。将 DURATION 设置为 0 将禁用 SERVFAIL 响应的缓存。如果未设置此选项,SERVFAIL 响应将被缓存 5 秒。DURATION 不得大于 5 分钟。disable
禁用列出的 ZONES 的成功或拒绝缓存。如果未给出 ZONES,则指定的缓存将对所有区域禁用。keepttl
在从缓存提供响应时不要降低 TTL。条目仍将在 TTL 到期时从缓存中移除,在过期之前,响应将包含原始 TTL 而不是剩余 TTL。如果 CoreDNS 用作权威服务器并且您想向下游客户端提供一致的 TTL,这可能很有用。当 CoreDNS 正在缓存它没有权威权限的记录时,不建议使用它,因为它可能导致下游客户端使用陈旧的答案。
容量和驱逐
如果容量未指定,则每个缓存的默认缓存大小为 9984。允许的最小缓存大小为 1024。如果容量已指定,则实际使用的缓存大小将取整为最接近的 256 的倍数(因此所有分片的大小相等)。
逐个分片进行驱逐。事实上,当一个分片达到容量时,项目将从此分片中驱逐。由于分片不会均匀填充,因此驱逐将在整个缓存达到满容量之前发生。每个分片的容量等于总缓存大小 / 分片数 (256)。驱逐是随机的,不基于 TTL。具有 0 TTL 的条目在分片达到容量时随机驱逐之前,将保留在缓存中。
指标
如果监控已启用(通过prometheus 插件),则导出以下指标
coredns_cache_entries{server, type, zones, view}
- 按缓存类型进行缓存中的总元素。coredns_cache_hits_total{server, type, zones, view}
- 按缓存类型进行缓存命中的计数器。coredns_cache_misses_total{server, zones, view}
- 缓存未命中的计数器。 - 不推荐使用,从缓存命中/请求计数器中导出未命中。coredns_cache_requests_total{server, zones, view}
- 缓存请求的计数器。coredns_cache_prefetch_total{server, zones, view}
- 缓存已预取缓存项的次数计数器。coredns_cache_drops_total{server, zones, view}
- 由于请求/响应问题名称不匹配而从缓存中排除的响应计数器。coredns_cache_served_stale_total{server, zones, view}
- 从过时缓存条目提供服务的请求计数器。coredns_cache_evictions_total{server, type, zones, view}
- 缓存驱逐的计数器。
缓存类型为“否定”或“成功”。Server
是处理请求的服务器,有关文档请参阅 Prometheus 插件。
示例
为所有区域启用缓存,但将所有内容限制为 10 秒的 TTL
. {
cache 10
whoami
}
代理到 Google Public DNS,并仅缓存 example.org(或以下)的响应。
. {
forward . 8.8.8.8:53
cache example.org
}
为 example.org
启用缓存,保持 5000 的正缓存大小和 2500 的负缓存大小
example.org {
cache {
success 5000
denial 2500
}
}
为 example.org
启用缓存,但不要在 sub.example.org
中缓存否定内容
example.org {
cache {
disable denial sub.example.org
}
}