我们有一个运行cassandra 3.9的5节点cassandra集群 . 我们有一个键空间“ks”和一个表“cf” . 我们在表上创建了几个索引,如“cf_c1_idx”,“cf_c1_idx_1”,“cf_c2_idx” . 当我执行nodetool flush时,1个索引文件的刷新失败,并出现以下异常:

-- StackTrace --
java.lang.RuntimeException: Last written key DecoratedKey(4dd1d75b-e52f-6c49-e7cd-c52a968e70de, 4dd1d75be52f6c49e7cdc52a968e70de) >= current key DecoratedKey(00000000-0000-0000-0000-000000000000, 5331cc31ae396031e6be66312c89c379) writing into /var/lib/cassandra/data/ks/cf-8d8b1ba0081c11e7a4206f8b05d669ae/.cf_c1_idx_1/mc-401-big-Data.db
    at org.apache.cassandra.io.sstable.format.big.BigTableWriter.beforeAppend(BigTableWriter.java:122)
    at org.apache.cassandra.io.sstable.format.big.BigTableWriter.append(BigTableWriter.java:161)
    at org.apache.cassandra.io.sstable.SimpleSSTableMultiWriter.append(SimpleSSTableMultiWriter.java:48)
    at org.apache.cassandra.db.Memtable$FlushRunnable.writeSortedContents(Memtable.java:458)
    at org.apache.cassandra.db.Memtable$FlushRunnable.call(Memtable.java:493)
    at org.apache.cassandra.db.Memtable$FlushRunnable.call(Memtable.java:380)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

当我几秒钟后再次运行nodetool flush时,它成功顺利 . 我们还注意到有时在重新启动节点后在提交日志重播期间出现相同的异常 . 我们最终删除了commitlog目录,因此cassandra可以启动并运行修复以同步丢失的数据 . 这是因为二级索引没有及时更新吗?此外,这是一个读密集群 .