在分佈式資料庫領域,Cassandra 以其高可擴展性與強大寫入效能著稱,而其核心存儲機制 LSM Tree(Log-Structured Merge-Tree)的效能表現,直接影響系統整體效能。隨著資料量增長,SSTable(Sorted String Table)的數量與大小會快速膨脹,導致讀寫放大(read/write amplification)問題。Cassandra 5 引入的「統一壓縮策略」(Unified Compaction Strategy, UCS),透過整合 Size-Tiered 與 Leveled 壓縮策略的優點,提供更靈活的壓縮機制,解決傳統策略在讀寫平衡與 SSTable 管理上的瓶頸,成為現代分佈式資料庫存儲優化的重要突破。
Cassandra 使用 LSM Tree 結構進行資料存儲,其核心特性為將資料分為多個 SSTable,寫入操作透過記憶體緩衝區(MemTable)快速完成,而壓縮(compaction)則用於重新組織 SSTable,以維持查詢效能與空間利用率。壓縮過程需處理讀寫放大問題:讀取時需掃描更多 SSTable,寫入時資料需重寫多次。
UCS 的核心目標在於結合 Size-Tiered 與 Leveled 壓縮策略的優點,實現:
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
。fun factor=4
,觸發壓縮,分為 4 個 100MB SSTable。fun factor=4
,分為 2 個 120MB SSTable(覆蓋半數 Token 空間)。fun factor=3
,識別重疊 SSTable(CDF、G),分為 8 個 Shard,最終生成 4 個 SSTable。UCS 預先計算分片邊界,避免因資料位置變動導致重複壓縮。目標大小計算根據資料集大小與目標 SSTable 大小(如 160MB)計算分片數量,並透過資料大小與目標大小的比率(Ratio)選擇最接近的 2 的冪次方作為分片數量。成長控制預設分片數量隨資料量成長,每次分片數量增加 4 倍時,SS Table 大小增長 2 倍,平衡資料密度與壓縮效率。
fun factor
,平衡讀寫效能。fun factor
以平衡讀寫放大,過度優化可能導致效能反彈。Cassandra 5 的統一壓縮策略(UCS)透過整合 Size-Tiered 與 Leveled 策略的優點,提供更靈活的壓縮機制,解決傳統策略在讀寫平衡與 SSTable 管理上的瓶頸。其核心在於透過密度與重疊控制,動態調整分片數量與壓縮粒度,並透過 fun factor
參數實現靈活配置。對於高寫入負載或讀取密集的場景,UCS 能有效減少讀寫放大,提升系統整體效能。未來隨著時間基準層級與自動化調整機制的完善,UCS 將進一步強化 Cassandra 在分佈式資料庫領域的競爭力。