Takéapplication load balancer, network load balancer, L4 load balancer, L7 load balancerPokročilý

Definice

Load balancer je síťová nebo aplikační komponenta, která rozděluje příchozí provoz mezi více serverů nebo služeb. Zvyšuje dostupnost, umožňuje škálování a chrání uživatele před výpadkem jedné instance tím, že směruje požadavky jen na cíle, které podle kontrol zdraví a zvolené strategie dokážou odpovědět.

Kategorie: Sítě a protokolyAktualizováno

Proč se provoz neposílá na jeden server

Load balancer řeší situaci, kdy jedna instance aplikace nestačí výkonem, spolehlivostí nebo geografickou blízkostí k uživateli. Klient pošle požadavek na jednu známou adresu a load balancer vybere konkrétní backend: webový server, kontejner, virtuální stroj nebo službu. Aplikace se díky tomu může rozšiřovat přidáním dalších instancí, aniž by klient musel znát jejich adresy.

Rozdělování provozu není jen otázka rychlosti. Load balancer odděluje veřejný vstup do systému od vnitřních uzlů, pomáhá při nasazování nových verzí a umožňuje vyřadit porouchanou instanci bez ruční změny DNS. V cloudu bývá load balancer spravovaná služba, v Kubernetes často vzniká nad službou typu LoadBalancer.

Rozhodování o další cílové instanci

Load balancer může pracovat na různých vrstvách. Na síťové vrstvě obvykle sleduje IP adresy a porty, takže je rychlý a hodí se i pro protokoly mimo HTTP. Na aplikační vrstvě rozumí například HTTP hlavičkám, cestám URL nebo TLS terminaci, takže může posílat /api jinam než statické soubory.

Výběr backendu se řídí algoritmem. Round robin střídá cíle postupně, least connections preferuje méně vytíženou instanci a vážené směrování dovolí poslat větší část provozu na silnější server. U reálných systémů se přidávají limity, timeouty a ochrana proti tomu, aby pomalý backend dostával další požadavky jen proto, že je stále technicky dostupný.

Kontroly zdraví a vyřazení uzlu

Kontrola zdraví je pravidelný test, kterým load balancer zjišťuje, zda má backend dostávat provoz. Jednoduchý test ověří otevřený port, lepší test zavolá endpoint typu /health a zkontroluje, že aplikace zvládá odpovědět včas. Zdravý proces ale ještě nemusí znamenat zdravou službu, protože aplikace může běžet a zároveň nemít přístup k databázi.

Po selhání kontroly load balancer obvykle backend dočasně vyřadí. Návrat do provozu má být opatrný: instance po restartu může potřebovat zahřát cache, otevřít spojení nebo dokončit migrace. Příliš agresivní kontroly mohou naopak způsobit kolísání, kdy se uzel rychle vyřazuje a vrací.

Dva praktické scénáře

E-shop během kampaně

E-shop spustí slevovou akci a návštěvnost se během minut několikanásobně zvýší. Load balancer rozdělí HTTP požadavky mezi deset aplikačních serverů a nemocnou instanci přestane používat po neúspěšných health checkech. Zákazník si většinou nevšimne, že jeden server spadl, protože další požadavek obslouží jiný backend.

Kubernetes služba pro webové API

Tým provozuje API v několika podech a nechce ručně vystavovat každý pod do internetu. Kubernetes Service typu LoadBalancer požádá cloudovou platformu o externí load balancer a směruje provoz na dostupné pody. Ukázka vynechává detaily zabezpečení, ale ukazuje základní záměr:

apiVersion: v1
kind: Service
metadata:
  name: orders-api
spec:
  type: LoadBalancer
  selector:
    app: orders-api
  ports:
    - port: 80
      targetPort: 8080

Kde load balancer nestačí

Load balancer nezachrání aplikaci, která neumí běžet ve více instancích. Stav uložený jen v paměti jednoho serveru může rozbít přihlášení, košík nebo rozpracovaný formulář. Řešením bývá sdílené úložiště relací, tokeny, externí cache nebo návrh služby tak, aby byla bezstavová.

