El manual de migración de sistemas heredados: oleadas, ejecución en paralelo y recuentos y checksums idénticos
Toda empresa tiene un sistema que nadie quiere tocar: una base de datos antigua, un monolito, dos herramientas que deben seguir sincronizadas. Las migraciones de golpe de esos sistemas son donde se pierden fines de semana y reputaciones. Lo que funciona es aburrido a propósito: primero mapear, mover por oleadas, ejecutar lo viejo y lo nuevo en paralelo y cambiar solo cuando los números son idénticos. Este es el manual que uso, con los proyectos en los que funcionó.
11 min de lectura
1. Por qué fallan las migraciones de golpe
Una migración de golpe lo apuesta todo a una noche: todos los datos, todas las funciones y todos los usuarios cambian a la vez. Si algo está mal, lo descubres en producción y sin vuelta atrás que no pierda el trabajo hecho desde entonces. Además, el sistema viejo deja de recibir cambios durante meses mientras se construye el nuevo, y el negocio espera.
Los proyectos de esta web que salieron bien evitaron esa apuesta. Un ERP y un CRM siguieron en uso diario con los mismos datos mientras se conectaban en ambos sentidos. Registros sanitarios muy sensibles pasaron entre dos sistemas públicos sin perder ninguno. Bases de datos de clientes se movieron a un clúster de Kubernetes con recuentos y checksums idénticos. Sistemas distintos, el mismo patrón.
2. Primero mapea el sistema viejo, con IA leyendo el código
Antes de cualquier plan, haz un mapa: qué componentes hay, qué datos posee cada uno, qué interfaces los conectan con el exterior, qué procesos corren de noche y qué personas y equipos dependen de qué. Los sistemas viejos esconden su comportamiento real en sitios que nadie recuerda: un procedimiento almacenado, un cron, una exportación CSV que alguien abre cada lunes.
Aquí es donde la IA más ha cambiado el trabajo. Un agente de código puede leer una base de código antigua y grande, listar puntos de entrada y flujos de datos y redactar el mapa, y lo que hace falta son días de revisión en lugar de semanas de lectura. Sigo verificando cada hallazgo importante contra el sistema en marcha, pero el primer borrador ya no es lo que más tarda. Pregunta también a los usuarios: la exportación que nadie documentó es la que para las nóminas.
3. Elige una estrategia por componente, no una para todo
No todas las piezas merecen reescribirse. La guía de migración de AWS recoge las estrategias habituales: retirar, mantener, rehospedar, reubicar, replataformar, recomprar y refactorizar. Úsalas por componente: el módulo de informes que nadie usa se retira, el proceso por lotes estable se rehospeda tal cual, la base de datos pasa a un servicio gestionado y solo se refactoriza la parte que frena al negocio.
Así el trabajo caro se queda donde compensa. En un proyecto de automoción, una aplicación regulada pasó a Azure Kubernetes Service, todo en Terraform, sin aflojar ni un solo control, y los costes cloud quedaron en torno a un 25 % más bajos. El ahorro vino de elegir con cuidado qué cambiar, no de cambiarlo todo.
4. Oleadas por capacidad de negocio, detrás de una fachada
Divide la migración en oleadas que tengan sentido para el negocio: primero la facturación, luego las cuentas de cliente, luego los informes. Cada oleada es lo bastante pequeña para probarla bien y deshacerla por separado. Evita cortar por capas técnicas («primero la base de datos, luego el backend»): una función a medio mover es el estado más difícil de operar.
Pon una fachada delante, el patrón strangler fig del Azure Architecture Center: usuarios y otros sistemas hablan con la fachada, y esta envía cada función al sistema viejo o al nuevo. Mover una función se convierte en un cambio de enrutamiento que puedes revertir en minutos. Oleada tras oleada, el sistema viejo encoge hasta que ya no le llega nada.
5. Mover datos sin perder ni un registro
Los datos se mueven en dos fases: una copia masiva de todo y después captura de cambios (CDC), que mantiene al día el lado nuevo hasta el cambio. Servicios gestionados como Azure Database Migration Service y AWS DMS hacen ambas cosas para las bases de datos habituales. Donde dos sistemas deben ir a la par durante más tiempo, pon una cola entre ellos.
Así funcionaba el middleware de los datos sanitarios: funciones serverless en Azure con Azure Queue Storage entre los dos sistemas públicos. Si un lado no estaba disponible, los registros esperaban en la cola en lugar de perderse, y se entregaban cuando volvía. Reintentos, procesamiento idempotente y una cola de mensajes fallidos que alguien vigila de verdad convierten «esperamos que no se haya perdido nada» en «podemos demostrar que no se perdió nada».
6. Ejecución en paralelo, recuentos y checksums
Antes de cambiar una oleada para siempre, ambos sistemas procesan la misma entrada y comparas los resultados: totales, facturas, informes, los números que la gente usa de verdad. Para los datos, compara por tabla y por oleada: el número de filas y un checksum del contenido en un orden fijo. AWS DMS trae una validación que compara origen y destino fila a fila; para lo demás, basta una consulta como la de abajo en ambos lados.
Acuerda la regla antes: si los recuentos o los checksums no coinciden, la oleada no cambia, por cerca que esté la fecha. Cuando en el proyecto FinOps las bases de datos de clientes se movieron a un clúster de Kubernetes con CloudNativePG, recuentos y checksums eran idénticos antes de cambiar un solo cliente.
-- Run on the old and the new database, per table and per wave (PostgreSQL)
SELECT 'invoices' AS table_name,
count(*) AS row_count,
md5(string_agg(md5(t::text), '' ORDER BY t.id)) AS checksum
FROM invoices t;
-- Same result on both sides, or the wave does not switch.7. El cambio, con una vuelta atrás probada
El cambio de una oleada es una rutina corta y ensayada: congelar las escrituras de los datos de la oleada, dejar que lleguen los últimos cambios, comparar recuentos y checksums una última vez, cambiar la fachada y vigilar las métricas de negocio. Deja el lado viejo funcionando en solo lectura un tiempo, para poder consultar y para que la vuelta atrás siga siendo posible.
Un plan de vuelta atrás que nunca se ejecutó no es un plan. Ensáyalo con una copia: devolver la fachada, reaplicar los cambios hechos en el lado nuevo y volver a comprobar los números. Cuando todos lo han visto funcionar una vez, el día del cambio es tranquilo en lugar de heroico.
8. Termina el trabajo: apaga lo viejo y déjalo como código
Una migración termina cuando el sistema viejo ha desaparecido, no cuando el nuevo está en marcha. Archiva lo que debas guardar por motivos legales, apaga el lado viejo, cancela sus licencias y contratos y borra lo que no hace falta. Si no, pagas dos sistemas y el viejo mantiene vivo un riesgo de seguridad.
Y construye el lado nuevo como código desde el primer día, para que el próximo cambio sea un pull request y no otra migración. En el proyecto de automoción todo entró como Terraform, con políticas que se aplican a todos los equipos: la plataforma a la que migras debería ser más fácil de cambiar que la que dejas.
Conclusión
Migra como un contable, no como un héroe: primero el mapa, oleadas detrás de una fachada, ambos lados en paralelo y el cambio solo con recuentos y checksums idénticos.
Fuentes y guías oficiales
- Azure Architecture Center: Strangler Fig pattern
- Azure Architecture Center: Anti-corruption Layer pattern
- AWS Prescriptive Guidance: migration strategies
- Azure Database Migration Service overview
- AWS DMS: data validation
- Azure Queue Storage introduction
- Azure Architecture Center: Competing Consumers pattern
- CloudNativePG documentation
Más artículos
- 3.025 pull requests en diez meses: un proceso de entrega con IA, desde dentro
- La Ley de IA de la UE para medianas empresas: qué te aplica y desde cuándo
- FinOps para el gasto en IA: tokens, caché, enrutado y presupuestos que aguantan
- Hacer visible una red de restaurantes en las respuestas de la IA: un proyecto GEO paso a paso
- Cómo está hecha esta web: estática donde se puede, en streaming donde hace falta
- Costes de Kubernetes en EKS y GKE: el mismo método, otras palancas
- Una landing zone para empresas medianas, en Terraform o Bicep: las piezas que importan
- Seguridad de MCP a fondo: dejar entrar a los asistentes de IA en tu producto sin abrir las puertas
- Monitorizar resultados de negocio: paneles en verde, caja vacía
- Agentes de IA por teléfono: la arquitectura y los tropiezos que ninguna demo enseña
- Pruebas de restauración: un backup que nunca has restaurado es solo una esperanza
- Respuestas de IA en streaming en Azure Static Web Apps: la cabecera que lo retenía todo
- Construir un asistente de IA para WhatsApp de principio a fin: lo que hace falta más allá de la demo
- Sistemas air-gapped: software crítico sin conexión a internet
- IA en producción en AWS: Amazon Bedrock y AgentCore en una configuración privada
- IA en producción con Microsoft Foundry: una configuración de referencia privada para agentes
- /goal, /loop o rutinas: deja de vigilar a tu agente de programación
- Los nuevos planes de Claude: Max, Ultra y lo que significan para los equipos
- OpenAI Codex a finales de 2026: goal mode, dots y cómo blindarlo
- ¿GitHub Copilot, Claude Code o Codex? Cómo elegiría para una empresa
- Fundamentos de GEO: cómo aparecer en las respuestas de la IA
- IA en producción en Google Cloud: de Vertex AI a Gemini Enterprise Agent Platform
- LLM locales en una red air-gapped: IA para tus datos más sensibles
- Quiero ejecutar un LLM local: ¿qué servidor compro?
- MiniMax M3: ¿un modelo puntero que puedes ejecutar tú mismo?
- Investigación de prompts a gran escala con un modelo abierto
- SEO y GEO juntos: una auditoría práctica en 6 pasos
- Dimensionar bien Kubernetes: el método que llevó un clúster de 7 a 4 nodos
- IA privada para datos sensibles: un LLM local que supera la revisión de seguridad
- Del prototipo con IA a producción: las ocho capas que añado, en este orden
