Marcio Cunha

Cómo migrar bases de datos de un monolito sin downtime

Descubre cómo aplicar el patrón Strangler Fig en bases de datos relacionales y garantizar sincronización bidireccional en transiciones críticas hacia microservicios.

Marcio Cunha•4 min
También disponible en:EnglishPortuguês
Resumen
  • Migrar datos de un monolito requiere fragmentar la base de datos sin interrumpir las operaciones del sistema en producción
  • El patrón Strangler Fig se centra en aislar dominios de negocio gradualmente en lugar de reescribir todo de una vez
  • La sincronización bidireccional mediante Change Data Capture evita la pérdida de datos durante la transición de lectura y escritura
  • Dos fases de transición garantizan que el nuevo microservicio asuma el flujo de datos con total seguridad
  • Las pruebas de consistencia paralela validan si el nuevo sistema responde exactamente igual a la base de datos heredada

Por qué migrar la base de datos es el mayor desafío de los microservicios

Cuando decidimos transformar un sistema monolítico (una aplicación única donde todo el código y la base de datos conviven juntos) en microservicios (pequeños servicios independientes), el mayor dolor de cabeza no es reescribir el código, sino separar los datos. En un monolito, diferentes tablas se comunican entre sí mediante claves foráneas y consultas complejas conocidas como JOINs. En la práctica, esto significa que romper una base de datos gigante en piezas más pequeñas sin interrumpir la operación requiere una cirugía de altísima precisión.

Muchos equipos intentan hacer este cambio de golpe, apagando el sistema el viernes por la noche y encendiéndolo el lunes con la nueva arquitectura. Este método, conocido como big bang, casi siempre resulta en fallas catastróficas, datos corruptos y horas de inactividad que enfurecen a los usuarios. Para evitar el caos, debemos adoptar estrategias incrementales que nos permitan actualizar la infraestructura de datos con el motor en marcha, garantizando la continuidad del negocio. Si quieres entender los fundamentos de esta separación en sistemas heredados, vale la pena revisar nuestra guía sobre cómo desacoplar bases de datos en microservicios heredados antes de avanzar.

Aplicando el patrón Strangler Fig a los datos

El patrón Strangler Fig (inspirado en una higuera que envuelve un árbol huésped hasta reemplazarlo) propone sustituir el sistema antiguo de forma gradual. Cuando se aplica a bases de datos, nos impide mover todas las tablas a la vez. En su lugar, elegimos un dominio de negocio específico —como el registro de clientes— y creamos una nueva base de datos dedicada exclusivamente a él, mientras el resto del monolito permanece intacto en la base heredada.

En la práctica, esto significa construir una capa de enrutamiento intermedia que decide a dónde va cada solicitud de lectura o escritura. Si la aplicación necesita consultar datos del cliente migrado, accede al nuevo servicio; si necesita productos, sigue consultando el monolito heredado. Esta convivencia pacífica reduce drásticamente el riesgo del cambio, ya que cualquier problema localizado se puede revertir rápidamente sin comprometer todo el ecosistema.

Sincronización bidireccional con Change Data Capture

Durante el período de transición, la aplicación antigua y el nuevo microservicio deben coexistir operando sobre datos similares, lo que genera el desafío crítico de la consistencia. Si un cliente actualiza su dirección en la interfaz antigua, ese cambio debe reflejarse inmediatamente en la nueva base de datos, y viceversa. Para resolver esto sin crear un acoplamiento frágil en el código, utilizamos Change Data Capture, una tecnología que monitorea el registro de transacciones de la base heredada y replica los eventos en tiempo real.

Herramientas como Debezium escuchan cada inserción, actualización o eliminación realizada en la base principal y publican estos eventos en un gestor de colas, como Apache Kafka. El nuevo microservicio consume estos eventos y actualiza su propia base de datos de forma asíncrona. Este flujo bidireccional garantiza que ambos extremos permanezcan sincronizados, permitiendo al equipo realizar pruebas de estrés y validaciones de rendimiento sin miedo a perder información crítica.

Paso a paso de la transición en fases seguras

Para ejecutar la migración sin downtime, dividimos el proceso en etapas controladas que evitan cuellos de botella operativos y protegen la integridad de la información transaccional.

La primera etapa consiste en configurar la replicación asíncrona de los datos heredados hacia la nueva base, asegurando que el nuevo microservicio reciba una copia espejada y actualizada de todo el historial operativo.

La segunda etapa implica redirigir únicamente las operaciones de lectura hacia el nuevo servicio, manteniendo las escrituras en el monolito para una validación rigurosa de los resultados entregados al usuario final.

La tercera etapa realiza el cambio definitivo de las operaciones de escritura, convirtiendo al nuevo microservicio en la fuente primaria de verdad para ese dominio de negocio específico.

Manejo de conflictos y garantía de consistencia eventual

Incluso con una sincronización eficiente, el retraso en la red (latencia) puede crear pequeñas ventanas donde los datos difieren entre el monolito y el microservicio. En arquitecturas distribuidas, aceptamos que la consistencia no es inmediata en todas partes, pero debe converger rápidamente hacia un estado correcto. Para mitigar este efecto, implementamos rutinas de reconciliación en segundo plano que verifican discrepancias y corrigen eventuales desincronizaciones antes de que afecten al usuario.

Además, cuando surgen ralentizaciones inesperadas durante esta fase de transición, es fundamental contar con herramientas de observabilidad para rastrear dónde se esconde el cuello de botella. Si deseas profundizar en cómo monitorear fallas de rendimiento en esta etapa, consulta nuestra guía sobre microservicios lentos y cómo depurar cuellos de botella con OpenTelemetry. Identificar latencias a tiempo evita que los problemas de base de datos se propaguen por el sistema.

Consideraciones finales sobre la migración de datos

Migrar bases de datos de un monolito a microservicios sin downtime no es un proyecto puramente técnico, sino un ejercicio de gestión de riesgos y arquitectura evolutiva. El secreto del éxito radica en fragmentar el problema en partes más pequeñas, mantener los sistemas heredados operando en paralelo con la ayuda de Change Data Capture y validar rigurosamente cada cambio antes de apagar las estructuras antiguas. Con planificación y paciencia operativa, la transición ocurre de forma invisible para el usuario final.