Возможно ли обновление на месте в Кассандре?

У меня есть таблица в Кассандре, где я заполняю несколько строк тысячами записей (каждая строка имеет более 10000 столбцов). Записи в строках очень часто обновляются, в основном просто поле (которое является целым числом) обновляется с различными значениями. Все остальные значения для столбцов остаются неизменными. У меня вопрос, будут ли обновления производиться на месте? Насколько хороша Cassandra для частого обновления записей?

3 ответа

Решение

Первоначально эти обновления хранятся в структуре данных в памяти под названием Memtable. Memtables регулярно сбрасываются в неизменяемые SSTables.

Таким образом, одна широкая строка будет прочитана из различных таблиц SSTable. Именно во время процесса, называемого "уплотнением", различные SSTable будут объединены в больший SSTable на диске.

Увеличение порогов для сброса Memtables является одним из способов оптимизации. Если обновления приходят очень быстро до того, как Memtable записывается на диск, я думаю, что обновление должно быть в памяти, хотя я не уверен.

Также каждая операция чтения сначала проверяет Memtables, если данные все еще там, они будут просто возвращены - это самый быстрый доступ.

Кассандра прочитала путь:

When a read request for a row comes in to a node, the row must be combined from all SSTables on that node that contain columns from the row in question

Кассандра пишет путь:

Прежде всего, каждое обновление также является последовательной записью для Кассандры, поэтому, что касается Кассандры, для Кассандры не имеет значения, обновляете ли вы или пишете.

На самом деле вопрос в том, как быстро вам нужно читать эти записи, чтобы они были доступны для чтения? Как предположил @john, сначала все записи записываются в изменяемый CQL Memtable, который находится в памяти. Таким образом, каждое обновление по существу добавляется как новая последовательная запись в memtable для конкретной таблицы CQL. Он также периодически периодически записывается в `commitlog' (каждые 10 секунд) для обеспечения долговечности.

Когда Memtable заполнен или полный размер comittlog достигнут, cassandra сбрасывает все данные в неизменяемую таблицу отсортированных строк (SSTable). После сброса сжатие - это процедура, в которой сохраняются все записи PK для новых значений столбца и удаляются все предыдущие значения (до обновления).

С очисткой часто возникают накладные расходы на частые последовательные записи на диск и сжатие, которые могут занять много операций ввода-вывода и серьезно повлиять на производительность cassandra.

Что касается чтения, первая Кассандра будет пытаться читать с row cache (если он включен) или из memtable, Если это не удастся там, он пойдет на bloom filter, key cache, partition summary, partition index и, наконец, SSTable в таком порядке. Когда данные собраны для всех значений столбца, их агрегирование в памяти и значения столбца с последней отметкой времени возвращаются клиенту после агрегирования, и запись делается в row cache для этого ключа раздела`.

Так что, да, когда вы запрашиваете ключ раздела, он сканирует все таблицы SSTable для этой конкретной таблицы CQL и таблицу памяти для всех значений столбцов, которые еще не записаны на диск.

Нет, обновления на месте невозможны.

Как сказал @john, если у вас частые записи, вам следует отложить процесс очистки. Во время сброса множественные записи в один и тот же раздел, которые хранятся в MemTable, будут записаны как один раздел во вновь созданном SSTable.

C * отлично подходит для тяжелых записей. Тем не менее, вам нужно следить за количеством SSTable-объектов, доступных для чтения. Если # слишком велико, вам нужно пересмотреть свою стратегию уплотнения.

Другие вопросы по тегам