Klaster → jednostavno upravljanje OTP klasterom

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.

Klaster → jednostavno upravljanje OTP klasterom

Ispalo je tako srećno dobijeno, koji smo odabrali zbog njegove ugodne sintakse i hype oko nje, ima prvu klasu podrška za distribuirane sisteme. U teoriji, ovo zvuči potpuno trivijalno:

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. Zaista je super, ima preko hiljadu zvjezdica, autor je poznat u društvu i sve to. Ako su vam metode koje nudi ovaj paket za kreiranje i održavanje klastera dovoljne, drago mi je zbog vas. Nažalost, treba mi mnogo više. Želim da kontrolišem postavku do detalja, a ne da budem spoljni posmatrač u teatru reorganizacije klastera.

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, samo želim da trčim 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) je konfiguriran za primanje obavijesti o promjenama topologije. Detaljan opis kompletne konfiguracije možete pronaći u dokumentaciju.

Sa ovom konfiguracijom, aplikacija Klaustra će biti lansiranje u fazama, odgađajući proces pokretanja glavne aplikacije dok se ne postigne konsenzus (tri čvora su povezana i povezana, kao u gornjem primjeru.) Ovo daje glavnoj aplikaciji mogućnost da pretpostavi da je klaster već dostupan kada se pokrene. Kad god se topologija promijeni (bit će ih mnogo, jer čvorovi ne počinju potpuno sinhrono), rukovalac će biti pozvan MyApp.Listener.on_state_change/2. Većinu vremena izvršimo radnju kada primimo statusnu poruku %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: :rehashingstatus: :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@nohostili :node@hostili :[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 dokumentaciju Klaustra.

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 dokumentaciju.

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

Dodajte komentar