Cuando tenemos miles de inserts por segundo, migrar datos entre diferentes servicios se convierte en un reto.
Es un gran reto porque es muy fácil que se nos queden datos por importar o que tengamos inconsistencias en la información.
Para ello, hemos hecho esta pequeña guía para que, en base a una pequeña checklist, puedas asegurarte de que migras todos los datos de forma correcta.
1️⃣ Crear la(s) nueva(s) cola de mensajería y empezar a puiblicarle sus eventos
Empezaremos a publicar todos los eventos que nos hagan falta para tener la proyección de nuestros datos. Por ejemplo, si es una proyección de usuario escucharemos:
user_registered
user_renamed
user_bio_changed
Depende como tengamos montado nuestro sistema, crearemos una o diversas colas para ello.
2️⃣ Crear una réplica de la Base de Datos fuera del balanceador
Con ello conseguimos tener una "foto" de los datos sin afectar al rendimiento del sistema en producción.
3️⃣ Establecer el Momento X™
Desconectamos la réplica en un instante preciso. Este timestamp será crucial, le llamamos el Momento X™. Todos los datos hasta ese momento vendrán de la réplica, todo lo posterior de la cola de eventos.
4️⃣ Importar el histórico de la réplica
Transferimos todos los datos que hay en réplica al nuevo sistema. Si lo tienes, podemos tomarnos nuestro tiempo para ello, ya que los cambios nuevos se están acumulando en la cola.
5️⃣ Consumir la cola de eventos
Una vez completada la importación histórica, podemos empezar a procesar los eventos acumulados, descartando aquellos anteriores al Momento X™ para evitar duplicados. Si se nos olvidó tomar el timestamp para saber ese momento, podemos ver la fecha del último registro que ha entrado en la réplica (tanto por created_at como por updated_at).
Esta técnica nos ha permitido migrar sistemas con millones de registros sin interrupciones de servicio y con total integridad de datos.
Si quieres aprender más sobre cómo hacer migraciones de datos en sistemas con alta concurrencia, te recomendamos el curso de Migración de Datos: De Legacy a Event-Driven Architecture donde exploramos cómo migrar datos entre diversos sistemas de forma segura y eficiente.