¡Participa de la Maratón Behind the Code, la competencia de programación más desafiante! Inscríbete aqui

Configurar servidores de MongoDB para que ejecuten scripts de copias de seguridad.

Introducción

Gestionar los datos, servicios e información es crucial para el éxito de una compañía. Y en un mundo en el que cada vez hay más datos, elegir la solución de gestión de datos adecuada es más importante que nunca. MongoDB es una base de datos NoSQL de código abierto que se puede utilizar para gestionar datos masivos. Brinda funciones de alto rendimiento, alta disponibilidad y facilidad de escalabilidad. Un elemento crítico de la gestión de datos es realizar copias de seguridad habitualmente para prevenir la pérdida de datos, y esto es algo que no se debe hacer manualmente. Existen diferentes métodos que se pueden utilizar para realizar copias de seguridad en MongoDB, pero este artículo muestra cómo configurar y ejecutar scripts de copias de seguridad con mongodump y mongorestore.

Configurar una instancia de MongoDB

Utilice los siguientes pasos para diseñar scripts de copias de seguridad de MongoDB que se ejecutan automáticamente con un trabajo de cron. Puede personalizar los scripts de copias de seguridad según sus requisitos empresariales.

Nota: para seguir los pasos de este tutorial, cree un usuario diferente (llamado mongo, por ejemplo) para realizar las operaciones administrativas en MongoDB.

  1. Instale MongoDB desde el Centro de Descarga de MongoDB. Los archivos binarios de MongoDB están en el directorio /opt/mongodb/mongodb/bin/. Utilice las credenciales de usuario raíz cuando instale MongoDB.
  2. Inicie sesión como usuario raíz, y cree un grupo y un usuario:
    
    #groupadd mongogrp
    #vi /etc/group
    mongogrp:x:1005:
  3. Añada el usuario mongo al grupo mongogrp que acaba de crear:
    #useradd mongo ‑d /home/mongo ‑f ‑1 ‑g mongogrp ‑m
  4. Verifique que se creó el usuario:
    
    #cd /home
    #ls ‑l
    drwxr‑xr‑x 2 mongo mongogrp 4096 Oct 18 07:25 mongo
    vi /etc/passwd
    mongo:x:1005:1005::/home/mongo:
  5. Establezca la contraseña para el usuario mongo:
    #passwd mongo

Invoque un shell de MongoDB

  1. Abra una nueva sesión e inicie sesión como el usuario mongo:
    $ sudo su – mongo
  2. Encuentre el directorio bin de la instalación de MongoDB:
    $ cd /opt/mongodb/mongodb/bin/
    $ ls
    bsondump mongo mongod mongodump mongoexport mongofiles mongoimport
    mongooplog mongoperf mongorestore mongos mongosniff mongostat mongotop
  3. Para ejecutar esas utilidades, el directorio debe tener acceso adecuado al usuario mongo. Utilice las credenciales de usuario raíz y brinde el acceso adecuado al usuario mongo para el directorio bin.
  4. Verifique que las utilidades que se muestran en el Paso 2 están bajo el directorio bin.
  5. Cuando se invoca un shell de MongoDB hay dos opciones: una utiliza SSL y la otra no. Las instrucciones para las dos están a continuación. a. Para invocar un shell de MongoDB, ejecute el comando mongo con estas opciones:
    $ ./mongo ‑ ‑ host pre‑mongo01.ibmcloud.com ‑ ‑ port 27017
    b. Para invocar un shell de MongoDB con SSL, ejecute el comando mongo con estas opciones:
    $ ./mongo ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem‑‑sslPEMKeyPassword
    password123 pre‑mongo01.ibmcloud.com:27017
    Donde:
    Certification file :/opt/mongodb/mongodb/cert/mongo.server.trust‑certs.pem
    password123 :sslPEMKeyPassword
    port no :27017
    Hostname :pre‑mongo01.ibmcloud.com

Nota: aquí, usted obtendrá la versión 3.2 del shell de MongoDB. Ahora puede realizar varias operaciones.

Este artículo ejecuta comandos y utilidades de MongoDB con SSL.

> show dbs
testdb1 0.800GB
local 0.000GB
mydb 0.300GB

Funciones de copia de seguridad y restauración de MongoDB

