Cloister → 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 prosječno opterećenje. 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.

Cloister → jednostavno upravljanje OTP klasterom

Ispalo je tako sretno da dobiveni, koji smo odabrali zbog njegove ugodne sintakse i pompe oko njega, ima prvoklasnu podrška za distribuirane sustave. U teoriji ovo zvuči potpuno trivijalno:

Prijenos poruka između procesa na različitim čvorovima, kao i između veza i monitora, transparentan je […]

U praksi je sve malo kompliciranije. Distribuirano dobiveni je razvijen kada je "kontejner" značio veliku željeznu kutiju za otpremu, a "docker" je bio jednostavno sinonim za dužnog dužnosnika. U IP4 bilo je mnogo nezauzetih adresa, prekide mreže obično su uzrokovali štakori koji su žvakali kabel, a prosječno vrijeme rada proizvodnog sustava mjerilo se desetljećima.

Sada smo svi nevjerojatno samodostatni, upakirani i distribuirani dobiveni u okruženju gdje se dinamičke IP adrese dijele na principu velike slučajnosti, a čvorovi se mogu pojavljivati ​​i nestajati po želji lijeve pete planera. Kako biste izbjegli hrpe šablonskog koda u svakom projektu koji izvodi distribuirani dobiveni, za borbu protiv neprijateljskog okruženja potrebna je pomoć.

Primijetiti: Svjestan sam da postoji libcluster. Stvarno je super, ima preko tisuću zvjezdica, autor je poznat u zajednici i sve to. Ako su vam metode koje nudi ovaj paket za stvaranje i održavanje klastera dovoljne, drago mi je zbog vas. Nažalost, treba mi mnogo više. Želim detaljno kontrolirati postavku, a ne biti vanjski gledatelj u kazalištu reorganizacije klastera.

Zahtjevi

Ono što je meni osobno trebalo je biblioteka koja bi preuzela upravljanje klasterom i imala bi sljedeća svojstva:

  • transparentan rad s tvrdo kodiranim popisom čvorova i dinamičkim otkrivanjem putem usluga dobiveni;
  • potpuno funkcionalan povratni poziv za svaku promjenu topologije (čvor tamo, čvor ovdje, nestabilnost mreže, razdvajanja);
  • transparentno sučelje za pokretanje klastera s dugim i kratkim nazivima, kao kod :nonode@nohost;
  • Podrška za Docker izvan kutije, bez potrebe za pisanjem infrastrukturnog koda.

Potonje znači da nakon što sam testirao aplikaciju lokalno u :nonode@nohost, ili u umjetno distribuiranom okruženju pomoću test_cluster_task, samo želim trčati docker-compose up --scale my_app=3 i pogledajte kako izvršava tri instance u dockeru bez ikakvih promjena koda. Također želim ovisne aplikacije poput mnesia - kada se topologija promijeni, iza kulisa oni ponovno grade klaster uživo bez ikakvog dodatnog udaranja aplikacije.

manastir nije zamišljena kao knjižnica sposobna za sve, od podrške klasteru do kuhanja kave. To nije srebrni metak koji ima za cilj pokriti sve moguće slučajeve ili biti akademski cjelovito rješenje u smislu kako teoretičari iz CS staviti u ovaj termin. Ova je biblioteka dizajnirana da služi vrlo jasnoj svrsi, ali savršeno obavlja svoj ne preveliki posao. Taj će cilj biti osigurati potpunu transparentnost između lokalnog razvojnog okruženja i distribuiranog elastičnog okruženja punog neprijateljskih spremnika.

Odabrani pristup

manastir namijenjen je za pokretanje kao aplikacija, iako napredni korisnici mogu ručno raditi sa sastavljanjem i održavanjem klastera izravnim pokretanjem Cloister.Manager u nadzornom stablu ciljne aplikacije.

Kada se pokreće kao aplikacija, knjižnica se oslanja na config, iz koje se očitavaju 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

Gornji parametri znače doslovno sljedeće: manastir koristi se za OTP aplikaciju :my_app, koristi otkrivanje erlang usluge 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 dokumentacija.

S ovom konfiguracijom, aplikacija manastir volja pokretanje u fazama, odgađajući proces pokretanja glavne aplikacije dok se ne postigne konsenzus (tri čvora su spojena i spojena, 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 sinkrono), rukovatelj će biti pozvan MyApp.Listener.on_state_change/2. Većinu vremena izvršavamo radnju kada primimo poruku o statusu %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.

Prilikom pokretanja u razvojnom načinu, trebate samo postaviti consensus: 1 и manastir rado će preskočiti čekanje na sklapanje klastera kad vidi :nonode@nohostIli :node@hostIli :[email protected] - ovisno o tome kako je čvor konfiguriran (:none | :shortnames | :longnames).

Distribuirano upravljanje aplikacijama

Distribuirane aplikacije koje nisu u vakuumu obično uključuju distribuirane ovisnosti, kao što su mnesia. Lako nam je rukovati njihovom rekonfiguracijom iz istog povratnog poziva on_state_change/2. Ovdje je, na primjer, detaljan opis kako ponovno konfigurirati mnesia u hodu dokumentacija manastir.

Glavna prednost korištenja manastir je da izvodi sve potrebne operacije za ponovnu izgradnju klastera nakon promjene topologije ispod haube. Aplikacija jednostavno radi u već pripremljenom distribuiranom okruženju, sa svim povezanim čvorovima, bez obzira znamo li IP adrese, a samim tim i nazive čvorova unaprijed, ili su oni dinamički dodijeljeni/promijenjeni. Ovo ne zahtijeva apsolutno nikakve posebne konfiguracijske postavke dockera i sa stajališta razvojnog programera aplikacije, nema razlike između rada u distribuiranom okruženju ili rada u lokalnom. :nonode@nohost. Više o ovome možete pročitati u dokumentacija.

Iako je složeno rukovanje promjenama topologije moguće kroz prilagođenu implementaciju MyApp.Listener, uvijek mogu postojati rubni slučajevi u kojima se ta ograničenja knjižnice i konfiguracijske pristranosti pokažu kao kamen temeljac implementacije. U redu je, samo uzmi gore navedeno libcluster, što je više opće namjene, ili čak sami upravljajte klasterom niske razine. Cilj ove biblioteke kodova nije pokriti svaki mogući scenarij, već koristiti najčešći scenarij bez nepotrebne muke i glomaznog kopiranja i lijepljenja.

Napomena: na ovom mjestu u originalu je bio izraz "Sretno grupiranje!", a Yandex, s kojim prevodim (ne moram sam pregledavati rječnike), ponudio mi je opciju "Sretno grupiranje!" Možda je nemoguće zamisliti bolji prijevod, pogotovo u svjetlu trenutne geopolitičke situacije.

Izvor: www.habr.com

Dodajte komentar