Cassandra 文档

版本

您正在查看预发布版本的文档。

布隆过滤器

在读取路径中,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 scrubnodetool upgradesstables -a 触发 SSTable 重写,这两个命令都将重建磁盘上的 sstable,并在过程中重新生成布隆过滤器。