Wiki.Pilas.Guru

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

  1. Verificar que MongoDB está gestionado por el StatefulSet y localizar su
    Pod antes de iniciar el backup:

    kubectl get statefulset,pod,pvc -n mern
    
  2. 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
    
  3. 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
    
  4. 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())'
    
  5. 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
    
  6. 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