【问题标题】:Memtable & key cache confusion内存表和键缓存混淆
【发布时间】:2012-08-09 00:31:24
【问题描述】:

我正在使用带有默认 Cassandra 缓存设置的 Hector 从 CF 读取行。 这意味着密钥缓存已打开。我正在使用 jconsole 来监控键缓存命中。

但即使在读取单行(通过主键)100 次后,缓存命中率也不会增加。该行最近已更新。

因此,当打开密钥缓存时,Cassandra 读取流程是什么。是这样的吗?

  1. 检查内存中的 MemTable 中的行(可能在最近的插入/更新后驻留在那里)。
  2. 如果在 MemTable 中找不到,则检查键缓存中的键。
  3. 如果找到键(缓存命中),则一次查找,否则 2 次查找获取行。

但是使用cassandra-clicassandra-jdbc (CQL),我得到了不同的结果。 也就是说,即使我最近更新了该行,每次从该行读取都会导致键缓存命中。比如说,我读了 100 遍,我得到了 100 次点击。

为什么会出现这种差异?

嗯,我自己想通了,但希望有人确认..

看起来更新只是将要更新的列提取到 MemTable 中。 因此,当我使用 hector 更新一行时,我并没有更新所有列。只是一列 x 并且正在读取同一列 x 以进行读取操作。所以没有缓存命中,因为它已经在 MemTable 中了。

在运行 CQL 时,我只是在运行 select * from cf,这导致也获取了另一列 yy 列尚未更新,所以我假设它不会在内存中(MemTable),因此导致缓存命中。

【问题讨论】:

    标签: cassandra hector cql


    【解决方案1】:

    读取一行时,总是会同时检查 Memtables 和 SSTables,并将结果合并在一起。密钥缓存仅用于 SSTables,而不是 memtables(基本上是 hashmaps)。

    如果您写了一个新行,然后很快又读了它,那么 memtable 可能还没有被刷新,并且仍然会保存该行。在这种情况下,Cassandra 甚至不必查看密钥缓存,因为它可以快速检查 SSTable 布隆过滤器以查看该行还没有在任何 SSTable 中。因此,在这种情况下,直接返回 memtable 中的行数据。

    如果您强制提前刷新内存表(使用 nodetool)然后读取该行几次,您会看到密钥缓存开始被使用。

    【讨论】:

    • 这是否也适用于行的更新? MemTable 中的数据是否存储在列级别?也就是说,在 MemTable 刷新之后,我只更新一行中的一个列 x,并在同一行中读取另一列说 y,然后由于列 y 尚未加载到内存表?
    • 这应该解释它是如何工作的:wiki.apache.org/cassandra/MemtableSSTable。事情不会移回内存表;一旦你从 sstables 中读取任何内容,就会使用密钥缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多