Files
dtic-DIIAA/docs/ambito/dtic-DASUTEN/A04.P006_Backups-DASUTEN.md
T
Ricardo MonlaandClaude Opus 4.6 db86f86e59 [MEJORA] Salida visual mejorada para pipelines DASUTEN
Se implementó mejora en la salida de comandos para hacerla más intuitiva:

Cambios realizados:
- bkps.rb: Encabezado y cierre visual con box drawing para tareas DASUTEN
- ejecutor.rb: Barra de progreso con timer en tiempo real durante ejecución
- A04.P006: Actualizado con resultados del test completo 2026-04-15

Nueva salida visual:
- Encabezado con contexto del pipeline (nombre, hora de inicio)
- Timer en vivo durante la ejecución ([1m 23s] ejecutando...)
- Cierre con estado (/) y duración total

Resultados del test completo (Pipeline FULL):
- 6 pasos completados exitosamente en 13m 15s
- DBCC CHECKDB: Integridad OK
- Todos los drones atómicos funcionaron correctamente

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 11:18:48 -03:00

16 KiB

Plan: Backups y Refresco de Base de Datos DASUTEN

Ámbito: A04 — dtic-DASUTEN

Código: A04.P006
Fecha: 15 de abril de 2026
Autor: Sistema ADN
Versión: 1.2
Estado: COMPLETADO (Pipeline completo, diferencial y latidos acumulados)
Dependencia: A04.P005 (DASUTEN sin DC), A03.P002 (Automatización Backups)

📊 Progreso

Fase Estado Avance
Fase 1: Backup de VMs Completado 100%
Fase 2: Pipeline Google Drive Completado 100%
Fase 3: Pipeline Diferencial Completado 100%
Fase 4: Integración BKPs Completado 100%
Fase 5: Mejora de Latidos Completado 100%
Fase 6: Validación Pipeline FULL Completado 100%

Resumen de Validación (2026-04-15)

Pipeline COMPLETO validado de principio a fin

  • Backup FULL exportado, transferido, subido, bajado, restaurado y verificado
  • Integridad de BD confirmada con DBCC CHECKDB: OK
  • Duración total: 13m 15s (dentro de lo estimado: ~35-40 min)
  • Todos los drones atómicos funcionaron correctamente en modo orquestado

🎯 Objetivo

Establecer un sistema de backups y refrescos de la base de datos DASUTEN que permita:

  1. Resguardar VMs del ámbito mediante vzdump (Proxmox)
  2. Refrescar la BD desde el servidor original (srvv-fenix) hacia dasu-sql4
  3. Automatizar el pipeline mediante drones atómicos integrados en bkps.rb
  4. Soportar modos completo y diferencial según frecuencia requerida

🌐 Arquitectura del Pipeline

Flujo Completo (Semanal/Mensual)

srvv-fenix (SQL Server)
    ↓ BACKUP DATABASE TO DISK = 'X:\' WITH COMPRESSION
X:\sysdasuten_FULL_YYYYMMDD_HHMMSS.bak (~1.3 GB)
    ↓ Copy local (share → /var/tmp)
srv-ns8 (/var/tmp/)
    ↓ rclone upload
Google Drive (drive_bkps-dasu)
    ↓ HTTP Download (Invoke-WebRequest)
dasu-sql4 (F:\BACKUP\)
    ↓ RESTORE DATABASE WITH REPLACE
sysdasuten ONLINE

Duración estimada: ~35-40 minutos total

Flujo Diferencial (Diario)

srvv-fenix (SQL Server)
    ↓ BACKUP DATABASE TO DISK = 'X:\' WITH DIFFERENTIAL
X:\sysdasuten_DIF_YYYYMMDD_HHMMSS.bak (~0.4-10 MB)
    ↓ Copy local (share → /var/tmp)
srv-ns8 (/var/tmp/)
    ↓ rclone upload
Google Drive (drive_bkps-dasu)
    ↓ HTTP Download (Invoke-WebRequest)
dasu-sql4 (F:\BACKUP\)
    ↓ RESTORE DATABASE WITH DIFFERENTIAL
sysdasuten ONLINE

Duración estimada: ~5-10 minutos total

Nota de Arquitectura

Un solo destino: Los backups se generan directamente en X:\ (share de srv-ns8), eliminando pasos intermedios innecesarios.

  • Antes: E:\BK_SQL\sysdasuten\X:\/var/tmp/ (3 ubicaciones)
  • Ahora: X:\/var/tmp/ (2 ubicaciones, 1 copia)

Esto simplifica el flujo y reduce puntos de falla.

