Programiranje

Arhitekture za uravnoteženje obremenitve strežnika, 1. del: Uravnavanje obremenitve na ravni transporta

Strežniške farme dosežejo visoko razširljivost in visoko razpoložljivost s pomočjo uravnoteženja obremenitve strežnika, tehnike, zaradi katere je strežniška kmetija odjemalcem prikazana kot en sam strežnik. V tem dvodelnem članku Gregor Roth raziskuje arhitekture za uravnoteženje obremenitve strežnika s poudarkom na odprtokodnih rešitvah. 1. del zajema osnove uravnoteženja obremenitve strežnika in razpravlja o prednostih in slabostih uravnoteženja obremenitve strežnika na ravni transporta. Drugi del zajema arhitekture za uravnoteženje obremenitve strežnika na ravni aplikacije, ki obravnavajo nekatere omejitve arhitektur, obravnavane v 1. delu.

Vstopna ovira za mnoga internetna podjetja je nizka. Vsak, ki ima dobro idejo, lahko razvije majhno aplikacijo, kupi domensko ime in nastavi nekaj strežnikov na osebnem računalniku za obdelavo dohodnega prometa. Začetna naložba je majhna, zato je zagonsko tveganje minimalno. Toda uspešna nizkocenovna infrastruktura lahko hitro postane resen problem. En sam strežnik, ki obravnava vse dohodne zahteve, morda ne bo zmožen obvladovati velike količine prometa, ko podjetje postane priljubljeno. V takih situacijah se podjetja pogosto začnejo povečati: obstoječo infrastrukturo nadgradijo z nakupom večje škatle z več procesorji ali dodajo več pomnilnika za zagon aplikacij.

Povečanje obsega pa je le kratkoročna rešitev. In to omejen pristop, ker so stroški nadgradnje nesorazmerno visoki glede na povečanje zmogljivosti strežnika. Iz teh razlogov najuspešnejša internetna podjetja sledijo a pomanjšajte pristop. Komponente aplikacije se na strežniških kmetijah obdelajo kot več primerkov, ki temeljijo na poceni strojni opremi in operacijskih sistemih. Ko se promet povečuje, se dodajajo strežniki.

Pristop strežniška kmetija ima svoje edinstvene zahteve. Na strani programske opreme morate načrtovati aplikacije, tako da se lahko izvajajo kot več primerkov na različnih strežnikih. To storite tako, da aplikacijo razdelite na manjše komponente, ki jih je mogoče namestiti neodvisno. To je nepomembno, če komponente aplikacije nimajo stanja. Ker komponente ne ohranijo nobenega stanja transakcije, lahko katera koli od njih enako obravnava iste zahteve. Če potrebujete več procesorske moči, preprosto dodate več strežnikov in namestite komponente aplikacije.

Težje težave se pojavijo, ko so komponente aplikacije s statusom. Če na primer komponenta aplikacije vsebuje podatke o nakupovalni košarici, mora biti dohodna zahteva usmerjena v primerek komponente aplikacije, ki vsebuje podatke o nakupovalni košarici tega zahtevnika. Kasneje v tem članku bom razpravljal o tem, kako ravnati s takimi podatki seje aplikacije v porazdeljenem okolju. Vendar pa se za zmanjšanje zapletenosti najbolj uspešni internetni aplikacijski sistemi poskušajo izogniti komponentam aplikacij s stanjem, kadar koli je to mogoče.

Na infrastrukturni strani je treba obremenitev obdelave porazdeliti med skupino strežnikov. To je znano kot uravnoteženje obremenitve strežnika. Tehnologije za uravnoteženje obremenitve se nanašajo tudi na druge domene, na primer širjenje dela med komponentami, kot so omrežne povezave, CPU ali trdi diski. Ta članek se osredotoča na uravnoteženje obremenitve strežnika.

Razpoložljivost in razširljivost

Izravnava obremenitve strežnika razdeli zahteve za storitve med skupino resničnih strežnikov in odjemalcem naredi, da so ti strežniki videti kot en velik strežnik. Pogosto na desetine pravih strežnikov stoji za URL-jem, ki izvaja eno samo navidezno storitev.

