HAProxy ja kuormantasaus

HAProxy ja kuormantasaus

13.02.2021 0

Kuormantasaus on helppo toteuttaa, vaikka palvelimen ylläpitäjä olisi vasta-alkaja tai pienen yrityksen yrittäjä, jolla ei ole varaa ostaa ylläpitoa.

Kuormantasaus parantaa suorituskykyä

Kuormantasausta tarvitaan nettisivuilla ja palveluilla, joilla on suuri määrä yhtäaikaisia käyttäjiä. Kuormantasauksen ideana on ohjata käyttäjiä huomaamattomasti eri palvelimelle, jolloin vaadittava laskentataho jakautuu tasaisemmin.

Nykypäivänä monia ohjelmistoja tarjotaan SaaS-palveluina. Ohjelmaa ei tarvitse asentaa koneelle, vaan sitä voidaan käyttää suoraan nettiselaimesta. Tällaisella palvelulla voi olla satoja tuhansia tai jopa miljoonia käyttäjiä. Jos tarjotaan esim. sähköistä tilitoimistopalvelua sadoille tuhansille asiakkaillle, voit varmaan arvata, että tilinpäätöksen yhteydessä monet käyttäjät laativat raporttejaan yhtä aikaa. Tämä vaatii huiman määrän laskentatehoa ja lukuisia tietokantahakuja. Kuormantasauksella estetään se, ettei sivusto jumitu suurella käyttäjämäärällä.

HAProxy toimii välittäjänä

HAProxy (High availability proxy) on kuormantasaukseen käytettävä ohjelmisto. Se mahdollistaa lukuisia eri tapoja jakaa kuorma eri palvelimelle. Kuten tiedämme, internetissä käyttäjät eivät suinkaan pelaa ip-osoitteella vaan käyttävät eri palveluille domainnimeä. Esimerkiksi meidän sivustomme verkko-osoite on dev.wizardcow.fi. Todellisuudessa sivustomme kuitenkin pyörii palvelimella, jolla on ip-osoite. HAProxy välittää huomaamattomasti käyttäjän tietopyynnöt muille palvelimille, jolloin kuorma jakautuu tasaisemmin.

Otetaanpa esimerkki. Meillä on sivusto palvelimella A. Kyseessä on nettisivu, jolla voi laatia monenlaisia raportteja, taulukoita ja diagrammeja. Käyttäjämäärä on valtava, minkä vuoksi nämä vaativat palvelimelta laskentatehoa. Tämän vuoksi sama sivusto on kannattanut kloonata myös palvelimille B ja C. Käyttäjän huomaamatta sivusto välittääkin kaikki laskentatehoa vaativat pyynnöt sivustolla B ja C, jolloin palvelimelle tuleva kuorma on vain puolet siitä kuin yhdellä palvelimella. Lisäksi toki palvelin A voi olla mukana proxytys-ringissä, jolloin kuormaa on enää kolmasosa alkuperäisestä.

 

Kuormaa voi tasata monessa tarkoituksessa

Yleensä ihan perusnettisivun näyttäminen ei ole kovin kuormittavaa, jos sivuston tehty puhtaasti käyttäen HTML, CSS ja JavaScriptiä. Kuorma muodostuukin siinä vaiheessa, kun nettisivuun liittyy ohjelmointia ja koodin suoritusta palvelimella. Jos sivuston on toteutettu WordPressillä, silloin taustalla on ainakin tietokanta ja palvelin suorittaa PHP-koodia. Monet applikaatiot käyttävät Pythonia, sivustoille ladataan dynaamista sisältöä ja sivusto voi tarjota ties minkälaisia rajapintoja erinäköisille widgeteille. Pääsääntönä sanoisin HAProxysta, että sillä voi tasata kuormaa kaikkeen liikenteeseen liittyen HTTP/TCP-liikenteesen. Tietokantoihin kohdistuvaa kuormaa voi myös helposti tasata käyttäen HAProxya yhdessä vaikkapa Galeran kanssa.

Kuormantasauksen toteuttaminen

Jos olet palvelimen ylläpitäjä ja kuormantasaukselle on tarvetta, tässä on nyt lyhyet ja helpot ohjeet peruskuormantasauksen toteuttamiseen. Nämä ohjeet ainakin toimivat debianissa, mutta kaikki linuxithan ovat melko johdonmukaisia käyttää.

