Я создаю процесс резервного копирования и восстановления для базы данных 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