Saltearse al contenido

Backup y Recuperación ante Desastres

Tabla de Contenidos

  1. Propósito
  2. Configuración de Backup de MongoDB Atlas
  3. Procedimientos de Backup Manual
  4. Procedimientos de Restauración
  5. Redundancia de Azure Storage
  6. Escenarios de Recuperación ante Desastres
  7. Procedimientos de Pruebas de Recuperación

Propósito

Este documento describe los procedimientos de backup y recuperación ante desastres para la plataforma Algesta, incluyendo backups automatizados de MongoDB Atlas, procedimientos de backup manual, operaciones de restauración y escenarios de recuperación ante desastres.


Configuración de Backup de MongoDB Atlas

Configuración de Terraform (desde modules/Base de datos/MongoDB/main.tf:23):

resource "mongodbatlas_cluster" "cluster" {
cloud_backup = true
auto_scaling_disk_gb_enabled = true
mongo_db_major_version = "7.0"
provider_instance_size_name = "M0" # Free tier
}

Funcionalidades de Backup (M0 Free Tier):

  • Snapshots Automatizados: Snapshots diarios
  • Retención: 2 días (limitación del tier gratuito)
  • Restauración Point-in-Time: No disponible en M0 (requiere M10+)
  • Almacenamiento: Incluido en el tier gratuito

Recomendaciones para Producción:

  1. Actualizar a M10+ para:

    • Backup continuo (restauración point-in-time a cualquier segundo en los últimos 7 días)
    • Calendarios de backup personalizados
    • Periodos de retención más largos (7-90 días)
    • Pruebas de restauración automatizadas
  2. Configurar Calendario de Backup:

resource "mongodbatlas_cloud_backup_schedule" "backup_schedule" {
project_id = var.project_id
cluster_name = mongodbatlas_cluster.cluster.name
reference_hour_of_day = 3 # 3 AM UTC
reference_minute_of_hour = 0
restore_window_days = 7
policy_item_hourly {
frequency_interval = 6 # Every 6 hours
retention_unit = "days"
retention_value = 2
}
policy_item_daily {
frequency_interval = 1 # Daily
retention_unit = "days"
retention_value = 7
}
policy_item_weekly {
frequency_interval = 1 # Weekly (Sunday)
retention_unit = "weeks"
retention_value = 4
}
policy_item_monthly {
frequency_interval = 1 # Monthly
retention_unit = "months"
retention_value = 12
}
}

Visualización de Backups en Atlas:

  1. Iniciar sesión en MongoDB Atlas: https://cloud.mongodb.com
  2. Navegar a Project → Clusters → [Nombre del Cluster] → Backup
  3. Ver snapshots disponibles y puntos de restauración

Procedimientos de Backup Manual

mongodump (Backup Manual)

Backup Completo de Base de datos:

Ventana de terminal
# Set MongoDB URI (from Kubernetes secret or Azure Key Vault)
MONGODB_URI="mongodb+srv://admin:SecurePassword@cluster.mongodb.net/algesta?retryWrites=true&w=majority"
# Backup all databases
mongodump --uri="$MONGODB_URI" \
--out=/backups/algesta-$(date +%Y%m%d-%H%M%S) \
--gzip
# Backup specific database
mongodump --uri="$MONGODB_URI" \
--db=orders_db \
--out=/backups/orders-$(date +%Y%m%d-%H%M%S) \
--gzip

Subir a Azure Storage:

Ventana de terminal
# Install Azure CLI if not available
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Authenticate
az login
# Upload backup to Azure Storage
az storage blob upload-batch \
--account-name storagealgestaproduction \
--destination data \
--source /backups/algesta-20251120-100000 \
--pattern "*"

Script de Backup Automatizado (backup.sh):

#!/bin/bash
set -e
# Configuration
MONGODB_URI=$(kubectl get secret mongodb-credentials -n production -o jsonpath='{.data.uri}' | base64 -d)
BACKUP_DIR="/tmp/backups"
BACKUP_NAME="algesta-$(date +%Y%m%d-%H%M%S)"
AZURE_STORAGE_ACCOUNT="storagealgestaproduction"
AZURE_CONTAINER="data"
# Create backup directory
mkdir -p $BACKUP_DIR
# Run mongodump
echo "Starting backup: $BACKUP_NAME"
mongodump --uri="$MONGODB_URI" \
--out=$BACKUP_DIR/$BACKUP_NAME \
--gzip
# Upload to Azure Storage
echo "Uploading to Azure Storage..."
az storage blob upload-batch \
--account-name $AZURE_STORAGE_ACCOUNT \
--destination $AZURE_CONTAINER \
--source $BACKUP_DIR/$BACKUP_NAME \
--pattern "*"
# Cleanup local backup
rm -rf $BACKUP_DIR/$BACKUP_NAME
echo "Backup completed: $BACKUP_NAME"

