Sto cercando di ottenere zero implementazioni di downtime in modo da poter distribuire meno durante le ore di pausa e di più durante le ore "più lente" - o in qualsiasi momento, in teoria.
La mia configurazione attuale, in qualche modo semplificata:
- Server Web A (app .NET)
- Server Web B (app .NET)
- Server database (SQL Server)
La mia attuale procedura di distribuzione:
- "Interrompi" i siti su entrambi i server Web A e B
- Aggiorna lo schema del database per la versione dell'app che viene distribuita
- Aggiorna server Web A
- Aggiorna server Web B
- Ripristina tutto online
Problema corrente
Questo porta a una piccola quantità di tempo di inattività ogni mese - circa 30 minuti. Lo faccio durante le ore libere, quindi non è un problema enorme, ma è qualcosa che mi piacerebbe fuggire.
Inoltre, non c'è modo di tornare veramente indietro. Generalmente non eseguo gli script di rollback del DB, ma solo gli script di aggiornamento.
Utilizzo del Load Balancer
Mi piacerebbe poter aggiornare un server Web alla volta. Prendi il server Web A fuori dal servizio di bilanciamento del carico, aggiornalo, rimettilo in linea, quindi ripetilo per Web Server B.
Il problema è il database. Ogni versione del mio software dovrà essere eseguita su una versione diversa del database, quindi sono un po '"bloccato".
Soluzione possibile
Una soluzione attuale che sto considerando è l'adozione delle seguenti regole:
- Non eliminare mai una tabella di database.
- Non eliminare mai una colonna del database.
- Non rinominare mai una colonna del database.
- Non riordina mai una colonna.
- Ogni stored procedure deve essere versionata.
- Significato - "spFindAllThings" diventerà "spFindAllThings_2" quando viene modificato.
- Quindi diventa "spFindAllThings_3" quando viene modificato di nuovo.
- La stessa regola si applica alle viste.
Anche se sembra un po 'estremo - penso che risolva il problema. Ogni versione dell'applicazione colpirà il DB in modo non distruttivo. Il codice si aspetta determinati risultati dalle viste / stored procedure - e questo mantiene valido quel 'contratto'. Il problema è che si infiltra solo in modo approssimativo. So che posso ripulire le vecchie stored procedure dopo che l'app è stata distribuita per un po ', ma sembra solo sporca. Inoltre, dipende da tutti gli sviluppatori che seguono questa regola, che avverrà principalmente, ma immagino che qualcuno commetta un errore.
Infine - La mia domanda
- Questo è sciatto o hacky?
- Qualcun altro lo fa in questo modo?
- In che modo altre persone risolvono questo problema?