布隆过滤器
在读取路径中,Cassandra 将磁盘上的数据(在 SSTable 中)与内存中的数据(在内存表中)合并。为了避免检查每个 SSTable 数据文件以查找请求的分区,Cassandra 使用了一种称为布隆过滤器的數據结构。
布隆过滤器是一种概率数据结构,它允许 Cassandra 确定两种可能状态之一: - 数据肯定不存在于给定文件中,或者 - 数据可能存在于给定文件中。
虽然布隆过滤器不能保证数据存在于给定的 SSTable 中,但可以通过允许它们消耗更多内存来提高布隆过滤器的准确性。操作员可以通过将 bloom_filter_fp_chance
调整为 0 到 1 之间的浮点数,来为每个表调整此行为。
对于使用 LeveledCompactionStrategy 的表,bloom_filter_fp_chance
的默认值为 0.1,对于所有其他情况,默认值为 0.01。
布隆过滤器存储在内存中,但存储在非堆中,因此操作员在选择最大堆大小时不应考虑布隆过滤器。随着准确性的提高(bloom_filter_fp_chance
接近 0),内存使用量呈非线性增长 - bloom_filter_fp_chance = 0.01
的布隆过滤器将需要大约三倍于 bloom_filter_fp_chance = 0.1
的相同表的内存。
bloom_filter_fp_chance
的典型值通常在 0.01 (1%) 到 0.1 (10%) 的假阳性几率之间,Cassandra 可能会扫描 SSTable 以查找行,但最终发现磁盘上不存在该行。应根据用例调整参数。
-
具有更多内存和更慢磁盘的用户可能会从将
bloom_filter_fp_chance
设置为数值更小的数字(例如 0.01)中受益,以避免过多的 IO 操作。 -
具有更少内存、更密集节点或非常快磁盘的用户可能会容忍更高的
bloom_filter_fp_chance
,以节省内存,但代价是过多的 IO 操作。 -
在很少读取或仅通过扫描整个数据集执行读取的工作负载(例如分析工作负载)中,将
bloom_filter_fp_chance
设置为更高的数字是可以接受的。
更改
布隆过滤器假阳性几率在 DESCRIBE TABLE
输出中可见,作为字段 bloom_filter_fp_chance
。操作员可以使用 ALTER TABLE
语句更改该值:
ALTER TABLE keyspace.table WITH bloom_filter_fp_chance=0.01
但是,操作员应该意识到,此更改不是立即生效的:布隆过滤器是在写入文件时计算的,并在磁盘上作为 SSTable 的 Filter 组件持久化。在发出 ALTER TABLE
语句后,磁盘上的新文件将使用新的 bloom_filter_fp_chance
写入,但现有 sstable 不会被修改,直到它们被压缩 - 如果操作员需要 bloom_filter_fp_chance
的更改生效,他们可以使用 nodetool scrub
或 nodetool upgradesstables -a
触发 SSTable 重写,这两个命令都将重建磁盘上的 sstable,并在过程中重新生成布隆过滤器。