Cassandra 文件

版本

您正在檢視預發行版本的說明文件。

分層壓縮策略 (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 設定,通常會發生這種情況。

SizeTieredCompactionStrategy 是預設壓縮策略。任何其他壓縮策略都必須在 cassandra.yaml 檔案中定義。

LCS 選項

子屬性 說明

enabled

啟用背景壓縮。預設值:true

tombstone_compaction_interval

在 Cassandra 將 SSTable 視為墓碑壓縮之前,建立 SSTable 後的最小秒數。如果表格超過 tombstone_threshold 比率,則 SSTable 有資格進行墓碑壓縮。預設值:86400

tombstone_threshold

可垃圾回收的墓碑與所有包含欄位的比率。如果比率超過此限制,Cassandra 會開始單獨對該表格進行壓縮,以清除墓碑。預設值:0.2

unchecked_tombstone_compaction

如果設為 true,允許 Cassandra 在不預先檢查哪些表格有資格進行此操作的情況下執行墓碑壓縮。即使沒有此預先檢查,Cassandra 仍會檢查 SSTable 以確保可以安全地刪除墓碑。預設值:false

log_all

啟用整個叢集的高階記錄。預設值:false

sstable_size_in_mb

SSTables 的目標大小。儘管 SSTable 大小應小於或等於 sstable_size_in_mb,但壓縮期間壓縮可能會產生更大的 SSTable。當給定分區金鑰的資料特別大時,就會發生這種情況。Cassandra 資料庫不會將資料拆分為兩個 SSTables。預設值:160

fanout_size

層級的目標大小會增加此 fanout_size 倍數。您可以調整此選項來減少空間放大。預設值:10

single_sstable_uplevel

??? 預設值:true

LCS 也支援啟動選項,-Dcassandra.disable_stcs_in_l0=true 會停用 L0 中的 STCS。