Ohjelmointi

Palvelimen kuormituksen tasapainotusarkkitehtuurit, osa 1: Kuljetustason kuormituksen tasaaminen

Palvelintilat saavuttavat korkean skaalautuvuuden ja korkean käytettävyyden palvelimen kuormituksen tasapainottamisen avulla. Tämä tekniikka saa palvelintilan näyttämään asiakkaille yhtenä palvelimena. Tässä kaksiosaisessa artikkelissa Gregor Roth tutkii palvelinten kuormituksen tasapainotusarkkitehtuureja keskittyen avoimen lähdekoodin ratkaisuihin. Osa 1 kattaa palvelimen kuormituksen tasapainottamisen perusteet ja käsittelee kuljetustason palvelimen kuormituksen tasapainottamisen edut ja haitat. Osa 2 kattaa sovellustason palvelimen kuormituksen tasapainotusarkkitehtuurit, jotka käsittelevät joitain osassa 1 käsiteltyjen arkkitehtuurien rajoituksia.

Monien Internet-yritysten pääsyn este on pieni. Kuka tahansa, jolla on hyvä idea, voi kehittää pienen sovelluksen, ostaa verkkotunnuksen ja perustaa muutaman PC-pohjaisen palvelimen käsittelemään saapuvaa liikennettä. Alkuinvestointi on pieni, joten käynnistysriski on minimaalinen. Mutta onnistuneesta edullisesta infrastruktuurista voi tulla nopeasti vakava ongelma. Yhdellä palvelimella, joka käsittelee kaikki saapuvat pyynnöt, ei ehkä ole kykyä käsitellä suuria liikennemääriä, kun yritys on tullut suosittu. Tällaisissa tilanteissa yritykset alkavat usein skaalata: he päivittävät nykyisen infrastruktuurin ostamalla suuremman laatikon, jossa on enemmän suorittimia, tai lisäämällä muistia sovellusten ajamiseksi.

Suurentaminen on kuitenkin vain lyhytaikainen ratkaisu. Ja se on rajallinen lähestymistapa, koska päivityskustannukset ovat suhteettoman korkeat palvelinominaisuuksien hyötyihin nähden. Näistä syistä menestyneimmät Internet-yritykset seuraavat a laajentaa lähestyä. Sovelluskomponentit käsitellään useina esiintyminä palvelintiloilla, jotka perustuvat edullisiin laitteistoihin ja käyttöjärjestelmiin. Liikenteen kasvaessa palvelimia lisätään.

Palvelin-maatila-lähestymistavalla on omat ainutlaatuiset vaatimukset. Ohjelmistopuolella sinun on suunniteltava sovelluksia siten, että ne voivat toimia useana esiintymänä eri palvelimilla. Teet tämän jakamalla sovelluksen pienempiin komponentteihin, jotka voidaan ottaa käyttöön itsenäisesti. Tämä on triviaalia, jos sovelluksen komponentit ovat valtiottomia. Koska komponentit eivät säilytä mitään transaktiotilaa, kukin niistä voi käsitellä samoja pyyntöjä tasapuolisesti. Jos tarvitaan enemmän prosessointitehoa, lisää vain lisää palvelimia ja asenna sovelluksen komponentit.

Haastavampi ongelma syntyy, kun sovelluksen komponentit ovat tilannekohtaisia. Esimerkiksi, jos sovelluskomponentilla on ostoskoridataa, saapuva pyyntö on ohjattava sovelluskomponentti-ilmentymään, joka pitää kyseisen pyynnön tekijän ostoskoritiedot. Myöhemmin tässä artikkelissa keskustelen siitä, miten tällaisia ​​sovellusistuntotietoja käsitellään hajautetussa ympäristössä. Monimutkaisuuden vähentämiseksi menestyneimmät Internet-pohjaiset sovellusjärjestelmät yrittävät kuitenkin välttää tilannekohtaisia ​​sovelluskomponentteja aina kun mahdollista.

Infrastruktuurin puolella käsittelykuormitus on jaettava palvelinryhmän kesken. Tätä kutsutaan palvelimen kuormituksen tasaamiseksi. Kuormituksen tasaustekniikat liittyvät myös muihin alueisiin, esimerkiksi työn levittämiseen komponenttien, kuten verkkolinkkien, suorittimien tai kiintolevyjen, kesken. Tämä artikkeli keskittyy palvelimen kuormituksen tasapainottamiseen.

Saatavuus ja skaalautuvuus

Palvelinten kuormituksen tasaaminen jakaa palvelupyynnöt todellisten palvelimien ryhmälle ja tekee näistä palvelimista asiakkaille yhden ison palvelimen. Usein kymmenet todelliset palvelimet ovat URL-osoitteen takana, joka toteuttaa yhden virtuaalipalvelun.