Kako to deluje? V široko uporabljeni arhitekturi za uravnoteženje obremenitve strežnika je dohodna zahteva usmerjena v namenski izravnalnik obremenitve strežnika, ki je odjemalcu pregleden. Na podlagi parametrov, kot sta razpoložljivost ali trenutna obremenitev strežnika, se izravnalnik obremenitve odloči, kateri strežnik naj obravnava zahtevo, in jo posreduje izbranemu strežniku. Da algoritmu za uravnoteženje obremenitve zagotovi zahtevane vhodne podatke, izravnalnik obremenitve pridobi tudi informacije o zdravstvenem stanju strežnikov in obremenitvi, da preveri, ali se lahko odzovejo na promet. Slika 1 prikazuje to klasično arhitekturo uravnoteženja obremenitve.

Arhitektura razporejevalnika tovora, prikazana na sliki 1, je le eden od številnih pristopov. Če se želite odločiti, katera rešitev za uravnoteženje obremenitve je najboljša za vašo infrastrukturo, morate razmisliti razpoložljivost in razširljivost.

Razpoložljivost določa uptime - čas med okvarami. (Izpad je čas, da odkrijete napako, jo popravite, izvedete zahtevano obnovitev in znova zaženete naloge.) Med delovanjem sistema mora sistem odgovoriti na vsako zahtevo v vnaprej določenem, natančno določenem času. Če je ta čas prekoračen, odjemalec to vidi kot okvaro strežnika. Visoka razpoložljivost je v bistvu odvečnost sistema: če en strežnik ne uspe, drugi prevzamejo neuspešno nalaganje strežnika transparentno. Napaka posameznega strežnika je za stranko nevidna.

Prilagodljivost pomeni, da lahko sistem izpolnjuje zahteve za kakovost storitve, kot je odzivni čas, enemu odjemalcu in tisočim hkratnim odjemalcem. Pod povečano obremenitvijo lahko visoko razširljiv sistem skoraj linearno poveča pretočnost sorazmerno z močjo dodanih strojnih virov.

V scenariju na sliki 1 dosežemo visoko razširljivost z distribucijo dohodne zahteve po strežnikih. Če se obremenitev poveča, lahko dodate dodatne strežnike, če izravnalnik obremenitve ne postane ozko grlo. Za doseganje visoke razpoložljivosti mora izravnalnik obremenitve nadzorovati strežnike, da se izogne ​​posredovanju zahtev preobremenjenim ali mrtvim strežnikom. Poleg tega mora biti tudi izravnalnik obremenitve odveč. O tej točki bom razpravljal kasneje v tem članku.

Tehnike uravnoteženja obremenitve strežnika

Na splošno so rešitve za uravnoteženje obremenitve strežnika dve glavni vrsti:

  • Na ravni prevoza uravnoteženje obremenitve - na primer pristop na osnovi DNS ali uravnoteženje obremenitve na ravni TCP / IP - deluje neodvisno od koristnega tovora aplikacije.
  • Na ravni aplikacije uravnoteženje obremenitve uporablja uporabni tovor aplikacije za sprejemanje odločitev o uravnoteženju obremenitve.

Rešitve za uravnoteženje obremenitve lahko nadalje razvrstimo v programske izravnalnike obremenitve in strojne izravnalnike obremenitve. Strojno uravnoteženi obremenjevalniki obremenitve so specializirana strojna polja, ki vključujejo integrirana vezja (ASIC), prilagojena posamezni aplikaciji. ASIC omogočajo hitro posredovanje omrežnega prometa brez splošnih stroškov operacijskega sistema. Za uravnoteženje obremenitve na ravni transporta se pogosto uporabljajo strojni uravnotežilniki obremenitve. Na splošno so izravnalniki obremenitve na osnovi strojne opreme hitrejši od rešitev, ki temeljijo na programski opremi. Njihova pomanjkljivost so njihovi stroški.

V nasprotju s strojnimi uravnotežilniki obremenitve delujejo programski uravnoteževalniki obremenitve na standardnih operacijskih sistemih in standardnih komponentah strojne opreme, kot so osebni računalniki. Programske rešitve se izvajajo znotraj namenskega vozlišča strojne opreme za uravnoteženje obremenitve, kot je prikazano na sliki 1, ali neposredno v aplikaciji.

