Cloister → paprastas OTP klasterio valdymas

Beveik kiekviena sėkminga verslo programa anksčiau ar vėliau patenka į fazę, kai reikalingas horizontalus mastelio keitimas. Daugeliu atvejų galite tiesiog pradėti naują egzempliorių ir sumažinti apkrovos vidurkį. Tačiau yra ir mažiau nereikšmingų atvejų, kai turime užtikrinti, kad skirtingi mazgai žinotų vienas apie kitą ir kruopščiai paskirstytų darbo krūvį.

Cloister → paprastas OTP klasterio valdymas

Taip pasisekė, kad erlangas, kurį pasirinkome dėl malonios sintaksės ir ažiotažo aplink jį, yra pirmos klasės parama paskirstytoms sistemoms. Teoriškai tai skamba visiškai trivialiai:

Pranešimų perdavimas tarp procesų skirtinguose mazguose, taip pat tarp saitų ir monitorių, yra skaidrus […]

Praktiškai viskas yra šiek tiek sudėtingiau. Paskirstyta erlangas buvo sukurtas, kai „konteineris“ reiškė didelę geležinę dėžę gabenimui, o „dokeris“ buvo tiesiog longshoreman sinonimas. IN IP4 buvo daug neužimtų adresų, tinklo pertraukas dažniausiai lemdavo kabelį kramtančios žiurkės, o vidutinis gamybos sistemos veikimo laikas buvo matuojamas dešimtmečiais.

Dabar visi esame neįtikėtinai savarankiški, supakuoti ir veikiame platinami erlangas aplinkoje, kur dinaminiai IP adresai išdalinami didelio atsitiktinumo principu, o mazgai gali atsirasti ir išnykti pagal kairiojo planuotojo kulno užgaidą. Siekiant išvengti krūvos pagrindinio kodo kiekviename projekte, kuriame vykdomas paskirstytas erlangas, kovojant su priešiška aplinka, reikalinga pagalba.

Atkreipti dėmesį: Aš žinau, kad yra libcluster. Tai tikrai šaunu, turi daugiau nei tūkstantį žvaigždžių, autorius garsus bendruomenėje ir tiek. Jei jums pakanka šio paketo siūlomų klasterio kūrimo ir priežiūros metodų, aš džiaugiuosi už jus. Deja, man reikia daug daugiau. Noriu detaliai kontroliuoti sąranką ir nebūti pašaliniu žiūrovu klasterio reorganizavimo teatre.

Reikalavimai

Man asmeniškai reikėjo bibliotekos, kuri perimtų klasterio valdymą ir turėtų šias savybes:

  • skaidrus darbas su užkoduotu mazgų sąrašu ir dinamišku atradimu per paslaugas erlangas;
  • pilnai veikiantis atšaukimas kiekvienam topologijos pakeitimui (mazgas ten, mazgas čia, tinklo nestabilumas, skilimai);
  • skaidri sąsaja, skirta paleisti klasterį su ilgais ir trumpais pavadinimais, kaip ir :nonode@nohost;
  • Docker palaikymas iš karto, nereikia rašyti infrastruktūros kodo.

Pastarasis reiškia, kad po to, kai išbandžiau programą vietoje :nonode@nohost, arba dirbtinai paskirstytoje aplinkoje naudojant test_cluster_task, aš tiesiog noriu bėgti docker-compose up --scale my_app=3 ir pažiūrėkite, kaip jis vykdo tris egzempliorius „Docker“ be jokių kodo pakeitimų. Aš taip pat noriu priklausomų programų, pvz mnesia - pasikeitus topologijai, užkulisiuose jie atkuria klasterį gyvai be jokio papildomo programos smūgio.

Klosteris nebuvo skirta būti biblioteka, galinčia viskuo – nuo ​​klasterio palaikymo iki kavos ruošimo. Tai nėra sidabrinė kulka, kuria siekiama aprėpti visus įmanomus atvejus arba būti akademiniu požiūriu išsamus sprendimas ta prasme, kaip teoretikai iš CS įtraukti į šį terminą. Ši biblioteka sukurta taip, kad tarnautų labai aiškiai, tačiau puikiai atlieka savo ne per didelį darbą. Šis tikslas bus užtikrinti visišką skaidrumą tarp vietinės plėtros aplinkos ir paskirstytos elastingos aplinkos, pilnos priešiškų konteinerių.

Pasirinktas požiūris

