布隆过滤器在卡桑德拉中的作用是什么?

What is role of bloom filter in cassandra?

从 Cassandra 文档的两个不同链接,我发现:

link 1

A structure stored in memory that checks if row data exists in the memtable before accessing SSTables on disk

link2

Cassandra checks the Bloom filter to discover which SSTables are likely to have the request partition data.

请问以上两种说法都对吗?如果是,布隆过滤器是否分别为 Memtable 和 SSTable 维护?提前致谢。

A Bloom filter 是一种通用数据结构,用于检查元素是否存在于集合中。它的算法设计得非常快,但要冒 return 误报的风险。

Cassandra 使用布隆过滤器来测试是否有任何 SSTables 可能包含请求的分区键,无需实际读取它们的内容(从而避免昂贵的 IO操作)。

如果给定分区键的布隆过滤器 returns false,那么绝对可以肯定分区键不存在于相应的 SSTable 中;但是,如果 returns true,则 SSTable 可能 包含分区键。发生这种情况时,Cassandra 将采用更复杂的技术来确定是否需要读取该 SSTable。请注意,布隆过滤器会针对大多数读取进行咨询,并且仅在某些写入期间(当将内存表刷新到磁盘时)进行更新。您可以阅读更多关于 Cassandra 的读取路径 here.

回到你的问题:

1) 第一个陈述 ("A structure stored in memory that checks if row data exists in the memtable before accessing SSTables on disk") 恕我直言不准确:当 memtable 刷新到磁盘时布隆过滤器确实会更新,但它们不引用 memtable。

2) 每个 SSTable 都维护布隆过滤器,即磁盘上的每个 SSTable 在内存中都有一个相应的布隆过滤器。

在读取路径中,Cassandra 将磁盘上的数据(在 SSTables 中)与 RAM 中的数据(在 memtables 中)合并。为了避免为请求的分区检查每个 SSTable 数据文件,Cassandra 采用了一种称为布隆过滤器的数据结构。

布隆过滤器是一种概率数据结构,它允许 Cassandra 确定两种可能状态之一:- 数据肯定不存在于给定文件中,或者 - 数据可能存在于给定文件中。

虽然布隆过滤器不能保证数据存在于给定的 SSTable 中,但布隆过滤器可以通过允许它们消耗更多 RAM 来提高准确性。操作员有机会根据 table 调整此行为,方法是将 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 的布隆过滤器将需要大约三倍于相同 [=45= 的内存] bloom_filter_fp_chance = 0.1.

bloom_filter_fp_chance 的典型值通常在 0.01 (1%) 到 0.1 (10%) 之间的误报几率,其中 Cassandra 可能会扫描 SSTable 中的一行,却发现它不存在在磁盘上。应根据用例调整参数:

  1. 具有更多 RAM 和较慢磁盘的用户可能会受益于设置 bloom_filter_fp_chance 到较小的数字(例如 0.01) 避免过多的IO操作。

  2. RAM 更少、节点更密集或磁盘速度非常快的用户可能 容忍更高的 bloom_filter_fp_chance 以节省 RAM 额外 IO 操作的开销

  3. 在很少读取或仅执行读取的工作负载中 扫描整个数据集(例如分析工作负载),设置 bloom_filter_fp_chance 到更高的数字是 acceptable.