Кассандра AssertionError

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

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

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


person mlohbihler    schedule 28.04.2012    source источник
comment
В итоге я просто удалил все в журнале коммитов, данных и save_caches и перезапустил. Итак, суть в том, что я не смог восстановить пространство ключей, не отключив все остальное в кластере. Таким образом, оба ответа верны. Я отметил Самарта как таковой, потому что он предоставил немного больше информации, которая может быть полезна в других ситуациях.   -  person mlohbihler    schedule 04.05.2012
comment
Вы выполняете все операции из cassandra-cli? можете ли вы упомянуть шаги по воссозданию этой проблемы, чтобы мы могли попробовать ее.   -  person samarth    schedule 04.05.2012


Ответы (2)


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

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

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

  • Используйте удаление nodetool, чтобы очистить журнал фиксации на всех узлах кластера.

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

person samarth    schedule 02.05.2012
comment
Спасибо за дополнительную информацию о nodetool. Теперь у меня есть другие пространства ключей, которые я не хочу удалять, поэтому я выбрал вариант 2). Однако та же проблема остается. См. мое примечание к dtootill выше для получения дополнительной информации. Когда я перечисляю пространства ключей, его там нет. Команда для его создания выполняется успешно, но когда я пытаюсь ее использовать, я понимаю, почему: Keyspace mango не существует. - person mlohbihler; 02.05.2012
comment
Прежде всего, остановите кластер cassandra. Попробуйте удалить файлы LocationInfo* со всех узлов. Также удалите каталог из папки данных с тем же именем, что и ваш кластер keyspace.restart, заново создайте пространство ключей и проверьте разрешения каталогов в каталоге данных. - person samarth; 03.05.2012
comment
Все тот же результат: не указан в пространстве ключей, мне разрешено создавать, но когда я пытаюсь использовать, я получаю ошибки. Есть ли способ исправить файлы schema_keyspaces? Я вижу, как в них появляется манго. - person mlohbihler; 03.05.2012

Почти наверняка проблема заключается в том, что воссозданное пространство ключей несовместимо с журналом фиксации или данными, хранящимися в исходном определении. Выключите сервер Cassandra и очистите журнал фиксации, save_caches и каталог данных, соответствующий пространству ключей. Расположение этих каталогов указано в cassandra.yaml — ищите data_file_directories, save_caches_directory и commitlog_directory.

person dtootill    schedule 02.05.2012
comment
Спасибо dtootill. Каталог commitlog не содержит файлов, относящихся к ошибочному пространству ключей. Я удалил другие вещи, но когда я перезапустил, проблема не исчезла. Я также заметил, что имя пространства ключей отображается в файле Data.db в каталоге system/schema_keyspaces. Я считаю, что это часть проблемы, нет? - person mlohbihler; 02.05.2012
comment
Спасибо Спасибо dtootill. Это тоже помогает решить мою проблему. - person keypoint; 22.08.2015