Równoważenie obciążenia
- 9 min
Skalowanie na zewnątrz przez przełączanie nowych maszyn wirtualnych w tryb online w przypadku wzrostu ruchu jest efektywną strategią skalowania w celu spełnienia wymagań. Możliwość szybkiej aprowizacji maszyn wirtualnych ma kluczowe znaczenie dla osiągnięcia elastyczności. Jednak przełączanie dodatkowych serwerów w tryb online nie jest „przydatne”, dopóki ruch nie jest dystrybuowany między tymi serwerami. Ogólnie pomaga to systemowi obsłużyć zwiększone obciążenie. Dlatego równoważenie obciążenia ma kluczowe znaczenie dla elastyczności, ponieważ dynamicznie dostosowuje liczbę zasobów przypisanych do zadania.
Konieczność równoważenia obciążenia wynika z dwóch podstawowych wymagań. Po pierwsze: przepływność jest lepsza w przypadku przetwarzania równoległego. Jeśli jeden serwer może obsłużyć 5000 żądań na jednostkę czasu, 10 serwery z idealnie zrównoważonym obciążeniem mogą obsługiwać 50 000 żądań na jednostkę czasu. Po drugie: zasoby o zrównoważonym obciążeniu mają wyższą dostępność. Zamiast przekazywania żądania do serwera, który już ma problemy z obsługą ruchu, moduł równoważenia obciążenia może skierować żądanie do serwera z mniejszym obciążeniem. Ponadto, jeśli serwer przejdzie w tryb offline, a moduł równoważenia obciążenia go rozpozna, będzie mógł kierować żądania do innych serwerów.
Co to jest równoważenie obciążenia?
Dobrze znaną formą równoważenia obciążenia jest usługa DNS w trybie okrężnym, której wiele dużych usług internetowych używa do dystrybucji żądań między kilkoma serwerami. Konkretne serwery front-end, z których każdy ma unikatowy adres IP, dzielą nazwę DNS. Aby zrównoważyć liczbę żądań na każdym serwerze internetowym, duże firmy, takie jak Google, utrzymują i nadzorują pulę adresów IP dla każdego wpisu DNS. Gdy klient wysyła żądanie (na przykład do www.google.com), usługa DNS firmy Google wybiera jeden z dostępnych adresów z puli i wysyła go do klienta. Najprostszą strategią wykorzystywaną do wysyłania adresów IP jest użycie kolejki okrężnej, gdzie po każdej odpowiedzi usługi DNS lista adresów jest permutowana.
Przed pojawieniem się chmury równoważenie obciążenia DNS było prostym sposobem na zmniejszenie opóźnień połączeń na duże odległości. Dyspozytor na serwerze DNS był zaprogramowany w celu odpowiedzi przy użyciu adresu IP serwera geograficznie najbliższego klientowi. Najprostszym sposobem jest odpowiedź za pomocą adresu IP z puli, który był numerycznie najbliżej adresu IP klienta. Ta metoda była zawodna, ponieważ adresy IP nie są dystrybuowane w hierarchii globalnej. Bieżące techniki są bardziej zaawansowane i polegają na programowym mapowaniu adresów IP na lokalizacji w oparciu o fizyczne mapy usługodawców internetowych (ISP). Ponieważ to mapowanie jest implementowane jako kosztowne wyszukiwanie programowe, ta metoda zapewnia lepsze wyniki, ale obliczenia za jej pomocą są kosztowne. Koszt powolnego wyszukiwania jest jednak amortyzowany, ponieważ wyszukiwanie DNS odbywa się tylko wtedy, gdy pierwsze połączenie z serwerem jest nawiązywane przez klienta. Cała dalsza komunikacja odbywa się bezpośrednio między klientem a serwerem, który jest właścicielem wysłanego adresu IP. Przykład schematu równoważenia obciążenia DNS przedstawiono na rysunku 9.
Rysunek 9. Równoważenie obciążenia w środowisku chmury.
Wada tej metody występuje w przypadku awarii serwera. Przełączenie na inny adres IP jest zależne od konfiguracji czasu wygaśnięcia (TTL) pamięci podręcznej DNS. Wpisy DNS są długotrwałe, a propagacja aktualizacji trwa ponad tydzień. Oznacza to, że trudno jest szybko ukryć błąd serwera u klienta. Zmniejszenie ważności (TTL) adresu IP w pamięci podręcznej poprawia stosunek kosztu do wydajności i zwiększa liczbę wyszukiwań.
Nowoczesne równoważenie obciążenia często odnosi się do użycia dedykowanego wystąpienia (lub pary wystąpień) do wysyłania żądań przychodzących do serwerów zaplecza. W przypadku każdego żądania przychodzącego na określonym porcie moduł równoważenia obciążenia przekierowuje ruch do jednego z serwerów zaplecza zgodnie ze strategią dystrybucji. W związku z tym moduł równoważenia obciążenia przechowuje metadane żądania, w tym takie informacje jak nagłówki protokołu aplikacji (na przykład nagłówki HTTP). W tej sytuacji nieodświeżone informacje nie stanowią problemu, ponieważ każde żądanie przechodzi przez moduł równoważenia obciążenia.
Mimo że wszystkie typy modułów równoważenia obciążenia sieciowego przekazują żądania wraz z dowolnym kontekstem do serwerów zaplecza, to w przypadku wysłania odpowiedzi z powrotem do klienta można wdrożyć jedną z dwóch podstawowych strategii1:
Proxy — w tym podejściu moduł równoważenia obciążenia otrzymuje odpowiedź z zaplecza i przekazuje ją z powrotem do klienta. Moduł równoważenia obciążenia działa jako standardowy internetowy serwer proxy i jest uwzględniany w obu połowach transakcji sieciowej, a mianowicie w przekazywaniu żądania do klienta i wysyłaniu odpowiedzi.
Przekazywanie TCP — w tym podejściu połączenie TCP z klientem jest przekazywane do serwera backendowego, a serwer wysyła odpowiedź bezpośrednio do klienta, bez przechodzenia przez load balancer.
Tę drugą strategię przedstawiono na rysunku 10.
Rysunek 10. Mechanizm przekazywania TCP z dyspozytora do serwera zaplecza.
Zalety równoważenia obciążenia
Jedną z zalet równoważenia obciążenia jest możliwość maskowania błędów w systemie. O ile klient jest narażony na pojedynczy punkt końcowy, który reprezentuje kilka zasobów, awarie poszczególnych zasobów są ukryte przed klientem, obsługując żądania przy użyciu innych zasobów. Teraz jednak sam moduł równoważenia obciążenia jest pojedynczym punktem awarii. Jeśli z jakiegoś powodu wystąpi błąd, nawet jeśli wszystkie serwery zaplecza nadal działają, żadne żądania klienta nie zostaną przetworzone. W związku z tym w celu osiągnięcia wysokiej dostępności moduły równoważenia obciążenia często są implementowane w parach.
Co ważniejsze, równoważenie obciążenia skraca czas odpowiedzi przez dystrybuowanie obciążeń do kilku zasobów obliczeniowych w chmurze. Jednak pojedyncze wystąpienie obliczeniowe w chmurze ma pewne ograniczenia. We wcześniejszych modułach omówiono fizyczne ograniczenie wydajności, w przypadku którego więcej zasobów jest wymaganych do zwiększenia obciążeń. Za pomocą równoważenia obciążenia większe obciążenia są dystrybuowane w wielu zasobach, dzięki czemu każdy zasób może realizować żądania niezależnie i równolegle, co poprawia przepływność aplikacji. Równoważenie obciążenia skraca również średni czas odpowiedzi, ponieważ jest więcej serwerów do obsługi obciążenia.
Kontrola kondycji jest kluczem do wdrożenia pomyślnych strategii równoważenia obciążenia. Moduł równoważenia obciążenia musi wiedzieć, kiedy zasób staje się niedostępny, aby można było uniknąć przekazywania ruchu do tego zasobu. Monitorowanie echa ping, w którym moduł równoważenia obciążenia wysyła do serwerów żądania protokołu ICMP (Protokół komunikatów sterujących Internetu), jest jedną z najpopularniejszych taktyk używanych do sprawdzania stanu określonych zasobów. Oprócz uwzględniania kondycji zasobu podczas przekazywania do niego ruchu niektóre strategie równoważenia obciążenia mają wpływ na inne metryki, takie jak przepływność, opóźnienie i użycie procesora CPU.
Moduły równoważenia obciążenia muszą często gwarantować wysoką dostępność. Najprostszym sposobem na to jest utworzenie wielu wystąpień równoważenia obciążenia (z których każde ma unikatowy adres IP) i połączenie go z pojedynczym adresem DNS. Za każdym razem, gdy wystąpi błąd równoważnika obciążenia, zostanie on zastąpiony nowym, a cały ruch będzie przekazywany do instancji przełączania awaryjnego z minimalnym wpływem na wydajność. Jednocześnie można skonfigurować nowe wystąpienie równoważnika obciążenia, aby zastąpić to uszkodzone, a rekordy DNS muszą zostać natychmiast zaktualizowane.
Oprócz dystrybuowania żądań między serwerami zaplecza moduły równoważenia obciążenia często korzystają z mechanizmów do zmniejszania obciążenia serwerów i zwiększania ogólnej przepływności. Niektóre z tych mechanizmów obejmują:
Odciążanie SSL — w przypadku połączeń HTTPS jest naliczany dodatkowy koszt wydajności, ponieważ ruch w nich jest szyfrowany. Zamiast obsługiwać wszystkie żądania za pośrednictwem protokołu SSL (Secure Sockets Layer) połączenie klienta z modułem równoważenia obciążenia może być nawiązywane za pośrednictwem protokołu SSL, a żądania mogą być przekierowywane do poszczególnych serwerów za pośrednictwem nieszyfrowanego protokołu HTTP. Ta technika znacznie zmniejsza obciążenie serwerów. Ponadto zabezpieczenia są zachowywane, o ile żądania przekierowania nie są wykonywane za pośrednictwem otwartej sieci.
Buforowanie TCP — strategia odciążania klientów mających powolne połączenia z modułem równoważenia obciążenia w celu zwolnienia serwerów obsługujących odpowiedzi dla tych klientów.
Buforowanie — w niektórych scenariuszach moduł równoważenia obciążenia może zachować pamięć podręczną dla najpopularniejszych żądań (lub żądań, które mogą być obsługiwane bez przechodzenia do serwerów, takich jak zawartość statyczna), aby zmniejszyć obciążenie serwerów.
Kształtowanie ruchu — moduł równoważenia obciążenia może użyć tej techniki w celu opóźnienia lub zmiany priorytetu przepływu pakietów w celu zoptymalizowania ruchu pod kątem konfiguracji serwera. Ma to wpływ na jakość usług w przypadku niektórych żądań, ale gwarantuje, że obciążenie może zostać obsłużone.
Pamiętaj, że równoważenie obciążenia działa tylko wtedy, gdy sam moduł równoważenia obciążenia nie ma dużego obciążenia. W przeciwnym razie moduł równoważenia obciążenia stanie się wąskim gardłem. Na szczęście moduły równoważenia obciążenia wykonują małą część przetwarzania odbieranych żądań zamiast polegać na serwerach zaplecza, aby rzeczywiście przekształcać żądania w odpowiedzi.
Sprawiedliwe dystrybuowanie
W chmurze są używane różne strategie równoważenia obciążenia. Jedną z najczęstszych jest zrównoważone wysyłanie, które korzysta z prostego algorytmu okrężnego w celu równomiernego dystrybuowania ruchu między wszystkimi węzłami. Nie uwzględnia użycia poszczególnych zasobów w systemie, ani czasu wykonywania żądania. To podejście stara się utrzymać każdy węzeł w systemie zajętym i jest jedną z najprostszych metod do wdrożenia.
Usługi AWS używają tego rozwiązania w swojej ofercie usługi Elastic Load Balancer (ELB). Usługa ELB dostarcza równoważniki obciążenia, które równoważą ruch między dołączonymi wystąpieniami EC2. Moduły równoważenia obciążenia są zasadniczo wystąpieniami EC2 z usługą, która służy do kierowania ruchu. W miarę skalowania zasobów za pomocą modułu równoważenia obciążenia, adresy IP nowych zasobów są aktualizowane w rekordzie DNS tego modułu. Ten proces może potrwać kilka minut, ponieważ wymaga zarówno czasu monitorowania, jak i aprowizacji. Ten okres skalowania — czas oczekiwania do momentu, gdy moduł równoważenia obciążenia będzie gotowy do obsłużenia wyższego obciążenia — jest określany jako „rozgrzewanie” modułu równoważenia obciążenia.
Moduły równoważenia obciążenia usług AWS również monitorują dołączone do nich zasoby na potrzeby dystrybucji obciążeń, aby zachować kontrolę kondycji. Mechanizm ping-echo służy do zapewnienia, że wszystkie zasoby są w dobrej kondycji. Użytkownicy usługi ELB mogą konfigurować parametry kontroli kondycji przez określenie opóźnień i liczby ponownych prób.
Dystrybucja oparta na skrótach
To rozwiązanie próbuje zadbać o to, aby żądania od tego samego klienta w czasie trwania sesji były za każdym razem kierowane do tego samego serwera, przez określenie skrótu metadanych definiującego każde żądanie i używającego skrótu do wybrania serwera. Jeśli skrót zostanie określony prawidłowo, żądania będą dystrybuowane względnie równomiernie między serwerami. Jedną z zalet tego podejścia jest to, że jest to rozwiązanie dla aplikacji obsługujących sesje, które mogą przechowywać dane sesji w pamięci zamiast zapisywać je w udostępnionym magazynie danych, takim jak baza danych lub pamięć podręczna Redis. Wadą jest to, że każde żądanie musi być zhashowane, co prowadzi do niewielkiego opóźnienia.
Usługa Azure Load Balancer używa mechanizmu opartego na skrócie do dystrybucji obciążeń. Ten mechanizm tworzy skrót dla każdego żądania w oparciu o źródłowy adres IP, port źródłowy, docelowy adres IP, port docelowy i typ protokołu w celu zapewnienia, że w normalnych warunkach każdy pakiet z tej samej sesji trafi na ten sam serwer zaplecza. Funkcję skrótu wybiera się tak, aby dystrybucja połączeń z serwerami była losowa.
Inne strategie równoważenia obciążenia
Jeśli określony serwer ma dużo pracy z przetwarzaniem żądania (lub zestawu żądań), moduły równoważenia obciążenia korzystające z okrężnych algorytmów wysyłania lub algorytmów wysyłania opartych na skrótach będą przekazywać do niego żądania. Istnieją inne, bardziej zaawansowane strategie równoważenia obciążenia dla wielu zasobów, które uwzględniają pojemność. Oto dwie z najczęściej używanych metryk dla oceny pojemności:
Czas wykonania żądania — strategie oparte na tej metryce używają algorytmu planowania priorytetowego, w którym czas wykonywania żądań służy do wybrania miejsca docelowego dla poszczególnych żądań. Głównym wyzwaniem w przypadku tego podejścia jest dokładne zmierzenie czasu wykonywania. Moduł równoważenia obciążenia może odgadnąć czas wykonywania (i stale aktualizować) przy użyciu tabeli w pamięci, w której są przechowywane różnice między czasem przekazania żądania do każdego serwera a czasem zwrotu żądania.
Użycie zasobów — strategie oparte na tej metryce korzystają z użycia procesora do zrównoważenia wykorzystania między węzłami. Moduł równoważenia obciążenia zachowuje uporządkowaną listę zasobów na podstawie ich użycia i kieruje każde odbierane żądanie do zasobu, które ma najmniejsze obciążenie.
Równoważenie obciążenia ma kluczowe znaczenie dla implementacji skalowalnych usług w chmurze. Bez skutecznej metody dystrybucji ruchu między zasobami zaplecza technicznego, elastyczność osiągnięta przez tworzenie zasobów w razie potrzeby i ich usuwanie, gdy nie są potrzebne, jest bardzo ograniczona.
Źródła
- Aron, Mohit i Sanders, Darren i Druschel, Peter i Zwaenepoel, Willy (2000). "Skalowalna dystrybucja żądań świadoma zawartości na serwerach sieciowych opartych na klastrze". Materiały z Dorocznej Konferencji Technicznej USENIX z 2000 roku.