Programar con Kubernetes CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
name: mongodb-backup
namespace: production
spec:
schedule: "0 3 * * *" # Daily at 3 AM
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: mongo:7.0
command: ["/bin/sh", "-c"]
args:
- |
apt-get update && apt-get install -y azure-cli
/backup.sh
env:
- name: MONGODB_URI
valueFrom:
secretKeyRef:
name: mongodb-credentials
key: uri
volumeMounts:
- name: backup-script
mountPath: /backup.sh
subPath: backup.sh
volumes:
- name: backup-script
configMap:
name: backup-script
defaultMode: 0755
restartPolicy: OnFailure

Procedimientos de Restauración

Restaurar desde Snapshot de MongoDB Atlas

Vía Interfaz de Atlas:

  1. Iniciar sesión en MongoDB Atlas
  2. Navegar a Cluster → Backup → Snapshots
  3. Seleccionar snapshot → Restore
  4. Elegir opción de restauración:
    • Restauración automatizada: Restaura al mismo cluster (sobrescribe datos)
    • Restauración point-in-time: Seleccionar timestamp específico (solo M10+)
    • Descargar: Descargar snapshot para restauración manual
  5. Confirmar restauración (requiere tiempo de inactividad del cluster)

Tiempo de Inactividad Estimado:

  • Clusters M0/M2: 10-15 minutos
  • Clusters M10+: 5-10 minutos

Restaurar desde Backup de mongodump

Descargar Backup desde Azure Storage:

Ventana de terminal
# List available backups
az storage blob list \
--account-name storagealgestaproduction \
--container-name data \
--output table
# Download specific backup
az storage blob download-batch \
--account-name storagealgestaproduction \
--source data \
--destination /tmp/restore \
--pattern "algesta-20251120-100000/*"

Restaurar a MongoDB:

Ventana de terminal
# Restore full database
mongorestore --uri="$MONGODB_URI" \
--gzip \
--dir=/tmp/restore/algesta-20251120-100000
# Restore specific database
mongorestore --uri="$MONGODB_URI" \
--db=orders_db \
--gzip \
--dir=/tmp/restore/algesta-20251120-100000/orders_db
# Restore with drop (replaces existing data)
mongorestore --uri="$MONGODB_URI" \
--drop \
--gzip \
--dir=/tmp/restore/algesta-20251120-100000

Verificación:

Ventana de terminal
# Connect to MongoDB and verify data
mongosh "$MONGODB_URI" --eval "db.orders.countDocuments()"
# Check specific collection
mongosh "$MONGODB_URI" --eval "db.orders.find().limit(5)"

Redundancia de Azure Storage

Configuración Actual:

  • Storage Account: storagealgestaproduction
  • Replicación: LRS (Locally Redundant Storage) - 3 copias en un solo datacenter
  • Contenedores:
    • tf-state: Archivos de estado de Terraform
    • data: Datos de aplicación, backups

Recomendaciones para Producción:

Actualizar a GRS (Geo-Redundant Storage):

Ventana de terminal
az storage account update \
--name storagealgestaproduction \
--resource-group rg-algesta-production \
--sku Standard_GRS

Beneficios de GRS:

  • 6 copias totales (3 en región primaria, 3 en región secundaria)
  • Protege contra desastres regionales
  • 99.99999999999999% (16 nueves) de durabilidad

Habilitar Versionado de Blobs (para protección contra eliminación accidental):

Ventana de terminal
az storage account blob-service-properties update \
--account-name storagealgestaproduction \
--enable-versioning true

Configurar Gestión del Ciclo de Vida (auto-eliminar backups antiguos):

{
"rules": [
{
"enabled": true,
"name": "delete-old-backups",
"type": "Lifecycle",
"definition": {
"filters": {
"blobTypes": ["blockBlob"],
"prefixMatch": ["data/algesta-"]
},
"actions": {
"baseBlob": {
"delete": {
"daysAfterModificationGreaterThan": 90
}
}
}
}
}
]
}

Escenarios de Recuperación ante Desastres

Escenario 1: Eliminación Accidental de Datos

Impacto: Usuario elimina accidentalmente datos críticos (ej., todas las órdenes)

