Usiłuję osiągnąć zerowe czasy przestoju, aby móc wdrażać mniej podczas wolnych godzin i więcej podczas „wolniejszych” godzin - lub teoretycznie w dowolnym momencie.
Moja obecna konfiguracja, nieco uproszczona:
- Serwer WWW A (aplikacja .NET)
- Serwer WWW B (aplikacja .NET)
- Serwer bazy danych (SQL Server)
Mój obecny proces wdrażania:
- „Zatrzymaj” witryny zarówno na serwerze sieciowym A, jak i B
- Zaktualizuj schemat bazy danych dla wdrażanej wersji aplikacji
- Zaktualizuj serwer WWW A
- Zaktualizuj serwer WWW B
- Przywróć wszystko do sieci
Aktualny problem
Prowadzi to do niewielkiej ilości przestojów każdego miesiąca - około 30 minut. Robię to poza godzinami pracy, więc nie jest to duży problem - ale chciałbym uciec od tego.
Ponadto - nie ma sposobu, aby naprawdę wrócić. Generalnie nie tworzę wycofanych skryptów DB - tylko skrypty aktualizacji.
Wykorzystanie modułu równoważenia obciążenia
Chciałbym móc aktualizować jeden serwer WWW na raz. Wyjmij serwer sieci Web A z modułu równoważenia obciążenia, zaktualizuj go, przełącz z powrotem w tryb online, a następnie powtórz dla serwera sieci Web B.
Problemem jest baza danych. Każda wersja mojego oprogramowania będzie musiała zostać uruchomiona z inną wersją bazy danych - więc jestem trochę „utknięty”.
Możliwe rozwiązanie
Obecne rozwiązanie, które rozważam, przyjmuje następujące zasady:
- Nigdy nie usuwaj tabeli bazy danych.
- Nigdy nie usuwaj kolumny bazy danych.
- Nigdy nie zmieniaj nazwy kolumny bazy danych.
- Nigdy nie zmieniaj kolejności kolumny.
- Każda procedura składowana musi być wersjonowana.
- Znaczenie - „spFindAllThings” zmieni się w „spFindAllThings_2” podczas edycji.
- Po ponownej edycji staje się „spFindAllThings_3”.
- Ta sama zasada dotyczy widoków.
Chociaż wydaje się to nieco ekstremalne - myślę, że rozwiązuje problem. Każda wersja aplikacji będzie uderzać w DB w sposób niezniszczalny. Kod oczekuje pewnych wyników od widoków / procedur przechowywanych - i to zachowuje ważność „umowy”. Problem w tym, że po prostu jest niechlujny. Wiem, że mogę wyczyścić stare procedury przechowywane po wdrożeniu aplikacji na jakiś czas, ale po prostu czuję się brudny. Ponadto - zależy to od wszystkich programistów przestrzegających tej reguły, co w większości się zdarzy, ale wyobrażam sobie, że ktoś popełni błąd.
Wreszcie - moje pytanie
- Czy to jest niechlujne czy hacky?
- Czy ktoś robi to w ten sposób?
- Jak inni ludzie rozwiązują ten problem?