Cómo generar respaldos automáticos de MongoDB en Ubuntu y subirlos a AWS S3

Uno de nuestros proyectos utiliza como base de datos MongoDB y vimos la necesidad de poder generar respaldos y subirlos a un servidor externo para protección de los mismos.

Una de las opciones es contratar un servicio de terceros que maneje la base de datos por nosotros y que por lo general incluye manejo de respaldos. Otra de las opciones es hacerlo en nuestro propio servidor, y en este artículo les explicaré el cómo hacerlo.

Requisitos

Obviamente necesitamos tener MongoDB instalado. Los pasos para instalarlo lo encuentran en la documentación de MongoDB pero en resumen son los siguientes:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org

El siguiente requisito es tener instalado el cliente de consola de AWS, de igual manera, los pasos están en la documentación de AWS. Y en breves cuentas es (sin tomar en cuenta pre-requisitos como python y/o pip):

pip install awscli --upgrade --user

Luego de tener instalado, debemos configurar el cliente de AWS, para información detalla, mira la documentación, la forma fácil es corriendo el siguiente comando:

aws configure
AWS Access Key ID [None]: KEY
AWS Secret Access Key [None]: SECRET
Default region name [None]: region
Default output format [None]: json

Ya tengo los pre-requisitos, ¿cómo genero el respaldo?

Muy pero muy fácil, con el siguiente comando generaremos un respaldo de todas nuestras bases en MongoDB y los guardarmos en la carpeta respaldos:

mongodump --out ~/respaldos

Para información más detallada y diferentes opciones de respaldo por favor revisa la documentación oficial

Luego de eso por facilidad podemos empaquetar la carpeta por ejemplo con tar

tar czf respaldo_db.tar.gz ~/respaldos

Y… ¿Cómo lo subo a AWS S3?

Con el siguiente comando haremos la magia:

aws s3 cp respaldo.tar.gz s3://mi_bucket/respaldos_db/

Poniendo todo junto

Ahora es cuestión de hacer unos pequeños cambios para poder poner todo en un script y que se ejecute automáticamente todos los días.

El primer cambio es darle un nombre único al archivo de respaldo, así podemos guardar varios archivos sin reemplazar el anterior, lo fácil es basarnos en la fecha y hora actual, algo como esto hace el truco:

backup_name=~/db_backups-`date +%Y-%m-%d-%H%M`

Y luego la idea es generar un script, por facilidad se puede colocar en ~/bin

Este es un ejemplo de lo que puede contener el script:

backup_name=~/db_backups-`date +%Y-%m-%d-%H%M`
mongodump --out $backup_name
tar czf $backup_name.tar.gz $backup_name
aws s3 cp $backup_name.tar.gz s3://mi_bucket/respaldos/
rm -rf $backup_name
rm $backup_name.tar.gz

Y por último agregamos una tarea en cron para que se ejecute todos los días, para editar cron este comando nos será de utilidad:

crontab -e

En el archivo que se abre colocamos algo como lo siguiente:

0 0 * * * /bin/bash ~/bin/db-backups.sh >> ~/logs/db_backups.log 2>&1

Con eso le decimos a cron que todos los días a media noche genere un respaldo.

Para comprobarlo podemos o bien ejecutar el comando a mano:

/bin/bash ~/bin/db-backups.sh

O bien esperar al siguiente día y verificar en nuestra cuenta de Amazon Web Services que el archivo esté creado.

Como ven, el proceso es sencillo, debemos seguir algunos pasos y ya tendremos nuestros respaldos en un servicio externo. Obviamente una buena práctica es verificar que los respaldos funcionan haciendo pruebas ya sea en un ambiente local o en algún servidor para verificar que los datos se pueden restaurar y que sí nos servirán cuando tengamos una contingencia con nuestro servidor.


Si te gustó esta historia, aplaude tantas veces como quieras y para ver historias similares acerca de tecnología, mira nuestras publicaciones y escribe en los comentarios cualquier duda que tengas.

Si necesitas un equipo que te ayude a implementar tus ideas en React JS o Nativo, no dudes en avisarnos. Puedes ir a nuestro sitio web y llenar el formulario para que iniciemos el contacto.

English version

Gustavo
Mail: gustavo@alturasoluciones.com
Twitter: @Aguardientico
LinkedIn: www.linkedin.com/in/gustavoagonzalez
Blog personal: http://aguardientech.blogspot.com