Para realizar la copia de seguridad de la base de datos de MongoDB, se utiliza la utilidad mongodump, que se encuentra en el directorio bin. Esta utilidad realiza la copia de seguridad de todos los datos en la carpeta «dump» de la ubicación predeterminada /bin/dump. MongoDB utiliza el puerto 27017 de forma predeterminada. Se puede utilizar la utilidad mongodump para realizar copias de seguridad en caliente (online) o en frío (fuera de línea).

Copia de seguridad fuera de línea de MongoDB

El servidor MongoDB tiene un proceso daemon primario, llamado mongod. Mongod gestiona el acceso a datos, las solicitudes de datos y las operaciones ocultas. Para realizar una copia de seguridad fuera de línea, primero hay que parar el servicio mongod, que para la instancia MongoDB. Después, hay que realizar la copia de seguridad e iniciar la instancia de MongoDB.

Para crear una copia de seguridad fuera de línea de MongoDB:

  1. Cree un directorio para copias de seguridad. Basándose en el tamaño de la base de datos de MongoDB, cree los directorios para las copias de seguridad en las ubicaciones respectivas de las copias de seguridad. Aquí, los directorios para las copias de seguridad se crean como /mongo_data/backup:
     #mkdir /mongo_data/backup
    #ls –l
  2. Cambiar el propietario para el usuario mongo:
    #chown ‑R mongo:mongogrp /mongo_data/backup/
    #ls –l
  3. Pare la instancia de mongod:
    service mongod stop
  4. Realice la copia de seguridad fuera de línea. Primero, inicie sesión con el usuario mongo y encuentre el directorio bin:
    $ pwd
    /opt/mongodb/mongodb/bin
    $./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem
    ‑‑sslPEMKeyPassword password123 ‑‑host pre‑mongo01.ibmcloud.com:27017 ‑‑out /mongo_data/backup/
  5. Inicie la instancia de mongod tecleando service mongod start.

Copia de seguridad online de MongoDB

Para realizar una copia de seguridad online, ejecute el comando mongodump sin parar, y reinicie la instancia mongod. Este comando se puede ejecutar con o sin SSL. Ambos comandos se muestran a continuación.

Para ejecutar el comando mongodump con SSL, el comando se debe parecer a esto:

$./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem
‑‑sslPEMKeyPassword password123 ‑‑host pre‑mongo01.ibmcloud.com:27017 ‑‑out /mongo_data/backup/

Para ejecutar el comando mongodump sin SSL, el comando se debe parecer a esto:

$ ./mongodump ‑‑ host pre‑mongo01.ibmcloud.com ‑‑port 27017 ‑‑out /mongo_data/backup/

Copia de seguridad de clúster fragmentado y pequeño con mongodump

Si su clúster contiene un pequeño conjunto de datos, se puede conectar a un mongos a través de mongodump.

En un clúster fragmentado de MongoDB, mongos es un servicio de direccionamiento que procesa consultas de la capa de aplicaciones. Para realizar la operación, determina la ubicación de estos datos en el clúster fragmentado.

Se puede crear la copia de seguridad del clúster de MongoDB si la infraestructura puede realizar toda la copia de seguridad en un tiempo razonable y si un sistema de almacenamiento puede contener todo el conjunto de datos de MongoDB. De forma predeterminada, mongodump lanza sus consultas a los nodos no primarios.

Para realizar una copia de seguridad de un clúster fragmentado, utilice mongodump como se muestra en el siguiente tomado:

$ ./mongodump ‑‑ host pre‑mongo01.ibmcloud.com ‑‑port 27017

Nota: las aplicaciones pueden continuar modificando los datos mientras mongodump captura el resultado. Para los conjuntos de réplicas, mongodump brinda la opción –oplog para incluir sus entradas del oplog de salida que ocurren durante la operación mongodump. Esto permite que la cooperación correspondiente de mongorestore reproduzca el oplog capturado. Para restaurar una copia de seguridad creada con –oplog, utilice mongorestore con la opción –oplogReplay. Sin embargo, para los conjuntos de réplicas, considere utilizar MongoDB Cloud Manager u Ops Manager.

Escenarios de la recuperación

Usted puede planificar mejor y evitar escenarios de fallos si entiende cómo ocurren los fallos y cómo puede recuperarse tras ellos. Las siguientes secciones simulan los diferentes tipos de fallos y presentan un conjunto de pasos que se pueden seguir si ocurre uno de ellos en un entorno.

