Кассандра перестраивается, останавливаясь

У меня есть кластер кассандры из 18 прод-узлов в 1 DC1 и 12 резервных узлов в дата-центре DC2, за несколько дней до того, как все резервные узлы вышли из строя и пересекли период gc_grace. Теперь я пытаюсь создать все резервные узлы, поэтому удалил все данные из резервных узлов и пытаюсь восстановить, но это останавливается с FileNotFoundException:.

Команды перестроения: nohup nodetool перестраивают DC1 &

(DC1 является центром обработки данных)

Error in nohup.out file :
   Error while rebuilding node: Stream failed
-- StackTrace --
java.lang.RuntimeException: Error while rebuilding node: Stream failed
        at org.apache.cassandra.service.StorageService.rebuild(StorageService.java:1076)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Ошибка в system.log:

Caused by: java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.io.FileNotFoundException: /data1/cassandra/data/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/system-compactions_in_progress-tmp-ka-62-Data.db (No such file or directory)
    at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299) ~[guava-16.0.jar:na]
    at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286) ~[guava-16.0.jar:na]
    at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) ~[guava-16.0.jar:na]
    at org.apache.cassandra.utils.FBUtilities.waitOnFuture(FBUtilities.java:372) ~[apache-cassandra-2.1.16.jar:2.1.16]
    ... 12 common frames omitted
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: /data1/cassandra/data/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/system-compactions_in_progress-tmp-ka-62-Data.db (No such file or directory)
        at org.apache.cassandra.io.util.SequentialWriter.<init>(SequentialWriter.java:82) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.io.compress.CompressedSequentialWriter.<init>(CompressedSequentialWriter.java:67) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.io.util.SequentialWriter.open(SequentialWriter.java:124) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.io.sstable.SSTableWriter.<init>(SSTableWriter.java:130) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.db.Memtable$FlushRunnable.createFlushWriter(Memtable.java:414) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.db.Memtable$FlushRunnable.writeSortedContents(Memtable.java:351) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.db.Memtable$FlushRunnable.runMayThrow(Memtable.java:335) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:297) ~[guava-16.0.jar:na]
        at org.apache.cassandra.db.ColumnFamilyStore$Flush.run(ColumnFamilyStore.java:1134) ~[apache-cassandra-2.1.16.jar:2.1.16]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_79]
        at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[na:1.7.0_79]
        ... 5 common frames omitted
Caused by: java.io.FileNotFoundException: /data1/cassandra/data/system/compactions_in_progress-55080ab05d9c388690a4acb25fe1f77b/system-compactions_in_progress-tmp-ka-62-Data.db (No such file or directory)

2 ответа

Решение

Ваша проблема не является исключением FileNotFound. Это факт, что вы транслируете системные таблицы. Системные таблицы будут создаваться на узле локально при запуске. Все данные должны быть потоковыми, за исключением данных системных таблиц. /data1/cassandra/data/system/

Какую версию Cassandra вы используете?

Если вы не изменили ничего, что вынудило Cassandra транслировать системные таблицы, я бы сказал, что это ошибка.

Пока вы запускали восстановление в DC2, в DC1 происходили уплотнения. Вы можете выполнить следующую команду во всех узлах DC1, чтобы увидеть процесс сжатия

уплотнения

Как часть сжатия, sstables будут объединены вместе, и таблицы tmp "compaction_in_progress" исчезнут после завершения слияния. Таким образом, потоковая передача этих временных таблиц теряется по пути от DC1 к DC2, что приводит к сбою потоковой передачи.

Также эти уплотнения могут быть вызваны "восстановлением nodetool", инициированным в DC1. Поэтому, чтобы избежать этой ситуации, дождитесь завершения ремонта, если он еще не завершен.

Поскольку в DC1 18 узлов, я считаю, что размер хранилища кластера огромен. Более чистый способ обойти эту ситуацию - приостановить сжатие во время перестроения и перестраивать одно пространство ключей за раз. Так что вместо того, чтобы восстанавливать весь кластер с

nohup nodetool перестраивает DC1 &

  1. Выполните следующую команду в DC1

    nodetool disableautocompaction keyspace-name1

  2. Затем перестройте это пространство ключей в DC2, по одному узлу за раз

    nohup nodetool перестраивает keyspace-name1 DC1 &

  3. После завершения восстановления во всех узлах в DC2 для этого пространства ключей

    nodetool enableautocompaction keyspace-name1

Повторите два вышеупомянутых шага для всех клавиш, пока не закончите. Вы можете пропустить системные таблицы, такие как "system", которые являются локальными для этого узла и автоматически восстанавливаются при запуске этого узла (даже с пустым каталогом данных).

Если слишком много пространств клавиш приложения, чтобы справиться с этим, это становится легким занятием ручной работы.

Другие вопросы по тегам