分層壓縮策略 (LCS)
統一壓縮策略 (UCS) 是從 Cassandra 5.0 開始對大多數工作負載推薦的壓縮策略。如果您正在建立新表格,請使用此策略。 |
LeveledCompactionStrategy (LCS)
建議用於讀取密集型工作負載,儘管 UCS 是目前對所有工作負載的最佳建議。它緩解了 STCS 的一些讀取操作問題,同時提供了合理的寫入操作。此策略使用一系列層級,其中每個層級都包含一組 SSTable。當記憶體表格中的資料被沖刷時,SSTable 會寫入第一層 (L0),其中不保證 SSTable 不重疊。LCS 壓縮會將這些第一個 SSTable 與 L1 層中的較大 SSTable 合併。預設情況下,每個層級的大小是前一個層級的 10 倍。一旦 SSTable 寫入 L1 或更高層級,則保證 SSTable 與同層級中的其他 SSTable 不重疊。如果讀取操作需要存取列,則它只需要查看每個層級的一個 SSTable。
若要完成壓縮,所有重疊的 SSTable 都會合併到下一層級的新 SSTable 中。對於 L0 → L1 壓縮,我們幾乎總是需要包含所有 L1 SSTable,因為大多數 L0 SSTable 涵蓋了完整的分割區範圍。LCS 將 SSTable 從一個層級壓縮到下一個層級,寫入分割區以符合定義的 SSTable 大小。此外,每個層級都有規定的尺寸,因此當層級達到其尺寸限制時,將觸發壓縮。在一個層級中建立新的 SSTable 會觸發下一個層級的壓縮,依此類推,直到所有層級都根據設定進行壓縮。
如果在 L0 層級中執行過多的 SSTable 讀取,則有一個故障保護機制。如果 L0 中有超過 32 個 SSTable,則會在 L0 中觸發 STCS 壓縮。此壓縮會快速將 SSTable 從 L0 合併到 L1,在 L1 中它們將被壓縮成不重疊的 SSTable。
LCS 沒有 STCS 那麼耗費磁碟,執行時僅需要大約 10% 的磁碟,但它更耗費 IO 和 CPU。對於讀取密集型工作負載中的持續小型壓縮,壓縮量是合理的。不過,它不是寫入密集型工作負載的理想選擇,因為它會造成大量的磁碟 IO 和 CPU 使用量。不建議對 LCS 進行大型壓縮。
引導
在引導過程中,SSTables 會從其他節點串流。由於許多 SSTables 會同時從新寫入到記憶表中清除,以及從遠端節點串流,因此新節點在 L0 中會有許多 SSTables。為了避免清除和串流 SSTables 發生衝突,只有在引導完成之前才會執行 L0 中的 STCS。
飢餓的 SSTables
如果調整層級不佳,LCS 最終可能會產生飢餓的 SSTables。高層級 SSTables 可能會擱置且無法壓縮,因為較低層級的 SSTables 沒有合併和壓縮。例如,這種情況可能會導致較低層級無法刪除墓碑。如果這些飢餓的 SSTables 未在定義的壓縮回合數內解決,它們將包含在其他壓縮中。如果使用者降低 sstable_size
設定,通常會發生這種情況。
|
LCS 選項
子屬性 | 說明 |
---|---|
enabled |
啟用背景壓縮。預設值:true |
tombstone_compaction_interval |
在 Cassandra 將 SSTable 視為墓碑壓縮之前,建立 SSTable 後的最小秒數。如果表格超過 |
tombstone_threshold |
可垃圾回收的墓碑與所有包含欄位的比率。如果比率超過此限制,Cassandra 會開始單獨對該表格進行壓縮,以清除墓碑。預設值:0.2 |
unchecked_tombstone_compaction |
如果設為 |
log_all |
啟用整個叢集的高階記錄。預設值:false |
sstable_size_in_mb |
SSTables 的目標大小。儘管 SSTable 大小應小於或等於 sstable_size_in_mb,但壓縮期間壓縮可能會產生更大的 SSTable。當給定分區金鑰的資料特別大時,就會發生這種情況。Cassandra 資料庫不會將資料拆分為兩個 SSTables。預設值:160 |
fanout_size |
層級的目標大小會增加此 |
single_sstable_uplevel |
??? 預設值:true |
LCS 也支援啟動選項,-Dcassandra.disable_stcs_in_l0=true
會停用 L0 中的 STCS。