web-dev-qa-db-fra.com

Comment puis-je restaurer des instantanés Cassandra?

Je crée un processus de sauvegarde et de restauration pour une base de données Cassandra afin qu'elle soit prête lorsque j'en ai besoin, et que je comprenne les détails afin de construire quelque chose qui fonctionnera pour la production. I suis les instructions de Datastax ici:

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

Pour commencer, j'amorce la base de données sur une boîte de développement, puis j'essaie de faire fonctionner la sauvegarde/restauration. 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 simplement de faire fonctionner quelque chose en ce moment. J'ai vérifié le tar, 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, restaurez la base de données. La restauration "Méthode 2" 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émarrez Cassandra, puis mon application. L'application est conçue pour recréer le schéma au démarrage si nécessaire. Une fois qu'il est en place, il y a un nœud Cassandra avec un schéma pour l'application, mais pas de données.

Méthode 2/Étape 2 "Restaurer l'instantané": ils offrent trois alternatives, la première consiste à utiliser sstableloader, documentée à http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools /toolsBulkloader_t.html . La structure de dossiers requise par le chargeur ne ressemble en rien à la structure de dossiers créée par l'outil d'instantané, donc tout doit être déplacé en place. Avant d'aller à tous ces ennuis, je vais juste l'essayer sur une table:

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

Hmmm, eh 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 deuxième alternative, en copiant le répertoire d'instantanés dans le répertoire makeyourcase/users/snapshots /. Cela devrait être facile, car nous renvoyons le répertoire d'instantanés d'où il vient, donc 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 remet les répertoires d'instantanés sous leurs répertoires respectifs "d'instantanés", et une actualisation devrait restaurer les données:

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

Cela fonctionne sans plainte. Notez que vous devez l'exécuter pour chaque table, vous devez donc d'abord générer la liste des tables. Mais avant de faire cela, notez qu'il y a quelque chose d'intéressant dans les journaux 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 l'instantané, mais Cassandra ne l'a pas trouvé. J'ai également essayé de déplacer le répertoire instantané sous le répertoire SSTables existant et de copier les anciens fichiers SSTable dans le répertoire existant, avec la même erreur dans le journal. Cassandra ne se connecte pas là où il s'attend à les trouver, juste qu'il ne peut pas les trouver. Les docs disent de les mettre dans un répertoire nommé data/keyspace/nom_table-UUID, mais il n'y a pas de répertoire de ce type. Il y en a un nommé/makeyourcase/users/snapshots/1408820504987-users /, mais le placement du répertoire de l'instantané ou des fichiers individuels n'a pas fonctionné.

La troisième alternative, la "méthode de redémarrage des nœuds" ne semble pas adaptée à un environnement de production multi-nœuds, donc je n'ai pas essayé cela.

Éditer:

Juste pour rendre cela parfaitement explicite pour la prochaine personne, voici les scripts de sauvegarde et de restauration préliminaires qui fonctionnent et 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
Don Branson

Ajout de plus de détails:

Vous pouvez exécuter l'instantané pour votre espace de clés particulier en utilisant:

$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>

Cela créera les fichiers d'instantanés dans le répertoire d'instantanés des données.

Lorsque vous supprimez vos données, assurez-vous de ne pas supprimer le dossier des instantanés 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 à nouveau les données de cliché dans le répertoire keyspace/table (un pour chaque table):

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

Vous avez mentionné:

et cela remet les répertoires d'instantanés sous leurs répertoires respectifs "d'instantanés", et un rafraîchissement> devrait restaurer les données:

Je pense que le problème est que vous restaurez les données d'instantané dans le répertoire d'instantanés. Il devrait aller directement dans le répertoire de la table. Tout le reste semble correct, faites le moi savoir.

9
phact

Les docs disent de les mettre dans un répertoire nommé data/keyspace/table_name-UUID, mais il n'y a pas un tel répertoire.

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
Ludovic Francois