Abbiamo un'applicazione che presenta un mix di migrazioni di database veloci (< 1 secondo) e lente (> 30 secondi). Al momento, stiamo eseguendo le migrazioni dei database come parte dell'elemento della configurazione, ma in seguito lo strumento CI deve conoscere tutte le stringhe di connessione del database per la nostra app (in 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 a rotazione (tutte le app vengono distribuite simultaneamente per quanto ne so)
Problema: diciamo che abbiamo una migrazione a lungo termine. In questo caso, viene avviato node1
, quindi inizia l'esecuzione della migrazione. Ora, node4
viene avviato e la migrazione di lunga durata non è ancora terminata, quindi node4
inizia anche a eseguire la migrazione - > possibile corruzione dei dati? Come eviterai questo problema o il problema è abbastanza importante da preoccupare?
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 il resto delle app si avvia e entra nella sezione critica, tutte le migrazioni sono già state eseguite in modo che lo script di migrazione sia appena terminato.
Tuttavia, il mio istinto sta dicendo "questo è eccessivo, deve esserci una soluzione più semplice", quindi ho pensato di chiedere qui per vedere se qualcun altro ha qualche idea migliore.