cassandra - devcenter - datastax dse
¿Cómo puedo restaurar las instantáneas de Cassandra? (2)
Los documentos dicen colocarlos en un directorio llamado data / keyspace / table_name-UUID, pero no hay tal directorio.
No tienes este directorio UUID porque estás usando cassandra 2.0 y esta cosa UUID comenzó con cassandra 2.2
Estoy creando un proceso de copia de seguridad y restauración para una base de datos Cassandra para que esté listo cuando lo necesito, y para que entienda los detalles con el fin de construir algo que funcione para la producción. Estoy siguiendo las instrucciones de Datastax aquí:
http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_restore_c.html .
Para empezar, siembro la base de datos en un cuadro de desarrollo y luego intento que la copia de seguridad / restauración funcione. Aquí está el script de copia de seguridad:
#!/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
Sí, el alquitrán no es la forma más eficiente, quizás, pero solo estoy tratando de que algo funcione ahora. He comprobado el tar, y todos los archivos están ahí.
Una vez que se realiza una copia de seguridad de la base de datos, cierro Cassandra y mi aplicación, luego rm -rf /var/lib/cassandra/
para simular una pérdida completa.
Ahora para restaurar la base de datos. La restauración del "Método 2" de http://www.datastax.com/documentation/cassandra/2.0/cassandra/operations/ops_backup_snapshot_restore_t.html es más compatible con mi componente de creación de esquemas que con el Método 1.
Entonces, Método 2 / Paso 1, "Recrear el esquema": reinicia Cassandra, luego mi aplicación. La aplicación está diseñada para volver a crear el esquema en el inicio cuando sea necesario. Una vez que está listo, hay un nodo de Cassandra en funcionamiento con un esquema para la aplicación, pero sin datos.
Método 2 / Paso 2 "Restaurar la instantánea": ofrecen tres alternativas, la primera de las cuales es usar sstableloader, documentado en http://www.datastax.com/documentation/cassandra/2.0/cassandra/tools/toolsBulkloader_t.html . La estructura de carpetas que requiere el cargador no se parece en nada a la estructura de carpetas creada por la herramienta de instantáneas, por lo que todo tiene que moverse a su lugar. Antes de meterme en todos esos problemas, lo probaré en una mesa:
>./bin/sstableloader makeyourcase/users
Error: Could not find or load main class org.apache.cassandra.tools.BulkLoader
Hmmm, bueno, eso no va a funcionar. BulkLoader está en ./lib/apache-cassandra-2.0.9.jar, pero el cargador no parece estar configurado para funcionar fuera de la caja. En lugar de depurar la herramienta, pasemos a la segunda alternativa, copiando el directorio de instantáneas en el directorio makeyourcase / users / snapshots /. Esto debería ser fácil, ya que estamos lanzando el directorio de instantáneas justo de donde vino, por lo que tar xzf after_seeding.tgz
debería hacer el truco:
cd /var/lib/
tar xzf after_seeding.tgz
chmod -R u+rwx cassandra/data/makeyourcase
y eso coloca a los directorios de instantáneas de nuevo bajo sus respectivos directorios de ''instantáneas'', y una actualización debe restaurar los datos:
cd /opt/apache-cassandra-2.0.9
./bin/nodetool refresh -- makeyourcase users
Esto funciona sin queja. Tenga en cuenta que debe ejecutar esto para todas y cada una de las tablas, por lo que primero debe generar la lista de tablas. Pero, antes de hacer eso, tenga en cuenta que hay algo interesante en los registros 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
Entonces, devolvimos la instantánea, pero Cassandra no la encontró. También intenté mover el directorio de instantáneas debajo del directorio de SSTables existente, y copiar los archivos antiguos de SSTable en el directorio existente, con el mismo error en el registro. Cassandra no registra dónde espera encontrarlos, solo que no puede encontrarlos. Los documentos dicen colocarlos en un directorio llamado data / keyspace / table_name-UUID, pero no hay tal directorio. Hay uno llamado data / makeyourcase / users / snapshots / 1408820504987-users /, pero poner el directorio de instantáneas allí, o los archivos individuales, no funcionó.
La tercera alternativa, el "método de reinicio de nodo" no parece adecuado para un entorno de producción de múltiples nodos, así que no lo intenté.
Editar:
Solo para hacer esto perfectamente explícito para la siguiente persona, aquí están los scripts preliminares de trabajo de copia de seguridad y restauración que aplican la respuesta aceptada.
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
Agregado más detalles:
Puede ejecutar la instantánea para su espacio de teclas en particular usando:
$ nodetool snapshot <mykeyspace> -t <SnapshotDirectoryName>
Esto creará los archivos de instantáneas dentro del directorio de instantáneas en los datos.
Cuando elimine sus datos, asegúrese de no eliminar la carpeta de instantáneas o no podrá restaurarla (a menos que la esté moviendo a otra ubicación / máquina).
$ 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
Una vez que esté listo para restaurar, vuelva a copiar los datos de la instantánea en el directorio de espacio de claves / tabla (uno para cada tabla):
$ pwd
/var/lib/cassandra/data/mykeyspace/mytable
$ sudo cp snapshots/<SnapshotDirectoryName>/* .
Mencionaste:
y eso coloca a los directorios de instantáneas de nuevo bajo sus respectivos directorios de ''instantáneas'', y una actualización> debería restaurar los datos:
Creo que el problema es que está restaurando los datos de instantáneas en el directorio de instantáneas. Debe ir a la derecha en el directorio de la tabla. Todo lo demás parece correcto, házmelo saber.