Cassandra 作為一個高可用、可擴展的分散式資料庫,其核心資料結構基於 LSM Tree(Log-Structured Merge-Tree)。資料寫入時先儲存在 MemTable,滿載後刷寫為不可變的 SSTable(Sorted String Table)。隨著 SSTable 積累,壓縮(Compaction)成為維護資料一致性與讀取效能的關鍵步驟。傳統壓縮策略如 Size-Tiered Compaction(STC)與 Level Compaction(LC)各有優缺點,而 UCS(Unified Compaction Strategy)透過密度(Density)與分片(Sharding)機制,提供更靈活的壓縮方案,本文將深入解析 UCS 的設計與應用。
Cassandra 的 LSM Tree 結構包含 MemTable 與 SSTable 兩個主要元件。MemTable 為記憶體中的有序資料結構,當其滿載時會被刷寫為 SSTable,並以不可變方式儲存於磁碟。隨著 SSTable 積累,壓縮過程會重新組織資料,消除重疊與無效資料,以提升讀取效能。
UCS 的核心在於動態調整壓縮策略,結合密度與分片機制:
UCS 透過參數 W 動態調整壓縮策略,適應不同負載場景:
UCS 支援高達 10TB 的資料規模,並提供自動化分片與壓縮策略調整,提升系統擴展能力。例如,UCS 初始實現中,透過分片與密度機制,將壓縮效能提升 10 倍。
Cassandra 保證資料隨機分佈於 Token 範圍,UCS 利用此特性優化分片與壓縮:
當系統負載持續且壓縮延遲時,UCS 優先選擇重疊度最高的分片進行壓縮,避免低層級過度壓縮。若存在多個相同重疊度的分片,優先處理低層級(覆蓋更廣的 Token 範圍),以減少讀取放大。
UCS 透過密度驅動的層級管理與動態分片機制,解決傳統 STC 與 LC 的缺陷,提供更靈活的壓縮策略。其核心在於動態調整層級與壓縮觸發條件,平衡讀寫放大,提升 Cassandra 的效能與可擴展性。在實際應用中,建議根據資料規模與負載特性調整參數 W,並密切監控資源使用情況,以實現最佳壓縮效能。