Jak niektórzy mogli zauważyć, przez pewien czas blog był niedostępny, a to za sprawą problemów technicznych. Coś padło w głównej serwerowni u mojego dostawcy hostingu, następnie problem eskalował na konfigurację mojego serwera. W wyniku podjętej przeze mnie akcji ratunkowej, pomimo że operacja się udała – pacjent nie przeżył. Ta sytuacja zachęciła mnie do długo już planowanej, a przez brak czasu ciągle odkładanej decyzji o migracji bazy bloga do MongoDB. Dzisiejszy wpis będzie właśnie o tych moich potyczkach, zakończonych, jak widać, sukcesem.
MongoDB to dokumentowa baza danych, która zdobyła ogromną popularność. Tego typu bazy świetnie nadają się na platformy blogowe. Jednym z głównych powodów, dla których zdecydowałem się na migrację, jest elastyczność, jaką oferują dokumenty w kontekście zarządzania danymi. Tradycyjne relacyjne bazy danych, jak MySQL czy PostgreSQL, są oparte na sztywnych strukturach tabel, a bazy dokumentowe nie muszą posiadać schematu. Kolejną zaletą MongoDB jest jej skalowalność. W przypadku wzrostu ruchu na blogu baza może być łatwo skalowana horyzontalnie przez dodanie kolejnych węzłów, co sprawia, że jest idealna do obsługi aplikacji, które mogą szybko rosnąć. MongoDB jest również ceniona za wysoką wydajność w operacjach odczytu i zapisu. Dodatkowo, MongoDB posiada świetne wsparcie społeczności i dokumentację, dlatego też praca z nią na co dzień jest całkiem przyjemna.
Migracja bazy danych to dosyć skomplikowany proces. Na początek przeanalizowałem strukturę obecnej bazy i dostosowałem schemat danych do modelu dokumentowego. W przypadku MongoDB dane są przechowywane w kolekcjach jako dokumenty, więc musiałem przemyśleć, jak najlepiej zorganizować te dane, aby zachować logikę i spójność aplikacji. Tutaj należy kierować się ideą jednego pliku JSON, tzn. dane tak powinny być ułożone, aby przy użyciu jednego żądania otrzymać komplet danych. Nie obyło się bez zmian w samej aplikacji. Musiałem porzucić wykorzystywany system mapowania obiektowo-relacyjnego (Doctrine ORM) na rzecz systemu mapowania obiektowo-dokumentowego (Doctrine ODM). Nie była to zmiana czysto kosmetyczna – zmiana w nazwach adnotacji, lecz poznanie nowych sposobów reprezentacji danych. Przykładowo, adnotacja @EmbedOne
umożliwia zagnieżdżenie jednego dokumentu w innym dokumencie. To też typowa właściwość dla tego paradygmatu baz NoSQL – pozwalamy na redundancję danych. Dlatego pojawienie się ponownie owego zagnieżdżonego dokumentu nie musi oznaczać błędu projektowego.
W trakcie importowania danych do MongoDB napotkałem na kilka problemów związanych z kompatybilnością niektórych typów danych czy związkami wiele do wielu. Choć posłużyłem się dostarczonymi z MongoDB narzędziami takimi jak mongoimport
i mongodump
, to samo przemapowanie danych relacyjnych do dokumentu musiałem zrobić własnoręcznie. W tym celu napisałem autorskie narzędzie eksportujące dane relacyjne i przy użyciu odpowiednich reguł mapowania związków relacyjnych czy typów danych uzyskałem format Binary JSON. Wprowadziłem także kilka usprawnień w kodzie aplikacji, aby w pełni wykorzystać możliwości MongoDB, takie jak indeksowanie i agregacje.
Monitorowanie wydajności serwera pokazało mniejsze zużycie zasobów w porównaniu do poprzedniego rozwiązania relacyjnego, ale może to być też wynikiem tego, że sporą część logiki z aplikacji usunąłem. Jest mniej używanych zapytań, a te, które są potrzebne, są tak skonstruowane, aby nie dociągać dodatkowych danych. Jak pisałem wcześniej, nie przejmuję się redundancją czy wynikającą z niej anomalią modyfikacji. Kluczowe jest, aby jak najszybciej wygenerowała się strona startowa czy strona reprezentująca konkretny wpis!
Migracja do MongoDB to dopiero początek. Teraz, gdy mam stabilną i wydajną bazę danych, mogę skupić się na wprowadzaniu nowych funkcji i ulepszeń na blogu. Planuję zintegrować bardziej zaawansowane funkcje wyszukiwania, wykorzystując możliwości agregacji MongoDB. Chcę także wdrożyć kolejne węzły replikacji, tak by w przypadku awarii jakiegoś serwera strona dalej była dostępna. Postaram się jeszcze wrócić do tego tematu na blogu. Tymczasem mam nadzieję, że nowa infrastruktura okaże się strzałem w dziesiątkę!