Ответ 1
Вы можете рассматривать журнал фиксации как оптимизацию, но Cassandra будет безжизненно замедляться без него. Когда MemTables записываются на диск, мы называем их SSTables. SSTables являются неизменяемыми, то есть когда Cassandra записывает их на диск, он не обновляет их. Поэтому, когда столбец изменяется, Cassandra нужно написать новый SSTable на диск. Если бы Cassandra записывала эти SSTables при каждом обновлении, она была бы полностью привязана к IO и очень медленной.
Итак, Cassandra использует несколько трюков для повышения производительности. Вместо того, чтобы записывать SSTables на диск при каждом обновлении столбцов, он сохраняет обновления в памяти и периодически меняет эти изменения на диск, чтобы поддерживать IO на разумном уровне. Но это приводит к очевидной проблеме: если машина опустится или Cassandra выйдет из строя, вы потеряете данные на этом node. Чтобы избежать потери данных, в дополнение к сохранению последних изменений в памяти, Cassandra записывает изменения в свой CommitLog.
Возможно, вы спрашиваете, почему писать в CommitLog лучше, чем просто писать SSTables. CommitLog оптимизирован для записи. В отличие от SSTables, которые хранят строки в отсортированном порядке, CommitLog хранит обновления в том порядке, в котором они были обработаны Cassandra. CommitLog также сохраняет изменения для всех семейств столбцов в одном файле, поэтому на диске не нужно делать кучу запросов, когда он получает обновления для нескольких семейств столбцов одновременно.
В принципе, это лучше, потому что он должен писать меньше данных, чем писать SSTables, и записывает все эти данные в одно место на диске.
Cassandra отслеживает, какие данные были сброшены в SSTables, и может обрезать журнал Commit, как только будут записаны все данные старше определенной точки.
Когда Cassandra запускается, он должен прочитать журнал фиксации с этого последнего известного момента времени (точка, в которой мы знаем, что все предыдущие записи были записаны в SSTable). Он повторно применяет изменения в журнале фиксации к своим MemTables, чтобы он мог попасть в одно и то же состояние, когда он остановился. Этот процесс может быть медленным, поэтому, если вы останавливаете Cassandra node для обслуживания, рекомендуется использовать nodetool drain
, прежде чем отключать его, что будет сбрасывать все в MemTables на SSTables и значительно увеличить объем работы при запуске меньше.