Miten tämä toimii? Laajalti käytetyssä palvelimen kuormituksen tasapainotusarkkitehtuurissa saapuva pyyntö ohjataan erilliselle palvelimen kuormituksen tasauslaitteelle, joka on avoin asiakkaalle. Parametrien, kuten saatavuus tai palvelimen nykyinen kuormitus, perusteella kuormituksen tasapainottaja päättää, minkä palvelimen tulisi käsitellä pyyntö ja välittää se edelleen valitulle palvelimelle. Saadakseen kuormituksen tasausalgoritmin tarvittavilla syötetiedoilla kuormituksen tasapainotin hakee myös tietoja palvelimien kunnosta ja kuormituksesta varmistaakseen, että ne voivat vastata liikenteeseen. Kuva 1 kuvaa tätä klassista kuormituksen tasausarkkitehtuuria.

Kuvassa 1 esitetty kuorman lähettäjän arkkitehtuuri on vain yksi monista lähestymistavoista. Sinun on harkittava, mikä kuormituksen tasapainotusratkaisu on paras infrastruktuurillesi saatavuus ja skaalautuvuus.

Saatavuus määritetään käyttöaste - epäonnistumisten välinen aika. (Seisonta-aika on aika havaita vika, korjata se, suorittaa vaaditut palautukset ja käynnistää tehtävät uudelleen.) Käyttöajan aikana järjestelmän on vastattava kuhunkin pyyntöön ennalta määrätyn, määritellyn ajan kuluessa. Jos tämä aika ylittyy, asiakas näkee tämän palvelimen toimintahäiriönä. Korkea käytettävyys on periaatteessa redundanssia: jos yksi palvelin epäonnistuu, muut ottavat epäonnistuneen palvelimen kuormituksen läpi avoimesti. Yksittäisen palvelimen epäonnistuminen on asiakkaalle näkymätön.

Skaalautuvuus tarkoittaa, että järjestelmä voi palvella yhtä asiakasta sekä tuhansia samanaikaisia ​​asiakkaita täyttämällä palvelun laatuvaatimukset, kuten vasteajan. Suurentuneen kuormituksen alaisuudessa korkea skaalautuva järjestelmä voi lisätä läpimenoa melkein lineaarisesti suhteessa lisättyjen laitteistoresurssien tehoon.

Kuvion 1 skenaariossa korkea skaalautuvuus saavutetaan jakamalla saapuva pyyntö palvelimille. Jos kuorma kasvaa, lisäpalvelimia voidaan lisätä, kunhan kuormituksen tasapainottajasta ei tule pullonkaulaa. Korkean käytettävyyden saavuttamiseksi kuormituksen tasapainottimen on valvottava palvelimia välttääkseen pyyntöjen lähettämistä ylikuormitetuille tai kuolleille palvelimille. Lisäksi myös kuormituksen tasapainottimen on oltava tarpeeton. Keskustelen tästä asiasta myöhemmin tässä artikkelissa.

Palvelimen kuormituksen tasaustekniikat

Palvelinten kuormituksen tasausratkaisut ovat yleensä kahta päätyyppiä:

  • Kuljetustaso kuormituksen tasaus - kuten DNS-pohjainen lähestymistapa tai TCP / IP-tason kuormituksen tasapainotus - toimii sovelluksen hyötykuormasta riippumatta.
  • Sovellustaso kuormituksen tasaus käyttää sovelluksen hyötykuormaa kuormituksen tasapainottamiseen liittyvien päätösten tekemisessä.

Kuormituksen tasapainotusratkaisut voidaan edelleen luokitella ohjelmistopohjaisiin kuormituksen tasapainottajaksi ja laitteistopohjaiseen kuormituksen tasapainottajaan. Laitteistopohjaiset kuorman tasauslaitteet ovat erikoistuneita laitteistolaatikoita, jotka sisältävät sovelluskohtaisia ​​integroituja piirejä (ASIC), jotka on räätälöity tiettyyn käyttöön. ASIC: t mahdollistavat verkkoliikenteen nopean edelleenlähetyksen ilman yleiskäyttöisen käyttöjärjestelmän kuluja. Laitteistopohjaisia ​​kuormituksen tasapainotimia käytetään usein kuljetustason kuormituksen tasapainottamiseen. Yleensä laitteistopohjaiset kuormituksen tasapainottimet ovat nopeampia kuin ohjelmistopohjaiset ratkaisut. Niiden haittana on niiden hinta.

