Путаница с Memtable и кэшем ключей

Я читаю строки из CF, используя Hector с настройками кэша Cassandra по умолчанию. Это означает, что кэш ключей включен. Я использую jconsole для мониторинга попаданий в кэш ключей.

Но даже после чтения одной строки (по первичному ключу) 100 раз число попаданий в кеш не увеличивается. Ряд был недавно обновлен.

Итак, когда кеш ключей включен, что такое поток чтения Cassandra. Это так?

  1. MemTable в памяти проверяется на наличие строки (может находиться там после недавней вставки/обновления).
  2. Если он не найден в MemTable, кэш ключа проверяется на наличие ключа.
  3. Если ключ найден (попадание в кеш), один seek , иначе 2 пытается получить строку.

Но используя cassandra-cli и cassandra-jdbc (CQL), я получаю разные результаты. То есть, даже когда я недавно обновлял строку, каждое чтение из строки приводит к попаданию в кэш ключа. Скажем, я прочитал это 100 раз, я получил 100 просмотров.

Почему это несоответствие?

Ну, я как бы понял это сам, но хотел бы, чтобы кто-то подтвердил ..

Похоже, что обновления приводят к выборке столбца для обновления в MemTable. Поэтому, когда я обновил строку с помощью Гектора, я не обновил все столбцы. Просто столбец x и читал тот же столбец x для операции чтения. Таким образом, кеш не попал, поскольку он уже находится в MemTable.

Во время запуска CQL я просто запускал select * from cf, в результате чего был получен и другой столбец y. Столбец y не был обновлен, поэтому я предполагаю, что он не был в памяти (MemTable), что привело к попаданию в кеш.


person varun    schedule 12.08.2012    source источник


Ответы (1)


Memtables и SSTables всегда проверяются, когда вы читаете строку, и результаты объединяются. Кэш ключей используется только для SSTables, а не для memtables (которые в основном являются хэш-картами).

Если вы запишете новую строку, а затем прочитаете ее вскоре после этого, memtable, вероятно, еще не будет очищена и по-прежнему будет хранить строку. В этом случае Cassandra даже не нужно заглядывать в кеш ключей, потому что она может быстро проверить фильтры цветения SSTable, чтобы увидеть, что строки еще нет ни в одной SSTables. Итак, в этом случае данные строки из memtable просто возвращаются напрямую.

Если вы принудительно очистите memtable (используя nodetool), а затем прочитаете строку несколько раз, вы увидите, что кеш ключей начинает использоваться.

person Tyler Hobbs    schedule 15.08.2012
comment
Это применимо и для обновлений строки? И хранятся ли данные в MemTable на уровне столбца? То есть, скажем, после сброса MemTable я обновляю только один из столбцов x в строке и читаю другой столбец, скажем, y в той же строке, затем кеш ключей снова попадает, поскольку столбец y еще не загружен в MemTable? - person varun; 15.08.2012
comment
Это должно объяснить, как это работает: wiki.apache.org/cassandra/MemtableSSTable. Вещи не возвращаются в memtables; как только вы читаете что-либо из sstables, будет использоваться кеш ключей. - person Tyler Hobbs; 19.08.2012