Jak zapewnić wydajność i dostępność strony internetowej?
25 sierpnia 2008 16:13
Kamil Folga
Prowadzę stronę internetową, która w ostatnim okresie notuje znaczne zwiększenie liczby odwiedzin. W momentach najwyższego obciążenia, serwer obsługujący stronę odmawia odpowiedzi na zapytania. Chciałbym zainwestować w kolejne serwery i zrealizować mechanizm balansowania obciążeniem serwerów. Czy jest na to prosta metoda?
Zasoby każdego serwera są ograniczone. Aplikacja lub strona WWW o dużym obciążeniu, powinna wykorzystywać nie jeden, a wiele serwerów w celu zaakceptowania zwiększonej liczby użytkowników. Problem skalowalności dotyczy głównie serwerów internetowych, w których liczba użytkowników rośnie wraz z dostępnością łącz szerokopasmowych. Balansowanie obciążeniem to partycypowanie wielu serwerów w tej samej usłudze, realizujących te same zadania. Przy dużej ilości maszyn zawsze istnieje ryzyko uszkodzenia jednego z serwerów. Zdolność poprawnego funkcjonowania w momencie błędnego zadziałania usługi określa się mianem dostępności.
Najłatwiejszą drogą do wprowadzenia balansowania obciążeniem jest dedykowanie serwerów predefiniowanym grupom użytkowników. W podstawowej konfiguracji serwera nazw, domena jest rozwiązywana przez serwer na jeden adres IP. Co stanie się, gdy dana nazwa będzie rozwiązywana na kilka adresów IP, czyli kilka fizycznych serwerów? Otrzymamy prosty i skalowalny mechanizm balansowania obciążeniem. Przykładową metodą realizującą te założenia jest mechanizm Round Robin DNS. Wykorzystując RR DNS użytkownicy będą otrzymywali różne adresy IP dla tej samej nazwy serwera. Jak ten proces wygląda od strony użytkownika? Spróbujmy zapytać o rekordy typu A powiązane z domena google.com:
dns:~# host -t a google.com
google.com has address 72.14.207.99
google.com has address 64.233.187.99
google.com has address 64.233.167.99
Sprawdzamy ponownie po kilku sekundach:
dns:~# host -t a google.com
google.com has address 64.233.187.99
google.com has address 64.233.167.99
google.com has address 72.14.207.99
W przypadku serwera BIND możemy zrealizować identyczną usługę przez wprowadzenie następującej konfiguracji w ramach strefy danej domeny:
www IN CNAME serwer1.domena.pl.
IN CNAME serwer2.domena.pl.
IN CNAME serwer3.domena.pl.
IN CNAME serwer4.domena.pl.
Serwer DNS będzie rozwiązywał nazwę www.domena.pl rotacyjnie na jeden z wielu wprowadzonych konfiguracyjnie serwerów (serwer1.domena.pl, serwer2.domena.pl, serwer3.domena.pl, serwer4.domena.pl). W rezultacie użytkownicy będą kierowani na różne fizycznie serwery. To jest bardzo popularna metoda równoważenia obciążenia, ale nie zapewnia wymaganej dostępności. Serwer DNS nie ma informacji o dostępności serwera WWW, więc kontynuuje przełączanie nawet na niedostępne serwery.
Trudno w tym przypadku mówić o wysokiej dostępności. Można powiedzieć, że tym sposobem realizowana jest dystrybucja obciążenia. Niektóre z tych niedogodności mogą zostać usunięte przez implementację zaawansowanej wersji mechanizmów DNS, realizowanych przy wykorzystaniu dodatkowych skryptów. Konieczne będzie okresowe sprawdzanie statusu każdego z serwerów i przełączanie na poprawnie pracujące serwery w przypadku awarii. Dodatkową komplikację będzie stanowiła konieczność ustawienia krótkiego czasu TTL danej strefy, po upływie którego klient powinien jeszcze raz odpytać serwer nazw o daną domenę. Taka konfiguracja powoduje jednak znaczne zwiększenie obciążenia serwera nazw.
Niektóre odmiany mechanizmów równoważenia obciążenia mogą zostać przeprowadzane przy wykorzystaniu serwerów pośredniczących (proxy), w których są one wykorzystywane do balansowania ruchem rzeczywistych serwerów.
Zaawansowane rozwiązania oparte są o sprzętowe mechanizmy balansowania obciążaniem oraz realizację wirtualnych serwerów. Wśród niekomercyjnych rozwiązań bardzo popularnym rozwiązaniem jest
LVS. Linux Virtual Server jest wirtualnym i skalowalnym serwerem zbudowanym w oparciu o klaster rzeczywistych serwerów. Oprogramowanie zawierające wbudowany mechanizm balansowania obciążeniem jest dedykowane dla systemu operacyjnego Linux. Architektura serwera jest w pełni przeźroczysta dla końcowego użytkownika. Rzeczywiste serwery mogą być połączone zarówno przez sieć LAN oraz WAN. Od strony użytkownika widoczny jest jeden serwer z jednym adresem IP. Skalowalność systemu jest realizowana przez przeźroczyste dodawanie i usuwanie węzłów klastra. Wysoka dostępność jest realizowana przez węzły wykrywające usterki, a następnie automatycznie rekonfigurujące system. Istnieje wiele systemów zarządzania klastrami, które w połączeniu z LVM mogą zapewnić wysoką wydajność dla każdej aplikacji.
Co wybrać? W przypadku bardzo prostych rozwiązań i nieskomplikowanych stron, możemy zadowolić się mechanizmem Round Robin DNS. W przypadku zaawansowanych projektów warto wykorzystać darmowe oprogramowanie klastra typu LVS. Najbardziej zaawansowane rozwiązania będą oparte o kompilację opisanych metod oraz rozwiązania sprzętowe.