Uravnavanje obremenitve na osnovi DNS

Uravnavanje obremenitve na osnovi DNS predstavlja enega od zgodnjih pristopov k uravnoteženju obremenitve strežnika. Internetni sistem domenskih imen (DNS) IP naslove poveže z imenom gostitelja. Če v svoj brskalnik vnesete ime gostitelja (kot del URL-ja), brskalnik zahteva, da strežnik DNS ime gostitelja razreši na naslov IP.

Pristop, ki temelji na DNS, temelji na dejstvu, da DNS dovoljuje dodelitev več naslovov IP (resničnih strežnikov) enemu imenu gostitelja, kot je prikazano v primeru iskanja DNS v seznamu 1.

Seznam 1. Primer iskanja DNS

> Nslookup amazon.com strežnik: ns.box naslov: 192.168.1.1 ime: amazon.com naslovi: 72.21.203.1, 72.21.210.11, 72.21.206.5

Če strežnik DNS izvaja pristop krožno, se vrstni red naslovov IP za danega gostitelja spremeni po vsakem odzivu DNS. Običajno se odjemalci, kot so brskalniki, poskušajo povezati s prvim naslovom, vrnjenim iz poizvedbe DNS. Rezultat tega je, da se odzivi na več odjemalcev porazdelijo med strežnike. V nasprotju z arhitekturo za uravnoteženje obremenitve strežnika na sliki 1 ni potrebno strojno vozlišče vmesnega izravnalnika obremenitve.

DNS je učinkovita rešitev za globalno uravnoteženje obremenitve strežnika, kjer je treba obremenitev razporediti med podatkovnimi centri na različnih lokacijah. Globalno uravnoteženje obremenitve strežnika, ki temelji na DNS, se pogosto kombinira z drugimi rešitvami za uravnoteženje obremenitve strežnika za razporeditev obremenitve znotraj namenskega podatkovnega centra.

Čeprav je pristop DNS enostaven za izvajanje, ima resne pomanjkljivosti. Za zmanjšanje poizvedb DNS odjemalec ponavadi shrani poizvedbe DNS v predpomnilnik. Če strežnik postane nedosegljiv, bo predpomnilnik odjemalca in strežnik DNS še naprej vseboval mrtev naslov strežnika. Iz tega razloga pristop DNS le malo prispeva k izvajanju visoke razpoložljivosti.

Uravnavanje obremenitve strežnika TCP / IP

Izravnalniki obremenitve strežnika TCP / IP delujejo na nizkem nivoju. Priljubljen izravnalnik obremenitve strežnika na nizki ravni je Linux Virtual Server (LVS). Pravi strežniki se zunanjemu svetu zdijo kot en sam "virtualni" strežnik. Dohodne zahteve v povezavi TCP posreduje resničnim strežnikom izravnalnik obremenitve, ki zažene jedro Linuxa, popravljeno tako, da vključuje kodo navideznega strežnika IP (IPVS).

Da bi zagotovili visoko razpoložljivost, je v večini primerov nastavljenih par vozlišč za uravnoteženje obremenitve z enim vozliščem za uravnoteženje obremenitve v pasivnem načinu. Če izravnava obremenitve ne uspe, program srčnega utripa, ki se izvaja na obeh izravnalnikih obremenitve, aktivira pasivno vozlišče izravnalnika obremenitve in sproži prevzem navideznega naslova IP (VIP). Medtem ko je srčni utrip odgovoren za upravljanje preklopa med izravnalniki obremenitve, se za spremljanje stanja resničnih strežnikov uporabljajo preprosti skripti za pošiljanje / pričakovanje.

Preglednost za stranko dosežemo z uporabo VIP-ja, ki je dodeljen izravnalniku obremenitve. Če stranka izda zahtevo, se najprej zahtevano ime gostitelja prevede v VIP. Ko prejme paket zahtevkov, se uravnotežilec obremenitve odloči, kateri pravi strežnik naj obravnava paket zahtevkov. Ciljni naslov IP paketa zahtev je prepisan v pravi IP (RIP) resničnega strežnika. LVS podpira več algoritmov razporejanja za distribucijo zahtev na resnične strežnike. Pogosto je nastavljen tako, da uporablja časovno načrtovanje, podobno kot uravnoteženje obremenitve na osnovi DNS. Pri LVS se odločitev o uravnoteženju obremenitve sprejme na ravni TCP (sloj 4 referenčnega modela OSI).