📋 Tareas Configuradas (bkps.yml)

Tareas Individuales

ID Descripción Tipo Nodo
dasuten_export_full 📤 Exportar backup COMPLETO DASUTEN dasuten srvv-fenix
dasuten_export_dif 📤 Exportar backup DIFERENCIAL DASUTEN dasuten srvv-fenix
dasuten_transferir 🔄 Transferir SMB (fenix → ns8) dasuten srv-ns8
dasuten_upload ☁️ Upload a Google Drive dasuten srv-ns8
dasuten_download 📥 Download desde Google Drive dasuten dasu-sql4
dasuten_restaurar_full 💾 Restaurar backup COMPLETO dasuten dasu-sql4
dasuten_restaurar_dif 💾 Restaurar backup DIFERENCIAL dasuten dasu-sql4
dasuten_verificar Verificar integridad BD dasuten dasu-sql4

Comandos Compuestos

ID Descripción Tareas Frecuencia
dasuten_full 🔄 Pipeline COMPLETO DASUTEN export_full → transferir → upload → download → restaurar_full → verificar Semanal
dasuten_diferencial 🔄 Pipeline DIFERENCIAL DASUTEN export_dif → transferir → upload → download → restaurar_dif → verificar Diario (lun-vie)

🛸 Drones Atómicos Implementados

Dron Script Nodo Función Output JSON
exportar dasuten_exportar_srvv-fenix.rb srvv-fenix BACKUP DIRECTO A X: COMPRESSION backup_ruta_unix, backup_tipo
exportar_dif dasuten_exportar_diferencial_srvv-fenix.rb srvv-fenix BACKUP DIRECTO A X: DIFFERENTIAL backup_ruta_unix, backup_tipo
transferir dasuten_transferir_srvv-fenix-srv-ns8.rb srv-ns8 Copy share → /var/tmp backup_local, backup_origen
upload dasuten_upload_srv-ns8-drive.rb srv-ns8 rclone copy drive_ruta, drive_url
download dasuten_download_drive-dasu-sql4.rb dasu-sql4 Invoke-WebRequest backup_local, duracion
restaurar dasuten_restaurar_dasu-sql4.rb dasu-sql4 RESTORE DATABASE estado_integridad
restaurar_dif dasuten_restaurar_diferencial_dasu-sql4.rb dasu-sql4 RESTORE DATABASE DIFFERENTIAL estado_integridad
verificar dasuten_verificar-integridad_dasu-sql4.rb dasu-sql4 DBCC CHECKDB estado_integridad

Orquestadores

Script Función Uso
orquestador_pipeline.rb Pipeline completo ruby orquestador_pipeline.rb
orquestador_pipeline_diferencial.rb Pipeline diferencial ruby orquestador_pipeline_diferencial.rb --paso upload

🔧 Integración con BKPs (IMPLEMENTADO)

Procesador: adn/tools/bkps/lib/proc_dasuten.rb

El procesador Dasuten fue integrado en bkps.rb como un nuevo tipo de tarea:

'dasuten' => -> (log) { BKPs::Procesador::Dasuten.new(log) }

Funcionamiento:

  1. Cada tarea DASUTEN se mapea a un script de dron atómico
  2. El dron se lanza vía ./adn/tools/run dron lanzar
  3. La bitácora se registra automáticamente con el nodo y ámbito correspondiente
  4. El output de cada dron se guarda en /tmp/dron_*_output.json para el siguiente paso

Comandos disponibles (vía bkps.rb)

# Pipeline completo (semanal - ~35-40 min)
./adn/tools/run bkps run dasuten_full

# Pipeline diferencial (diario - ~5-10 min)
./adn/tools/run bkps run dasuten_diferencial

# Tareas individuales
./adn/tools/run bkps run dasuten_export_full    # Solo exportar completo
./adn/tools/run bkps run dasuten_export_dif     # Solo exportar diferencial
./adn/tools/run bkps run dasuten_transferir     # Solo transferir SMB
./adn/tools/run bkps run dasuten_upload         # Solo upload Drive
./adn/tools/run bkps run dasuten_download       # Solo download Drive
./adn/tools/run bkps run dasuten_restaurar_full # Solo restore completo
./adn/tools/run bkps run dasuten_restaurar_dif  # Solo restore diferencial
./adn/tools/run bkps run dasuten_verificar      # Solo verificar integridad

# Con dry-run (simulación)
./adn/tools/run bkps run dasuten_full --dry-run

# Con modo batch (sin interacción, para cron)
./adn/tools/run bkps run dasuten_diferencial --batch

Frecuencias recomendadas

