Sto cercando di ottenere zero tempi di fermo macchina in modo da poterlo distribuire meno durante le ore di riposo 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)
- Web Server B (app .NET)
- Server database (SQL Server)
Il mio attuale processo di distribuzione:
- "Arresta" i siti su entrambi i server Web A e B.
- Aggiorna lo schema del database per la versione dell'app da distribuire
- Aggiorna server Web A
- Aggiorna server Web B
- Riporta tutto online
Problema attuale
Ciò porta a una piccola quantità di inattività ogni mese - circa 30 minuti. Lo faccio durante le ore di riposo, quindi non è un grosso problema, ma è qualcosa da cui vorrei allontanarmi.
Inoltre, non c'è modo di tornare "indietro". In genere non eseguo script di rollback DB, ma solo script di aggiornamento.
Sfruttando il bilanciamento del carico
Mi piacerebbe poter aggiornare un Web Server alla volta. Rimuovere Web Server A dal bilanciamento del carico, aggiornarlo, rimetterlo online, quindi ripetere 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".
Possibile soluzione
Una soluzione attuale che sto prendendo in considerazione è l'adozione delle seguenti regole:
- Non eliminare mai una tabella del database.
- Non eliminare mai una colonna del database.
- Non rinominare mai una colonna del database.
- Non riordinare mai una colonna.
- Ogni procedura memorizzata deve essere versionata.
- Significato: 'spFindAllThings' diventerà 'spFindAllThings_2' quando viene modificato.
- Quindi diventa 'spFindAllThings_3' quando modificato di nuovo.
- La stessa regola si applica alle viste.
Anche se questo sembra un po 'estremo - penso che risolva il problema. Ogni versione dell'applicazione colpirà il DB in modo non-break. Il codice prevede alcuni risultati dalle viste / stored procedure - e questo mantiene valido quel "contratto". Il problema è che sembra solo sciatto. So di poter ripulire le vecchie procedure memorizzate dopo che l'app è stata distribuita per un po ', ma mi sembra solo sporca. Inoltre, dipende dal fatto che tutti gli sviluppatori seguano queste regole, il che accadrà principalmente, ma immagino che qualcuno commetterà un errore.
Finalmente - La mia domanda
- Questo è sciatto o confuso?
- Qualcun altro lo sta facendo in questo modo?
- In che modo altre persone risolvono questo problema?