2012-04-28 7 views
4

Я получил исключение OOM в одном месте в Кассандре. Mine - это единственный экземпляр, работающий на сервере с умеренным питанием, и я выполнял некоторые нагрузочные тесты, поэтому не удивительно.Cassandra AssertionError

Но, я впоследствии не смог использовать экземпляр. Когда я перечисляю пространства ключей, отображается только «система». Но когда я пытаюсь воссоздать пространство ключей, которое я тестировал, Гектор отвечает на страшное «Все пулы хостов помечены вниз». Бремя пересылки вытесняется клиенту ». сообщение, и журнал 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 «описать кластер»; описывает только «системное» пространство ключей. Но когда я «использую систему»; а затем «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). 

«манго» является пространство ключей, что я больше не могу доступа, но он все еще там в какой-то степени. Есть ли способ исправить это?

+0

В итоге я просто удалил все в commitlog, data и saved_caches и перезапустил. Итак, нижняя строка заключается в том, что я не смог восстановить пространство ключей, не разбирая все остальное в кластере. Таким образом, оба ответа верны. Я отметил самарт как таковой, потому что он предоставил немного больше информации, которая может быть полезна в других ситуациях. – mlohbihler

+1

Вы делаете все операции из cassandra-cli? можете ли вы упомянуть о шагах по воссозданию этой проблемы, чтобы мы могли попробовать ее. – samarth

ответ

-1

Эта проблема обусловлена ​​несогласованностью, и вы можете перейти к следующим шагам.

1) В вашем случае это нормально, чтобы очистить каталоги «данные», «saved_caches» и «commitlog», поскольку у вас нет критических данных и других ключей.

2) В сценариях, где у вас есть критические данные, и вы не можете удалить вышеупомянутые каталоги, выполните следующие действия.

  • Использование nodetool стечь в Очищать commitlog на всех узлах кластера.

  • Затем удалите все файлы «LocationInfo *» из каталогов «/ data/system» и перезапустите кластер.

+0

Спасибо за дополнительную информацию о nodetool. У меня теперь есть другие пространства ключей, которые я не хочу удалять, поэтому я сделал вариант 2). Однако такая же проблема сохраняется. Для получения дополнительной информации см. Мою записку, чтобы посмотреть выше.Когда я перечислил пространства ключей, его там нет. Команда для ее создания завершается успешно, но когда я пытаюсь ее использовать, я получаю «почему: Манго из Keyspace не существует». – mlohbihler

+0

Прежде всего остановите кластер cassandra. Удалите файлы «LocationInfo *» со всех узлов. Также удалите каталог из папки данных, имеющей то же имя, что и кластер keypace.restart, заново создайте пространство ключей и проверьте разрешения каталогов в каталоге данных. – samarth

+0

По-прежнему тот же результат: не указан в пространствах ключей, мне разрешено создавать, но когда я пытаюсь использовать, я получаю ошибки. Есть ли способ исправить файлы schema_keyspaces? Видит в них «манго». – mlohbihler

2

Проблема почти наверняка заключается в том, что воссозданное пространство ключей несовместимо с журналом фиксации или данными, хранящимися в исходном определении. Завершите работу сервера Cassandra и очистите файлы commitlog, saved_caches и данных, соответствующие пространству клавиш. Местоположение этих каталогов находится в cassandra.yaml - найдите файлы данных_каталогов, save_caches_directory и commitlog_directory.

+0

Спасибо, dtootill. В файле commitlog не содержатся файлы, специфичные для ошибочного пространства ключей. Я удалил другие вещи, но когда я перезапустил проблему, она осталась. Я также отметил, что имя ключевого пространства отображается в файле Data.db в директории system/schema_keyspaces. Я считаю, что это часть проблемы, нет? – mlohbihler

+0

Спасибо спасибо dtootill. Это помогает решить мою проблему. – keypoint