绽放过滤器在cassandra中的作用是什么?

时间:2016-09-05 09:20:26

标签: cassandra datastax datastax-enterprise

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

link 1

  

存储在内存中的结构,用于在访问磁盘上的SSTable之前检查memtable中是否存在行数据

link2

  

Cassandra检查Bloom过滤器以发现哪些SSTable可能具有请求分区数据。

我的问题是上述陈述是否正确?如果是,是否为Memtable和SSTable分别维护了bloom过滤器?提前谢谢。

2 个答案:

答案 0 :(得分:19)

Bloom filter是一种通用数据结构,用于检查元素是否存在于集合中。它的算法设计得非常快,代价是有可能返回误报。

Cassandra使用bloom过滤器来测试是否有任何SSTable可能包含所请求的分区键,没有实际上必须读取其内容(因此避免了昂贵的IO操作)。

如果布隆过滤器为给定的分区键返回false,则绝对可以确定分区键不存在于相应的SSTable中;但是,如果它返回true,则SSTable 可能包含分区键。当发生这种情况时,Cassandra将采用更复杂的技术来确定是否需要读取SSTable。请注意,大多数读取都会查看bloom过滤器,并且仅在某些写入期间(将memtable刷新到磁盘时)进行更新。您可以阅读有关Cassandra的阅读路径here的更多信息。

回到你的问题:

1)第一个语句("存储在内存中的结构,用于检查在访问磁盘上的SSTables之前是否存在于memtable中的行数据")是恕我直言不准确:当memtable是memtable时,确实更新了bloom过滤器刷新到磁盘,但他们没有引用memtable。

2)每个SSTable维护Bloom过滤器,即磁盘上的每个SSTable都在内存中获得相应的bloom过滤器。

答案 1 :(得分:0)

在读取路径中,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过滤器需要的内存大约是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。