卡桑德拉 AssertionError

5

我曾经在Cassandra中收到过OOM异常。我的单个实例运行在一台性能适中的服务器上,当时我正在进行一些负载测试,所以这并不奇怪。

但是,随后我无法再使用该实例。当我列出键空间时,只显示“system”。但是当我尝试重新创建我正在测试的键空间时,Hector会响应可怕的“所有主机池都已标记为关闭。重试负担推向客户端。”消息,并且Cassandra日志具有以下堆栈跟踪:

ERROR [MigrationStage:1] 2012-04-27 20:47:00,863 AbstractCassandraDaemon.java (line 134) Exception in thread Thread[MigrationStage:1,5,main]
java.lang.AssertionError
    at org.apache.cassandra.db.DefsTable.updateKeyspace(DefsTable.java:441)
    at org.apache.cassandra.db.DefsTable.mergeKeyspaces(DefsTable.java:339)
    at org.apache.cassandra.db.DefsTable.mergeSchema(DefsTable.java:269)
    at org.apache.cassandra.service.MigrationManager$1.call(MigrationManager.java:214)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
ERROR [Thrift:9] 2012-04-27 20:47:00,864 CustomTThreadPoolServer.java (line 204) Error occurred during processing of message.
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.AssertionError
    at org.apache.cassandra.utils.FBUtilities.waitOnFuture(FBUtilities.java:372)
    at org.apache.cassandra.service.MigrationManager.announce(MigrationManager.java:191)
    at org.apache.cassandra.service.MigrationManager.announceNewKeyspace(MigrationManager.java:129)
    at org.apache.cassandra.thrift.CassandraServer.system_add_keyspace(CassandraServer.java:987)
    at org.apache.cassandra.thrift.Cassandra$Processor$system_add_keyspace.getResult(Cassandra.java:3370)
    at org.apache.cassandra.thrift.Cassandra$Processor$system_add_keyspace.getResult(Cassandra.java:3358)
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
    at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:186)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.util.concurrent.ExecutionException: java.lang.AssertionError
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
    at java.util.concurrent.FutureTask.get(FutureTask.java:83)
    at org.apache.cassandra.utils.FBUtilities.waitOnFuture(FBUtilities.java:368)
    ... 11 more
Caused by: java.lang.AssertionError
    at org.apache.cassandra.db.DefsTable.updateKeyspace(DefsTable.java:441)
    at org.apache.cassandra.db.DefsTable.mergeKeyspaces(DefsTable.java:339)
    at org.apache.cassandra.db.DefsTable.mergeSchema(DefsTable.java:269)
    at org.apache.cassandra.service.MigrationManager$1.call(MigrationManager.java:214)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    ... 3 more

旧的键空间仍然在数据目录中,所以我移动了它,但这没有帮助。似乎系统数据仍然存在无效引用。有人知道如何解决吗?
编辑:从CLI,"describe cluster;" 只描述了 "system" 键空间。但当我使用 "use system;" 然后 "list schema_keyspaces;" 时,会显示以下内容:
Using default limit of 100
-------------------
RowKey: mango
=> (column=durable_writes, value=true, timestamp=29127788177516974)
=> (column=name, value=mango, timestamp=29127788177516974)
=> (column=strategy_class, value=org.apache.cassandra.locator.SimpleStrategy, timestamp=29127788177516974)
=> (column=strategy_options, value={"replication_factor":"1"}, timestamp=29127788177516974)

1 Row Returned.
Elapsed time: 1107 msec(s).

"mango" 是我不能再访问的键空间,但在某种程度上它仍然存在。有没有办法修复它?


最终我只是删除了commitlog、data和saved_caches中的所有内容,然后重新启动了。因此,归根结底,我无法在不放弃集群中的其他所有内容的情况下恢复keyspace。因此,两个答案都是正确的。我标记了Samarth的答案,因为他提供了一些在其他情况下可能有用的额外信息。 - mlohbihler
1
你是在使用cassandra-cli执行所有操作吗?你能否提供重现此问题的步骤,以便我们可以尝试解决它。 - samarth
2个回答

2

问题几乎肯定是重建的键空间与原始定义存储的提交日志或数据不一致。关闭Cassandra服务器并清除与键空间对应的commitlog、saved_caches和data目录。这些目录的位置在cassandra.yaml中——查找data_file_directories、saved_caches_directory和commitlog_directory。


感谢dtootill。commitlog目录中没有包含特定于有误的键空间的文件。我确实删除了其他一些东西,但是当我重新启动时问题仍然存在。我还注意到键空间的名称出现在system/schema_keyspaces目录中的Data.db文件中。我认为这是问题的一部分,不是吗? - mlohbihler
谢谢,感谢dtootill。它也帮助解决了我的问题。 - keypoint

1

这个问题是由于不一致性引起的,您可以按照以下步骤进行操作。

1)在您的情况下,如果没有任何关键数据和其他Keyspaces,则可以清除“data”、“saved_caches”和“commitlog”目录。

2)在您有一些关键数据且无法删除上述目录的情况下,请执行以下操作。

  • 使用nodetool drain在集群的所有节点上清空commitlog。

  • 然后从“/data/system”目录中删除所有"LocationInfo*"文件并重新启动集群。


感谢提供有关nodetool的额外信息。我现在有其他不想删除的关键空间,所以我选择了选项2)。然而,同样的问题仍然存在。请参见我在上面给dtootill的留言获取更多信息。当我列出关键空间时,它并不存在。创建命令成功完成,但是当我尝试使用它时,会出现“why:Keyspace mango does not exist”的错误提示。 - mlohbihler
首先停止Cassandra集群。尝试删除所有节点上的“LocationInfo*”文件。还要从数据文件夹中删除与您的键空间同名的目录。重新启动集群,重新创建键空间并检查数据目录中目录的权限。 - samarth
仍然没有改变结果:未列在键空间中,虽然我被允许创建,但当我尝试使用时出现错误。有没有修复 schema_keyspaces 文件的方法?我看到它们中出现了“mango”。 - mlohbihler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接