Bloom 篩選器
在讀取路徑中,Cassandra 會將磁碟上的資料 (在 SSTable 中) 與 RAM 中的資料 (在記憶表中) 合併。為了避免檢查每個 SSTable 資料檔以取得請求的分區,Cassandra 會採用稱為 Bloom 篩選器的資料結構。
Bloom 篩選器是一種機率資料結構,可讓 Cassandra 判斷兩種可能狀態之一:- 資料絕對不存在於給定的檔案中,或 - 資料可能存在於給定的檔案中。
雖然 Bloom 篩選器無法保證資料存在於給定的 SSTable 中,但透過允許 Bloom 篩選器使用更多 RAM,可以讓 Bloom 篩選器更準確。操作員有機會透過將 bloom_filter_fp_chance
調整為介於 0 到 1 之間的浮點數,針對每個表格調整此行為。
對於使用 LeveledCompactionStrategy 的表格,bloom_filter_fp_chance
的預設值為 0.1,而所有其他情況的預設值為 0.01。
Bloom 篩選器儲存在 RAM 中,但會儲存在堆外,因此操作員在選擇最大堆大小時不應考慮 Bloom 篩選器。隨著準確度提高 (bloom_filter_fp_chance
接近 0),記憶體使用量會非線性增加 - bloom_filter_fp_chance = 0.01
的 Bloom 篩選器需要的記憶體約為 bloom_filter_fp_chance = 0.1
的相同表格的三倍。
bloom_filter_fp_chance
的典型值通常介於 0.01 (1%) 到 0.1 (10%) 的誤判機率之間,Cassandra 可能會掃描 SSTable 以尋找列,但只會發現它不存在於磁碟上。應根據使用案例調整參數
-
RAM 較多而磁碟較慢的使用者,可以將
bloom_filter_fp_chance
設為數值較低的數字(例如 0.01),以避免過多的 IO 作業 -
RAM 較少、節點較密集或磁碟非常快的使用者,可以容忍較高的
bloom_filter_fp_chance
,以犧牲過多的 IO 作業來節省 RAM -
在很少讀取或僅透過掃描整個資料集來執行讀取的工作負載(例如分析工作負載)中,將
bloom_filter_fp_chance
設為較高的數字是可以接受的。
變更
Bloom 過濾器誤判機率會顯示在 DESCRIBE TABLE
輸出中,為欄位 bloom_filter_fp_chance
。操作員可以使用 ALTER TABLE
陳述式變更值:
ALTER TABLE keyspace.table WITH bloom_filter_fp_chance=0.01
不過,操作員應注意,這個變更並非立即生效:Bloom 過濾器會在寫入檔案時計算,並作為 SSTable 的 Filter 元件儲存在磁碟上。在發出 ALTER TABLE
陳述式後,磁碟上的新檔案會以新的 bloom_filter_fp_chance
寫入,但現有的 SSTable 必須壓縮後才會修改 - 如果操作員需要變更 bloom_filter_fp_chance
以生效,他們可以使用 nodetool scrub
或 nodetool upgradesstables -a
觸發 SSTable 重新寫入,這兩個指令都會在磁碟上重建 SSTable,並在進行中重新產生 Bloom 過濾器。