Cassandra. Часть 4. Writepath
Сохранение Cassandra выполняет в следующем порядке:
- На основе ключа записи вычисляются хеш и определяются ноды, куда согласно replciation factor попадут данные;
- На репликах запись в commit log;
- На репликах запись в memtable в памяти;
- На репликах инвалидация кеша;
- Ожидание координатором подтверждения записи от реплик;
- Отправка ответа клиенту, о том, что запись выполнена;
https://wiki.apache.org/cassandra/WritePathForUsers
Параллельно выполняется процесс, который следит за размером memtable и если он достигает определенного размера, выполянется сброс данных в SSTable на диск;
Commit Log
Самое первое место, куда попадают данные в момент записи в Cassandra - это Commit log. Сommit log - это стандартный механизм для восстановления данных в случае краха. Представляет собой журнал в который данные постоянно дописываются и сохраняются на жесткий диск. Операция записи не считается выполненной пока данные не попадут в commit log. В случае неожиданного отключения сервера, данные будут восстановлены из этого журнала и потери информации не произойдет. По существу, commit log читается только в одном случае - когда произошел сбой.
Memtable
После записи в commit log, данные попадают в оперативную память в структуру под названием memtable. Memtable представляет собой кеш в оперативной памяти ассоциированный с таблицей, в которой данные располагаются в сортированном порядке.
Когда количество данных в memtable достигает определенного порога, она сохраняется на диск в SSTable. А вновь поступающие данные пишутся уже в новую memtable. У одной таблицы в Cassandra может быть несколько еще не записанных на диск таблиц memtable, при этом активная всегда только одна, в нее и пишутся данные. Обычно Cassandra не держит такие memtable долго в памяти и старается сохранить их на диск того, как произойдет переполнение памяти.
Каждой физической таблице соответствует своя отдельная memtable.
SSTable
Данные в SSTable как и в memtable отсортированы как по колонкам, там и по столбцам. Это позволяет быстро находить нужные данные. Так же в SSTable запрещены любые модификации, (иначе, это повлекло за собой совершенно ненужную перезапись всего файла) Можно подытожить ключевые факты которые отличают memtable от SSTable:
- Memtable располагается в оперативной памяти, а SSTable на диске
- Memtable модифицируется по мере поступления новых записей, SSTable иммутабельна
Начиная с версии 1.0 каждая SSTable может быть сжата, для экономии места. Также у каждой SSTable есть собственный Bloom filter, который используется для дополнительной эффективности при поиске.