Comment puis-je restaurer Cassandra snapshots?
je construis un processus de sauvegarde et de restauration pour une base de données Cassandra pour qu'elle soit prête quand j'en ai besoin, et pour que je comprenne les détails afin de construire quelque chose qui fonctionnera pour la production. Je suis les instructions de Datastax ici:
http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html.
pour commencer, je cherche la base de données sur une boite dev puis j'essaie de faire la sauvegarde / restauration travail. Voici le script de sauvegarde:
#!/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
Oui, le goudron n'est peut-être pas le moyen le plus efficace, mais j'essaie juste de faire fonctionner quelque chose en ce moment. J'ai vérifié le goudron, et tous les fichiers sont là.
une fois la base de données sauvegardée, J'arrête Cassandra et mon application, puis rm -rf /var/lib/cassandra/
pour simuler une perte complète.
maintenant de restaurer la base de données. Restauration "Méthode 2" à partir de http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_snapshot_restore_t.html est plus compatible avec mon composant de création de schéma que la méthode 1.
donc, Méthode 2 / Étape 1, "recréer le schéma": redémarrer Cassandra, puis mon application. L'application est construite pour recréer le schéma au démarrage si nécessaire. Une fois que C'est en place, il y a un noeud Cassandra qui fonctionne avec un schéma pour l'application, mais pas de données.
Méthode 2 / Étape 2 " restaurer la snapshot": ils donnent trois alternatives, dont la première est d'utiliser sstableloader, documenté à http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsBulkloader_t.html. La structure de dossier dont le chargeur a besoin n'est en rien comparable à la structure de dossier créée par l'outil snapshot, de sorte que tout doit être mis en place. Avant d'aller à toute cette peine, je vais juste essayer sur une table:
>./bin/sstableloader makeyourcase/users
Error: Could not find or load main class org.apache.cassandra.tools.BulkLoader
Hmmm, et bien, ça ne va pas marcher. BulkLoader est dans ./ lib / apache-cassandra-2.0.9.jar, mais le chargeur ne semble pas être configuré pour fonctionner hors de la boîte. Plutôt que de déboguer l'outil, passons à la seconde alternative, copier le répertoire snapshot dans le makeyourcase/users/snapshots/ directory. Cela devrait être facile, puisque nous organisons le répertoire des instantanés de retour là où il venait,tar xzf after_seeding.tgz
devrait faire l'affaire:
cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase
et qui replace les répertoires snapshot sous leurs répertoires respectifs "instantanés" des répertoires, et une actualisation doit restaurer les données:
cd /opt/apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users
cela fonctionne sans plainte. Notez que vous devez exécuter ceci pour chaque table, donc vous devez générer la liste des tables en premier. Mais avant de faire cela, notez qu'il y a quelque chose d'intéressant dans les logs de 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
donc, nous avons remis le cliché, mais Cassandra ne l'a pas trouvé. J'ai aussi essayé de déplacer le répertoire snapshot sous le répertoire existant de SSTables, et de copier les vieux fichiers instables dans le répertoire existant, avec la même erreur dans le log. Cassandra ne sait pas où elle s'attend à les trouver, juste qu'elle ne peut pas les trouver. Les docs disent de les mettre dans un répertoire nommé data/keyspace/table_name-UUID, mais il n'y en a pas. Il y en a un nommé data/makeyourcase/users/snapshots/mitch820504987-users/, mais mettre le lecteur de snapshot là, ou les fichiers individuels, n'a pas fonctionné.
la troisième alternative, la méthode "Node restart"" ça ne semble pas adapté à un environnement de production multi-noeuds, donc je n'ai pas essayé.
Edit:
juste pour rendre cela parfaitement explicite pour la personne suivante, voici les scripts préliminaires de sauvegarde et de restauration qui appliquent la réponse acceptée.
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
2 réponses
Ajout de plus de détails:
vous pouvez exécuter le snapshot pour votre espace de clé particulier en utilisant:
$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>
cela créera les fichiers snapshots à l'intérieur du répertoire snapshots dans data.
Lorsque vous supprimez vos données, assurez-vous de ne pas supprimer le dossier snapshots ou vous ne pourrez pas le restaurer (sauf si vous le déplacez vers un autre emplacement / machine.)
$ 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
une fois que vous êtes prêt à restaurer, Copiez le snapshot des données dans l'espace de clé/répertoire de table (un pour chaque table):
$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ sudo cp snapshots/<SnapshotDirectoryName>/* .
Vous avez mentionné:
et qui replace les répertoires snapshots sous leurs répertoires respectifs' snapshots', et un rafraîchissement >devrait restaurer les données:
je pense que le problème est que vous restaurez les données du Snapshot dans le répertoire snapshot. Ça devrait aller dans le répertoire des tables. Tout le reste me semble bon, laissez-moi savoir.
Les docs disent de les mettre dans un répertoire nommé data/keyspace / table_name-UUID, mais il n'existe pas de répertoire de ce type.
Vous n'avez pas ce répertoire UUID parce que vous utilisez cassandra 2.0 et cette chose UUID a commencé avec cassandra 2.2