2015-03-11 3 views
1

У меня есть некоторые вопросы о cassandra memtable. Буду благодарен за помощь.Умение с учетом понимания

Факты о memtable:

1), помещенный в ОЗУ;

2) для колонныСемейная конструкция;

3) может существовать несколько memtables для одного семейства столбцов;

Вопросы:

1) Когда дополнительный memtable для семьи колонки созданы? Какое условие необходимо? Я предполагаю, что после создания дополнительного файла журнала фиксации создаются дополнительные memtables. Это правда?

2) Что происходит после достижения порогового значения размера журнала регистрации? Я предполагаю, что начнет размещать memtables в очереди; после заполнения очереди начнет сбрасывать memtable в sstable, после чего удаляются старый журнал фиксации (на hdd) и соответствующий memtable s (в плунжере). В этом случае некоторая часть памяти memtable будет всегда пуста, и журнал фиксации всегда будет заполнен до 90-100%?

3) Что происходит, когда достигается порог размера памяти? Как и в предыдущем случае, начнется промывка до sstable? Некоторая часть журнала фиксации также будет всегда пустой, а память памяти будет заполнена до 90-100%?

4) О memtable_allocation_type: в официальных Recources - «offheap_buffers перемещает имя ячейки и значение объектов DirectBuffer Это имеет самое низкое воздействие на чтение - эти значения до сих пор.„Живые“Java буфера - но только уменьшает кучу значительно когда вы храните большие строки или капли ».. Что означает DirectBuffer? Он помещен в кучу java? Можете ли вы дать ссылки на сайты с информацией об этом?

большое спасибо!

ответ

5
  1. Для данной семьи столбцов в памяти обычно имеется один Memtable, за исключением особых случаев, таких как процесс ремонта или ожидающие сброса.
  2. Когда заполняется журнал фиксации, запускается флеш: Memtable записывается на диск как SSTable, после чего Memtable очищается, а журнал Commit Log перерабатывается. Новый цикл начинается с пустой записи Commit Log/Memtable
  3. Когда Memtable превышает заданный размер, срабатывает заподлицо, как указано выше.
  4. Обычно Memtable хранится в памяти кучи Java по умолчанию. По состоянию на Cassandra 2.1, Memtable can be stored outside the Java Heap для облегчения давления GC. Однако этот параметр является оптимизацией для некоторого частного случая. Cassandra может хранить данные за пределами кучи Java с помощью JNA, это означает, что эти данные не имеют права на сбор мусора, потому что неизвестно о JVM. Однако объекты Java должны быть преобразованы для сохранения/получения в/из него. Вот почему эти объекты Java не считаются «живыми».

Я советую вам смотреть https://academy.datastax.com/courses/learning-cassandra-write-path

+0

Спасибо! Но в некоторых статьях и книгах существует различная информация. Где верно? 1) Это цитата из книги «Кассандра: окончательное руководство» Эбена Хьюитта: «Эта промывка является неблокирующей операцией, могут существовать несколько memtables для одного семейства столбцов, один ток и остальное, ожидающие вспышки». – bissquit

+0

2) Хорошо.Зачем нужен параметр memtable_flush_queue_size? По умолчанию оно равно 4. 4 означает количество семейств столбцов. Цитата из официальной документации: "memtable_flush_queue_size (По умолчанию: 4) Количество полных memtables, чтобы разрешить отложенный флеш (memtables, ожидающий поток записи)". Что означает «полная память»? Если у меня есть 3 семейства столбцов в моем ключевом пространстве - у меня будет не более 3 memtable в ram? 3) Как и выше. 4) Я не знаю, что такое DirectBuffer. Он расположен вне родной памяти Кассандры? Предположим, что нет. Тогда почему мы можем увидеть описание «значения по-прежнему« живут »буферами Java»? – bissquit

+0

Этот размер очереди здесь, потому что Cassandra как архитектура SEDA с рабочими очередями и всеми задачами выполняется через очереди томов. Это позволяет контролировать, сколько работы выполняется одновременно. Обычно 3 семейства столбцов означают 3 memtables. Если флеш занимает время (загруженный узел), могут быть некоторые ожидающие memtables, но это не номинальный случай. DirectBuffer - это область памяти, выделенная непосредственно с использованием JNA (возможно, с использованием malloc), она не может содержать «живых» Java-объектов, они должны быть сериализованы. Однако эта память не управляется JVM, поэтому игнорируется GC. –

Смежные вопросы