Восстановление снимка Кассандры: случайные пропущенные данные
Мне трудно восстановить моментальный снимок на Apache Cassandra (версия 3.0.9). Насколько я могу сказать, я следую процедуре, описанной в блоге datastax, а также нескольким другим (например: http://datascale.io/cloning-cassandra-clusters-fast-way/). Тем не менее, я могу что-то упустить, и каждый раз, когда я делаю восстановление, данные отсутствуют.
Настройка: кластер из 6 узлов (1 DC, 3 стойки по 2 узла в каждом) с коэффициентом репликации, равным 3. Машины размещены на AWS.
Процедура резервного копирования (на каждом узле):
nodetool snapshot mykeyspacecqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cqlnodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens
Я получаю файлы, созданные командой nodetool snapshot, и копирую их вместе с токенами и cql на S3.
Процедура восстановления (для каждого узла, если он не указан):
(после создания новых виртуальных машин)
- Скачать снимки, токены и ключи
- Остановить службу Кассандра
- удалять
/var/lib/cassandra/commitlog/*а также/var/lib/cassandra/system/ - Вставьте токены в
cassandra.yaml - Запустить службу Кассандра
- Восстановить mykeyspace из
mykeyspace.cqlтолько на одном узле - Дождитесь репликации и остановите службу Кассандра
- удалять
.dbфайлы в папке/var/lib/cassandra/data/mykeyspace/ - Для каждой таблицы скопируйте файлы снимков (
.db,.crc32,.txt) в/var/lib/cassandra/data/mykeyspace/$table/ - Перезапустите службу Кассандра
- Бежать
nodetool repair mykeyspace -fullодин узел за раз
Результат:
Всегда есть пропущенные строки, примерно одинаковое количество для каждой таблицы, но никогда не одинаковые. Я попытался немного "перепутать" процедуру, такую как восстановление пространства ключей перед токенами, запуск nodetool refresh до ремонта, но я встречаю одну и ту же проблему каждый раз.
Поскольку я не далеко от "хорошего" восстановления, я думаю, что мне не хватает чего-то довольно очевидного. Анализ журналов не очень помог, так как они не показывают никаких сообщений об ошибках / сбоях.
Любая помощь будет приветствоваться:) Я могу, конечно, дать больше информации, если это необходимо.
редактировать: никто? Я обновил вопрос с версией Кассандры (3.0.9), которую я забыл в первую очередь. Я попытался снова восстановить, но не повезло. Я понятия не имею, на самом деле:(
2 ответа
Хорошо, конец истории, глупый я! initial_token строка в cassandra.yaml была ошибочно "отправлена" во время процедуры восстановления. Если после ":" нет пробела для initial_token ключ, то Кассандра не запускается. поэтому строка была прокомментирована, а токены не интерпретированы!
Tldr:
initial_token:<values>= НЕПРАВИЛЬНОinitial_token: <values>= ХОРОШО
Большое спасибо вам, Джош Первис, за то, что вы настаивали на высокой важности этого параметра:-)
sed Команда в этом сообщении в блоге, который должен добавить -Dcassandra.load_ring_state=false к $JVM_OPTS, не имеет никакого эффекта в его нынешнем виде.
Если вы копировали эту команду прямо из поста в блоге, возможно, это проблема. Вы можете попробовать это вместо этого, который помещает его в конец файла:
sudo sed -i '$ a\JVM_OPTS="$JVM_OPTS -Dcassandra.load_ring_state=false"' /etc/cassandra/cassandra-env.sh
Также вам нужно будет сделать nodetool repair -pr <ks> на каждом узле, один за другим, после выполнения этой процедуры.