Ostatnimi czasy miałem sporo styczności z zapuszczonymi bazami danych, dlatego też chcę się podzielić z drogimi Czytelnikami kilkoma przemyśleniami na ten temat. Regularne doglądanie serwisu internetowego i jego bazy danych to ważna, choć często pomijana kwestia.
O co chodzi? Standardowa procedura wdrażania serwisu internetowego wygląda następująco. Pierwszy krok to wybór oprogramowania. Drugi, ściągnięcie go i instalacja na serwerze. Trzeci – konfiguracja serwisu i jego ewentualne dostosowanie do naszych potrzeb. Czwarty – zapomnieć o wszystkim. Tak się niestety nie da.
Po pierwsze, kwestia wszelkiego rodzaju logów aplikacji. Często jest tak, że aplikacja różnego rodzaju logi i statystyki przechowuje w bazie danych. Samo w sobie nie jest to złe, ale jeśli serwis nie umie sobie dobrze poradzić z nadmierną ilością danych, to zaczynają się problemy. Przykładowo, logi trzeba rotować. Można co pewien czas (codziennie, co miesiąc, co dana liczba rekordów) tworzyć nową tabelę i przepisywać tam stare wpisy. Można wykorzystać silnik Archive bądź też mechanizmy kompresji wbudowane w MyISAM czy InnoDB aby zmniejszyć ilość danych zajmowanych przez logi. Można tabelę podzielić na partycje. Coś w każdym razie trzeba robić, bo w przeciwnym razie zostaniemy z tabelą z kilkudziesięcioma milionami rekordów, obejmujących kilka ostatnich lat – z danymi w takiej postaci nie wiele da się zrobić jeśli chodzi o zestawienia. Raz zdarzyło mi się trafić na tabelę która zajmowała kilka gigabajtów, a w której w ogóle nie było indeksów – najwyraźniej nikt nie próbował nawet wyciągać z niej kiedykolwiek jakichś danych – czas wykonywania ciut bardziej skomplikowanego SELECTa można liczyć w dniach.
Druga sprawa – spam. Ktoś kiedyś zainstalował na serwerze forum dyskusyjne. Minęło trochę czasu, twórcy już dawno o forum zapomnieli. Jednak jest ktoś, kto doskonale o takich forach pamięta. Jeśli dostęp do forum nie jest poprawnie zabezpieczony (bądź też zabezpieczenie to nie jest wystaczające), automaty spamujące będą wrzucać nowe posty i generować wątki idące w dziesiątki tysięcy wpisów. Obsługa takiego ruchu zajmuje trochę czasu serwerowi bazodanowego. Tabele puchną, INSERTy wrzucające kolejną porcję spamu zajmują operacje dyskowe, które przydałyby się innym zapytaniom. Co gorsza, nie tylko boty spamerów pamiętają o takich zapomnianych stronach. Są jeszcze inni automatyczni użytkownicy. Też boty, tylko wyszukiwarek internetowych. Takie połączenie rodzi już konkretny problem. Jeśli tabele mają po kilka gigabajtów, wątki po kilka tysięcy stron postów, to w momencie gdy jakikolwiek bot zacznie indeksować takie forum, może przeciążyć całkiem mocny serwer bazodanowy. Kumulują się tu problemy takie jak ogromna ilość danych w tabeli, daleka od optymalnej struktura bazy, brak niektórych ważnych indeksów, nieoptymalne zapytania, “klasyczne”, mocno obciążające MySQL rozwiązania paginacji (LIMIT 10000,20) i tak dalej.
Co można zrobić aby uniknąć tego typu problemów? Podstawowa sprawa – robić przeglądy okresowe serwera bazodanowego. Jeśli sprawdzanie slowlogów stanie się rutyną, zauważymy że coś jest nie tak. Duże ilości INSERTów, w dodatku o specyficznej treści (zazwyczaj łączącej się ze stosunkami damsko – męskimi, kilkoma farmaceutykami bądź też zegarkami różnego rodzaju) mogą świadczyć o tym, że dana baza zawiera niekoniecznie pożądane wpisy i może być wykorzystywana przez serwis, który stał się celem spamerów. Dobrze jest też co pewien czas sprawdzać jak duże są nasze bazy danych. Jeśli widzimy, że niektóre z nich osiągają wielkość kilku gigabajtów, a nie bardzo wiemy skąd taka ilość danych mogłaby się w nich znajdować, trzeba taką bazę sprawdzić.
Tego typu operacje powinny się stać czymś naturalnym dla każdego administratora baz danych (czy też administratora serwera fizycznego lub VPS, który także bazami się zajmuje). Opisane powyżej sytuacje skutkują czasami na prawdę sporym obciążeniem. Pytanie, co jest lepsze – poświęcić regularnie trochę czasu na uporządkowanie spraw na serwerze i zmniejszyć obciążenie czy też kupić bardziej wydajną opcję? Dla mnie sprawa jest oczywista.
Komentarze