Bloom filter是一种通用的数据结构,用于检查元素是否存在于集合中。它的算法被设计得非常快速,但有可能会返回错误的结果。
Cassandra使用Bloom过滤器来测试任何SSTable是否可能包含所请求的分区键,而无需实际读取其内容(从而避免昂贵的IO操作)。
如果给定的分区键的Bloom过滤器返回false
,则可以确定该分区键不在相应的SSTable中;但如果返回true
,则SSTable可能包含该分区键。当发生这种情况时,Cassandra将采用更复杂的技术来确定是否需要读取该SSTable。请注意,Bloom过滤器适用于大多数读取,并仅在某些写入期间更新(当memtable刷新到磁盘时)。您可以在此处了解有关Cassandra读取路径的更多信息。
回到您的问题:
1) 第一句话(“在访问磁盘上的SSTables之前,存储在内存中的结构检查行数据是否存在于memtable中”)在我看来不准确:布隆过滤器确实在将memtable刷新到磁盘时进行更新,但它们不引用memtable。
2) 布隆过滤器是按SSTable维护的,即磁盘上的每个SSTable都会在内存中得到相应的布隆过滤器。