从 Cassandra 文档的两个不同链接中,我发现:
link 1 http://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlHowDataWritten.html
存储在内存中的结构,用于在访问磁盘上的 SSTable 之前检查 memtable 中是否存在行数据
and
link2 http://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutReads.html
Cassandra 检查 Bloom 过滤器以发现哪些 SSTable 可能具有请求的分区数据。
我的问题是上述两种说法都正确吗?如果是,布隆过滤器是否分别为 Memtable 和 SSTable 维护?提前致谢。
A 布隆过滤器 https://en.wikipedia.org/wiki/Bloom_filter是一种通用数据结构,用于检查元素是否存在于集合中。其算法设计得非常快,但代价是冒着返回误报的风险。
Cassandra 使用布隆过滤器来测试任何 SSTable 是否可能包含所请求的分区键,without实际上必须读取它们的内容(从而避免昂贵的 IO 操作)。
如果布隆过滤器返回false
对于给定的分区键,那么绝对可以肯定该分区键不存在于对应的SSTable中;如果它返回true
,但是,那么 SSTable 是likely包含分区键。发生这种情况时,Cassandra 将采用更复杂的技术来确定是否需要读取该 SSTable。请注意,大多数读取都会参考布隆过滤器,并且仅在某些写入期间(当内存表刷新到磁盘时)进行更新。你可以阅读更多关于Cassandra的读取路径here http://docs.datastax.com/en/cassandra/3.0/cassandra/dml/dmlAboutReads.html.
回到你的问题:
1)第一个语句(“存储在内存中的结构,在访问磁盘上的 SSTable 之前检查内存表中是否存在行数据”)恕我直言不准确:当内存表刷新到磁盘时,布隆过滤器确实会更新,但它们不会引用内存表。
2)布隆过滤器按SSTable维护,即磁盘上的每个SSTable在内存中都有一个相应的布隆过滤器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)