Подтвердить что ты не робот

Как восстановить снимки Cassandra?

Я создаю процесс резервного копирования и восстановления для базы данных Cassandra, чтобы он был готов, когда мне это нужно, и чтобы я понял детали, чтобы создать что-то, что будет работать для производства. Я следую инструкциям Datastax здесь:

http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html.

Вначале я загружаю базу данных в dev, затем пытаюсь сделать работу по резервному копированию/восстановлению. Здесь резервная копия script:

#!/bin/bash

cd /opt/apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding

Да, tar, пожалуй, не самый эффективный способ, но я просто пытаюсь что-то сделать сейчас. Я проверил tar, и все файлы там.

После резервного копирования базы данных я закрываю Cassandra и мое приложение, а затем rm -rf /var/lib/cassandra/, чтобы имитировать полную потерю.

Теперь, чтобы восстановить базу данных. Восстановление "Метод 2" из http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_snapshot_restore_t.html более совместимо с моим компонентом создания схемы, чем с методом 1.

Итак, метод 2/шаг 1, "Восстановить схему": перезапустите Cassandra, затем мое приложение. Приложение создано для повторной воссоздания схемы при запуске, когда это необходимо. После этого есть рабочая Cassandra node со схемой для приложения, но нет данных.

Способ 2/Шаг 2 "Восстановить моментальный снимок": они дают три альтернативы, первая из которых - использование sstableloader, занесенная в документ http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsBulkloader_t.html. Структура папок, которую требует загрузчик, ничем не отличается от структуры папок, созданной инструментом моментального снимка, поэтому все должно быть перенесено на место. Прежде чем идти на все эти проблемы, я просто попробую его на одном столе:

>./bin/sstableloader makeyourcase/users
Error: Could not find or load main class org.apache.cassandra.tools.BulkLoader

Хммм, ну, это не сработает. BulkLoader находится в. /lib/apache -cassandra-2.0.9.jar, но загрузчик, похоже, не настроен на работу из коробки. Вместо того, чтобы отлаживать инструмент, перейдите к второй альтернативе, скопировав каталог моментальных снимков в каталог makeyourcase/users/snapshots/. Это должно быть легко, так как мы бросаем каталог снимков прямо туда, откуда он появился, поэтому tar xzf after_seeding.tgz должен сделать трюк:

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase

и это возвращает каталоги моментальных снимков под их соответствующими каталогами "моментальных снимков", а обновление должно восстанавливать данные:

cd /opt/apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users

Это работает без жалобы. Обратите внимание, что вы должны запускать это для каждой таблицы, поэтому сначала необходимо создать список таблиц. Но прежде чем мы это сделаем, обратите внимание, что в журналах Cassandra есть что-то интересное:

INFO 14:32:26,319 Loading new SSTables for makeyourcase/users...
INFO 14:32:26,326 No new SSTables were found for makeyourcase/users

Итак, мы вернем снимок, но Кассандра его не нашла. Я также попытался переместить каталог моментальных снимков в существующий каталог SSTables и скопировать старые файлы SSTable в существующий каталог с той же ошибкой в ​​журнале. Кассандра не регистрируется там, где она рассчитывает найти их, просто чтобы их не найти. Документы говорят, что они помещают их в каталог с именем data/keyspace/table_name-UUID, но такого каталога нет. Существует один именованный data/makeyourcase/users/snapshots/1408820504987-users/, но размещение там моментального снимка или отдельных файлов не работает.

Третий вариант: метод Node restart не подходит для рабочей среды multi- node, поэтому я этого не делал.

Edit:

Чтобы сделать это совершенно явным для следующего человека, вот предварительные, рабочие сценарии резервного копирования и восстановления, которые применяют принятый ответ.

myc_backup.sh:

#!/bin/bash

cd ~/bootstrap/apache-cassandra-2.0.9
./bin/nodetool clearsnapshot -t after_seeding makeyourcase
./bin/nodetool snapshot -t after_seeding makeyourcase

cd /var/lib/
tar czf after_seeding.tgz cassandra/data/makeyourcase/*/snapshots/after_seeding

myc_restore.sh:

#!/bin/bash

cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase

cd ~/bootstrap/apache-cassandra-2.0.9
TABLE_LIST=`./bin/nodetool cfstats makeyourcase | grep "Table: " | sed -e 's+^.*: ++'`
for TABLE in $TABLE_LIST; do
    echo "Restore table ${TABLE}"
    cd /var/lib/cassandra/data/makeyourcase/${TABLE}
    if [ -d "snapshots/after_seeding" ]; then
        cp snapshots/after_seeding/* .
        cd ~/bootstrap/apache-cassandra-2.0.9
        ./bin/nodetool refresh -- makeyourcase ${TABLE}
        cd /var/lib/cassandra/data/makeyourcase/${TABLE}
        rm -rf snapshots/after_seeding
        echo "    Table ${TABLE} restored."
    else
        echo "    >>> Nothing to restore."
    fi
done
4b9b3361

Ответ 1

Добавлено больше деталей:

Вы можете запустить моментальный снимок для своего ключевого пространства, используя:

$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>

Это создаст файлы моментальных снимков внутри каталога моментальных снимков в данных.

Когда вы удаляете свои данные, убедитесь, что вы не удаляете папку моментальных снимков, или вы не сможете ее восстановить (если вы не переместите ее в другое место/машину.)

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ ls
mykeyspace-mytable-jb-2-CompressionInfo.db mykeyspace-mytable-jb-2-Statistics.db
mykeyspace-mytable-jb-2-Data.db mykeyspace-mytable-jb-2-Filter.db mykeyspace-mytable-jb-2-Index.db
mykeyspace-mytable-jb-2-Summary.db mykeyspace-mytable-jb-2-TOC.txt snapshots


$ rm *
rm: cannot remove `snapshots': Is a directory

После того, как вы будете готовы к восстановлению, скопируйте данные моментальных снимков в каталог keyspace/table (по одному для каждой таблицы):

$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ sudo cp snapshots/<SnapshotDirectoryName>/* .

Вы упомянули:

и это возвращает каталоги моментальных снимков под их соответствующими каталогами "моментальных снимков", а обновление > должно восстанавливать данные:

Я думаю, проблема в том, что вы восстанавливаете данные моментальных снимков в каталог моментальных снимков. Он должен идти прямо в каталоге таблицы. Все остальное кажется правильным, дайте мне знать.

Ответ 2

Документы говорят, чтобы поместить их в каталог с именем data/keyspace/table_name-UUID, но такой каталог отсутствует.

У вас нет этого каталога UUID, потому что вы используете cassandra 2.0, и эта вещь UUID началась с cassandra 2.2