load balancer

Rozdziela ruch sieciowy pomiędzy wiele serwerów, aby żaden nie był przeciążony. Zwiększa wydajność i dostępność usług.

Load balancer (równoważnik obciążenia) to element infrastruktury, który stoi przed grupą serwerów i rozdziela między nie przychodzący ruch sieciowy. Zamiast pozwolić, by jeden serwer dostał wszystkie żądania i padł pod ich naporem, load balancer pilnuje, żeby praca rozkładała się równomiernie. Efekt: usługa jest szybsza (bo nikt nie jest zarżnięty) i bardziej dostępna (bo gdy jeden serwer odpadnie, ruch leci do pozostałych).

Jak to działa

Klienci łączą się z jednym adresem (load balancera), a ten w tle decyduje, do którego z serwerów backendu przekazać żądanie. Wybór odbywa się według algorytmu: round robin (po kolei), least connections (do najmniej obciążonego) albo na podstawie hashowania IP klienta. Do tego dochodzi health check — load balancer regularnie odpytuje serwery i jeśli któryś przestaje odpowiadać, automatycznie wyrzuca go z puli, dopóki nie wróci do formy.

Rozróżnia się dwie warstwy: L4 (transportowa, balansuje po TCP/UDP, nie zaglądając do treści) i L7 (aplikacyjna, rozumie HTTP, więc potrafi kierować ruch np. po ścieżce URL czy nagłówku). L7 daje więcej możliwości, L4 jest szybszy i prostszy.

Przykład z praktyki

Najpopularniejszy darmowy zestaw to nginx jako reverse proxy z balansowaniem. Definiujesz pulę serwerów i kierujesz na nią ruch:

upstream backend { server 10.0.0.1; server 10.0.0.2; server 10.0.0.3; }

Potem w bloku server dajesz proxy_pass http://backend; i nginx sam rozkłada żądania round robinem. W chmurze zamiast tego klikasz gotowca: AWS Elastic Load Balancing (ALB dla HTTP, NLB dla L4), HAProxy albo Traefik w świecie kontenerów.

Częste błędy i mity

  • Mit: load balancer = wysoka dostępność. Jeśli masz jeden load balancer, to on sam jest single point of failure. W produkcji stawia się je redundantnie (np. para w trybie active-passive).
  • Sesje i sticky sessions. Gdy aplikacja trzyma stan sesji lokalnie na serwerze, rozrzucanie żądań po różnych maszynach wyloguje użytkownika. Rozwiązanie: trzymaj sesje w Redisie, albo włącz session affinity (ale to ogranicza równomierność).
  • Zapomniany health check. Bez niego load balancer wesoło wysyła ruch do martwego serwera i zalicza błędy 502.

Pojęcia powiązane: reverse proxy, high availability, failover, round robin, nginx, HAProxy, autoscaling, single point of failure.