Escenario 1. Una base de datos completa es eliminada accidentalmente o se corrompe

Un error manual o un fallo de hardware pueden dañar o corromper toda una base de datos. Si esto ocurre, puede recuperar toda la base de datos aplicando la última copia de seguridad completa de mongodump y restaurar la con la utilidad mongorestore

En este escenario, asumimos que la base de datos es testdb1 y las colecciones (por ejemplo, usuarios y alumnos) tienen algunos registros, como se muestra a continuación.

Paso 1. Verificar la base de datos y las colecciones

a. Inicie sesión como el usuario mongo:

$ sudo su – mongo
b. Encuentre el directorio de bin:
$ cd /opt/mongodb/mongodb/bin/
c. Invoque el shell de MongoDB:
$ ./mongo ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem ‑‑sslPEMKeyPassword password123 pre‑mongo01.ibmcloud.com:27017
d. Verifique la base de datos y las colecciones:

> show dbs
 testdb1 0.800GB
local 0.000GB
mydb 0.300GB
> use testdb1
switched to db testdb1
> show collections
student
users
> db.student.find({},{_id:0})
{ "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
{ "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
    }
{ "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }
> db.users.find({},{_id:0})
{ "name" : "Amol", "age" : 39 }
{ "name" : "Bob", "age" : 30 }
{ "name" : "Rachna", "age" : 36 }
{ "name" : "Aadya", "age" : 3 }

Paso 2. Realizar la copia de seguridad de toda la base de datos

Utilice el siguiente código para realizar una copia de seguridad de toda la base de datos:


$./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem ‑‑sslPEMKeyPassword password123 ‑‑host pre‑mongo01.ibmcloud.com:27017 –db testdb1 ‑‑out /mongo_data/backup/

2017‑01‑24T04:14:07.252‑0500 writing testdb1.student to
2017‑01‑24T04:14:07.253‑0500 writing testdb1.users to
2017‑01‑24T04:14:07.254‑0500 done dumping testdb1.student (3 documents)
2017‑01‑24T04:14:07.254‑0500 done dumping testdb1.users (3 documents)

Pasó 3. Simular un fallo

Para simular un escenario de fallo, tiene que eliminar completamente la base de datos.

a. Conéctese a la base de datos:

> use testdb1
switched to db mydb
b. Verifique las colecciones:
> show collections
student
users
c. Verifique la base de datos actual:

> db
testdb1
d. Elimine la base de datos:

> db.dropDatabase()
{ "dropped" : "testdb1", "ok" : 1 }

Paso 4. Restaurar la base de datos testdb1

Restaure la imagen de la copia de seguridad con la utilidad mongorestore tal como se demuestra a continuación. En este ejemplo, usted restaura la imagen más reciente de la copia de seguridad que está disponible en la ubicación para las copias de seguridad /mongo_data/backup/testdb1.

$ ./mongorestore ‑‑ssl ‑‑sslCAFile
../cert/mongo.server.trust‑certs.pem ‑‑sslPEMKeyPassword password123 ‑‑host
pre‑mongo01.ibmcloud.com:27017 ‑‑db testdb1 /mongo_data/backup/testdb1

Paso 5. Verificar la base de datos y las colecciones

Para verificar que la base de datos se restauró, conéctese a ella y consulte las colecciones:

 > show dbs
testdb1 0.800GB
local 0.000GB
mydb 0.300GB
> use testdb1
switched to db testdb1
> show collections
student
users
> db.student.find({},{_id:0})
> db.users.find({},{_id:0})

Escenario 2. Se elimina accidentalmente una colección

A veces, especialmente cuando hay miles de colecciones en una base de datos, una colección se borra por error. Para recuperar una colección que se eliminó accidentalmente, hace falta la copia de seguridad más reciente de la colección (por ejemplo, colección.nombre.bson) en la ubicación de las copias de seguridad. En este escenario, muestro cómo ejecutar esas funciones con la colección student, que se elimina y recupera con la utilidad mongorestore.

Paso 1. Verificar la colección

Utilice el siguiente código para verificar la colección:

 > use testdb1
switched to db testdb1
> show collections
student
users
> db.student.find({},{_id:0})
{ "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
{ "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
}
{ "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }

Paso 2. Realizar la copia de seguridad de la colección

Realice la copia de seguridad sólo a nivel de colección:


$./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem‑‑sslPEMKeyPassword password123
‑‑host pre‑mongo01.ibmcloud.com:27017 –db testdb1 ‑‑collection student ‑‑out /mongo_data/backup

Nota: asegúrese que en la ubicación de las copias de seguridad (por ejemplo, mongo_data/backup), se crea un archivo student.bson.

Paso 3. Simular el fallo

Para simular este fallo, elimine completamente de la colección.

a. Conéctese a la base de datos:

> use testdb1
switched to db testdb1
b. Elimine la colección:
> db.student.drop()
true
c. Verifique que se eliminó el contenido:

> db.student.find({},{name:1,age:1,_id:0})

Paso 4. Restaurar la colección

Restaure la imagen más reciente de la copia de seguridad de la colección (por ejemplo, student.bson) desde la ubicación mongo_data/backup, tal como se muestra:

$./mongorestore ‑‑ssl ‑‑sslCAFile
../cert/mongo.server.trust‑certs.pem ‑‑sslPEMKeyPassword
password123 ‑‑host pre‑mongo01.ibmcloud.com:27017 ‑‑db mydb ‑‑collection student
/mongo_data/backup/testdb1/student.bson

Nota: Se puede realizar la copia de seguridad a nivel base de datos con mongodump y, en caso necesario, se puede restaurar la colección necesaria desde el directorio de copias de seguridad.

Paso 5. Verificar las colecciones

Para verificar que la colección se restauró, conéctese a la base de datos y consulte la colección:

> use testdb1
switched to db testdb1

> show collections
student
users

> db.student.find({},{_id:0})
{ "rollno" : 1, "name" : "amol", "subject" : "english", "marks" : 90 }
{ "rollno" : 2, "name" : "rachna", "subject" : "english", "marks" : 85
}
{ "rollno" : 3, "name" : "Bob", "subject" : "english", "marks" : 75 }

Cree y ejecute un script de copia de seguridad con un trabajo de cron

Para establecer la estrategia que copias de seguridad según los requisitos empresariales, hay que crear el script personalizado para copias de seguridad: run_backup.sh. Para ejecutar esta copia de seguridad también tiene que crear un trabajo de cron.

Cree el script para la copia de seguridad

El siguiente script de muestras para la copia de seguridad, run_backup.sh, se basa en las siguientes condiciones.

  • El script primero borra de la ubicación de las copias de seguridad las imágenes de las copias de seguridad que tienen una antigüedad superior a 30 días. Realiza las copias de seguridad diarias de todas las bases de datos en la ubicación de las copias de seguridad.
  • El script escribe en el archivo de registro backup.log los comentarios acerca de qué borró la acción de la copia de seguridad y cuándo se realizó. De forma predeterminada, mongodump no captura el contenido de la base de datos local. Se debe añadir de forma separada, si así lo necesita. Para identificar de forma exclusiva la copia de seguridad de la base de datos individual con el nombre de la aplicación, debe definir algunos parámetros en el script de la copia de seguridad. Esto se muestra en la siguiente sección.

Cree un directorio para copias de seguridad

  1. Inicie sesión como usuario raíz:
    #mkdir /mongo_data/backup
  2. Cambie el propietario como usuario mongo:
    #chown ‑R mongo:mongogrp /mongo_data/backup
  3. Inicie sesión como usuario mongo:
    mongo@pre‑mongo01
    $pwd
    /mongo_data/backup
  4. Cree un script para la copia de seguridad:
    mongo@pre‑mongo01:/mongo_data/backup$ vi run_backup.sh
  5. El siguiente código muestra contenido de muestra del script para la copia de seguridad:
     #/bin/bash
    cd /opt/mongodb/mongodb/bin/
    echo date >>/mongodata/backup/backup.log
    APP_NAME="app1"
    MONGO_HOST="pre‑mongo01.ibmcloud.com"
    MONGO_PORT="27017"
    TIMESTAMP=date +%F‑%H%M
    MONGODUMP_PATH="/opt/mongodb/mongodb/bin/mongodump"
    BACKUPS_DIR="/mongo_data/backup/$APP_NAME‑$TIMESTAMP"
    BACKUP_NAME="/mongo_data/backup/$APP_NAME‑$TIMESTAMP"
    mkdir ‑p $BACKUPS_DIR
    cd /opt/mongodb/mongodb/bin/
    #Borrar de  /mongo_data/backup todas las copias de seguridad con más de 30 días de antigüedad
    echo "Borrando las siguientes copias de seguridad que tienen una antigüedad superior a 30 días:" >>
        /mongo_data/backup/backup.log
    find /mongo_data/backup/ ‑type d ‑name 'app1‑∗' ‑mtime +30 >>
        /mongo_data/backup/backup.log
    find /mongo_data/backup/ ‑type d ‑name 'app1‑∗' ‑mtime +30 ‑exec rm ‑rf {}
        +
    #Ejecutar solo la copia de seguridad diaria de la base de datos 'local'.
    for databaseName in local
    do
    echo "Iniciando la copia de seguridad diaria de $databaseName ...." >>
        /mongo_data/backup/backup.log
    ./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem
        ‑‑sslPEMKeyPassword password123 ‑‑host pre‑mongo01.ibmcloud.com:27017 ‑‑db
        $databaseName >>/mongo_data/backup/backup.log
    #Ejecutar las copias de seguridad diarias de las bases de datos restantes.
    echo "Iniciando la copia de seguridad diaria de todas las bases de datos..." >>
        /mongo_data/backup/backup.log
    ./mongodump ‑‑ssl ‑‑sslCAFile ../cert/mongo.server.trust‑certs.pem
        ‑‑sslPEMKeyPassword password123 ‑‑host pre‑mongo01.ibmcloud.com:27017
        >>/mongo_data/backup/backup.log
    if [ $? != 0 ]; then
    echo "Error al hacer la copia de seguridad de $databaseName el `date +%F%T"|mailx ‑s
        "La copia de seguridad de MongoDB falló" amolbarsagade@in.ibm.com
    fi
    done
    mv /opt/mongodb/mongodb/bin/dump $BACKUP_NAME
    echodate` >> /mongo_data/backup/backup.log
    echo "Fin de la ejecución de la copia de seguridad" >> /mongo_data/backup/backup.log
    echo "‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑" >>
        /mongo_data/backup/backup.log

Otorgar permisos

Guarde el archivo y otórguele el permiso 755:

mongo@pre‑mongo01:/mongo_data/backup$ chmod 755 run_backup.sh

Cree un trabajo de cron para ejecutar el script de la copia de seguridad

Cree un nuevo trabajo de cron, llamado mycron.txt en mongo_data/backup y prográmelo según la estrategia para las copias de seguridad.

  1. Inicie sesión como el usuario mongo :
    mongo@pre‑mongo01
    :/mongo_data/backup$ pwd
    /mongo_data/backup
  2. Verifique los trabajos existentes de cron para el usuario mongo:
    mongo@pre‑mongo01:/mongo_data/backup$ crontab ‑l
    no crontab for mongo
  3. Cree un nuevo trabajo de cron:
    mongo@pre‑mongo01:/mongo_data/backup$ vi mycron.txt
  4. Añada a la planificación de las copias de seguridad para ejecutar este trabajo de cron según su estrategia para las copias de seguridad. Por ejemplo:
    30 02 ∗ ∗ ∗ /mongo_data/backup/run_backup.sh >> /mongo_data/backup/run_backup.sh.out
  5. Cree que el trabajo de cron y verifíquelo:
    mongo@pre‑mongo01:/mongo_data/backup$ crontab mycron.txt
    mongo@pre‑mongo01:/mongo_data/backup$ crontab ‑l
    30 02 ∗ ∗ ∗ /mongo_data/backup/run_backup.sh >>
    /mongo_data/backup/run_backup.sh.out

Conclusión

Usted configuró y ejecutó los scripts para las copias de seguridad de los servidores de bases de datos de MongoDB, y ahora entiende mejor cómo utilizar las utilidades mongodump y mongorestore para realizar copias de seguridad y restauraciones. Usted planificó y ejecutó el script para la copia de seguridad con un trabajo de cron. Puede utilizar el script de las copias de seguridad para planificar, mantener y gestionar las copias de seguridad de sus servidores de bases de datos MongoDB.