1. HAProxyn asentaminen

root@0b9d7c130cd9:/# apt install -y haproxy

Roottina tai sudolla suoritat yllä olevan komennon. Ja näin helppoa se oli, nyt HAProxy on asennettu!

2. HAProxyn konfigurointi

Konffit löytyvät debianin tapauksessa /etc/haproxy-kansiossa. Muokkaa niitä suosikkieditorillasi.

root@0b9d7c130cd9:/# vim /etc/haproxy/haproxy.cfg

Aloitetaan siitä, että määritellään ensin palvelimet, joille HAProxyn pitäisi ohjata liikennettä. HAProxyn terminologiassa tätä kutsutana backendiksi. Kuvitellaan meidän tapauksessa, että meillä on kaksi tällaista palvelinta:

  • web1.wizardcow.fi
  • web2.wizardcow.fi
  • web3.wizardcow.fi

Lisäksi meidän täytyy päättää peruste, minkä mukaan liikennettä ohjataan näille palvelimille. Meillä on käytössä seuraavat algoritmin kuorman tasaamiselle:

  • roundrobin – valitaan joka kerta eri serveri vuoronperään
  • leastconn – valitaan palvelin, jolle sillä hetkellä on vähiten yhteyksiä. Jos käyttäjillä on tapana pitää pitkiä sessioita, tämä voi olla hyvä valinta.
  • source – valinta tehdään esim. käyttäjän ip-osoitteen perusteella. Tällöin käyttäjä ohjautuu aina samalla palvelimelle.

Lisätään backend-määritys konffitiedostoon /etc/haproxy/haproxy.cfg:

backend web-backend
   balance roundrobin
   server web1 web1.wizardcow.fi:80 check
   server web2 web2.wizardcow.fi:80 check
   server web3 web2.wizardcow.fi:80 check

Check-määritys jokaisen palvelimen perässä tarkoittaa sitä, että haproxy tarkistaa säännöllisesti palvelimien olevan pystyssä. Jos jokin palvelimista putoaa pois, yhteyksiä ei ohjata niille. Tämä onkin yksi HAProxyn hyvä puoli! Palveluita, ohjelmistoja ja sivustoja voi päivittää täysin ilman käyttökatkoja, jotka näkyisivät asiakkaalle.

Nyt meidän tarvitsee enää määritellä frontend eli mitkä yhteyden ohjataan näille palvelimille. Ihan perustapauksessa ja kaikista yksinkertaisimmissa konffeissa tämä onnistuu lisäämällä vielä konffitiedostoon /etc/haproxy/haproxy.cfg määritys:

frontend http
  bind *:80
  default_backend web-backend

3. HAProxyn käynnistäminen

root@0b9d7c130cd9:/# service haproxy start

Ja tsädäm! Nyt kuormantasaus on konffattu ja pitäisi toimia. HAProxyssa on tosin monia muita ominaisuuksia, joihin kannattaa tutustua varsinaisesti dokumentaatiosta.

Muita ajatuksia HAPRoxysta ja muista hyödyllisistä työkaluista, joilla kuormantasaus täyttää tehtävänsä

HAProxy kannattaa mahdollisesti konffata Galeran kanssa, jolloin tietokantaoperaatiot voidaan myös jakaa monella palvelimelle.

Lisäksi suosittelen konffaamaan vaikka corosyncin tai keepalived:in siihen sivuun. Jos “pääpalvelin”, eli HAProxy-palvelin, kaatuu, silloin joku toinen palvelin voi kaapata ip-osoitteen itselleen ja jatkaa kuormanvälitystä. Tällöin asiakkaat eivät tiedä mitään taustalla olevista palvelinongelmista vaan voivat jatkaa käyttöään täysin normaalisti.

Haproxy on myös mukava hallittava siinä mielessä, että pystyt näkemään, montako käyttäjää milläkin palvelimella on. Lisäksi pystyt kätevästi ohjaamaan käyttäjät eri palvelimille, jos haluat bootata jonkun palvelimen välissä käyttäjien sitä huomaamatta.