Estamos operando o Cassandra em um ambiente onde ocasionalmente a máquina host que executa o Cassandra fica sem energia sem um desligamento adequado. Não temos problemas em perder dados , mas nosso problema é que em raras situações o Cassandra não consegue iniciar após um desligamento impuro. A inicialização falha devido a uma corrupção do log de Commit:
ERROR [main] 2024-05-02 12:39:13,834 JVMStabilityInspector.java:196 - Exiting due to error while processing commit log during initialization.
org.apache.cassandra.db.commitlog.CommitLogReadHandler$CommitLogReadException: Mutation checksum failure at 2378 in Next section at 2016 in CommitLog-7-1714580480939.log
at org.apache.cassandra.db.commitlog.CommitLogReader.readSection(CommitLogReader.java:387)
at org.apache.cassandra.db.commitlog.CommitLogReader.readCommitLogSegment(CommitLogReader.java:244)
at org.apache.cassandra.db.commitlog.CommitLogReader.readCommitLogSegment(CommitLogReader.java:147)
at org.apache.cassandra.db.commitlog.CommitLogReplayer.replayFiles(CommitLogReplayer.java:191)
at org.apache.cassandra.db.commitlog.CommitLog.recoverFiles(CommitLog.java:223)
at org.apache.cassandra.db.commitlog.CommitLog.recoverSegmentsOnDisk(CommitLog.java:204)
at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:353)
at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:744)
at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:878)
Descobrimos sobre a opção " cassandra.commitlog.ignorereplayerrors ", que parece afetar o tratamento de erros quando o log Commit é processado. Algumas perguntas sobre essa configuração:
- É seguro habilitar essa configuração se a perda de dados gravados no Cassandra for aceitável?
- Todas as corrupções de log de Commit são ignoradas ao habilitar essa configuração ou ainda pode acontecer de o Cassandra não conseguir iniciar? Observe que nosso principal requisito é que o Cassandra consiga iniciar após uma queda de energia sem intervenção manual.
- O "nodetool repair" deve ser executado após a ocorrência de corrupções no log de confirmação?
Sim.
Não posso dizer com certeza, mas isso manterá as coisas funcionando neste caso.
Sim, você definitivamente deve executar um reparo após a reinicialização (se esse erro tiver ocorrido).
Para ativar, procure seu
jvm.options
arquivo e defina-o-Dcassandra.commitlog.ignorereplayerrors=true
como um dos parâmetros de inicialização.