Pasos de Recuperación:

  1. Detener todas las escrituras para prevenir sobrescritura de backups

    Ventana de terminal
    kubectl scale deployment/api-gateway-production --replicas=0 -n production
  2. Identificar punto de restauración

    • Verificar snapshots de MongoDB Atlas (últimos 2 días)
    • O usar backup manual desde Azure Storage
  3. Restaurar datos (ver Procedimientos de Restauración)

  4. Verificar integridad de datos

    Ventana de terminal
    mongosh "$MONGODB_URI" --eval "db.orders.countDocuments()"
  5. Reanudar Operaciones

    Ventana de terminal
    kubectl scale deployment/api-gateway-production --replicas=2 -n production

Prevención:

  • Implementar eliminaciones lógicas (marcar como eliminado, no eliminar realmente)
  • Requerir rol de administrador para operaciones destructivas
  • Habilitar restauración point-in-time de MongoDB Atlas (M10+)

Escenario 2: Falla Completa del Cluster de Base de datos

Impacto: Cluster de MongoDB Atlas se vuelve no disponible

Pasos de Recuperación:

  1. Verificar Estado de MongoDB Atlas:

  2. Si el cluster está corrupto:

    • Crear nuevo cluster en MongoDB Atlas
    • Restaurar desde último snapshot o backup manual
  3. Actualizar cadena de conexión en Kubernetes:

    Ventana de terminal
    kubectl create secret generic mongodb-credentials \
    --from-literal=uri="<new-cluster-uri>" \
    --namespace=production \
    --dry-run=client -o yaml | kubectl apply -f -
    kubectl rollout restart deployment -n production
  4. Verificar conectividad:

    Ventana de terminal
    kubectl logs -l app=api-gateway -n production | grep "MongoDB connected"

RTO (Objetivo de Tiempo de Recuperación): 30-60 minutos RPO (Objetivo de Punto de Recuperación): Hasta 24 horas (backups diarios)

Mejora: Actualizar a M10+ para backup continuo (RPO: < 1 minuto)


Escenario 3: Falla del Cluster AKS (Interrupción Regional)

Impacto: Región Azure East US no disponible, cluster AKS caído

Pasos de Recuperación:

  1. Crear nuevo cluster AKS en región secundaria (ej., West US):

    Ventana de terminal
    cd ops-algesta/infrastructure/envs/production/Azure
    # Update variables.tf: location = "West US"
    terraform apply
  2. Desplegar aplicaciones al nuevo cluster:

    Ventana de terminal
    az aks get-credentials --resource-group rg-algesta-production-west --name aks-algesta-production-west
    kubectl apply -f ops-algesta/resources-k8s/
  3. Actualizar DNS para apuntar al nuevo ingress:

    Ventana de terminal
    # Get new ingress IP
    kubectl get ingress ingress-production -n production
    # Update DNS A record: algesta-api-prod.3astronautas.com → <new-ip>
  4. Verificar servicios:

    Ventana de terminal
    curl https://algesta-api-prod.3astronautas.com/health

RTO: 2-4 horas (aprovisionamiento manual) RPO: 0 (MongoDB Atlas no afectado por interrupción de AKS)

Mejora: Despliegue multi-región de AKS con Azure Traffic Manager


Procedimientos de Prueba de Recuperación

Procedimiento Trimestral de Prueba de DR:

  1. Anunciar ventana de prueba (ej., Sábado 2 AM - 6 AM)

  2. Crear base de datos de prueba de MongoDB:

    Ventana de terminal
    mongorestore --uri="$TEST_MONGODB_URI" --db=orders_test --dir=/backups/latest
  3. Probar tiempo de restauración:

    Ventana de terminal
    time mongorestore --uri="$TEST_MONGODB_URI" --drop --dir=/backups/latest
  4. Verificar integridad de datos:

    Ventana de terminal
    mongosh "$TEST_MONGODB_URI" --eval "db.orders.countDocuments()"
  5. Documentar resultados:

    • Duración de restauración
    • Completitud de datos
    • Problemas encontrados
  6. Actualizar runbooks basado en hallazgos

Calendario de Pruebas:

  • Prueba completa de DR: Trimestral
  • Verificación de backup: Mensual
  • Prueba de tiempo de restauración: Mensual

Documentación Relacionada:

Para Soporte:

  • MongoDB Atlas: https://cloud.mongodb.com → Support
  • Azure Storage: Azure Portal → Storage Accounts
  • Contactos de emergencia: Equipo DevOps, administradores de base de datos