Load balancing w nginx: upstream, metody i health checki
Load balancing w nginx
Load balancer nginx: upstream, metody, wagi, health checki | We.Inc
Skonfiguruj nginx jako load balancer: blok upstream, round robin, least_conn, ip_hash i hash, wagi, max_fails i fail_timeout, serwery zapasowe, plus generator konfiguracji.
Aby rozkładać ruch w nginx, wypisz serwery aplikacji w bloku upstream i skieruj proxy_pass na jego nazwę. Żądania są rozdzielane metodą round robin, chyba że dodasz least_conn, ip_hash, hash lub random. Każda linia server może mieć weight, max_fails i fail_timeout dla pasywnych health checków oraz flagi backup lub down.
Metody load balancingu w nginx
Dyrektywa
Jak wybiera serwer
Dobre do
(brak)
Ważony round robin, domyślnie
Podobnych serwerów i krótkich żądań
Najmniej aktywnych połączeń, z uwzględnieniem wag
Żądań o bardzo różnej długości
Hash adresu klienta (pierwsze trzy oktety IPv4, cały IPv6)
Utrzymywania odwiedzającego na jednym serwerze
hash key
Hash dowolnej wartości, np. $request_uri
Powinowactwa cache; dodaj consistent, aby ograniczyć przetasowania
Losowy serwer albo lepszy z dwóch przy random two
Kilku load balancerów dzielących jedną pulę
Rozkładanie ruchu na kilka kopii aplikacji to jedno z najstarszych zadań nginx, a cała konfiguracja mieści się w kilkunastu liniach. Generator poniżej tworzy blok upstream z listy serwerów, ostrzega przed kombinacjami, które nginx odrzuca, i pokazuje udział każdego serwera w żądaniach, gdy działają wagi. Zestawienie pod nim opisuje każdy parametr server wraz z wartością domyślną.
Dodaj w generatorze adres i port każdego serwera aplikacji, z wagą, jeśli niektóre maszyny są mocniejsze od innych.
Wybierz metodę. Zostaw round robin, chyba że żądania mocno różnią się długością albo odwiedzający muszą trzymać się jednego serwera.
Skopiuj wynik do kontekstu http, na przykład do pliku w conf.d, i uruchom nginx -t.
Przeładuj przez nginx -s reload, potem zatrzymaj jeden serwer aplikacji i obserwuj, jak żądania przechodzą na pozostałe.
Pojedynczy serwer w upstream ignoruje max_fails i fail_timeout, więc pasywne sprawdzenia mają znaczenie dopiero przy dwóch lub więcej.
Przy ip_hash oznacz serwer jako down zamiast usuwać linię. Dzięki temu hash adresu każdego innego klienta wskazuje tam, gdzie wcześniej.
Serwery backup dostają ruch tylko wtedy, gdy każdy główny serwer jest niedostępny, i nie można ich łączyć z hash, ip_hash ani random.
O tym, które błędy liczą się do max_fails, decyduje proxy_next_upstream. Domyślnie liczą się błędy i timeouty; HTTP 500 nie, chyba że go wymienisz.
Dodaj keepalive z proxy_http_version 1.1 i pustym nagłówkiem Connection, aby ponownie używać połączeń z backendami zamiast otwierać nowe przy każdym żądaniu.
Najczęściej zadawane pytania
Czy nginx open source ma aktywne health checki?
Nie. Dyrektywa health_check należy do komercyjnego NGINX Plus. nginx open source polega na pasywnych sprawdzeniach: jeśli żądanie do serwera zawiedzie max_fails razy w ciągu fail_timeout, serwer jest pomijany przez fail_timeout, a potem ponownie testowany prawdziwym ruchem.
Jakie są wartości domyślne max_fails i fail_timeout?
max_fails domyślnie wynosi 1, a fail_timeout 10 sekund. Jedna nieudana próba wyłącza więc serwer na dziesięć sekund. Ustawienie max_fails=0 wyłącza zliczanie dla tego serwera.
Jak zrobić sticky sessions w nginx?
Użyj ip_hash, aby trzymać każdy adres klienta na jednym serwerze, albo hash ze zmienną cookie, taką jak $cookie_session, dla dokładniejszej kontroli. Dyrektywy sticky oparte na cookies istnieją tylko w wersji komercyjnej.
Co robi parametr weight?
Zmienia liczbę żądań, które serwer dostaje w stosunku do pozostałych. Przy wagach 3, 1 i 1 pierwszy serwer w round robin otrzymuje około trzech z każdych pięciu żądań. Domyślna waga to 1.
Czy nginx może rozkładać połączenia WebSocket?
Tak. Skieruj proxy_pass na upstream i przekazuj nagłówki Upgrade i Connection. least_conn lepiej pasuje do długo żyjących socketów niż round robin, bo liczy, ile połączeń każdy serwer już utrzymuje.
Gdzie umieścić poszczególne elementy
Blok upstream znajduje się w kontekście http, obok Twoich bloków server. Tylko nazywa pulę; nic się nie dzieje, dopóki location nie poda proxy_pass http://name. Tej samej puli może używać wiele bloków location i wiele bloków server.
Pasywne health checki krok po kroku
Gdy żądanie do serwera zawiedzie w sposób, który liczy proxy_next_upstream, nginx ponawia je na następnym serwerze i odnotowuje błąd. Gdy serwer osiągnie max_fails błędów w oknie fail_timeout, nginx przestaje go wybierać. Po upływie fail_timeout ostrożnie znów wysyła do niego prawdziwe żądania klientów, a sukces przywraca go do rotacji.
Ponieważ sprawdzenia opierają się na prawdziwym ruchu, odwiedzający może trafić na pierwszą nieudaną próbę. Krótkie wartości proxy_connect_timeout utrzymują to opóźnienie na niskim poziomie.
Parametry server i ich wartości domyślne
Parametry linii server wewnątrz upstream
Parametr
Domyślnie
Działanie
weight=n
Względny udział w żądaniach
max_fails=n
Nieudane próby w ciągu fail_timeout, po których serwer jest pomijany; 0 wyłącza
fail_timeout=time
Okno zliczania błędów i czas, przez jaki serwer jest pomijany
max_conns=n
0 (bez limitu)
Limit jednoczesnych aktywnych połączeń z tym serwerem
Używany tylko, gdy wszystkie główne serwery są niedostępne
Oznacza serwer jako trwale niedostępny
Kompletne przykłady
Round robin z zapasowym serwerem
Dwa główne serwery dzielą obciążenie; trzeci odpowiada tylko wtedy, gdy oba nie działają.
least_conn z ponownym użyciem połączeń
keepalive przechowuje bezczynne połączenia z backendami; dwie linie proxy sprawiają, że to działa.
Powinowactwo cache według URL
Każdy URL trafia zawsze na ten sam serwer cache; consistent zachowuje większość przypisań, gdy serwer zostanie dodany lub usunięty.
Nazwa upstream
Metoda
Round robin (domyślnie)
Klucz hash
Bezczynne połączenia keepalive (0 = brak)
Serwery
Adres i port
Waga
fail_timeout (s)
Udział
Usuń serwer {n}
Dodaj serwer
nginx odrzuca serwery backup przy hash, ip_hash i random. Usuń flagę backup albo zmień metodę.
Każdy główny serwer jest oznaczony jako down, więc nic nie może odbierać ruchu.