Peaaegu iga eduka Ă€ritarkvara rakendus satub varem vĂ”i hiljem faasi, kus on vajalik horisontaalne skaleerimine. Paljudes juhtudel piisab lihtsalt uue eksemplari kĂ€ivitamisest ja keskmise koormuse vĂ€hendamisest. Kuid on ka vĂ€hem triviaalsetele juhtumeid, kus peame tagama, et erinevad sĂ”lmed teaksid ĂŒksteisest ja jagaksid koormust hoolikalt.

Ănnestus, et erlang, mille valisime meeldiva sĂŒntaksi ja hype'i tĂ”ttu, pakub esmaklassilist . Teoorias kĂ”lab see tegelikult triviaalsetena:
SĂ”numite edastamine erinevate sĂ”lmede protsesside vahel, samuti viidete ja monitoride vahel on lĂ€bipaistev [âŠ]
Praktiliselt on kĂ”ik natuke keerulisem. Jaotatud erlang arendati siis, kui âkonteinerâ tĂ€hendas nii suurt metallkast, mida kasutati transpordiks, ja âdokkâ oli lihtsalt sĂ”na sadama töötaja tĂ€histamiseks. Ajal, mil IP4 oli palju vabu aadresse, olid vĂ”rgu katkestamiseks tavaliselt sĂŒĂŒdlased nĂ€rilised, kes olid kaableid lĂ€bi hammustanud, ja keskmine töökindluse aeg tootmissĂŒsteemis mÔÔdeti aastakĂŒmnetes.
NĂŒĂŒd oleme kĂ”ik uskumatult isemajandavad, pakitud ja kĂ€ivitame jaotatud erlang keskkonnas, kus dĂŒnaamilisi IP-aadresse jagatakse suure juhuslikkuse pĂ”himĂ”ttel ja sĂ”lmed vĂ”ivad ilmuda ja kaduda vastavalt planeerija soovile. Et vĂ€ltida igas projektis, mis kĂ€ivitab jaotatud erlang, peame me abistama vaenulikus keskkonnas.
MĂ€rkus: olen teadlik, et on olemas . See on tĂ”esti vinge, sellel on ĂŒle tuhande tĂ€he, autor on tuntud kogukonnas ja kĂ”ik see. Kui teile piisab sellest pakendist pakutud klastrite loomise ja haldamise viisidest â olen teie ĂŒle rÔÔmus. Kahjuks on mul vaja palju enam. Ma tahan hallata seadistust detailideni ja mitte olla kĂ”rvaltvaataja klastrihalduse teatrisse.
NÔuded
Mida ma isiklikult vajas, oli teek, mis vÔtab enda peale klastrihalduse ja omab jÀrgmisi omadusi:
- lĂ€bipaistev töö nii kĂ”vasti kodeeritud sĂ”lmede loendiga kui ka dĂŒnaamilise tuvastamise kaudu teenustest erlang;
- tÀisfunktsionaalne tagasiside iga topoloogiamuutuse korral (sÔlm siia, sÔlm sinna, vÔrgu ebastabiilsus, lÔhed);
- lĂ€bipaistev liides klastrite kĂ€ivitamiseks pikkade ja lĂŒhikeste nimedega, nagu ka
:nonode@nohost; - Dockeri tugi kohe olemas, ilma vajaduseta kirjutada infrastruktuuri koodi.
See tĂ€hendab, et pĂ€rast rakenduse testimist kohalikult :nonode@nohost, vĂ”i kunstlikult jaotatud keskkonnas abiga , tahan lihtsalt kĂ€ivitada docker-compose up --scale my_app=3 ja nĂ€ha, kuidas see tĂ€idab kolme eksemplari Dockeris ilma koodimuudatusteta. Samuti tahan, et sĂ”ltuvad rakendused, nĂ€iteks mnesia â kui topoloogia muutub, ehitataks klastrit tagasi ilma rakenduse vajaduseta tĂ€iendava âkĂ€epigistuseâ jĂ€rele.
Cloister ei olnud mĂ”eldud raamatukoguna, mis suudab kĂ”ike: klastrite toimest kohvi valmistamiseni. See ei ole hĂ”bedane kuul, mis pĂŒĂŒab katta kĂ”ik vĂ”imalikud juhtumid, ega ole akadeemiliselt tĂ€ielik lahendus selles mĂ”ttes, nagu teoreetikud CS investeerivad sellesse terminisse. See raamatukogu on loodud vĂ€ga selgelt mÀÀratletud eesmĂ€rgi saavutamiseks, et tĂ€ita oma mitte eriti suurt töömahtu ideaalselt. See eesmĂ€rk on tagada tĂ€ielik lĂ€bipaistvus kohaliku arenduskeskkonna ja jaotatud paindliku keskkonna vahel, mis on tĂ€is vaenulikke konteinerid.
Valitud lÀhenemine
Cloister on mÔeldud rakenduse kÀitamiseks, kuid kogenud kasutajad vÔivad klastrit kÀsitsi hallata ja hooldada (assembly and maintenance), kÀivitades selle otse Cloister.Manager sihtrakenduse superviisorite puus.
Rakenduse kÀivitamisel toetub raamatukogu edasi konsolideerimiseks ja aggregeerimiseks., kust loetakse jÀrgmised peamised vÀÀrtused:
config :cloister,
otp_app: :my_app,
sentry: :"cloister.local", # vÔi ~w|n1@foo n2@bar|a
consensus: 3, # sÔlmede arv, mida arvestada
# klaster on ĂŒles
listener: MyApp.Listener # kuulaja, mida kutsutakse, kui
# ring on muutunudĂlaltoodud parameetrid tĂ€hendavad laias laastus jĂ€rgmist: Cloister kasutatakse OTP rakenduse jaoks :my_app, kasutab erlang teenuse avastamine sĂ”lmede ĂŒhendamiseks, vĂ€hemalt kolm, ja MyApp.Listener moodul (realiseerib ) on seadistama teavitama topoloogiamuudatustest. Ăksikasjalik teave tĂ€ieliku konfiguratsiooni kohta on saadaval .
Sellise konfiguratsiooni korral rakendus Cloister rakendatakse , lĂŒkates peamise rakenduse kĂ€ivitamise protsessi edasi konsensuse saavutamiseni (kolm sĂ”lme on ĂŒhendatud ja seotud, nagu eespool nĂ€idatud). See vĂ”imaldab peamisel rakendusel eeldada, et klaster on kĂ€ivitumise hetkeks juba saadaval. Iga topoloogiamuutusega (neid tuleb palju, kuna sĂ”lmed ei kĂ€ivitu tĂ€iesti sĂŒnkroonselt) kutsub vĂ€lja töötleja . Enamasti tĂ€idame toimingu, kui saame sĂ”numi olekuga %Cloister.Monitor{status: :up}, mis tĂ€hendab: âHei, klaster on kokku pandudâ.
Enamasti on seadistamine consensus: 3 optimaalne, sest isegi kui me ootame, et ĂŒhendatakse rohkem sĂ”lmi, lĂ€bib tagasikutsumine lĂ€bi status: :rehashing â status: :up iga uue lisatud vĂ”i eemaldatud sĂ”lme korral.
KujundusreĆŸiimis piisab lihtsalt seadistamisest consensus: 1 ja Cloister kui rÔÔmsalt mööduvad ootes töötlemise hetkest, nĂ€hes :nonode@nohost, vĂ”i :node@host, vĂ”i :node@host.domain â sĂ”ltuvalt sellest, kuidas sĂ”lm on seadistatud (:none | :shortnames | :longnames).
Jaotatud rakenduste haldamine
Jaotatud rakendused ei eksisteeri vaakumis, tavaliselt sisaldavad need ka jaotatud sĂ”ltuvusi, nagu mnesia. Meil on lihtne hallata nende ĂŒmberkonfigureerimist sama tagasikutsumise kaudu on_state_change/2. Siin on nĂ€iteks ĂŒksikasjalik kirjeldus, kuidas seadistada mnesia reĆŸiimis .
Peamine eelis, millega Cloister on see, et see teostab kĂ”ik vajalikud klastriehituse operatsioonid peale topoloogia muutmist kapoti all. Rakendus kĂ€ivitatakse lihtsalt juba ettevalmistatud jaotatud keskkonnas, kĂ”igi ĂŒhendatud sĂ”lmedega, olenemata sellest, kas me teame eelnevalt IP-aadresse ja seega ka sĂ”lmede nimesid vĂ”i on need dĂŒnaamiliselt mÀÀratud/muudetud. See ei nĂ”ua erilisi konfigureerimiseseadeid dockeris ja rakenduste arendaja seisukohalt ei ole mingit erinevust jaotatud keskkonnas vĂ”i lokaalses keskkonnas kĂ€ivitamisel :nonode@nohost. Ăksikasjalikku teavet leiate .
Kuigi keeruline topoloogia muutmine on vÔimalik lÀbi oma rakenduse elluviimise MyApp.Listener, alati vÔivad olla piirjuhtumid, kus nende teegi piirangud ja kallutatud lÀhenemine konfigureerimisele osutuvad takistuseks juurutamisel. See on okei, lihtsalt vÔtke eelmainitud. libcluster, mis on universaalsem, vÔi isegi töötlege madala taseme klastrit ise. Selle kooditeegi eesmÀrk ei ole katab kÔiki vÔimalikke stsenaariume, vaid kasutada kÔige levinumat stsenaariumi ilma tarbetu valu ja mahukate kopeerimise ja kleepimisega.
MÀrkus: selle koha peal originaalis oli fraas «Happy clustering!», ja Yandex, kellelt ma tÔlgin (ei viitsi ju sÔnaraamatutesse kaevata), pakkus mulle variandi «SÔbralik klasterdamine!». Paremat tÔlget, eriti arvestades praegust geopolitiilist olukorda, on raske ette kujutada.
Allikas: habr.com