Po prejemu paketa zahtevkov ga resnični strežnik obdela in vrne odzivni paket. Za vsiljevanje povratnega paketa prek izravnalnika obremenitve pravi strežnik uporablja VIP kot privzeto odzivno pot. Če izravnalnik obremenitve prejme odzivni paket, se izvorni IP odzivnega paketa znova napiše z VIP (OSI Model Layer 3). Ta način usmerjanja LVS se imenuje usmerjanje prevajanja omrežnih naslovov (NAT). Slika 2 prikazuje izvedbo LVS, ki uporablja usmerjanje NAT.

LVS podpira tudi druge načine usmerjanja, kot so Neposredna vrnitev strežnika. V tem primeru odzivni paket pravi strežnik pošlje neposredno odjemalcu. Če želite to narediti, mora biti VIP dodeljen tudi vsem resničnim strežnikom. Pomembno je narediti VIP strežnika nerešljiv v omrežju; v nasprotnem primeru izravnalnik obremenitve postane nedosegljiv. Če izravnalnik obremenitve prejme paket zahteve, se namesto naslova IP znova napiše naslov MAC (model OSI 2). Pravi strežnik prejme paket zahtevkov in ga obdela. Na podlagi izvornega naslova IP se odzivni paket neposredno pošlje odjemalcu, pri čemer se izogne ​​uravnoteženju obremenitve. Pri spletnem prometu lahko ta pristop močno zmanjša obremenitev izravnalnika. Običajno se prenese veliko več odzivnih paketov kot paketov zahtev. Če na primer zahtevate spletno stran, je pogosto poslan samo en paket IP. Če se zahteva večja spletna stran, je za prenos zahtevane strani potrebnih več odzivnih paketov IP.

Predpomnjenje

Rešitve za uravnoteženje obremenitve strežnika na nizki ravni, kot je LVS, dosežejo svojo mejo, če je potrebno predpomnjenje na ravni aplikacije ali podpora za sejo aplikacije. Predpomnjenje je pomembno načelo razširljivosti za izogibanje dragim operacijam, ki večkrat pridobivajo iste podatke. Predpomnilnik je začasna shramba, ki vsebuje odvečne podatke, ki so posledica prejšnje operacije pridobivanja podatkov. Vrednost predpomnilnika je odvisna od stroškov pridobivanja podatkov glede na stopnjo zadetkov in zahtevano velikost predpomnilnika.

Na podlagi algoritma za načrtovanje uravnoteženja obremenitve zahteve uporabniške seje obravnavajo različni strežniki. Če se na strani strežnika uporablja predpomnilnik, bodo težave postale zastrašujoče zahteve. Eden od pristopov za to je postavitev predpomnilnika v globalni prostor. memcached je priljubljena rešitev porazdeljenega predpomnilnika, ki zagotavlja velik predpomnilnik v več računalnikih. To je razdeljeni, porazdeljeni predpomnilnik, ki uporablja dosledno zgoščevanje za določanje strežnika predpomnilnika (demona) za dani vnos predpomnilnika. Na podlagi razpršene kode ključa predpomnilnika odjemalska knjižnica vedno preslika isto razpršilno kodo na isti naslov strežnika predpomnilnika. Ta naslov se nato uporabi za shranjevanje vnosa v predpomnilnik. Slika 3 prikazuje ta pristop predpomnjenja.

Seznam 2 uporablja spymemcached, a memcached odjemalca, napisanega v Javi, v predpomnilnik HttpResponse sporočila v več strojih. The spymemcached knjižnica izvaja zahtevano odjemalsko logiko, ki sem jo pravkar opisal.

Seznam 2. Predpomnilnik HttpResponse na osnovi memcached

$config[zx-auto] not found$config[zx-overlay] not found