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į.
Taip pasisekė, kad erlangas, kurį pasirinkome dėl malonios sintaksės ir ažiotažo aplink jį, yra pirmos klasės
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
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
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
Su šia konfigūracija programa Klosteris valia MyApp.Listener.on_state_change/2
%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: :rehashing
→ status: :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@nohost
Arba :node@host
Arba :[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
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
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