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
19
demandé sur Don Branson 2014-08-24 00:07:08

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.

8
répondu phact 2014-08-25 03:49:55

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

3
répondu Ludovic Francois 2015-08-29 04:36:44