En primer lugar comentar que la  instalación sobre la que vamos a tratar consiste en dos nodos con sharding, uno de ellos hace además de config y router.

En las pruebas realizada con los comandos mongodump y mongorestore, la restauración de datos no ha sido satisfactoria y estable, puesto que en algunos casos se pierde la configuración del sharding y en otras no se restauran los datos correctamente, aun usando la opción –oplog  que permite escribir los datos recién escritos mientras se hace el backup. A partir de cierto volumen de datos (2.000.000 de registros) se queda colgado el restore.

La versión utilizada es la 2.0. El sistema de ficheros empleado en las particiones donde se alojan los datos del Mongo es ext4 con LVM.

La manera de realizar el backup de manera más fiable(aunque con la importante pega de no ser un backup incremental) es realizando un snapshot del volumen lógico(previo bloqueo de las escrituras en la base de datos), para posteriormente realizar un backup de ese snapshot en el directorio remoto que deseemos. De esta manera solo se bloquean las escrituras en la base de datos durante el tiempo que tarde en hacerse el snapshot.

Partimos de la siguiente infraestructura:

En cada máquina tenemos la siguiente configuración de particiones:

  • 1 lvm con el sistema /
  • 1 lvm con los datos de Mongo /var/lib/mongodb
  • Espacio para crear un snapshot de la partición  anteriormente mencionada(si /var/lib/mongodb ocupa 40 gb, necesitamos otros 40 gb libres por lo menos para crear el snapshot).

Os dejo un pequeño resumen de como redimensionar un volumen LVM,  así como crearlos por si fuera necesario(especialmente necesario si esta montado todo el sistema Linux en un solo volumen lógico).

Una vez cumplimos estos requisitos previos  nos conectamos a la consola del Mongodb:

#mongo -port 30000

y bloqueamos las operaciones de escritura sobre la base de datos:

mongo1$ use admin
mongo1$ db.runCommand({fsync:1,lock:1})

A continuación realizamos una copia exacta del volumen lógico donde guardamos los datos del mongo:

mongo1$  lvcreate -L40G -s -n mongosnapshot /dev/mapper/lvmcondatosmnongo

desbloqueamos las escrituras en en la base de datos(todas las operaciones pendientes seran ejecutadas):

mongo1$ db.$cmd.sys.unlock.findOne()

Y ahora ya podemos hacer el backup sobre esta imagen recien creada. Para ello montamos la imagen en un directorio de nuestra elección:

#mkdir -p /mnt/backup/mongonapshot

#mount /dev/mapper/mongosnapshot /mnt/backup/mongosnapshot

Ahora tenemos que elegir si queremos una copia exacta a nivel de bloques físicos o una copia a nivel de ficheros. Recomiendo la opción de ficheros para restaurar con más rapidez y optimizar el espacio en disco. Con la copia a nivel de disco, copiamos también el espacio no usado.

Fichero: #tar -pczf /backups/mongo.tar.gz /mnt/backup/mongosnapshot

Disco: #dd if=/mnt/backup/mongosnapshot of=/backups/mongo.dd

¡Ya tenemos backup!

Ahora sólo queda restaurar los datos, para lo que tendríamos que para los servicios en cada nodo y descomprimir la copia:

# /etc/init.d/mongodb stop
#tar zxvf  backups/mongo.tar.gz /var/lib/

o restaurar la imagen de disco:

#dd if=/backups/mongo.dd of=/var/lib/mongodb

Referencias:

http://www.howtoforge.com/linux_lvm_snapshots_p1

http://www.mongodb.org/display/DOCS/Backups

http://equivocation.org/node/103

http://www.tcpdump.com/kb/os/linux/lvm-resizing-guide/shrink.html

Anuncios