Klosteris skirtas paleisti kaip programą, nors pažengę vartotojai gali dirbti su klasterio surinkimu ir priežiūra rankiniu būdu, tiesiogiai paleisdami Cloister.Manager tikslinės programos priežiūros medyje.

Kai vykdoma kaip programa, biblioteka remiasi config, iš kurios nuskaitomos šios pagrindinės reikšmės:

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

Aukščiau pateikti parametrai pažodžiui reiškia: Klosteris naudojamas OTP programai :my_app, naudoja erlang paslaugos atradimas sujungti mazgus, bent tris ir MyApp.Listener modulis (diegiantis @behaviour Cloister.Listener) sukonfigūruotas taip, kad gautų pranešimus apie topologijos pakeitimus. Išsamų visos konfigūracijos aprašymą rasite dokumentacija.

Su šia konfigūracija programa Klosteris valia paleisti etapais, atideda pagrindinės programos paleidimo procesą, kol bus pasiektas sutarimas (sujungiami ir prijungiami trys mazgai, kaip nurodyta aukščiau esančiame pavyzdyje.) Tai suteikia pagrindinei programai galimybę daryti prielaidą, kad kai ji paleidžiama, klasteris jau yra prieinamas. Kaskart pasikeitus topologijai (jų bus daug, nes mazgai neprasideda visiškai sinchroniškai), tvarkytojas bus iškviestas MyApp.Listener.on_state_change/2. Dažniausiai mes atliekame veiksmą, kai gauname būsenos pranešimą %Cloister.Monitor{status: :up}, o tai reiškia: „Sveiki, grupė surinkta“.

Daugeliu atvejų montavimas consensus: 3 yra optimalus, nes net jei tikimės, kad prisijungs daugiau mazgų, atgalinis skambutis bus atliktas status: :rehashingstatus: :up bet kuriame naujai pridėtame arba pašalintame mazge.

Pradedant kūrimo režimu, tereikia nustatyti consensus: 1 и Klosteris kai pamatys, mielai nelauks klasterio surinkimo :nonode@nohostArba :node@hostArba :[email protected] - priklausomai nuo to, kaip mazgas buvo sukonfigūruotas (:none | :shortnames | :longnames).

Paskirstytas programų valdymas

Paskirstytos programos, kurios nėra vakuume, paprastai apima paskirstytas priklausomybes, pvz mnesia. Mums lengva atlikti jų perkonfigūravimą naudojant tą patį atgalinį skambutį on_state_change/2. Pavyzdžiui, čia yra išsamus aprašymas, kaip perkonfigūruoti mnesia skrendant dokumentacija Klosteris.

Pagrindinis naudojimo pranašumas Klosteris yra tai, kad ji atlieka visas būtinas operacijas, kad atkurtų klasterį po topologijos pakeitimo po gaubtu. Programa tiesiog veikia jau paruoštoje paskirstytoje aplinkoje, kai visi mazgai yra prijungti, nepriklausomai nuo to, ar iš anksto žinome IP adresus, taigi ir mazgų pavadinimus, ar jie buvo dinamiškai priskirti/pakeisti. Tam nereikia jokių specialių doko konfigūracijos nustatymų, o programų kūrėjo požiūriu nėra jokio skirtumo, ar veikia paskirstytoje aplinkoje, ar vietinėje. :nonode@nohost. Daugiau apie tai galite perskaityti dokumentacija.

Nors sudėtingas topologijos pakeitimų tvarkymas įmanomas naudojant tinkintą įgyvendinimą MyApp.Listener, visada gali pasitaikyti kraštinių atvejų, kai šie bibliotekos apribojimai ir konfigūracijos paklaidos yra įgyvendinimo kertiniai akmenys. Viskas gerai, tiesiog imkitės aukščiau pateiktų dalykų libcluster, kuris yra bendresnės paskirties, arba net patys tvarkykite žemo lygio klasterį. Šios kodų bibliotekos tikslas nėra aprėpti visus įmanomus scenarijus, o naudoti įprastą scenarijų be nereikalingo skausmo ir sudėtingo kopijavimo-įklijavimo.

Pastaba: šiuo metu originale buvo frazė „Happy Clustering!“, o „Yandex“, su kuria aš verčiau (man pačiam nereikia naršyti žodynų), pasiūlė man parinktį „Happy Clustering! Galbūt ir neįmanoma įsivaizduoti geresnio vertimo, ypač atsižvelgiant į dabartinę geopolitinę situaciją.

Šaltinis: www.habr.com

Добавить комментарий