Cassandra 文件

版本

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

儲存引擎

Cassandra 在寫入路徑上的幾個階段處理資料,從立即記錄寫入開始,最後以將資料寫入磁碟結束

  • 記錄提交記錄中的資料

  • 將資料寫入記憶表

  • 從記憶表清除資料

  • 將資料儲存在 SSTable 中的磁碟上

將寫入記錄到提交記錄

發生寫入時,Cassandra 會將資料寫入磁碟上的本地僅附加 (cassandra.apache.org//glossary.html#commit-log)[提交記錄]。此動作透過記錄對 Cassandra 節點進行的每次寫入,提供 可設定的耐用性。如果發生意外關機,提交記錄會提供資料的永久耐用寫入。在啟動時,提交記錄中的任何變更都會套用至 (cassandra.apache.org//glossary.html#memtable)[記憶表]。提交記錄在表格之間共用。

所有變更在提交記錄區段儲存時都經過寫入最佳化,減少寫入磁碟所需的搜尋次數。提交記錄區段受到 commitlog_segment_size 選項的限制。一旦達到定義的大小,就會建立新的提交記錄區段。提交記錄區段可以在所有資料清除到 (SSTable) 之後進行封存、刪除或回收。當 Cassandra 將早於特定時間點的資料寫入 SSTable 時,提交記錄區段會被截斷。在停止 Cassandra 之前執行 nodetool drain 會將記憶表中的所有內容寫入 SSTable,並消除在啟動時與提交記錄同步的需求。

  • commitlog_segment_size:預設大小為 32MiB,這幾乎總是沒問題,但如果您要封存提交記錄區段(請參閱 commitlog_archiving.properties),那麼您可能需要更精細的封存粒度;8 或 16 MiB 是合理的。commitlog_segment_size 也會決定 cassandra.yamlmax_mutation_size 的預設值。預設情況下,max_mutation_sizecommitlog_segment_size 的一半。

如果明確設定 max_mutation_size,則必須將 commitlog_segment_size 設定為至少為 max_mutation_size 大小的兩倍。

  • commitlog_sync:可能是 periodicbatch

    • batch:在批次模式中,Cassandra 會在提交記錄同步到磁碟後才會確認寫入。

    • periodic:在定期模式中,寫入會立即確認,而提交記錄只會每隔「commitlog_sync_period」毫秒同步一次。

      • commitlog_sync_period:在「定期」fsync 之間的等待時間 預設值: 10000 毫秒

預設值: 批次

在意外關機的情況下,Cassandra 可能會遺失長達同步週期或更長的時間,如果同步延遲的話。如果使用 batch 模式,建議將提交記錄儲存在一個獨立的專用裝置中。

  • commitlog_directory:此選項預設為註解。在磁性硬碟上執行時,這應該與資料目錄使用不同的磁軸。如果未設定,預設目錄為 $CASSANDRA_HOME/data/commitlog

預設值: /var/lib/cassandra/commitlog

  • commitlog_compression:套用於提交記錄的壓縮。如果省略,提交記錄將以未壓縮的方式寫入。支援 LZ4、Snappy、Deflate 和 Zstd 壓縮器。

預設值: (複雜選項)

#   - class_name: LZ4Compressor
#     parameters:
  • commitlog_total_space:用於磁碟上提交記錄的總空間。此選項預設為註解。如果空間超過此值,Cassandra 會清除最舊區段中的每個髒資料表並將其移除。因此,較小的提交記錄總空間會導致在較不活躍的資料表上產生更多清除活動。預設值是 8192 和提交記錄磁碟區總空間的 1/4 之間的最小值。

預設值: 8192MiB

記憶表

當寫入發生時,Cassandra 也會將資料寫入記憶表。記憶表是 Cassandra 緩衝寫入的記憶體中結構。一般來說,每個資料表有一個活躍的記憶表。記憶表是 Cassandra 透過金鑰查詢的資料區段的寫回快取。記憶表可以完全儲存在堆上或部分儲存在堆外,這取決於 memtable_allocation_type

記憶表會以排序順序儲存寫入,直到達到可設定的限制。當達到限制時,記憶表會沖刷到磁碟並成為不可變的 SSTable。沖刷可以用幾種方式觸發

  • 記憶表的記憶體使用量超過設定的閾值 (請參閱 memtable_cleanup_threshold)

  • 提交記錄接近其最大值,並強制記憶表沖刷以允許釋放提交記錄區段。

當觸發事件發生時,記憶表會放入一個佇列中,並沖刷到磁碟。沖刷會以記憶表排序順序將資料寫入磁碟。磁碟上也會建立一個區段索引,將令牌對應到磁碟上的位置。

佇列可以透過 cassandra.yaml 檔案中的 memtable_heap_spacememtable_offheap_space 設定進行設定。如果要快取的資料超過 memtable_cleanup_threshold,Cassandra 會封鎖寫入,直到下一次快取成功為止。您可以使用 nodetool flushnodetool drain(快取 memtable,而不傾聽其他節點的連線)手動快取表格。若要減少提交記錄重播時間,建議的最佳做法是在重新啟動節點之前快取 memtable。如果節點停止運作,重播提交記錄會還原停止運作之前 memtable 中的寫入。

提交記錄中的資料會在對應的 memtable 資料快取到磁碟上的 SSTable 之後清除。

SSTable

SSTable 是 Cassandra 用來將資料持續儲存在磁碟上的不可變資料檔案。SSTable 會針對每個表格維護。SSTable 是不可變的,在 memtable 快取之後,就不會再寫入。因此,當資料新增或修改時,分割通常會儲存在多個 SSTable 檔案中。

每個 SSTable 都包含儲存在個別檔案中的多個元件

Data.db

實際資料,也就是列的內容。

Partitions.db

分割索引檔案會將已裝飾的分割金鑰的唯一字首對應到資料檔案位置,或者,在列索引檔案中編入索引的寬分割的情況下,對應到列索引檔案中的位置。

Rows.db

列索引檔案只包含分割中包含多個列且大於一個索引區塊的分割項目。對於所有此類分割,它會儲存分割金鑰、分割標頭和列區塊分隔符號的索引的副本,這些索引會將每個列金鑰對應到可以找到相同或較高列金鑰的任何內容的第一個區塊。

Index.db

從分割金鑰到 Data.db 檔案中位置的索引。對於寬分割,這也可能包含分割內列的索引。

Summary.db

Index.db 檔案中(預設)每 128 個項目的抽樣。

Filter.db

SSTable 中分割金鑰的 Bloom Filter。

CompressionInfo.db

Data.db 檔案中壓縮區塊的偏移量和長度的元資料。

Statistics.db

儲存 SSTable 的元資料,包括時間戳、墓碑、叢集金鑰、壓縮、修復、壓縮、TTL 等資訊。

Digest.crc32

Data.db 檔案的 CRC-32 摘要。

TOC.txt

SSTable 組件檔案的純文字清單。

SAI*.db

儲存附加索引的索引資訊。僅在為資料表啟用 SAI 時才會存在。

請注意,Index.db 檔案類型已由 Partitions.dbRows.db 取代。此變更是 Cassandra 中包含 Big Trie 索引的結果 (CEP-25).

Data.db 檔案中,列會依分區組織。這些分區會依據令牌順序排序(即,在使用預設分區器 Murmur3Partition 時,依據分區金鑰的雜湊值排序)。在分區中,列會依據其叢集金鑰的順序儲存。

SSTable 可以選擇使用區塊式壓縮進行壓縮。

當 SSTable 從 memtable 沖寫到磁碟或從其他節點串流時,Cassandra 會觸發壓縮,將多個 SSTable 合併為一個。寫入新的 SSTable 後,就可以移除舊的 SSTable。

SSTable 版本

截至目前,版本號為

版本 0

  • b (0.7.0):將版本新增至 sstable 檔名

  • c (0.7.0):布隆過濾器元件會對原始金鑰位元組進行雜湊運算,而非字串

  • d (0.7.0):資料元件中的列大小會變成 long,而非 int

  • e (0.7.0):在資料和索引元件中儲存未裝飾的金鑰

  • f (0.7.0):切換資料元件中的布隆過濾器實作

  • g (0.8):在元資料元件中追蹤沖寫時的內容

版本 1

  • h (1.0):在元資料元件中追蹤最大用戶端時間戳

  • hb (1.0.3):在元資料元件中記錄壓縮比率

  • hc (1.0.4):在元資料元件中記錄分區器

  • hd (1.0.10):在 maxtimestamp 中包含列墓碑

  • he (1.1.3):在元資料元件中包含祖先世代

  • hf (1.1.6):標記重播位置對應於 1.1.5+ 基於毫秒的 ID (請參閱 CASSANDRA-4782)

  • ia (1.2.0)

    • 欄位索引已提升至索引檔案

    • 記錄墓碑中刪除時間的預估直方圖

    • 布隆過濾器(金鑰和欄位)已升級至 Murmur3

  • ib (1.2.1):追蹤元資料元件中的最小用戶端時間戳記

  • ic (1.2.5):省略欄位名稱的每列布隆過濾器

版本 2

  • ja (2.0.0)

    • 超級欄位序列化為複合資料(請注意,沒有真正的格式變更,這主要是一個標記,用於得知我們是否應預期超級欄位。然而,我們確實需要一個主要版本升級,因為我們不應允許將超級欄位串流至這個新格式)

    • 追蹤 sstable 元資料中的最大區域刪除時間

    • 記錄元資料元件中的 bloom_filter_fp_chance

    • 從資料檔案中移除資料大小和欄位計數(CASSANDRA-4180)

    • 追蹤最大/最小欄位值(根據比較器)

  • jb (2.0.1)

    • 將壓縮檢查碼從 crc32 切換至 adler32

    • 檢查壓縮資料的檢查碼

  • ka (2.1.0)

    • 新的 Statistics.db 檔案格式

    • 索引摘要可以降採樣,且採樣層級會持續存在

    • 將未壓縮檢查碼切換至 adler32

    • 追蹤舊版(區域和遠端)計數分段的存在

  • la (2.2.0):新的檔案名稱格式

  • lb (2.2.7):包含提交記錄下限

版本 3

  • ma (3.0.0)

    • 交換 bf hash 順序

    • 原生儲存列

  • mb (3.0.7, 3.7):包含提交記錄下限

  • mc (3.0.8, 3.9):包含提交記錄區間

  • md (3.0.18, 3.11.4):更正 sstable 最小/最大叢集

  • me (3.0.25, 3.11.11):新增 sstable 來源節點的 hostId

版本 4

  • na (4.0-rc1):未壓縮區塊、待處理修復階段、isTransient、sstable 元資料檔案檢查碼、新的 Bloomfilter 格式

  • nb (4.0.0):來源主機 ID

版本 5

  • oa (5.0):改善最小/最大值、區塊層級刪除存在標記、金鑰範圍(CASSANDRA-18134)

    • 長時間 deletionTime 以防止 TTL 溢位

    • 令牌空間覆蓋範圍

基於 Trie 索引的 SSTable 版本 (BTI)

Cassandra 5.0 引入了新的 SSTable 格式 BTI,用於基於 Trie 索引的 SSTable。若要使用 BTI 格式,請在 cassandra.yaml 中進行設定,如下所示

sstable:
  selected_format: bti

版本來自 (BtiFormat#BtiVersion)。

有關實作文件,請參閱 (BtiFormat.md)。

版本 5

  • da (5.0):BIT 格式的初始版本

範例程式碼

下列範例有助於找出所有與「ib」SSTable 版本不符的 SSTable

find /var/lib/cassandra/data/ -type f | grep -v -- -ib- | grep -v "/snapshots"