• vývoj

Softwarové load balancery

author.label Damir Špoljarič
aneb jak na bezproblémovou škálovatelnost aplikací

S rozmachem veřejných cloudů začínají i menší projekty řešit vysokou dostupnost aplikací a snadné škálování. Zásadní komponentu v návrhu takového řešení hrají load balancery. Load balancer 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.

Na ilustraci vidíte, jak takový typický návrh balancované aplikace vypadá:

Požadavky jdou z Internetu na load balancer, 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 load balancery, 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 load balanceru a ten začne požadavky zasílat i na něj. Load balancery se staví ve dvojicích, kdy druhý slouží jako záloha v případě, že primární load balancer selže.

Load balancer vs. reverzní proxy

Podobnou roli jako load balancery může sehrát i reverzní proxy. Zatímco load balancer pracuje na úrovni spojení, reverzní proxy rozumí přenášeným datům, čímž 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á. Díky cache dokáží dramaticky snížit nároky na aplikační stroje, a tím snížit náklady na provoz. Některé load balancery dokážou pracovat v obou režimech.

Softwarový vs. hardwarový load balancer

Softwarové load balancery jsou univerzální a nasazují se jako běžná aplikace zpravidla na 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é load balancery, které mají podobu “krabic” o rozměru 1U nebo 2U. Mají výrazně vyšší výkon a stabilitu (běž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 load balancerů jsou výrobky firmy F5.

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

HAProxy je nejčastěji nasazovaný load balancer. Vyznačuje se vysokou stabilitou, výkonem a snadnou konfigurací. Dokáže pracovat v režimu TCP load balanceru, 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 load balanceru 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ěřovat 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ý z hlavních serverů.

Konfigurace load balanceru se provádí v souboru /etc/haproxy/haproxy.conf. Jedná se o jednoduchý konfigurační soubor, kde se nastavují 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. 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ě open-source komunitní verze je dostupná i komerční podoba s placenou podporou pod názvem HAProxy Enterprise Edition a hardwarový load balancer postavený na HAProxy s názvem ALOHA hardware appliance.

Traeffik je moderní load balancer 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žiště 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 schopen si automaticky žádat o certifiká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 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, plným názvem IP virtual server, je load balancer 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 load balancery, zároveň má velmi malý dopad na systémové prostředky a vynikající stabilitu. IPVS je pouze L3 load balancer, 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 utilitu lmanager, která je dostupná ve všech linuxových distribucích. Po tomto balanceru sáhněte, pokud chcete na jednom 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í algoritmu round-robin včetně podpory různých vah u cílových serverů (wrr algoritmus).

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í nijak drasticky neprojeví na ceně provozu infrastruktury. Load balancer vždy vybírejte s ohledem na druh provozu, velmi často si vystačíte se specializovaným load balancerem pro konkrétní sadu protokolů a využijete možnosti, které nabízí balancer, který rozumí přenášeným datům.

Článek byl publikován naším Senior Infrastructure Adminem na webu www.starejajtak.cz