快取高一致性:Meta的快取失效解決方案

banq發表於2022-06-09

快取有助於減少延遲、擴充套件讀取繁重的工作負載並節省成本。它們實際上無處不在。快取在您的手機和瀏覽器中執行。例如,CDN 和 DNS 本質上是地理複製快取。多虧了許多在幕後工作的快取,您現在可以閱讀這篇博文。

Phil Karlton 有句名言:“電腦科學中只有兩件困難的事情:快取失效和命名事物。” 如果您曾經研究過使用失效的快取,那麼您很可能會遇到令人討厭的快取不一致問題。

在 Meta,我們運營著世界上一些最大的快取部署,包括 TAOMemcache。多年來,我們將 TAO 的快取一致性提高了一項,從 99.9999%(6 個 9)提高到 99.99999999%(10 個 9)。 

當談到快取失效時,我們相信我們現在有一個有效的解決方案來彌合理論與實踐之間的差距。這篇博文中的原理和方法廣泛適用於大多數(如果不是全部)任何規模的快取服務。無論您是在 Redis 中快取 Postgres 資料還是維護分解的具體化,它都會這樣做。

我們希望幫助減少工程師必須處理的快取失效問題的數量,並幫助使所有失效的快取更加一致。

根據定義,快取不儲存資料的真實來源(例如,資料庫)。快取失效描述了當真實源中的資料發生變化時主動使陳舊的快取條目失效的過程。如果快取失效處理不當,它可能會無限期地在快取中留下與事實來源不同的不一致值。

快取失效涉及必須由快取本身以外的其他事物執行的操作。有些東西(例如,客戶端或釋出/訂閱系統)需要告訴快取發生了突變。僅依賴生存時間 (TTL) 來保持其新鮮度的快取不包含快取失效,因此不在本討論範圍內。對於本文的其餘部分,我們將假設存在快取失效。

在某些情況下,快取不一致幾乎與資料庫上的資料丟失一樣嚴重。從使用者的角度來看,它甚至無法與資料丟失區分開來。

可靠的一致性可觀察性
為了解決快取失效和快取一致性,第一步涉及測量。我們想測量快取的一致性,並在快取中存在不一致的條目時發出警報。測量不能包含任何誤報。人腦可以很容易地排除噪音。如果存在任何誤報,人們會很快學會忽略它,並且該指標將失去信任並變得無用。我們還需要精確的測量,因為我們談到要測量超過 10 個 9 的一致性。如果實現了一致性修復,我們希望確保我們可以定量地衡量它的改進。

這個龐大而複雜的分散式系統中,任何元件中的單個缺陷都可能導致快取不一致,是否有可能找到一個引入大多數(如果不是全部)快取不一致的地方? 
我們的任務變成了找到一個簡單的解決方案來幫助我們管理這種複雜性。我們希望從單個快取伺服器的角度評估整個快取一致性問題。歸根結底,不一致必須在快取伺服器上實現。從它的角度來看,它只關心幾個方面:

  • 它收到無效了嗎?
  • 它是否正確處理了無效?
  • 之後專案變得不一致了嗎?


我們構建了一個有狀態的跟蹤庫,在這個紫色的小視窗中記錄和跟蹤快取突變,所有有趣和複雜的互動都會觸發導致快取不一致的錯誤。它涵蓋了快取驅逐,即使沒有日誌也可以告訴我們無效事件是否永遠不會到達。它嵌入到一些主要的快取服務和整個失效管道中。它緩衝最近修改資料的索引,用於確定是否應記錄後續快取狀態更改。它支援程式碼跟蹤,因此我們將知道每個跟蹤查詢的確切程式碼路徑。 
這種方法幫助我們發現並修復了許多缺陷。它提供了一種系統化且更具可擴充套件性的方法來診斷快取不一致。事實證明它非常有效。 


 

相關文章