Gotovo svaka uspješna poslovna aplikacija prije ili kasnije uđe u fazu u kojoj je potrebno horizontalno skaliranje. U mnogim slučajevima možete jednostavno pokrenuti novu instancu i smanjiti prosjek opterećenja. Ali postoje i manje trivijalni slučajevi u kojima moramo osigurati da različiti čvorovi znaju jedni za druge i pažljivo raspodijeliti radno opterećenje.
Ispalo je tako srećno dobijeno, koji smo odabrali zbog njegove ugodne sintakse i hype oko nje, ima prvu klasu
Prolazak poruka između procesa na različitim čvorovima, kao i između veza i monitora, transparentan je […]
U praksi je sve malo komplikovanije. Distribuirano dobijeno je razvijeno kada je "kontejner" značio veliku željeznu kutiju za otpremu, a "docker" je jednostavno bio sinonim za brodara. IN IP4 bilo je mnogo nezauzetih adresa, prekidi mreže su obično bili uzrokovani pacovima koji su žvakali kabl, a prosječno vrijeme rada proizvodnog sistema mjerilo se decenijama.
Sada smo svi nevjerovatno samodovoljni, upakovani i distribuirani dobijeno u okruženju u kojem se dinamičke IP adrese dijele na principu velike nasumice, a čvorovi se mogu pojaviti i nestati po volji lijeve pete planera. Kako bi se izbjegle gomile šablonskog koda u svakom projektu koji pokreće distribuiran dobijeno, za borbu protiv neprijateljskog okruženja potrebna je pomoć.
primjedba: Svestan sam da postoji libcluster
zahtjevi
Ono što je meni lično trebalo je biblioteka koja bi preuzela upravljanje klasterom i koja bi imala sljedeća svojstva:
- transparentan rad sa tvrdo kodiranom listom čvorova i dinamičkim otkrivanjem kroz usluge dobijeno;
- potpuno funkcionalan povratni poziv za svaku promjenu topologije (čvor tamo, čvor ovdje, nestabilnost mreže, podjele);
- transparentan interfejs za pokretanje klastera sa dugim i kratkim imenima, kao sa
:nonode@nohost
; - Docker podrška iz kutije, bez potrebe za pisanjem infrastrukturnog koda.
Potonje znači da nakon što sam lokalno testirao aplikaciju u :nonode@nohost
, ili u umjetno distribuiranom okruženju koristeći test_cluster_task
docker-compose up --scale my_app=3
i pogledajte kako izvršava tri instance u docker-u bez ikakvih promjena koda. Također želim zavisne aplikacije kao što su mnesia
- kada se topologija promijeni, iza kulisa oni ponovo grade klaster uživo bez ikakvih dodatnih udaraca od strane aplikacije.
Klaustra nije bila zamišljena da bude biblioteka sposobna za sve, od održavanja klastera do pravljenja kafe. To nije srebrni metak koji ima za cilj da pokrije sve moguće slučajeve, ili da bude akademski cjelovito rješenje u smislu da teoretičari iz CS staviti u ovaj termin. Ova biblioteka je dizajnirana da služi vrlo jasnoj svrsi, ali savršeno radi svoj ne tako veliki posao. Ovaj cilj će biti da se obezbedi potpuna transparentnost između lokalnog razvojnog okruženja i distribuiranog elastičnog okruženja punog neprijateljskih kontejnera.
Odabrani pristup
Klaustra namijenjen je za pokretanje kao aplikacija, iako napredni korisnici mogu raditi sa sklapanjem i održavanjem klastera ručno direktnim pokretanjem Cloister.Manager
u stablu nadzora ciljne aplikacije.
Kada se pokrene kao aplikacija, biblioteka se oslanja na config
, iz koje čita sljedeće osnovne vrijednosti:
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
consensus: 3, # number of nodes to consider
# the cluster is up
listener: MyApp.Listener # listener to be called when
# the ring has changed
Gore navedeni parametri doslovno znače sljedeće: Klaustra koristi se za OTP aplikaciju :my_app
, koristi erlang service discovery za povezivanje čvorova, najmanje tri, i MyApp.Listener
modul (implementacija @behaviour Cloister.Listener
Sa ovom konfiguracijom, aplikacija Klaustra će biti MyApp.Listener.on_state_change/2
%Cloister.Monitor{status: :up}
, što znači: "Zdravo, klaster je sastavljen."
U većini slučajeva, instalacija consensus: 3
je optimalan jer čak i ako očekujemo da će se povezati više čvorova, povratni poziv će proći status: :rehashing
→ status: :up
na bilo kojem novo dodanom ili uklonjenom čvoru.
Kada pokrećete u razvojnom modu, samo trebate podesiti consensus: 1
и Klaustra sa zadovoljstvom će preskočiti čekanje za sklapanje klastera kada vidi :nonode@nohost
ili :node@host
ili :[email protected]
- ovisno o tome kako je čvor konfiguriran (:none | :shortnames | :longnames
).
Upravljanje distribuiranim aplikacijama
Distribuirane aplikacije koje nisu u vakuumu obično uključuju distribuirane zavisnosti, kao što su mnesia
. Lako nam je upravljati njihovom rekonfiguracijom iz istog povratnog poziva on_state_change/2
. Evo, na primjer, detaljnog opisa kako rekonfigurirati mnesia
u letu
Glavna prednost korištenja Klaustra je da obavlja sve potrebne operacije za ponovnu izgradnju klastera nakon promjene topologije ispod haube. Aplikacija jednostavno radi u već pripremljenom distribuiranom okruženju, sa svim čvorovima povezanim, bez obzira na to da li su nam IP adrese, a time i nazivi čvorova unaprijed poznati, ili su oni dinamički dodijeljeni/promijenjeni. Ovo ne zahtijeva apsolutno nikakve posebne postavke konfiguracije dockera i sa stanovišta programera aplikacija, nema razlike između pokretanja u distribuiranom okruženju ili rada u lokalnom. :nonode@nohost
. Više o ovome možete pročitati u
Iako je složeno rukovanje promjenama topologije moguće kroz prilagođenu implementaciju MyApp.Listener
, uvijek mogu postojati rubni slučajevi u kojima se ova ograničenja biblioteke i pristranosti konfiguracije pokažu kao kamen temeljac implementacije. U redu je, samo uzmi gore navedeno libcluster
, koji je više opće namjene, ili čak sami rukujte klasterom niskog nivoa. Cilj ove biblioteke kodova nije da pokrije svaki mogući scenario, već da koristi najčešći scenario bez nepotrebnog bola i glomaznog copy-paste-a.
Napomena: u ovom trenutku u originalu je bila rečenica "Srećno grupisanje!", a Yandex, sa kojim prevodim (ne moram sam da prolazim kroz rečnike), mi je ponudio opciju "Srećno grupisanje!" Možda je nemoguće zamisliti bolji prijevod, pogotovo u svjetlu trenutne geopolitičke situacije.
izvor: www.habr.com