Jaka jest najlepsza praktyka wdrażania nowego kodu w witrynie działającej na żywo (e-commerce)?
Na razie zatrzymałem apache na +/- 10 sekund podczas zmiany nazwy katalogu public_html_new
na public_html
stary i na stary public_html_old
. To powoduje krótkie przestoje, zanim ponownie uruchomię Apache.
To samo pytanie dotyczy użycia Git do pobrania nowego repozytorium do katalogu na żywo. Czy mogę pobrać repo, gdy strona jest aktywna? Co powiesz na to, że muszę też skopiować bazę danych?
Podczas kompresji tar (kopii zapasowej) witryny działającej na żywo zauważyłem, że nastąpiły zmiany w katalogu multimediów. To wskazało mi, że pliki zmieniają się okresowo. A jeśli zmiany te mogą przeszkadzać, jeśli Apache nie zostanie zatrzymany podczas wdrażania.
Najszybszym i najłatwiejszym jest użycie katalogu wersji takiego jak
i użyj aktualnego dowiązania symbolicznego jako twojego html_root:
Ta technika doskonale integruje się z systemem kontroli wersji (svn, git, mercurial, ...), ponieważ możesz sprawdzać gałęzie i tagi, zmieniać łącze symboliczne i ponownie ładować Apache. Przestoju jest minimalny przy użyciu tej techniki i umożliwia bardzo łatwy wycofywania .
Dobrze integruje się również z bardziej złożonym systemem wdrażania, takim jak pakiety RPM lub infrastruktura zarządzania zmianami konfiguracji (szef kuchni, kukiełka itp.).
źródło
ln -snf
zatkanie oryginalnego dowiązania symbolicznego, podstawową operacją jestunlink
isymlink
. Istnieje szansa, że użytkownicy otrzymają 404 podczas aktualizacji. Nie jest to lepsze niż zmiana nazwy oryginalnego katalogu na bok i zmiana nazwy nowego na miejsce (zakładając, że nie przenosisz systemów plików). Zobacz odpowiedź powyżej ze znacznikiem wyboru obok, która rozwiązuje ten problem.Powinna również działać zmiana nazwy katalogów bez wyłączania Apache. To znacznie skróci okno.
mv public_html public_html_old && mv public_html_new public_html
powinien zakończyć się w ułamku sekundy.Kilka wad polega na tym, że takie podejście da
404
każdemu żądaniu, które wciąż zdarza się podczas okna. A jeśli uruchomisz powyższe polecenie bezpublic_html_new
katalogu, zakończy się ono niepowodzeniem i pozostawi stronę z podaniem404
na każde żądanie.Robienie tego atomowo z katalogami nie jest obsługiwane. Ale możesz to zrobić za pomocą dowiązań symbolicznych. Zamiast mieć katalog o nazwie
public_html
, nazwij gopublic_html.version-number
i wywołaj dowiązanie symbolicznepublic_html
wskazujące na ten katalog. Teraz możesz utworzyć katalog o nazwiepublic_html.new-version-number
i nowe łącze symboliczne o nazwiepublic_html.new
.Następnie możesz zmienić nazwę
public_html.new
na,public_html
aby przełączać atomowo. Zauważ, żemv
jest „zbyt inteligentny”, aby wykonać tę zmianę nazwy, ale można to zrobić za pomocąos.rename
Pythona lub czegokolwiek innego, co wywoła wywołanierename
systemowe, nie próbując być mądrym.To, co zrobić z bazą danych, zależy od bazy danych, z której korzystasz i do czego jej używasz. Musisz podać o wiele więcej szczegółów na temat bazy danych, abyśmy mogli udzielić ci właściwej odpowiedzi na tę część pytania.
źródło
mv
ma-T
opcję, która uniemożliwia śledzenie dowiązania symbolicznego. To pozwoli Ci atomowo przemianowaćpublic_html.new
napublic_html
zakładając, oba są miękkie linki.Symlinks i mv to twoi przyjaciele, jednak jeśli naprawdę chcesz uniknąć sytuacji, w której użytkownicy końcowi otrzymają stronę błędu podczas wdrażania nowej wersji, powinieneś mieć odwrotny serwer proxy lub moduł równoważenia obciążenia przed co najmniej 2 serwerami zaplecza (apache) w Twoim przypadku).
Podczas wdrażania wystarczy zatrzymać jeden backend na raz, wdrożyć nowy kod, zrestartować go, a następnie wykonać iterację na pozostałych backendach.
Użytkownicy końcowi zawsze będą kierowani do dobrych backendów przez proxy.
źródło
Jeśli regularnie wprowadzasz zmiany w systemie produkcyjnym, zadbam o uporządkowany cykl życia. Dobrą praktyką jest Capistrano http://capistranorb.com/ . Jest to rozwiązanie typu open source do wdrażania oprogramowania na co najmniej jednym serwerze na kilku platformach i konfiguracjach.
Dla Magento istnieje nawet wtyczka: https://github.com/augustash/capistrano-ash/wiki/Magento-Example
W przypadku pojedynczego serwera i prawie płynnych przejść zalecam użycie dowiązań symbolicznych.
źródło
Sposób, w jaki to robię, polega na zatwierdzaniu zmian z lokalnego środowiska programistycznego do internetowego repozytorium Git, takiego jak Github. Moje środowisko produkcyjne działa ze zdalnego repozytorium, więc wszystko, co muszę zrobić, to ssh na serwerze i uruchomić,
git pull
aby sprowadzić najnowsze zmiany. Nie musisz zatrzymywać serwera.Jeśli masz w projekcie pliki, których ustawienia i / lub treść różnią się od wersji lokalnej (np. Pliki konfiguracyjne i przesyłanie multimediów), możesz użyć zmiennych środowiskowych i / lub dodać te pliki / katalogi do
.gitignore
pliku, aby zapobiec synchronizacji z repozytorium.źródło
Mój pierwszy pomysł to:
Dobrym rozwiązaniem było użycie rsync. Zmieniło tylko naprawdę zmienione pliki. Uwaga, ukośniki na końcu ścieżek są tutaj ważne.
Zwykle apache nie wymaga restartu, to nie jest świat Java. Sprawdza zmiany każdego pliku php na żądanie i automatycznie odczytuje (i ponownie tokenizuje) przy zmianie.
Pull Git był podobny, choć nieco trudniejszy do napisania. Oczywiście umożliwiło to szerokie spektrum różnych możliwości wykrywania łączenia / zmiany.
To rozwiązanie będzie bezproblemowo tylko wtedy, gdy nie będzie tak naprawdę poważnych zmian - jeśli są duże zmiany we wdrożeniu, nie można wyeliminować odrobiny zagrożenia, ponieważ nie ma nieistotnego odstępu czasu, kiedy kod zostanie częściowo zmieniony a w szczególności nie.
Jeśli są duże zmiany, moja propozycja była twoim początkowym rozwiązaniem (dwie zmiany nazwy).
Oto trochę hardcorowe, ale w 100% atomowe rozwiązanie:
(1) wykonaj naprzemienne podłączanie niektórych systemów plików, w których odbywa się magento:
(2) wykonaj
--bind
podłączenie swojej public_html_new do public_html:Od tego momentu apache zobaczy Twoje nowe wdrożenie. Każda zmiana 404 jest niemożliwa.
(3) wykonaj synchronizację z rsync, ale w alternatywnym punkcie montowania):
(4) zdejmij mocowanie bindowania
źródło
public_html
jest niespójny i nie chcesz zaryzykować.Przenoszenie / zastępowanie
http_public
folderu można wykonać za pomocą prostegomv
lubln -s
poleceń lub równoważne, gdy serwer http ciągle pracuje. Możesz wykonać skrypty, aby znacznie skrócić czas przestoju, ale jeśli zautomatyzujesz ten proces, dokładnie sprawdź kody zwrotne swoich poleceń w skrypcie.To powiedziawszy, jeśli nie chcesz przestoju, Twoja aplikacja musi również go obsługiwać. Większość aplikacji korzysta z bazy danych w celu zachowania trwałości. Zablokowanie wersji N aplikacji w wersji N + 1 (lub odwrotnej) modelu danych może zepsuć się, jeśli zespół programistyczny tego nie przewidzi.
Z doświadczenia, utrzymanie takiej spójności poprzez uaktualnienia nie jest dane dla większości aplikacji. Prawidłowe wyłączenie, pomimo przestoju, jest dobrym sposobem na uniknięcie problemów ze spójnością.
źródło