Cassandra 5 統一壓縮策略:重新定義 LSM Tree 的效能平衡

引言

在分佈式資料庫領域,Cassandra 以其高可擴展性與強大寫入效能著稱,而其核心存儲機制 LSM Tree(Log-Structured Merge-Tree)的效能表現,直接影響系統整體效能。隨著資料量增長,SSTable(Sorted String Table)的數量與大小會快速膨脹,導致讀寫放大(read/write amplification)問題。Cassandra 5 引入的「統一壓縮策略」(Unified Compaction Strategy, UCS),透過整合 Size-Tiered 與 Leveled 壓縮策略的優點,提供更靈活的壓縮機制,解決傳統策略在讀寫平衡與 SSTable 管理上的瓶頸,成為現代分佈式資料庫存儲優化的重要突破。

技術定義與核心概念

LSM Tree 與 SSTable 的角色

Cassandra 使用 LSM Tree 結構進行資料存儲,其核心特性為將資料分為多個 SSTable,寫入操作透過記憶體緩衝區(MemTable)快速完成,而壓縮(compaction)則用於重新組織 SSTable,以維持查詢效能與空間利用率。壓縮過程需處理讀寫放大問題:讀取時需掃描更多 SSTable,寫入時資料需重寫多次。

統一壓縮策略(UCS)的設計目標

UCS 的核心目標在於結合 Size-Tiered 與 Leveled 壓縮策略的優點,實現:

  • 讀寫放大平衡:根據工作負載動態調整壓縮策略。
  • 避免過大 SSTable:透過密度(density)與重疊(overlap)控制壓縮粒度。
  • 靈活配置:透過單一參數(fun factor)調整壓縮策略。

關鍵特性與技術實現

分層邏輯與密度控制

UCS 透過分層邏輯管理 SSTable,按大小分層(基於 fun factor),但允許每層存放多個 SSTable(上限為 fun factor)。每層 SSTable 覆蓋 Token 空間的大小由 fun factor 控制,並透過密度(SSTable 大小 / 覆蓋 Token 空間)衡量資料密集度。壓縮時根據密度決定分片數量,確保壓縮後 SSTable 大小合理。

重疊控制與動態分片策略

UCS 僅考慮重疊 SSTable 進行壓縮,非重疊 SSTable 不影響讀取效能。透過識別重疊區域,決定是否觸發壓縮。動態分片策略根據當前 SSTable 總大小與目標 SSTable 大小,計算最佳分片數量(近似為目標大小的 2 的冪次)。例如:總大小 400MB,目標 SSTable 100MB,分為 4 個 100MB SSTable。

參數調整與分層配置

UCS 透過調整 fun factor 參數平衡讀寫放大:

  • 負值:偏向讀優化(減少寫入放大)。
  • 正值:偏向寫優化(減少讀取放大)。 不同層級可設定不同 fun factor 值,例如底層使用 T4,上層使用 T3

壓縮流程與實際應用案例

壓縮流程示例

  1. 初始狀態:Level 0 有 4 個 SSTable(總大小 400MB),覆蓋完整 Token 空間。根據 fun factor=4,觸發壓縮,分為 4 個 100MB SSTable。
  2. 後續資料:新增 4 個 60MB SSTable,總大小 240MB。根據 fun factor=4,分為 2 個 120MB SSTable(覆蓋半數 Token 空間)。
  3. 更高層級壓縮:Level 1 有 4 個 SSTable(總大小 430MB),覆蓋半數 Token 空間。根據 fun factor=3,識別重疊 SSTable(CDF、G),分為 8 個 Shard,最終生成 4 個 SSTable。

分片邊界計算機制

UCS 預先計算分片邊界,避免因資料位置變動導致重複壓縮。目標大小計算根據資料集大小與目標 SSTable 大小(如 160MB)計算分片數量,並透過資料大小與目標大小的比率(Ratio)選擇最接近的 2 的冪次方作為分片數量。成長控制預設分片數量隨資料量成長,每次分片數量增加 4 倍時,SS Table 大小增長 2 倍,平衡資料密度與壓縮效率。

優勢與挑戰

優勢

  • 避免過大 SSTable:透過密度與重疊控制,確保壓縮後 SSTable 大小合理。
  • 減少重複壓縮:固定分片邊界,避免因資料位置變化導致重複壓縮。
  • 靈活適應負載:根據工作負載調整 fun factor,平衡讀寫效能。
  • 自動調整機制:支援根據讀取延遲調整壓縮策略,無需重新壓縮全部資料。

挑戰

  • 參數調校複雜度:需精準設定 fun factor 以平衡讀寫放大,過度優化可能導致效能反彈。
  • 資料規模限制:在 TB 級資料規模下,需平衡分片數量與 SSTable 大小,避免產生過多 SSTable。

總結

Cassandra 5 的統一壓縮策略(UCS)透過整合 Size-Tiered 與 Leveled 策略的優點,提供更靈活的壓縮機制,解決傳統策略在讀寫平衡與 SSTable 管理上的瓶頸。其核心在於透過密度與重疊控制,動態調整分片數量與壓縮粒度,並透過 fun factor 參數實現靈活配置。對於高寫入負載或讀取密集的場景,UCS 能有效減少讀寫放大,提升系統整體效能。未來隨著時間基準層級與自動化調整機制的完善,UCS 將進一步強化 Cassandra 在分佈式資料庫領域的競爭力。