Samotný load balancer také nesmí být jediným kritickým bodem. Produkční architektura proto řeší redundanci load balanceru, více zón dostupnosti, monitoring, logování a kapacitní rezervu. Bez těchto vrstev se problém jen přesune z aplikačního serveru na vstupní komponentu.

Příklady z praxe

  1. E-shop během kampaně

    E-shop spustí slevovou akci a návštěvnost se během minut několikanásobně zvýší. Load balancer rozdělí HTTP požadavky mezi deset aplikačních serverů a nemocnou instanci přestane používat po neúspěšných health checkech. Zákazník si většinou nevšimne, že jeden server spadl, protože další požadavek obslouží jiný backend.

  2. Kubernetes služba pro webové API

    Tým provozuje API v několika podech a nechce ručně vystavovat každý pod do internetu. Kubernetes Service typu LoadBalancer požádá cloudovou platformu o externí load balancer a směruje provoz na dostupné pody. Výsledkem je jedna stabilní adresa pro klienty a proměnlivá sada backendů uvnitř clusteru.

    apiVersion: v1
    kind: Service
    metadata:
      name: orders-api
    spec:
      type: LoadBalancer
      selector:
        app: orders-api
      ports:
        - port: 80
          targetPort: 8080

Časté omyly

MýtusLoad balancer automaticky zrychlí každou aplikaci.
Ve skutečnostiLoad balancer pomůže jen tehdy, když úzké místo leží v obsluze požadavků na více instancích. Pomalá databáze, synchronní externí API nebo špatný kód mohou zůstat stejným limitem.
MýtusKdyž máme load balancer, jeden server může kdykoli spadnout bez dopadu.
Ve skutečnostiVýpadek backendu nemusí být vidět, pokud jsou správně nastavené health checky, timeouty a aplikace nespoléhá na lokální stav. Rozpracované požadavky se ale mohou přerušit a špatně navržené relace mohou uživatele odhlásit.

Časté dotazy

Stačí load balancer k vysoké dostupnosti?
Load balancer k vysoké dostupnosti nestačí, protože chrání hlavně před výpadkem jednotlivých backendů. Vysoká dostupnost potřebuje také redundantní samotný load balancer, více zón nebo lokalit, monitoring, automatické zotavení a aplikaci navrženou pro provoz ve více instancích. Bez těchto částí může zůstat kritickým bodem databáze, úložiště, DNS nebo špatně nastavená kontrola zdraví.
Proč může load balancer rozbít přihlášení uživatelů?
Load balancer může pokazit přihlašování, když aplikace ukládá relaci jen do paměti jednoho serveru. První požadavek uživatele vytvoří session na instanci A, ale další požadavek se dostane na instanci B, která stejnou session nezná. Náprava obvykle znamená bezstavové tokeny, sdílené úložiště session nebo sticky session, pokud je dočasná vazba na jeden backend přijatelná.
Co znamená sticky session u load balanceru?
Sticky session znamená, že load balancer po určitou dobu posílá požadavky stejného klienta na stejný backend. Vazba může vzniknout podle cookie, IP adresy nebo jiného identifikátoru. Sticky session pomáhá starším aplikacím se stavem v paměti, ale zhoršuje rovnoměrné rozložení provozu a komplikuje výpadek konkrétní instance.
Kdy dává smysl interní load balancer?
Interní load balancer dává smysl, když službu nemají používat klienti z internetu, ale jiné části systému. Typický příklad je privátní API mezi mikroslužbami, přístup k internímu administrativnímu rozhraní nebo rozložení provozu na databázové proxy. Interní load balancer zachovává jednu stabilní adresu a současně omezuje vystavení služby mimo privátní síť.

Zdroje

  1. Elastic Load Balancing(otevře se v novém okně)Amazon Web Services
  2. Cloud Load Balancing overview(otevře se v novém okně)Google Cloud
  3. Service(otevře se v novém okně)Kubernetes
  4. What is Azure Load Balancer?(otevře se v novém okně)Microsoft Learn

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.