Tenemos una aplicación que tiene una combinación de migraciones de bases de datos rápidas (<1 segundo) y lentas (> 30 segundos). En este momento, estamos ejecutando migraciones de bases de datos como parte de CI, pero nuestra herramienta de CI tiene que conocer todas las cadenas de conexión de la base de datos para nuestra aplicación (en múltiples entornos), lo cual no es ideal. Queremos cambiar este proceso para que la aplicación ejecute sus propias migraciones de bases de datos cuando se inicie.
Aquí está la situación:
Tenemos varias instancias de esta aplicación, alrededor de 5 en producción. Vamos a llamarlos node1, ..., node5
. Cada aplicación se conecta a una única instancia de SQL Server, y no estamos usando implementaciones continuas (todas las aplicaciones se implementan simultáneamente hasta donde yo sé)
Problema: digamos que tenemos una migración de larga duración. En este caso, node1
comienza, luego comienza a ejecutar la migración. Ahora, node4
comienza, y la migración de larga duración aún no ha terminado, por lo que node4
también comienza a ejecutar la migración -> posible corrupción de datos? ¿Cómo evitarías este problema o es el problema lo suficientemente importante como para preocuparte?
Estaba pensando en resolver este problema con un bloqueo distribuido (usando etcd
o algo por el estilo). Básicamente, todas las aplicaciones intentan adquirir el bloqueo, solo una de ellas lo consigue y ejecuta las migraciones, luego se desbloquea. Cuando el resto de las aplicaciones se inician y entran en la sección crítica, todas las migraciones ya se han ejecutado, por lo que el script de migración acaba de salir.
Sin embargo, mi instinto dice "esto es excesivo, debe haber una solución más simple", así que pensé en preguntar aquí para ver si alguien más tiene mejores ideas.