Abbiamo un'applicazione che ha una combinazione di migrazioni di database rapide (<1 secondo) e lente (> 30 secondi). In questo momento, stiamo eseguendo migrazioni di database come parte di CI, ma poi il nostro strumento di CI deve conoscere tutte le stringhe di connessione al database per la nostra app (su più ambienti) che non è l'ideale. Vogliamo modificare questo processo in modo che l'applicazione esegua le proprie migrazioni del database all'avvio.
Ecco la situazione:
Abbiamo più istanze di questa applicazione - circa 5 in produzione. Chiamiamoli node1, ..., node5
. Ogni app si connette a una singola istanza di SQL Server e non utilizziamo distribuzioni in sequenza (per quanto ne so tutte le app vengono distribuite contemporaneamente)
Problema: supponiamo di avere una migrazione di lunga durata. In questo caso, node1
avvia, quindi inizia l'esecuzione della migrazione. Ora, node4
inizia e la migrazione a lungo termine non è ancora terminata, quindi node4
inizia anche a eseguire la migrazione -> possibile corruzione dei dati? Come prevenire questo problema o il problema è ancora abbastanza importante di cui preoccuparsi?
Stavo pensando di risolvere questo problema con un blocco distribuito (usando etcd
o qualcosa del genere). Fondamentalmente, tutte le app cercano di acquisire il blocco, solo uno di loro lo ottiene ed esegue le migrazioni, quindi si sblocca. Quando le altre app si avviano ed entrano nella sezione critica, tutte le migrazioni sono già state eseguite, quindi lo script di migrazione si chiude.
Tuttavia, il mio istinto sta dicendo "questo è eccessivo, ci deve essere una soluzione più semplice", quindi ho pensato che avrei chiesto qui per vedere se qualcun altro ha idee migliori.