缓存

代码

cache 启用前端缓存。

说明

启用 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
}
  • TTLZONES 如上。
  • 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
    }
}