通过Cassandra文档的两个不同链接,我发现:
link 1
和
link2
我的问题是以上两种说法都正确吗?如果是,是否分别为Memtable和SSTable维护Bloom筛选器?提前致谢。
最佳答案
Bloom filter是一种通用数据结构,用于检查元素是否存在于集合中。它的算法设计得非常快,但有返回假阳性的风险。
Cassandra使用Bloom筛选器来测试任何SSTable是否可能包含所请求的分区键,而无需实际读取它们的内容(从而避免了昂贵的IO操作)。
如果Bloom过滤器为给定的分区键返回false
,则绝对可以确定相应的SSTable中不存在该分区键;如果返回true
,则SSTable可能包含分区键。发生这种情况时,Cassandra将诉诸更复杂的技术来确定是否需要读取该SSTable。请注意,大多数读操作都会引用bloom过滤器,并且仅在某些写操作中(将内存表刷新到磁盘时)才会对它们进行更新。您可以阅读有关Cassandra的读取路径here的更多信息。
回到您的问题:
1)第一条语句(“在访问磁盘上的SSTable之前在内存中检查行数据是否存在于内存中的结构的内存中存储的结构”)恕我直言:当将内存表刷新到磁盘时,确实会更新Bloom过滤器,但不会引用内存表。
2)每个SSTable都会维护Bloom筛选器,即磁盘上的每个SSTable都会在内存中获得一个对应的Bloom筛选器。
关于cassandra - Bloom filter在Cassandra中的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39327427/