Comando Frecuencia Horario Duración
dasuten_full Semanal (lunes 08:00) Inicio jornada ~35-40 min
dasuten_diferencial Diario (lun-vie 08:00) Inicio jornada ~5-10 min

📅 Frecuencia de Backups

Tipo Frecuencia Retención Horario
VMs (vzdump) Semanal (domingo 03:00) 4 semanas Madrugada
BD Completo Semanal (lunes 08:00) 4 semanas Inicio jornada
BD Diferencial Diario (lun-vie 08:00) 5 días Inicio jornada

📊 Resultados Históricos

Fecha Tipo Duración Tamaño Estado
2026-04-14 15:54 Completo 44.8s 1.33 GB
2026-04-14 16:03 Diferencial 2.44s 0.39 MB
2026-04-14 16:35 Upload Drive 23.79s 0.39 MB
2026-04-15 11:01 Pipeline FULL 13m 15s ~1.3 GB COMPLETO

Detalle Pipeline 2026-04-15 (Test Completo)

Paso Tarea Nodo Duración Estado
1 dasuten_export_full srvv-fenix 46s
2 dasuten_transferir srv-ns8 2s
3 dasuten_upload srv-ns8 7m 9s
4 dasuten_download dasu-sql4 52s
5 dasuten_restaurar_full dasu-sql4 13s
6 dasuten_verificar dasu-sql4 4m 11s

Throughput:

  • Upload a Drive: ~3 MB/s (limitado por ancho de banda de subida)
  • Download desde Drive: ~25 MB/s (HTTP directo)
  • Restore SQL: instantáneo (MOVE de archivos)
  • DBCC CHECKDB: ~1.2M páginas verificadas en 4m 11s

🧪 Sesión de Test Completa (2026-04-15)

Objetivo: Validar el pipeline completo de backup/restore usando backup FULL (no diferencial).

Ejecución Orquestada (REINICIADA)

Se utiliza el comando orquestado dasuten_full que ejecuta los 6 pasos en secuencia automáticamente.

Paso ID Tarea Dron Nodo Estado Duración
1 dasuten_export_full dasuten_exportar_srvv-fenix.rb srvv-fenix Pendiente
2 dasuten_transferir dasuten_transferir_srvv-fenix-srv-ns8.rb srv-ns8 Pendiente
3 dasuten_upload dasuten_upload_srv-ns8-drive.rb srv-ns8 Pendiente
4 dasuten_download dasuten_download_drive-dasu-sql4.rb dasu-sql4 Pendiente
5 dasuten_restaurar_full dasuten_restaurar_dasu-sql4.rb dasu-sql4 Pendiente
6 dasuten_verificar dasuten_verificar-integridad_dasu-sql4.rb dasu-sql4 Pendiente

Comando orquestado:

# Ejecución completa (6 pasos en secuencia)
./adn/tools/run bkps run dasuten_full --batch

Notas de la sesión:

  • Tipo de backup: FULL/COMPLETO (~1.3 GB esperado)
  • Ejecución: Orquestada (un solo comando, 6 pasos automáticos)
  • Heartbeats acumulados: Se prueba la nueva mejora de latidos que muestra las últimas 15 líneas del progreso en Bitácora Web

Registro de Ejecución — Test 2026-04-15

Hora Paso Resultado Duración Observaciones
11:01 🚩 TEST INICIADO Pipeline FULL orquestado (dasuten_full --batch)
11:01 1. Exportar Completado 46s Backup FULL en X:\ (srvv-fenix)
11:02 2. Transferir Completado 2s SMB: fenix → ns8 (/var/tmp/)
11:02 3. Upload Completado 7m 9s rclone: ns8 → Google Drive (~1.3 GB)
11:09 4. Download Completado 52s HTTP: Drive → dasu-sql4 (F:\BACKUP\)
11:10 5. Restore Completado 13s RESTORE DATABASE WITH REPLACE + MOVE
11:10 6. Verificar Completado 4m 11s DBCC CHECKDB — Integridad: OK
11:14 🏁 PIPELINE COMPLETADO 13m 15s Todos los pasos exitosos

Resultados clave:

  • Backup FULL de ~1.3 GB transferido correctamente
  • Google Drive como intermediario (sin dependencia de Tailscale)
  • Restore completado con MOVE a F:\DATA y F:\LOG
  • DBCC CHECKDB: Integridad OK (base de datos consistente)

Ejecuciones anteriores (descartadas):

  • Paso 4 (Restore diferencial): 14.7s — ejecutado de forma aislada, no corresponde a esta sesión FULL

