Zero DownTime

Zero DownTime Deployment dla PHP

Zapewnienie ciągłości działania aplikacjom PHP

Modyfikujemy kod aplikacji PHP bez wpływu na ich dostępność dla użytkowników UniCloud.

 

Od nowoczesnych usług dostarczanych on-line wymagana jest możliwość dostępu bez przerw w działaniu. Wraz ze wzrostem liczby użytkowników, jeśli chcemy utrzymać odpowiedni poziom satysfakcji, wdrażanie kolejnych wersji aplikacji staje się coraz trudniejsze. Idealne rozwiązanie to aktualizacja „w locie”, odbywająca się bez przerwania pracy użytkowników, niejako w ukryciu. Stąd też pojawiły się dążenia do przeprowadzenia wdrożenia w sposób niezauważalny, kiedy to użytkownik nie musi oczekiwać na zakończenie procesu aktualizacji po stronie usługodawcy. Jest to tak zwane „wdrożenie bez przestojów”, czyli Zero DownTime Deployment [1]. Osiąga się je wykorzystując symboliczne powiązania folderów po stronie serwera. W dalszej części artykułu zaprezentujemy technologię przetestowaną w chmurze UniCloud.

Rozwiązanie to, zaproponowane dla aplikacji PHP przez Rasmusa Lerdorfa [2], upraszcza stosowane wcześniej metody i narzędzia, umożliwiając bezpieczną zmianę kodu bez wpływu na dostępność dla końcowego użytkownika. Idea ta zawiera się w dwóch punktach [3]:

  • przy każdym uruchomieniu procesu wdrażania nowej wersji, pliki aplikacji duplikowane są w nowym katalogu na serwerze
  • specjalny redirector przełącza się miedzy różnymi wersjami aplikacji wykorzystując mechanizmy łączy symbolicznych symlink

Rysunek 1: Przełączanie zapytań pomiędzy aplikacjami

Implementacja mechanizmu Zero DownTime Deployment w UniCloud [4]

Przetestowanie prezentowanego rozwiązania możliwe jest po założeniu konta trial na platformie UniCloud (www.unicloud.pl).

Aby skorzystać z mechanizmów ZDT należy stworzyć środowisko oparte o PHP (i np. Apache):

Następnie należy przystąpić do przesłania danej aplikacji:

Dostarczając po raz pierwszy aplikację w kontekst ROOT, poprzednie dane aktualnie istniejących aplikacji zostaną nadpisane. W tym momencie zalecana jest szczególna ostrożność.

Podczas pierwotnego dostarczenia aplikacji, powstanie nowy katalog, ROOT_ze_znacznikiem_czasu, oraz specjalny plik ROOT, będący linkiem do katalogu. Zostaną one utworzone wewnątrz katalogu webroot serwera aplikacji:

Łącząc się z serwerem po ssh, można łatwo sprawdzić ścieżkę aktualnego wiązania:

ls -l /var/www/webroot

Podczas ponownego dostarczenia aplikacji (np. po aktualizacji) powstanie kolejny katalog ROOT_ze_znacznikiem_czasu, zawierający aktualną wersję aplikacji. Nie wpływa to na pracę użytkowników z aktywnymi sesjami.

Po rozpakowaniu nowych plików, kolejne żądania będą kierowane już do nich. Jednocześnie warto zauważyć, że istniejące sesje będą wciąż aktywne (korzystając ze „starego” katalogu). Kolejne aktualizacje przebiegają w ten sam sposób, z zachowaniem dwóch najnowszych wersji – poprzednia zostaje usunięta podczas dodawania nowej:

Niepotrzebny katalog można skasować aby zmniejszyć użycie miejsca na dysku lub zmienić mu nazwę, dzięki czemu może pełnić rolę archiwum.

Wszystkie te operacje są zautomatyzowane i nie wymagają dodatkowego zaangażowania deweloperów i administratorów. Nie wymagają również restartów serwerów aplikacji i w rezultacie uzyskujemy nasz cel: zerowy czas niedostępności aplikacji.

Info:

[1] Wdrażanie aplikacji PHP (Niklas Modess, Deploying PHP Applications):
http://www.deployingphpapplications.com

[2] Rasmus Lerdorf, Atomic deploys at Etsy:
https://codeascraft.com/2013/07/01/atomic-deploys-at-etsy

[3] Rozwój aplikacji PHP na platformie Jelastic:
https://docs.jelastic.com/php-zero-downtime-deploy

[4] Baza wiedzy UniCloud:
http://pomoc.unicloud.pl/unicloud/tworzenie-aplikacji/zero-downtime-deployment-dla-aplikacji-php

Partnerzy technologiczni

Dell
Cisco
vmware
Emc2
Certum
Microsoft
IBM