S rozmachem veřejných cloudů začínají i menší projekty řešit vysokou dostupnost aplikací a snadné škálování. Zásadní komponentou v návrhu takového řešení hrají loadbalancery. Loadbalancer je aplikace, která distribuuje požadavky z Internetu na aplikační stroje a v případě problému dokáže nefunkční aplikační server odpojit z provozu. Typický návrh balancované aplikace vypadá nějak takto:

Požadavky jdou z Internetu na loadbalancer, který se na základě vnitřních metrik rozhodne, kterému aplikačnímu serveru předá požadavek k vyřízení. Z Internetu jsou dostupné pouze loadbalancery, aplikační stroje jsou “schované” za nimi. Škálování aplikace probíhá jednoduše tak, že se nový aplikační stroj připojí do loadbalanceru a ten začne požadavky zasílat i na něj. Loadbalancery se staví ve dvojicích, kdy druhý slouží jako záloha v případě, že primární loadbalancer selže.

Loadbalancer vs. reverzní proxy

Podobnou roli jako loadbalancery může sehrát i reverzní proxy. Zatímco loadbalancer pracuje na úrovni spojení, reverzní proxy rozumí přenášeným datům a dokáže efektivněji řídit provoz a cachovat odpovědi aplikačních serverů. Zároveň je ale většinou jednoúčelová a pracuje pouze s protokolem, na který je navržena. Nejčastěji se reverzní proxy nasazují před webové servery, kdy je spousta odpovědí prakticky totožná a díky cache dokáží  dramaticky snížit nároky na aplikační stroje a tím snížit náklady na provoz. Některé loadbalancery dokáží pracovat v obou režimech.

Softwarový vs. hardwarový loadbalancer

Softwarové loadbalancery jsou univerzální a nasazují se jako běžná aplikace na zpravidla linuxový server. Díky tomu je jejich provoz levný, avšak při vysokém množství požadavků mohou trpět problémy s výkonem. Pro nasazení ve velkých prostředích se používají hardwarové loadbalancery, které mají podobu “krabic” o rozměru 1U nebo 2U. Mají výrazně vyšší výkon a stabilitu (bežně v režimu “nastavit a zapomenout”), ovšem zároveň se jejich pořizovací cena pohybuje v řádech statisíců až milionů korun. Nejznámějším zástupcem rodiny hardwarových loadbalancerů jsou výrobky firmy F5.

Podíváme se důkladněji na čtyři zástupce softwarových loadbalancerů, které se praxi používají nejčastěji.

HAProxy

HAProxy je nejčastěji nasazovaný loadbalancer. Vyznačuje se vysokou stabilitou, výkonem a snadnou konfigurací. Dokáže pracovat v režimu TCP loadbalanceru, kdy pouze předává požadavky aplikačním strojům tak i v režimu reverzní proxy pro HTTP, kdy je schopna předávat požadavky na základě jejich metadat, jako je požadovaná URL nebo HTTP hlavičky. V režimu HTTP balanceru se také umí postarat o terminaci SSL šifrování, kdy na aplikační stroje jde požadavek už nešifrovaný a nemusí tedy pálit výkon dešifrováním a opětovným šifrováním provozu. Bohužel si nené schopna sama řešit požadavky na certifikáty pro nové domény, ale musí mít všechny certifikáty k dispozici při startu. Hodí se tedy v prostředí, kde je malé množství různých domén a certifikátů. Velkou výhodou HAProxy jsou velmi kvalitní statistiky provozu dostupné přes webové rozhraní nebo přes unix socket. V režimu HTTP podporuje kromě staršího HTTP/1.1 i moderní protokol HTTP/2

Trpí ovšem i několika neduhy. Z nejzásadnějších můžeme zmínit chybějící podporu rekonfigurace on-the-fly, kdy pro změnu konfigurace loadbalanceru je vyžadován restart služby. Dále se můžeme potkat s problémy při nedostupnosti DNS pro překlad jmen cílových serverů a chybějící podpora pro clusterované řešení.

Pro výběr cílového aplikačního serveru používá několik předpřipravených algoritmů. Můžete směrovat požadavky prostým i váženým round-robinem (kdy jsou požadavky distribuovány střídavě přes všechny aplikační servery) nebo lze využít módu leastconn, kdy se požadavek předává na stroj s nejmenším množstvím aktuálně obsluhovaných požadavků. Zároveň je schopna hlídat dostupnost a zdraví aplikačních serverů pravidelným zasíláním požadavků na nastavený endpoint a na základě odpovědi od serveru odstřihnout nefungující server z provozu. Podporuje také servery v režimu backup, na které je směrován provoz, pokud není dostupný žádný s hlavních serverů.

Konfigurace loadbalanceru se provádí v souboru /etc/haproxy/haproxy.conf. Jedná se o jednoduchý konfigurační soubor, kde se nastavuji frontendy (tj. veřejně dostupné služby, které HAProxy přijímá) a backendy (seznamy aplikačních serverů, které zpracovávají požadavky). HAProxy má velmi dobře zpracovanou dokumentaci a díky jejímu rozšíření naleznete na webu spoustu návodů, jak ji nastavit přesně podle vašich požadavků.