Toisin kuin laitteistokuormituksen tasauslaitteet, ohjelmistopohjaiset kuormituksen tasapainottimet toimivat tavallisissa käyttöjärjestelmissä ja vakiolaitteistokomponenteissa, kuten tietokoneissa. Ohjelmistopohjaiset ratkaisut toimivat joko omistetussa kuormituksen tasauslaitteistosolmussa, kuten kuvassa 1, tai suoraan sovelluksessa.

DNS-pohjainen kuormituksen tasapainotus

DNS-pohjainen kuormituksen tasaaminen edustaa yhtä varhaisista palvelimen kuormituksen tasapainotustavoista. Internetin verkkotunnusjärjestelmä (DNS) yhdistää IP-osoitteet isäntänimeen. Jos kirjoitat isäntänimen (osana URL-osoitetta) selaimeesi, selain pyytää DNS-palvelinta ratkaisemaan isäntänimen IP-osoitteeksi.

DNS-pohjainen lähestymistapa perustuu siihen tosiasiaan, että DNS sallii useiden IP-osoitteiden (todellisten palvelimien) osoittamisen yhdelle isäntänimelle, kuten näkyy luettelon 1 DNS-hakuesimerkissä.

Luettelo 1. Esimerkki DNS-hausta

> nslookup amazon.com Palvelin: ns.box Osoite: 192.168.1.1 Nimi: amazon.com Osoitteet: 72.21.203.1, 72.21.210.11, 72.21.206.5

Jos DNS-palvelin toteuttaa kierroslähestymistavan, tietyn isännän IP-osoitteiden järjestys muuttuu jokaisen DNS-vastauksen jälkeen. Yleensä asiakkaat, kuten selaimet, yrittävät muodostaa yhteyden ensimmäiseen DNS-kyselystä palautettuun osoitteeseen. Tuloksena on, että vastaukset useille asiakkaille jaetaan palvelimien kesken. Toisin kuin palvelimen kuormituksen tasapainotusarkkitehtuuri kuvassa 1, ei tarvita välikuormituksen tasauslaitteistoa.

DNS on tehokas ratkaisu palvelinten maailmanlaajuiseen kuormituksen tasapainottamiseen, jossa kuorma on jaettava eri sijaintipisteiden keskusten välillä. Usein DNS-pohjainen globaali palvelimen kuormituksen tasapainotus yhdistetään muihin palvelimen kuormituksen tasapainotusratkaisuihin kuorman jakamiseksi omistetussa datakeskuksessa.

Vaikka DNS-lähestymistapa on helppo toteuttaa, sillä on vakavia haittoja. DNS-kyselyjen vähentämiseksi asiakas pyrkii tallentamaan DNS-kyselyt välimuistiin. Jos palvelin ei ole käytettävissä, asiakasvälimuisti ja DNS-palvelin sisältävät edelleen kuolleen palvelimen osoitteen. Tästä syystä DNS-lähestymistapa ei juurikaan toteuta korkeaa käytettävyyttä.

TCP / IP-palvelimen kuormituksen tasaus

TCP / IP-palvelimen kuormituksen tasapainotin toimii matalalla kerroksella. Suosittu ohjelmistopohjainen matalan palvelimen kuormituksen tasapainottaja on Linux Virtual Server (LVS). Todelliset palvelimet näkyvät ulkomaailmassa yhtenä "virtuaalisena" palvelimena. TCP-yhteyden saapuvat pyynnöt välittää todellisille palvelimille kuormituksen tasapainottaja, joka suorittaa Linux-ytimen, joka on korjattu sisällyttämään IP Virtual Server (IPVS) -koodi.

Korkean käytettävyyden varmistamiseksi useimmissa tapauksissa perustetaan pari kuormituksen tasapainotinsolmua, joissa yksi kuormituksen tasaussolmu on passiivisessa tilassa. Jos kuormituksen tasapainotin epäonnistuu, molemmilla kuormituksen tasauslaitteilla toimiva sykeohjelma aktivoi passiivisen kuormituksen tasaussolmun ja aloittaa virtuaalisen IP-osoitteen (VIP) haltuunoton. Vaikka sydämenlyönti on vastuussa kuormituksen tasapainotinten välisen vianetsinnän hallinnasta, yksinkertaisten lähetys- / odotuskomentosarjojen avulla seurataan todellisten palvelinten kuntoa.

