Aby wdrożyć nową wersję naszej strony internetowej, wykonujemy następujące czynności:
- Spakuj nowy kod i prześlij go na serwer.
- Na aktywnym serwerze usuń cały aktywny kod z katalogu witryny sieci Web usług IIS.
- Wyodrębnij nowy plik ZIP z kodem do teraz pustego katalogu usług IIS
Cały ten proces jest oparty na skryptach i przebiega dość szybko, ale nadal może wystąpić przerwa w działaniu wynosząca 10–20 sekund, gdy stare pliki są usuwane, a nowe są wdrażane.
Jakieś sugestie dotyczące metody 0 sekund przestoju?
asp.net
iis
deployment
redundancy
Karl Glennon
źródło
źródło
Odpowiedzi:
Potrzebujesz 2 serwerów i modułu równoważenia obciążenia. Oto kroki:
Chodzi o to, że nawet w tym przypadku nadal będziesz mieć ponowne uruchomienie aplikacji i utratę sesji, jeśli używasz „trwałych sesji”. Jeśli masz sesje bazy danych lub serwer stanu, wszystko powinno być w porządku.
źródło
Narzędzie Microsoft Web Deployment obsługuje to do pewnego stopnia:
Wygląda na to, że transakcja dotyczy całej synchronizacji. Ponadto TxF jest funkcją systemu Windows Server 2008, więc ta funkcja transakcji nie będzie działać z wcześniejszymi wersjami.
Uważam, że możliwe jest zmodyfikowanie skryptu w celu wyeliminowania przestojów przy użyciu folderów jako wersji i metabazy usług IIS:
Ta metoda oferuje następujące korzyści:
źródło
Można osiągnąć zero przestojów na jednym serwerze, wykorzystując routing żądań aplikacji w usługach IIS jako programowy system równoważenia obciążenia między dwoma lokalnymi lokacjami usług IIS na różnych portach. Jest to tzw. Niebiesko-zielona strategia wdrażania, w której w danym momencie w module równoważenia obciążenia dostępna jest tylko jedna z dwóch witryn. Wdróż w witrynie, która jest „wyłączona”, rozgrzej ją i przenieś do systemu równoważenia obciążenia (zwykle przez sprawdzenie stanu routingu żądań aplikacji), a następnie wyjmij pierwotną lokację, która była aktywna, z „puli” (ponownie sprawiając, że jego kontrola stanu nie powiedzie się).
Pełen samouczek można znaleźć tutaj.
źródło
Niedawno przeszedłem przez to i rozwiązanie, które wymyśliłem, polegało na skonfigurowaniu dwóch witryn w IIS i przełączaniu się między nimi.
Dla mojej konfiguracji miałem katalog sieciowy dla każdej witryny A i B w następujący sposób: c: \ Intranet \ Live A \ Interface c: \ Intranet \ Live B \ Interface
W usługach IIS mam dwie identyczne witryny (te same porty, uwierzytelnianie itp.), Z których każda ma własną pulę aplikacji. Jedna z witryn jest uruchomiona (A), a druga jest zatrzymana (B). live ma również nagłówek live hosta.
Jeśli chodzi o wdrożenie na żywo, po prostu publikuję w lokalizacji STOPPED. Ponieważ mogę uzyskać dostęp do witryny B za pomocą jej portu, mogę wstępnie ją ogrzać, aby pierwszy użytkownik nie spowodował uruchomienia aplikacji. Następnie za pomocą pliku wsadowego kopiuję nagłówek hosta na żywo do B, zatrzymuję A i uruchamiam B.
źródło
Za pomocą klasy ServerManager firmy Microsoft.Web.Administration można opracować własnego agenta wdrożeniowego.
Sztuczka polega na zmianie PhysicalPath w VirtualDirectory, co skutkuje atomowym przełączaniem online między starymi i nowymi aplikacjami internetowymi.
Należy pamiętać, że może to spowodować równoległe uruchamianie starych i nowych AppDomains!
Problem w tym, jak zsynchronizować zmiany w bazach danych itp.
Dzięki odpytywaniu pod kątem istnienia domen AppDomains ze starymi lub nowymi PhysicalPaths można wykryć, kiedy stare domeny AppDomain zostały zakończone i czy nowe domeny AppDomain zostały uruchomione.
Aby wymusić uruchomienie AppDomain, należy wysłać żądanie HTTP (usługi IIS 7.5 obsługują funkcję Autostart)
Teraz potrzebujesz sposobu na blokowanie żądań dla nowej domeny AppDomain. Używam nazwanego muteksu - który jest tworzony i będący własnością agenta wdrażania, czekany przez Application_Start nowej aplikacji internetowej, a następnie zwalniany przez agenta wdrażania po wykonaniu aktualizacji bazy danych.
(Używam pliku znacznika w aplikacji internetowej, aby włączyć zachowanie oczekiwania mutex) Po uruchomieniu nowej aplikacji internetowej usuwam plik znacznika.
źródło
OK, więc ponieważ wszyscy odrzucają odpowiedź, którą napisałem w 2008 roku * ...
Powiem Ci, jak robimy to teraz w 2014 roku. Nie używamy już witryn sieci Web, ponieważ używamy teraz ASP.NET MVC.
Z pewnością nie potrzebujemy do tego modułu równoważenia obciążenia i dwóch serwerów, to dobrze, jeśli masz 3 serwery na każdą utrzymywaną witrynę, ale w przypadku większości witryn jest to całkowita przesada.
Nie polegamy też na najnowszym kreatorze firmy Microsoft - jest on zbyt wolny i zawiera zbyt wiele ukrytej magii oraz jest zbyt podatny na zmianę nazwy.
Oto jak to robimy:
Mamy krok po kompilacji, który kopiuje wygenerowane biblioteki DLL do folderu „bin-pub”.
Używamy Beyond Compare (co jest doskonałe **) do weryfikacji i synchronizacji zmienionych plików (przez FTP, ponieważ jest to szeroko obsługiwane) do serwera produkcyjnego
Na naszej stronie mamy bezpieczny adres URL zawierający przycisk, który kopiuje wszystko z „bin-pub” do „bin” (najpierw wykonuje kopię zapasową, aby umożliwić szybkie przywrócenie). W tym momencie aplikacja uruchomi się ponownie. Następnie nasz ORM sprawdza, czy są jakieś tabele lub kolumny, które należy dodać i tworzy je.
To tylko milisekundy przestoju. Ponowne uruchomienie aplikacji może zająć sekundę lub dwie, ale żądania ponownego uruchomienia są buforowane, więc przestoje są praktycznie zerowe.
Cały proces wdrażania trwa od 5 sekund do 30 minut, w zależności od tego, ile plików zostało zmienionych i ile zmian do przejrzenia.
W ten sposób nie musisz kopiować całej witryny do innego katalogu, ale tylko do folderu bin. Masz również pełną kontrolę nad procesem i dokładnie wiesz, co się zmienia.
** Zawsze szybko przyglądamy się wprowadzanym zmianom - w ostatniej chwili sprawdzamy dwukrotnie, dzięki czemu wiemy, co przetestować i jeśli coś się zepsuje, jesteśmy gotowi. Używamy Beyond Compare, ponieważ umożliwia łatwe porównywanie plików przez FTP. Nigdy nie zrobiłbym tego bez BC, nie masz pojęcia, co nadpisujesz.
* Przewiń w dół, aby to zobaczyć :( Przy okazji nie polecałbym już witryn internetowych, ponieważ są wolniejsze w tworzeniu i mogą powodować poważne awarie z częściowo skompilowanymi plikami tymczasowymi. Używaliśmy ich w przeszłości, ponieważ pozwalały na bardziej zwinne pliki po pliku Wdrażanie. Bardzo szybkie rozwiązanie drobnego problemu i możesz dokładnie zobaczyć, co wdrażasz (oczywiście jeśli używasz Beyond Compare - w przeciwnym razie zapomnij o tym).
źródło
Jedyne metody zerowych przestojów, jakie przychodzą mi do głowy, obejmują hosting na co najmniej 2 serwerach.
źródło
Uściśliłbym nieco odpowiedź George'a w następujący sposób dla pojedynczego serwera:
Krok 4 spowoduje odtworzenie procesu roboczego usług IIS.
To tylko zero przestojów, jeśli nie używasz sesji InProc; zamiast tego użyj trybu SQL, jeśli możesz (nawet lepiej, całkowicie unikaj stanu sesji).
Oczywiście jest to trochę bardziej skomplikowane, gdy występuje wiele serwerów i / lub zmian w bazie danych ....
źródło
Aby rozwinąć odpowiedź sklivvz, która polegała na posiadaniu pewnego rodzaju modułu równoważenia obciążenia (lub po prostu kopii zapasowej na tym samym serwerze)
Możliwe jest wprowadzenie trochę testowania dymu, tworząc migawkę / kopię bazy danych, ale nie zawsze jest to wykonalne.
Jeśli to możliwe i potrzebne, użyj „różnic w routingu”, takich jak różne adresy URL dzierżawcy (customerX.myapp.net) lub różni użytkownicy, aby wdrożyć najpierw w nieświadomej grupie świnek morskich. Jeśli nic nie zawiedzie, zwolnij wszystkich.
Ponieważ w grę wchodzą migracje baz danych, przywrócenie poprzedniej wersji jest często niemożliwe.
Istnieją sposoby, aby aplikacje działały przyjemniej w tych scenariuszach, na przykład za pomocą kolejek zdarzeń i mechanizmów odtwarzania, ale ponieważ mówimy o wdrażaniu zmian w czymś, co jest w użyciu, naprawdę nie ma żadnego niezawodnego sposobu.
źródło
Oto jak to robię:
Absolutnie minimalne wymagania systemowe:
1 serwer z
(lub nawet tylko dwie aplikacje z odwrotnym proxy na 2 różnych portach TCP bez piaskownicy)
Przepływ pracy:
rozpocznij transakcję myupdate
try Web-Service: Tell all applications on all web-servers to go into primary read-only mode Application switch to primary read-only mode, and responds Web sockets begin notifying all clients Wait for all applications to respond wait (custom short interval) Web-Service: Tell all applications on all web-servers to go into secondary read-only mode Application switch to secondary read-only mode (data-entry fuse) Updatedb - secondary read-only mode (switches database to read-only) Web-Service: Create backup of database Web-Service: Restore backup to new database Web-Service: Update new database with new schema Deploy new application to apt-repository (for windows, you will have to write your own custom deployment web-service) ssh into every machine in array_of_new_webapps run apt-get update then either apt-get dist-upgrade OR apt-get install <packagename> OR apt-get install --only-upgrade <packagename> depending on what you need -- This deploys the new application to all new chroots (or servers/VMs) Test: Test new application under test.domain.xxx -- everything that fails should throw an exception here commit myupdate; Web-Service: Tell all applications to send web-socket request to reload the pages to all clients at time x (+/- random number) @client: notify of reload and that this causes loss of unsafed data, with option to abort @ time x: Switch load balancer from array_of_old_webapps to array_of_new_webapps Decomission/Recycle array_of_old_webapps, etc. catch rollback myupdate switch to read-write mode Web-Service: Tell all applications to send web-socket request to unblock read-only mode end try
źródło
Proponuję zachować tam stare pliki i po prostu je nadpisać. W ten sposób przestój jest ograniczony do czasu nadpisywania pojedynczego pliku, a na raz brakuje tylko jednego pliku.
Nie jestem pewien, czy to pomaga w „aplikacji sieciowej” (myślę, że właśnie tego używasz), dlatego zawsze używamy „witryn internetowych”. Również w przypadku „witryn internetowych” wdrożenie nie powoduje ponownego uruchomienia witryny i porzucenia wszystkich sesji użytkowników.
źródło