HAProxy se nachází ve většině distribucí, bohužel velmi často ve starých verzích. Aktuální verze je dostupná na webu haproxy.org, kde naleznete i aktuální balíky pro distribuce. HAProxy podporuje nasazení na linuxu, BSD, Solarisu a AIXu. Windows ani Mac podporován není. Kromě opensource komunitní verze je dostupná i komerční podoba s placenou podporou pod názvem HAProxy Enterprise Edition a hardwarový loadbalancer postavený na HAProxy s názvem ALOHA hardware appliance.

Traeffik

Traeffik je moderní loadbalancer pracující v režimu HTTP proxy. Konfiguraci může mít uloženu v textových souborech ve formátu TOML nebo v distribuovaném key-value storage. Aktuálně podporuje úložistě etcd a consul. Dokáže komunikovat s kubernetes a automaticky vyhledávat nové stroje a odpojovat zrušené. Na rozdíl od HAProxy podporuje živou konfiguraci, kdy je schopen hlídat změny v konfiguračních souborech nebo v konfiguračním úložišti a reagovat na změny.

Podporuje pouze balancování HTTP provozu, není tedy moc praktický pro použití v interní síti. Jeho velkou výhodou je přímá podpora pro Let’s encrypt, kdy je shopen si automacky žádat o certifkáty pro neznámé domény a zároveň hlídat expiraci existujících certifikátů.

Velkou nevýhodou Traeffiku jsou časté chyby v dokumentaci. V nasazení jste tedy často odkázáni na metodu pokus-omyl a konzultace na veřejném slack channelu projektu. Když už se vám podaří Traeffik rozjet, má velmi slušný výkon a stabilitu. V základu nabízí jednoduché webové rozhraní s přehledem zaregistrovaných aplikačních serverů a základní statistiky provozu.

Traeffik je dostupný jako staticky linkovaná binárka (je psaný v Go) na webu projektu nebo na githubu, kde je k dispozici i aktuální seznam nahlášených chyb. Autoři Traeffiku také nově nabízí komerční podporu.

Nginx

Nginx je webový server, který má podporu loadbalancování tak nějak mimoděk. Má velmi vysoký výkon při práci s HTTP provozem, kdy využívá svůj vysoký potenciál coby webového serveru. Velmi dobře cachuje odpovědi z aplikačních serverů, reaguje na různé typy požadavků a je schopen je ve vysoké škále upravovat. Vzhledem k jeho hlavnímu účelu web serveru je velmi vhodný pro balancování HTTP provozu, zvládá ale také balancování TCP a UDP spojení. Nginx je díky své popularitě k nalezení v repozitářích distribucí v poměrně nových verzích. K dispozici je i placená verze s podporou pod názvem Nginx+. Nginx nepodporuje on-the-fly konfiguraci, pro změnu je nutný reload služby. Healthcheck pro aplikační servery je dostupný přes modul ngx_http_healthcheck_module, který ovšem pracuje pouze na úrovni HTTP (kontroluje HTTP status).

IPVS

IPVS, plným názvem IP virtual server, je loadbalancer zabudovaný přímo v linuxovém kernelu pomocí modulu ip_vs. Díky tomu dosahuje velmi vysokých výkonů, srovnatelných s hardwarovými loadbalancery, zároveň má velmi malý dopad na systémové prostředky a vynikající stabilitu. IPVS je pouze L3 loadbalancer, pracuje tedy na úrovni TCP/UDP spojení. Není schopen předávat požadavky na základě metadat (nevidí do přenášených dat), takže je vhodný pro řešení balancingu služeb pouze na základě portu služeb.

Konfiguruje se přes utilitku lmanager, která je dostupná ve všech linuxových distribucích. Po tomto balanceru sáhněte, pokud chcete na jendom místě balancovat více různých služeb a jde vám primárně o výkon. Své uplatnění tedy nalezne u velkých internetových projektů, jako balancer na úrovni datacenter a pro exponované služby. Zvládá on-the-fly konfiguraci, kontroluje dostupnost cílových serverů a podporuje balancování pomocí algorytmu round-robin včetně podpory různých vah u cílových serverů (wrr algorytmus).

Nasazení jakéhokoliv loadbalanceru je nutná podmínka k automatickým reakcím na výpadky aplikačních serverů a velký krok k zajištění bezproblémové škálovatelnosti aplikací. Díky velmi příznivému poměru potřebného výkonu a počtu spojení se jeho použití drasticky neprojeví na ceně provozu infrastruktury. Loadbalancer vždy vybírejte s ohledem na druh provozu, velmi často si vystačíte se specializovaným loadbalancerem pro konkrétní sadu protokolů a využijete možnosti, které nabízí balancer, který rozumí přenášeným datům.

Leave a Reply

Your email address will not be published. Required fields are marked *