当同一个键存在于多个SSTable中时,Cassandra键缓存是如何工作的?

4

1) 根据DataStax的说法,键缓存存储行键的主键索引。

2) 在我们的情况下,我们为键缓存分配了足够的内存,并且同一键存在于多个具有不同列的SSTable中。

3) 如果从多个SSTable中访问所有这些相同的键,则索引如何存储在键缓存中?它会为所有SSTable存储索引,还是仅为最近访问键的最后一个SSTable存储索引?


我已经正确地更新了答案。如果现在清楚,请告诉我。 - Tamil
1个回答

5

来自文档

关键缓存按列族的方式在内存中保存键的位置。

关键缓存作为所有存在于其内的SSTable中键的索引。

关键缓存是按SSTable维护的。因此,关键缓存可以每个SSTable节省一个磁盘查找[最小值]。每个键查找最终会命中所有SSTable的布隆过滤器。成功命中关键缓存只是为了跳过SSTable索引[默认情况下每127个键样本的指针]查找。

Cassandra的读取路径如下:

Memtable -> 行缓存(非堆) -> 布隆过滤器 -> 关键缓存 -> SSTable索引[如果未命中] -> 磁盘

加粗的内容表示它们在内存中维护(堆或非堆)。因此,它们不会增加磁盘查找。

每个SSTable都应该维护自己的关键缓存。来源1从第101页和来源2从第23页。

如果关键缓存未命中,则使用SSTable索引 - 这将提供有关键可能位于哪个128th范围的线索。从那时起,对键的磁盘查找开始[可以是1到多个]。

如果我得到任何关于Cassandra如何决定每个SSTable的关键缓存大小的线索,我将再次更新答案[ key_cache_conf/no_of_sstables ]。


@samarth,你所说的可验证来源是什么意思?我已经在答案中提到了文档资源。即使“键缓存可以为每个SSTable节省一个磁盘查找”,这也是来自文档。 - Tamil
我想要你所说的"键缓存在所有存在的sstables中作为键的索引"的来源,任何链接、文档或源代码都将非常有帮助。 - samarth
@samarth,“key cache can save one disk seek per SSTable”对你来说意味着什么?如果是你所想的另一种方式,他们会明确提到“key cache可以节省一个磁盘查找”,而不是每个SSTable。那么就由你决定了。你可以继续搜索 :) 在我们理解后,我们在我们的Cassandra集群中使用键缓存 :) - Tamil
@samarth 添加了一个额外的引用。 - Tamil
我有点困惑于读取流程。您能否在回答中解释一下?比如布隆过滤器是在缓存之前还是之后? - samarth
源码2 http://goo.gl/Gop6P5 幻灯片39-44说memtable->row_cache->bloom_filter->key_cache->sstable_index都在jvm中(行缓存是非堆内存),然后它从mmap到进程地址空间的sstable文件中获取值,因此操作系统可以将文件的页面缓存在ram中。每个sstable文件都有一个布隆过滤器,告诉你文件是否不包含该键,因此您不需要检查其缓存或索引。sstables通过写入和压实创建,因此可能很大,而布隆过滤器减少了您必须检查以重构最新行值的集合。 - simbo1905

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接