布隆过滤器在卡桑德拉中的作用是什么?
What is role of bloom filter in cassandra?
从 Cassandra 文档的两个不同链接,我发现:
A structure stored in memory that checks if row data exists in the memtable before accessing SSTables on disk
和
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 中的一行,却发现它不存在在磁盘上。应根据用例调整参数:
具有更多 RAM 和较慢磁盘的用户可能会受益于设置
bloom_filter_fp_chance 到较小的数字(例如 0.01)
避免过多的IO操作。
RAM 更少、节点更密集或磁盘速度非常快的用户可能
容忍更高的 bloom_filter_fp_chance 以节省 RAM
额外 IO 操作的开销
在很少读取或仅执行读取的工作负载中
扫描整个数据集(例如分析工作负载),设置
bloom_filter_fp_chance 到更高的数字是 acceptable.
从 Cassandra 文档的两个不同链接,我发现:
A structure stored in memory that checks if row data exists in the memtable before accessing SSTables on disk
和
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 中的一行,却发现它不存在在磁盘上。应根据用例调整参数:
具有更多 RAM 和较慢磁盘的用户可能会受益于设置 bloom_filter_fp_chance 到较小的数字(例如 0.01) 避免过多的IO操作。
RAM 更少、节点更密集或磁盘速度非常快的用户可能 容忍更高的 bloom_filter_fp_chance 以节省 RAM 额外 IO 操作的开销
在很少读取或仅执行读取的工作负载中 扫描整个数据集(例如分析工作负载),设置 bloom_filter_fp_chance 到更高的数字是 acceptable.