8. Backup y restore de MongoDB
Crear el backup
Obtener el nombre del Pod:
DB_POD=$(kubectl get pod -n mern -l app=db -o jsonpath='{.items[0].metadata.name}')
Crear el archivo dentro del Pod:
kubectl exec -n mern "$DB_POD" -- \
mongodump \
--db=mern-crud \
--archive=/tmp/mern-crud.archive
Comprobar:
kubectl exec -n mern "$DB_POD" -- ls /tmp
El archivo mern-crud.archive es binario. Es normal que:
file mern-crud.archive
devuelva:
data
Copiar el backup fuera del Pod
kubectl cp \
-n mern \
"$DB_POD":/tmp/mern-crud.archive \
./mern-crud.archive
La copia local es importante porque el archivo dentro del Pod es temporal.
Restaurar con otro nombre
El backup puede restaurarse en una base diferente sin modificar la original:
kubectl exec -n mern "$DB_POD" -- \
mongorestore \
--archive=/tmp/mern-crud.archive \
--nsFrom='mern-crud.*' \
--nsTo='mern-crud-restore.*'
Comprobar las colecciones:
kubectl exec -n mern "$DB_POD" -- \
mongosh --quiet --eval \
'db.getSiblingDB("mern-crud-restore").getCollectionNames()'
Comparar documentos:
kubectl exec -n mern "$DB_POD" -- \
mongosh --quiet --eval \
'print("original:", db.getSiblingDB("mern-crud").users.countDocuments()); print("restore:", db.getSiblingDB("mern-crud-restore").users.countDocuments())'
Resultado esperado:
original: 2
restore: 2
Resultado
MongoDB
-> mongodump
-> archivo externo
-> mongorestore
-> base restaurada
Pruebas a realizar
-
Verificar que MongoDB está gestionado por el StatefulSet y localizar su
Pod antes de iniciar el backup:kubectl get statefulset,pod,pvc -n mern -
Comprobar que el archivo fue creado dentro del Pod y revisar su tamaño:
kubectl exec -n mern "$DB_POD" -- ls -lh /tmp/mern-crud.archive -
Después de copiarlo al equipo local, verificar que existe y comparar su
tamaño con el archivo temporal del Pod:ls -lh ./mern-crud.archive kubectl exec -n mern "$DB_POD" -- ls -lh /tmp/mern-crud.archive -
Comparar las colecciones y el número de documentos de la base original y
de la base restaurada:kubectl exec -n mern "$DB_POD" -- \ mongosh --quiet --eval \ 'printjson(db.getSiblingDB("mern-crud").getCollectionNames()); printjson(db.getSiblingDB("mern-crud-restore").getCollectionNames())' -
Eliminar y recrear
db-0, y comprobar que el backup copiado localmente no
depende del ciclo de vida del Pod:kubectl delete pod db-0 -n mern kubectl wait --for=condition=ready pod/db-0 -n mern --timeout=120s ls -lh ./mern-crud.archive -
Como prueba controlada, restaurar nuevamente con otro nombre, por ejemplo
mern-crud-restore-2, y comparar el resultado. Esto permite repetir el
procedimiento sin sobrescribir la base original.
El archivo dentro de /tmp sí se pierde cuando desaparece el Pod. La copia
local o cualquier almacenamiento externo es la que constituye el backup.
Aprendizajes del despliegue
mongodumpgenera una copia lógica de la base de datos, no una instantánea del volumen.kubectl execpermite ejecutar herramientas dentro del contenedor de MongoDB.kubectl cpextrae el archivo fuera del Pod para separarlo de su ciclo de vida.- Un archivo temporal dentro del contenedor no es un backup operativo hasta que se copia a una ubicación persistente y controlada.
mongorestorepuede restaurar con otros nombres de base para validar el contenido sin alterar el original.- Comparar colecciones y conteos permite verificar que la restauración produjo datos utilizables.
- El backup debe planificarse considerando consistencia, frecuencia, retención y ubicación externa.
- Tener un StatefulSet y un PVC no sustituye la necesidad de realizar backups.