Läpinäkyvyys asiakkaalle saavutetaan käyttämällä VIP: tä, joka on määritetty kuormituksen tasaajaan. Jos asiakas lähettää pyynnön, ensin pyydetty isäntänimi käännetään VIP: ksi. Vastaanotettuaan pyyntöpaketin kuormituksen tasaaja päättää, minkä todellisen palvelimen tulisi käsitellä pyyntöpakettia. Pyyntöpaketin kohde-IP-osoite kirjoitetaan uudelleen todellisen palvelimen todelliseen IP-osoitteeseen (RIP). LVS tukee useita ajoitusalgoritmeja pyyntöjen jakamiseksi todellisille palvelimille. Se on usein määritetty käyttämään kierroksen ajoitusta, samanlainen kuin DNS-pohjainen kuormituksen tasapainotus. LVS: n avulla kuormituksen tasapainottamispäätös tehdään TCP-tasolla (OSI-viitemallin kerros 4).

Vastaanotettuaan pyyntöpaketin todellinen palvelin käsittelee sen ja palauttaa vastauspaketin. Pakottaakseen vastauspaketin palauttamaan kuormituksen tasauslaitteen kautta, todellinen palvelin käyttää VIP: tä oletusarvoisena vastereittinä. Jos kuormituksen tasapainotin vastaanottaa vastepaketin, vastepaketin lähde-IP kirjoitetaan uudestaan ​​VIP: llä (OSI-mallikerros 3). Tätä LVS-reititystilaa kutsutaan verkko-osoitekäännöksen (NAT) reititykseksi. Kuvassa 2 on LVS-toteutus, joka käyttää NAT-reititystä.

LVS tukee myös muita reititystiloja, kuten Suora palvelimen palautus. Tässä tapauksessa todellinen palvelin lähettää vastauspaketin suoraan asiakkaalle. Tätä varten VIP on määritettävä myös kaikille todellisille palvelimille. On tärkeää tehdä palvelimen VIP-verkosta ratkaisematon; muuten kuormituksen tasapainotin ei ole tavoitettavissa. Jos kuormituksen tasauslaite vastaanottaa pyyntöpaketin, pyynnön MAC-osoite (OSI-mallikerros 2) kirjoitetaan uudelleen IP-osoitteen sijaan. Todellinen palvelin vastaanottaa pyyntöpaketin ja käsittelee sen. Lähde-IP-osoitteen perusteella vastauspaketti lähetetään asiakkaalle suoraan ohittaen kuormituksen tasapainotin. Verkkoliikenteen osalta tämä lähestymistapa voi vähentää tasapainottimen työmäärää dramaattisesti. Tyypillisesti siirretään paljon enemmän vastauspaketteja kuin pyyntöpaketteja. Jos esimerkiksi pyydät verkkosivua, lähetetään usein vain yksi IP-paketti. Jos pyydetään suurempaa verkkosivua, vaaditaan useita IP-paketteja pyydetyn sivun siirtämiseksi.

Välimuisti

Matalan palvelimen kuormituksen tasausratkaisut, kuten LVS, saavuttavat rajan, jos tarvitaan sovellustason välimuistia tai sovellusistunnon tukea. Välimuisti on tärkeä skaalautuvuusperiaate välttämään kalliita toimintoja, jotka noutavat samat tiedot toistuvasti. Välimuisti on väliaikainen tallennus, joka sisältää edellisestä tiedonhakutoiminnosta johtuvat tarpeettomat tiedot. Välimuistin arvo riippuu datan noutokustannuksista osumaprosenttiin ja tarvittavaan välimuistin kokoon nähden.

Kuormituksen tasapainotuksen ajoitusalgoritmin perusteella eri palvelimet käsittelevät käyttäjäistunnon pyyntöjä. Jos välimuistia käytetään palvelinpuolella, harhautuvista pyynnöistä tulee ongelma. Yksi tapa käsitellä tätä on sijoittaa välimuisti globaaliin tilaan. memcached on suosittu hajautettu välimuistiratkaisu, joka tarjoaa suuren välimuistin useille koneille. Se on osioitu, hajautettu välimuisti, joka käyttää johdonmukaista hajautusta määritellessään välimuistipalvelimen (daemon) tietylle välimuistimerkinnälle. Välimuistiavain hajautuskoodin perusteella asiakaskirjasto kartoittaa aina saman hajautuskoodin samaan välimuistipalvelimen osoitteeseen. Tätä osoitetta käytetään sitten välimuistimerkinnän tallentamiseen. Kuva 3 kuvaa tätä välimuistilähestymistapaa.

Listalla 2 käyttötarkoitusta spymemcached, a Memcached Java-ohjelmassa kirjoitettu asiakas välimuistiin HttpResponse viestejä useille koneille. spymemcached kirjasto toteuttaa vaaditun asiakaslogiikan, jonka juuri kuvasin.

Luettelo 2. memcached-pohjainen HttpResponse-välimuisti