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
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.
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