⚠️ Consideraciones Técnicas

Google Drive Download

  • Virus confirmation page: Archivos >100MB requieren confirmación. Se maneja extrayendo parámetros id, uuid, confirm del HTML.
  • URL confirmada: https://drive.usercontent.google.com/download?id=...&confirm=...&uuid=...

dasu-sql4 Sleep Mode

  • La VM entra en suspensión cuando no se usa.
  • Solución: Acceso vía relay SSH desde srv-dasu con sshpass + ProxyCommand.

Base64 Encoding

  • Scripts PowerShell se codifican en base64 para transporte sobre SSH.
  • Evita problemas de escaping UTF-8 en Windows Core.

Comunicación entre Drones

  • Cada dron escribe output en /tmp/dron_*_output.json
  • El siguiente dron lee el JSON del anterior para obtener contexto
  • Formato: {"paso": "...", "backup_local": "...", "duracion": N, ...}

Módulo Común: dasu_executor.rb

Para evitar código repetido, los drones que se comunican con dasu-sql4 o srvv-fenix usan el módulo DasuExecutor:

require_relative 'lib/dasu_executor'

# Ejecutar PowerShell en dasu-sql4 vía srv-dasu
DasuExecutor.execute_ps_on_dasu(ps_script, output_path: 'C:\temp\output.json')

# Leer JSON desde dasu-sql4
resultado = DasuExecutor.read_json_from_dasu('C:\temp\output.json')

# Verificar archivo en fenix (share X:)
file_info = DasuExecutor.get_file_info_on_fenix(client, 'X:\backup.bak')

Funciones disponibles:

Función Propósito
execute_ps_on_dasu(ps_script, output_path:) Ejecuta PowerShell en dasu-sql4 vía SSH
read_json_from_dasu(output_path) Lee y parsea JSON desde dasu-sql4
execute_ps_on_fenix(client, ps_script) Ejecuta PowerShell en fenix vía xp_cmdshell
file_exists_on_fenix?(client, path) Verifica si existe archivo en fenix
get_file_info_on_fenix(client, path) Obtiene tamaño y existencia de archivo

Beneficio: El patrón SSH/PowerShell se define en un solo lugar. Si cambia, se actualiza solo el módulo.

🔗 Referencias

📝 Lecciones Aprendidas

Fecha Lección Impacto
2026-04-14 SMB password con $ requiere escape (\\$) Transferencia fallida sin escape
2026-04-14 Upload dron debe leer backup_local desde transfer output Timeout por archivo incorrecto
2026-04-14 Download dron requiere --file-id o leer desde upload output Error por falta de parámetro
2026-04-14 Pipeline diferencial: 0.39 MB vs 1.3 GB completo 90% más rápido para refrescos diarios
2026-04-14 Un solo destino (X:) vs 3 directorios Menos puntos de falla, más simple
2026-04-14 Módulo común DasuExecutor: 6 drones, 1 solo patrón -52% código, mantenibilidad
2026-04-15 Heartbeat con output acumulado en Bitácora Web Visibilidad completa del progreso de drones multi-paso

📈 Mejora de Latidos/Acumulados (2026-04-15)

Problema: Los drones de pipeline (ej: download, restaurar, verificar) muestran progreso tipo [1/3], [2/3], [3/3], pero la bitácora web solo mostraba la última línea, perdiendo el contexto del progreso.

Solución: Modificar Ejecutor#ejecutar_comando en adn/tools/cli/dron/ejecutor.rb para acumular todo el output y mostrar las últimas 15 líneas en el heartbeat web.

Resultado: La Bitácora Web ahora muestra el progreso completo acumulado:

🛸 Download desde Google Drive (`dron_152045_789`)
├─ Comando: `ruby dasuten_download_drive-dasu-sql4.rb`
└─ ❤️ 2m 30s — heartbeat #5

```text
[*] Dron: Download desde Google Drive
    Nodo: dasu-sql4
    Drive ruta: rmonla-GDrive:drive_bkps-dasu/sysdasuten.bak
    File ID: 1P0ci...
    Destino: F:\BACKUP\sysdasuten.bak

[1/3] Iniciando descarga con Rclone Nativo...
[2/3] Descargando...
[+] Descarga en 45.2s
[3/3] Verificando...
    Tamano: 1.33 MB

**Impacto:** Visibilidad en tiempo real del progreso de cada paso del pipeline, no solo la última línea.

**Documentación:** La mejora se documentó en [A01.P009_Evolucion-Dron-ADN.md](../dtic-ADN/A01.P009_Evolucion-Dron-ADN.md) como Fase F1.5b.