2012-04-28 2 views
4

Cassandra의 한 시점에서 OOM 예외가 발생했습니다. 내 것은 겸손하게 작동하는 서버에서 실행되는 단일 인스턴스이며, 일부로드 테스트를 수행 했으므로 거기에 놀랄 일이 아닙니다.Cassandra AssertionError

그러나 이후에 인스턴스를 사용할 수 없었습니다. 키 공간을 나열하면 "시스템"만 표시됩니다. 그러나 내가 테스트 한 키 공간을 다시 만들려고 할 때, Hector는 "모든 호스트 풀을 표시했습니다. 재시도 부담이 클라이언트에게 밀렸습니다."라고 대답합니다. 메시지와 카산드라 로그에 다음 스택 추적이 있습니다

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에서 "설명 클러스터;" "시스템"키 공간만을 설명합니다. 하지만 "시스템을 사용할 때" 그런 다음 "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"는 더 이상 액세스 할 수없는 키 공간이지만 어느 정도는 여전히 존재합니다. 그것을 고칠 방법이 있습니까?

+0

커밋 로그, 데이터 및 saved_caches의 모든 항목을 삭제하고 다시 시작했습니다. 그래서, 결론은 클러스터의 다른 모든 것을 버리지 않고 키 공간을 복구 할 수 없다는 것입니다. 따라서, 두 답이 모두 정확합니다. 다른 상황에서 유용 할 수있는 좀 더 많은 정보를 제공했기 때문에 samarth를 그러한 것으로 표시했습니다. – mlohbihler

+1

카산드라 클리에서 모든 작업을하고 계십니까? 이 문제를 재현하여 단계별로 시도해 볼 수 있습니까? – samarth

답변

-1

이 문제는 불일치로 인한 것이며 다음 단계를 수행 할 수 있습니다.

1) 중요한 데이터와 다른 Keyspaces가 없으므로 "data", "saved_caches"및 "commitlog"디렉토리를 지우는 것이 좋습니다.

2) 중요한 데이터가 있고 위에서 언급 한 디렉터리를 삭제할 수없는 시나리오에서 다음을 수행하십시오.

  • 사용

    는 클러스터의 모든 노드에 commitlog를 비우려면 드레인 nodetool.

  • 그런 다음 "/ data/system"디렉토리의 "LocationInfo *" 파일을 모두 삭제하고 클러스터를 다시 시작하십시오.

+0

nodetool에 대한 추가 정보를 가져 주셔서 감사합니다. 이제 삭제할 열망이없는 다른 키 스페이스가 있으므로 옵션 2를 수행했습니다. 그러나 같은 문제가 계속 발생합니다. 자세한 정보는 위의 dtootill에 대한 내 노트를 참조하십시오.내가 키쌍을 나열하면, 거기에 있지 않습니다. 그것을 만드는 명령은 성공적으로 완료하지만, 내가 그것을 사용하려고하면 "왜 : 키 공간 망고가 존재하지 않습니다"라는 메시지가 나타납니다. – mlohbihler

+0

먼저 모든 노드에서 "LocationInfo *"파일을 삭제하십시오. 카산드라 클러스터를 중지하십시오. 또한 keyspace.restart 클러스터와 이름이 같은 데이터 폴더에서 디렉토리를 삭제하고 keyspace를 다시 만들고 데이터 디렉토리에서 디렉토리의 권한을 확인하십시오. – samarth

+0

여전히 동일한 결과 : 키 공간에 나열되어 있지 않습니다. 만들 수 있지만 사용하려고하면 오류가 발생합니다. schema_keyspaces 파일을 수정하는 방법이 있습니까? "망고"가 그들에게 나타나는지 보았습니다. – mlohbihler

2

문제점은 재 작성된 키 공간이 원래 정의로 저장된 커밋 로그 또는 데이터와 일치하지 않는 것이 거의 확실합니다. Cassandra 서버를 종료하고 키 공간에 해당하는 commitlog, saved_caches 및 data 디렉토리를 지우십시오. 이 디렉토리의 위치는 cassandra.yaml에 있습니다. data_file_directory, saved_caches_directory 및 commitlog_directory를 찾으십시오.

+0

감사합니다. commitlog 디렉토리에는 잘못된 키 공간과 관련된 파일이 없습니다. 다른 물건을 삭제했는데 문제가 지속되면 다시 시작됩니다. 또한 keyspace의 이름이 system/schema_keyspaces 디렉토리의 Data.db 파일에 나타남을 알았습니다. 나는 이것이 문제의 일부라고 생각한다, 그렇지 않습니까? – mlohbihler

+0

감사합니다. dtootill. 그것은 내 문제도 해결하는 데 도움이됩니다. – keypoint