快取 (Cache)

原始碼 (Source)

快取 (cache) 啟用前端快取。

描述 (Description)

啟用快取 (cache) 後,除了區域傳輸和中繼資料記錄外,所有記錄都將快取最多 3600 秒。當從後端(上游、資料庫等)提取資料的成本很高時,快取尤其有用。

快取 (cache) 將會把 DNSSEC (DNSSEC OK; DO) 選項傳遞給外掛程式,以便進行上游查詢。

此外掛程式在每個伺服器區塊中只能使用一次。

語法 (Syntax)

cache [TTL] [ZONES...]
  • 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。 最小TTL (MINTTL) 覆寫快取的最小 TTL(預設為 5),這對於限制對後端的查詢非常有用。
  • denial,覆寫快取拒絕存在回應的設定。 容量 (CAPACITY) 表示在開始逐出 (LRU) 之前我們快取的最大封包數。 TTL 覆寫快取的最大 TTL。 最小TTL (MINTTL) 覆寫快取的最小 TTL(預設為 5),這對於限制對後端的查詢非常有用。還有第三類 (error),但這些回應永遠不會被快取。
  • prefetch 將在熱門項目即將從快取中刪除時預先提取它們。「熱門」表示在它們之間沒有 期間 (DURATION) 或更長的間隔的情況下,已經看到 數量 (AMOUNT) 次查詢。 期間 (DURATION) 預設為 1 分鐘。當 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 快取 期間 (DURATION) 的 SERVFAIL 回應。將 期間 (DURATION) 設定為 0 將停用快取 SERVFAIL 回應。如果未設定此選項,SERVFAIL 回應將快取 5 秒。 期間 (DURATION) 不得超過 5 分鐘。
  • disable 停用所列 區域 (ZONES) 的成功或拒絕快取。如果未提供 區域 (ZONES),則將針對所有區域停用指定的快取。
  • keepttl 從快取提供回應時,不會使 TTL 過期。當 TTL 正常到期時,條目仍將從快取中移除,但在到期之前,回應將包含原始 TTL 而不是剩餘 TTL。如果將 CoreDNS 用作權威伺服器,並且您希望向下游客戶端提供一致的 TTL,則此功能非常有用。當 CoreDNS 快取它沒有權威的記錄時,建議這樣做,因為它可能會導致下游客戶端使用過時的答案。

容量和逐出 (Capacity and Eviction)

如果指定 容量 (CAPACITY),則每個快取的預設快取大小為 9984。允許的最小快取大小為 1024。如果指定 容量 (CAPACITY),則實際使用的快取大小將向下捨入為可被 256 整除的最接近數字(因此所有分片的大小都相等)。

逐出是按分片完成的。實際上,當分片達到容量時,會從該分片中逐出項目。由於分片並非完全均勻地填滿,因此會在整個快取達到滿容量之前發生逐出。每個分片容量等於快取總大小 / 分片數量 (256)。逐出是隨機的,而不是基於 TTL。TTL 為 0 的條目將保留在快取中,直到分片達到容量時隨機逐出為止。

指標 (Metrics)

如果啟用監控(透過 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} - 快取逐出次數的計數器。

快取類型為「denial」或「success」。「Server」是處理請求的伺服器,請參閱 prometheus 外掛程式的說明文件。

範例 (Examples)

為所有區域啟用快取,但將所有內容的 TTL 限制為 10 秒

. {
    cache 10
    whoami
}

Proxy 到 Google 公用 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
    }
}