W ostatnich dniach być może zauważyłaś, że nasza strona ładowała się powoli. Baaardzo powoli — mówimy o ok. minucie czasu. Bez bicia przyznam się, że to moja wina — co więcej, zrobiłem to z pełną premedytacją. Dlaczego? To bardzo dobre pytanie…
Zacznijmy od początku, czyli co właściwie się zadziało. Od jakiegoś czasu blog jest hostowany na naszym własnym serwerze (VPSie dokładniej rzecz ujmując, ale na potrzeby tego wpisu nie ma to większego znaczenia). Sam hosting www był w tym czasie całkowicie po naszej stronie, ale nadal korzystał z bazy danych zarządzanej przez zewnętrzną firmę. Zmiany, które wprowadzałem zasadniczo sprowadzały się do przeniesienia bazy danych na naszą własną infrastrukturę, a ponieważ moją wiedzę i doświadczenie na temat administracji baz danych można podsumować liczbą 0, nie obyło się bez problemów. W tym momencie zapewne zaczynasz zastanawiać się “ale po co / dlaczego??” i jest to jak najbardziej uzasadnione pytanie.
Z oszczędności?
To oczywiście pierwszy sensowny powód który może przyjść do głowy — w końcu blog prowadzimy hobbystycznie, nie wyświetlamy (i nie planujemy) reklam ani nie nawiązujemy komercyjnej współpracy z firmami. Hosting oczywiście kosztuje, a że koszty pokrywamy z własnej kieszeni to fajnie byłoby je ograniczyć. Chciałbym tutaj zauważyć że cała migracja zabrała mi około 30 godzin poświęconych tylko na nią. Różnica w kosztach przed i po migracji to ok. 10$ miesięcznie, więc nawet nie uwzględniając czasu który będzie potrzebny na utrzymanie nowej bazy danych, po uwzględnieniu kosztu mojego czasu wyszedłbym ‘na zero’ za co najmniej kilka lat. Także zdecydowanie nie był to powód migracji.
To pewnie wydajność/bezpieczeństwo?
To też wygląda na logiczne uzasadnienie na pierwszy rzut oka — w końcu utrzymywanie serwera i bazy danych na różnych platformach generuje dodatkowe opóźnienia, trudniej zabezpieczyć ruch i dane przed atakami i awariami oraz ciężej zsynchronizować zmiany i aktualizacje. Poniekąd to wszystko prawda, ale ponownie patrząc na faktyczne dane, strona główna ładuje się obecnie w ok. 600ms (przy dobrym łączu) — w porównaniu do wcześniejszych ~800ms, nie jest to skórka warta wyprawki. Dodatkowo do tej pory nie mieliśmy problemów z atakami na bazę danych czy awariami na łączu. Ponownie — fałszywy trop.
????!
Uprzedzając pytania nie, nie zmieniam ścieżki kariery, nie szukam nowej pracy a moje codzienne obowiązki nie obejmują zbyt wiele szeroko pojętych DevOpsów. Nie odpalamy projektu związanego z zarządzaniem bazami danych i nie jest to konieczne z braku innych opcji. Główną motywacją była chęć nauczenia się czegoś nowego, trochę postawienia sobie nie-trywialnego wyzwania i nieco lepszego zrozumienia tego, czego nie wiem (Google: cztery fazy kompetencji, cztery fazy kompetencji — definicja).
Ok, ale w takim razie jak?
“Jak nauczyć się czegoś, czego nie wiem że nie umiem” — kolejne świetne pytanie! Podobnie jak z dowolnym projektem najlepiej zacząć od celu — co chcemy osiągnąć. Idealnie powinien być to cel realny (“zbudować perpetum mobile” może być nieco zbyt ambitnym przedsięwzięciem na początek), zdefiniowany i względnie mały (“zbudować w garażu auto wyścigowe” także może nie być najlepszym wyborem), mierzalny (“ulepszyć kod X” w wielu przypadkach ciężko opisać liczbą) i przede wszystkim sensowny (coś, co będzie przydatne lub używane). W naszym przypadku migracja bazy danych spełniała wszystkie te kryteria, ale jeśli szukasz projektu dla siebie może warto rozejrzeć się wokół i wesprzeć jakąś organizację non-profit? Możesz zbudować dla nich system, który pomoże im na codzień, albo skonfigurować i zarządzać gotowym narzędziem które będą mogli używać w pracy. Inna opcja to pomóc w rozwoju jakiegoś projektu Open Source — wiele projektów ma backlog rzeczy do zrobienia, nad którymi można pracować wiedząc, że ktoś z tego skorzysta.
Mając już projekt, kolejnym krokiem jest odniesienie porażki. Jeśli uda Ci się osiągnąć to, co założyłaś za pierwszym razem to albo a) jesteś geniuszem lub b) wybrany projekt mógłby być ambitniejszy — tutaj musisz odpowiedzieć sobie sama ;) . W naszym przypadku porażką było efektywne zablokowanie strony — która albo działała super powoli albo wcale. I nie zrozum mnie źle — przed przełączeniem bloga poczytałem tutoriale, przetestowałem rozwiązanie na innych aplikacjach, przejrzałem komentarze pod tutorialami i poradnikami oraz informacje na temat tego jak skonfigurować wszystko na początku. W momencie jak pojawił się problem, zaczęła się ta naprawdę ciekawa część .
Czemu to nie działa?
Pierwszy krok to oczywiście odtworzenie listy kroków, które zaplanowałaś wykonać i sprawdzenie czy na pewno wszystko jest zrobione i nie pojawiły się żadne błędy czy problemy. Odhaczone.
Drugi krok to randka z Google — opisujemy problem w kilku słowach (“mysql wordpress slow response”, “database long query time”, “mysql connection timeout”) — im więcej wiemy (np. z logów) tym precyzyjniej możemy wyszukać informacji. Po przeczytaniu kilkunastu wątków na StackOverflow, paru stron i blogów być może coś naprawiłem, ale główny problem występuje nadal. Idziemy więc dalej.
Trzeci krok to odpowiedzenie sobie na pytanie: “Co tak naprawdę zrobiłem” i idąc ‘od ogółu do szczegółu’ znalezienie potencjalnych źródeł problemów. W tym wypadku wyglądało to mniej więcej tak:
- przeniosłem bazę danych na inny serwer
- nowy serwer jest nieco lepszy (2GB pamięci vs 1GB, podobna moc obliczeniowa, podobna technologia), ale zasadniczo identyczny do poprzedniego. Na pewno nie jest gorszy, więc to nie problem z brakiem zasobów
- używam nieco innego oprogramowania (MySQL vs Percona), ale w gruncie rzeczy jest to to samo oprogramowanie (Percona bazuje na silniku MySQL, główna różnica polega na ‘wydajniejszej’ domyślnej konfiguracji i kilku optymalizacjach w samym kodzie) — ewentualne różnice nie powodowałyby aż tak drastycznych zmian
- używam domyślnej konfiguracji, wcześniej działało to w oparciu o domyślną konfigurację Amazon RDS — mamy jakiś trop, tak naprawdę nie wiem jaka była i jaka jest konfiguracja i na co ona wpływa
Jako że był to pierwszy sensowny trop, warto było sprawdzić. w MySQL możemy podejrzeć ustawienia (‘SHOW GLOBAL VARIABLES;‘ — więcej informacji na https://dev.mysql.com/doc/refman/5.7/en/show-variables.html ) — mamy bagatela kilkaset opcji dla każdej z baz danych. Kolejny krok to odfiltrowanie szumu czyli ponownie — zrozumienie co tak naprawdę się zmieniło. Ponieważ wynik tego zapytania łatwo wyeksportować do pliku tekstowego, możemy użyć dowolnego narzędzia, żeby porównać oba pliki, np. diffchecker.com (uwaga! taka konfiguracja może zawierać też wrażliwe dane jak np. klucze czy hasła; upewnij się, że nie wysyłasz ich na losowy serwer w sieci lub skorzystaj z jakiegoś narzędzia lokalnego — choćby dowolnego narzędzi do obsługi Gita). Już lepiej, około 100 różnic, z czego po odfiltrowaniu prawdopodobnie nieistotnych (ścieżki do folderów, nazwy serwera itp) zostało kilkadziesiąt. W tym momencie wracamy do google, dokumentacji mysql i sprawdzamy każdy parametr po kolei.
Kilka godzin (i masę stron dokumentacji) później, wytypowałem 5 parametrów które mogły mieć wpływ na obserwowane problemy, skopiowałem ich wartości z konfiguracji Amazon RDS na swój serwer i ponownie przepiąłem bloga na nową bazę danych.
Podsumowanie
Nie przedłużając — zadziałało :) Blog (a przynajmniej jego część webowa) jest już w pełni na naszej infrastrukturze, w efekcie czego… nic się nie zmieniło :D To lepiej niż nasze założone kryterium sukcesu (w tym wypadku było to spadek wydajności o strony mierzony jako czas do załadowania się o nie więcej niż 25%).
W żadnym wypadku nie oznacza to, że cała ta przygoda nie przyniosła korzyści, wręcz przeciwnie!
Przede wszystkim, poczucie dobrze wykonanego zadania i podbudowanie pewności siebie. Jeśli będę miał do zrobienia w pracy czy prywatnie coś, o czym nie mam bladego pojęcia, zamiast panikować pomyślę sobie że “wtedy się udało, to i teraz dam radę”.
Po drugie, wiem lepiej czego nie wiem. Podczas pracy nad migracją przeczytałem więcej dokumentacji MySQLa niż ucząc się korzystać z baz danych. W żadnym wypadku nie czuje się ekspertem w tej dziedzinie ale jeśli napotkam problem w przyszłości, będę umiał lepiej go opisać komuś kompetentnemu albo szybciej znaleźć odpowiednie informacje.
Po trzecie, to było po prostu ciekawe. Zaglądanie ‘pod maskę’ bazy danych to super interesująca lekcja o tym jak budować wydajne oprogramowanie oraz z jakimi problemami można się spotkać (w dojrzałych produktach, jakim jest np. mysql, każda decyzja i podejście ma swoje uzasadnienie i wynika z jakichś problemów napotkanych w przeszłości).
Po czwarte — teraz mogę napisać o tym wpis z konkretnymi przykładami ;)
Czy przyda mi się to w pracy / karierze? Raczej nie (choć nigdy nie wiadomo). Czy było warto (choć tytuł mógł być trochę spoilerem…)? Zdecydowanie TAK!
Zdjęcie w nagłówku autorstwa Susan Holt Simpson pobrane z serwisu Unsplash