Перейти к основному содержанию

Cassandra — Exiting due to error while processing commit log during initialization

Apache Cassandra

Cassandra не запускается, в логе ошибка:

ERROR [main] 2024-02-26 00:57:32,905 JVMStabilityInspector.java:82 - Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReadHandler$CommitLogReadException: Mutation checksum failure at 3984 in Next section at 600 in CommitLog-6-1708329368008.log
        at org.apache.cassandra.db.commitlog.CommitLogReader.readSection(CommitLogReader.java:344) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.db.commitlog.CommitLogReader.readCommitLogSegment(CommitLogReader.java:201) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.db.commitlog.CommitLogReader.readAllFiles(CommitLogReader.java:84) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.db.commitlog.CommitLogReplayer.replayFiles(CommitLogReplayer.java:140) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.db.commitlog.CommitLog.recoverFiles(CommitLog.java:177) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.db.commitlog.CommitLog.recoverSegmentsOnDisk(CommitLog.java:158) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:325) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:600) [apache-cassandra-3.11.0.jar:3.11.0]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:689) [apache-cassandra-3.11.0.jar:3.11.0]

cassandra

Apache Cassandra — это популярная колоночная база данных, оптимизированная для обработки больших объемов данных на множестве узлов.

Apache Cassandra — распределённая СУБД, относящаяся к классу NoSQL-систем и рассчитанная на создание высокомасштабируемых и надёжных хранилищ огромных массивов данных, представленных в виде хэша.

Обращаем внимание на строку:

Mutation checksum failure at 3984 in Next section at 600 in CommitLog-6-1708329368008.log

Вы только послушайте как это звучит: "Сбой контрольной суммы мутации". Киберпанк, едрить-колотить. Если упростить, то повреждены данные в файле CommitLog-6-1708329368008.log.

Commit Log представляет из себя структуру данных (это может быть несколько файлов), которая располагается на жёстком диске и логирует все операции записи для повышения живучести данных (data durability) при различных сбоях, таких как потеря питания. В других СУБД такие логи известны как WAL (write-ahead log) файлы. Эти данные попали на сервер, но ещё не успели записаться в саму БД, т.е. в SSTables.

При некоторых видах сбоев данные могут записаться в лог неполностью, их контрольная сумма (checksum) не совпадает, поэтому Cassandra не может восстановить эти данные при запуске и не стартует, хотя, в настройках такое поведение можно изменить. Не представляю в каких случаях нам может понадобиться Cassandra, в которой данные могут быть в несогласованном состоянии.

Видео про Commit Log, в конце видео приводятся ещё типы ошибок, которые нужно лечить таким же способом:

  • CommitLogReplayException: Encountered bad header at position 0000000 of commit log
    CommitLogReplayException: Could not read commit log descriptor in file
  • CommitLogReplayException: Unexpected error deserializing mutation — This may be caused by replaying a mutation against a table with the same name but incompatible schema
    UnknownColumnFamilyException

Лечение

Поскольку Commit Log повреждён, то его нужно удалить. Удаляем файл CommitLog-6-1708329368008.log, возможно, понадобится удалить несколько файлов.

rm -f /opt/cassandra/data/commitlog/CommitLog-6-1708329368008.log
systemctl restart cassandra

В крайнем случае можно удалить все логи, но я не рекомендую:

rm /opt/cassandra/data/commitlog/CommitLog*
systemctl restart cassandra

После того как мы избавимся от кривых логов, кассандра запустится.

systemctl status cassandra

Но данные на ней будут несогласованны. Утерянные данные вручную мы не восстановим, нужно запустить процедуру восстановления: repair.

/opt/cassandra/bin/nodetool repair --full

Потерянные данные будут восстановлены с других нод. Процедура долгая и потребляет много ресурсов.

Примечание

Опция для игнорирования поврежденных логов. Может использоваться при наличие периодического расписания полного восстановления:

-Dcassandra.commitlog.ignorereplayerrors=true

Примечание 2

Некоторые виды ошибок с логами последние версии кассандры умеют восстанавливать автоматически.

Теги

 

Похожие материалы

Seafile — установка на Ubuntu 18.04 LTS

Seafile — это личное облачное хранилище для хранения данных в стиле Dropbox. Сегодня мы развернём это хранилище на виртуальном сервере. В качестве гипервизора у нас ESXi 6.7 Update 1.