4

1)根据datastax键缓存存储rowkey的主键索引。

2)在我们的例子中,我们为键缓存分配了足够的内存,并且相同的键存在于具有不同列的多个 sstable 中。

3) 如果没有调用从多个 sstables 访问所有这些相同的密钥,那么索引如何存储在密钥缓存中?它会存储所有 sstable 的索引还是仅存储最近访问的最后一个 sstable 的索引?

4

1 回答 1

5

来自文档

键缓存以每个列族为基础在内存中保存键的位置。

密钥缓存用作它存在的所有 sstable 中的密钥的索引。

每个 sstable 都维护密钥缓存。因此,密钥缓存可以为每个 SSTable [最少] 节省一次磁盘寻道。每个键查找最终都会至少命中所有 sstable 的布隆过滤器。成功时验证密钥缓存只是为了跳过 sstable 索引 [pointers to key sample @ interval of 127 by default] 查找。

阅读 cassandra 的路径是这样的

Memtable -> Row Cache (Off heap) -> Bloom filter -> Key cache -> SSTable Index [if miss] -> Disk

粗体表示的所有内容都保存在内存中(在堆中或堆外)。因此它们不会加起来磁盘寻道

每个 sstable 都应该维护自己的密钥缓存。来自幻灯片 101 的源和来自幻灯片 23 的Source2

在关键缓存未命中的情况下,使用 sstable 索引 - 这将提供线索,即第 128 个范围可能是关键所在。从那时起磁盘寻找键开始[可以是 1 到多个]。

如果我得到任何关于 cassandra 如何决定每个 sstable 的密钥缓存大小可能是 [key_cache_conf/no_of_sstables] 的线索,我将再次更新答案?

于 2012-06-20T07:16:48.517 回答