从Cassandra文档的两个不同链接中,我发现:
存储在内存中的结构,用于在访问磁盘上的SSTable之前检查memtable中是否存在行数据
和
Cassandra检查Bloom过滤器以发现哪些SSTable可能具有请求分区数据。
我的问题是上述陈述是否正确?如果是,是否为Memtable和SSTable分别维护了bloom过滤器?提前谢谢。
答案 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一行,但却发现它不存在于磁盘上。该参数应根据用例进行调整:
具有更多RAM和更慢磁盘的用户可能会受益于设置 bloom_filter_fp_chance为数字较低的数字(例如0.01) 避免过多的IO操作。
RAM较少,节点较密集或磁盘速度非常快的用户可以 容忍更高的bloom_filter_fp_chance以节省RAM 超额IO操作的费用
在很少读取或仅执行读取的工作负载中 扫描整个数据集(例如分析工作负载),设置 可以接受更高数字的bloom_filter_fp_chance。