布隆过滤器在 cassandra 中的作用是啥?
Posted
技术标签:
【中文标题】布隆过滤器在 cassandra 中的作用是啥?【英文标题】:What is role of bloom filter in cassandra?布隆过滤器在 cassandra 中的作用是什么? 【发布时间】:2017-01-12 15:18:06 【问题描述】:从 Cassandra 文档的两个不同链接中,我发现:
link 1
一种存储在内存中的结构,用于在访问磁盘上的 SSTable 之前检查内存表中是否存在行数据
和
link2
Cassandra 检查 Bloom 过滤器以发现哪些 SSTables 可能具有请求分区数据。
我的问题是上述两种说法都正确吗?如果是,布隆过滤器是否分别为 Memtable 和 SSTable 维护?提前致谢。
【问题讨论】:
【参考方案1】:Bloom filter 是一种通用数据结构,用于检查元素是否存在于集合中。它的算法设计得非常快,但有返回误报的风险。
Cassandra 使用布隆过滤器来测试任何 SSTables 是否可能包含请求的分区键,实际上不必读取它们的内容(从而避免昂贵的 IO 操作)。
如果布隆过滤器为给定的分区键返回false
,那么绝对可以肯定分区键不存在于相应的SSTable中;但是,如果它返回 true
,则 SSTable 可能包含分区键。发生这种情况时,Cassandra 将求助于更复杂的技术来确定它是否需要读取该 SSTable。请注意,大多数读取都会使用布隆过滤器,并且仅在某些写入期间更新(当内存表刷新到磁盘时)。你可以阅读更多关于 Cassandra 的读取路径here。
回到你的问题:
1) 第一条语句(“存储在内存中的结构,在访问磁盘上的 SSTable 之前检查内存表中是否存在行数据”)恕我直言不准确:当内存表刷新到磁盘时,布隆过滤器确实会更新,但是他们不引用内存表。
2) 每个 SSTable 都维护布隆过滤器,即磁盘上的每个 SSTable 在内存中都有一个相应的布隆过滤器。
【讨论】:
“存储在内存中的结构,在访问磁盘上的 SSTables 之前检查内存表中是否存在行数据”不准确:+1 我想了解,布隆过滤器建立在哪一列上。假设我在表中有 3 列,第一列是我的分区键。因此,当我通过 where col1(partition_key) = 进行搜索时和 col2 = ? ,因为 col1 是分区键,所以一旦你到达那个节点,所以当然每个 SS 表都会有这个 col1,因为 col1 只会写在那个节点上,所以不需要在 col1 上保留布隆过滤器。所以关于 cassandra 哪个列创建布隆过滤器的问题。【参考方案2】:在读取路径中,Cassandra 将磁盘上的数据(在 SSTables 中)与 RAM 中的数据(在 memtables 中)合并。为避免检查每个 SSTable 数据文件中所请求的分区,Cassandra 采用了一种称为布隆过滤器的数据结构。
布隆过滤器是一种概率数据结构,它允许 Cassandra 确定以下两种可能状态之一:- 数据肯定不存在于给定文件中,或者 - 数据可能存在于给定文件中。
虽然布隆过滤器不能保证数据存在于给定的 SSTable 中,但布隆过滤器可以通过允许它们消耗更多 RAM 来提高准确度。操作员有机会通过将 bloom_filter_fp_chance 调整为 0 到 1 之间的浮点数来调整每个表的此行为。
对于使用 LeveledCompactionStrategy 的表,bloom_filter_fp_chance 的默认值为 0.1,对于所有其他情况,默认值为 0.01。
布隆过滤器存储在 RAM 中,但存储在堆外,因此运营商在选择最大堆大小时不应考虑布隆过滤器。随着精度的提高(随着bloom_filter_fp_chance 接近0),内存使用量呈非线性增加——bloom_filter_fp_chance = 0.01 的bloom filter 需要的内存大约是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。
【讨论】:
以上是关于布隆过滤器在 cassandra 中的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章