Pieci studenti un trÄ«s izplatÄ«ti atslÄgu vÄrtÄ«bu veikali
Vai arÄ« kÄ mÄs izveidojÄm klienta C++ bibliotÄku ZooKeeper, etcd un Consul KV
SadalÄ«to sistÄmu pasaulÄ ir vairÄki tipiski uzdevumi: informÄcijas glabÄÅ”ana par klastera sastÄvu, mezglu konfigurÄcijas pÄrvaldÄ«ba, bojÄtu mezglu noteikÅ”ana, lÄ«dera izvÄle cits. Å o problÄmu risinÄÅ”anai ir izveidotas speciÄlas izkliedÄtÄs sistÄmas - koordinÄcijas dienesti. Tagad mÅ«s interesÄs trÄ«s no tiem: ZooKeeper, etcd un Consul. No visas bagÄtÄ«gÄs Consul funkcionalitÄtes mÄs koncentrÄsimies uz Consul KV.
BÅ«tÄ«bÄ visas Ŕīs sistÄmas ir pret defektiem izturÄ«gas, linearizÄjamas atslÄgu vÄrtÄ«bu glabÄtuves. Lai gan to datu modeļiem ir bÅ«tiskas atŔķirÄ«bas, par kurÄm mÄs runÄsim vÄlÄk, tie atrisina tÄs paÅ”as praktiskÄs problÄmas. AcÄ«mredzot katra lietojumprogramma, kas izmanto koordinÄcijas pakalpojumu, ir piesaistÄ«ta vienai no tÄm, kas var radÄ«t nepiecieÅ”amÄ«bu atbalstÄ«t vairÄkas sistÄmas vienÄ datu centrÄ, kas atrisina vienas un tÄs paÅ”as problÄmas dažÄdÄm lietojumprogrammÄm.
Ideja atrisinÄt Å”o problÄmu radÄs AustrÄlijas konsultÄciju aÄ£entÅ«rÄ, un mÄs, neliela studentu komanda, nÄcÄs to Ä«stenot, par ko es arÄ« runÄÅ”u.
Mums izdevÄs izveidot bibliotÄku, kas nodroÅ”ina kopÄ«gu saskarni darbam ar ZooKeeper, etcd un Consul KV. BibliotÄka ir rakstÄ«ta C++ valodÄ, taÄu tiek plÄnots to pÄrnest uz citÄm valodÄm.
Datu modeļi
Lai izstrÄdÄtu kopÄ«gu saskarni trim dažÄdÄm sistÄmÄm, jums ir jÄsaprot, kas tÄm ir kopÄ«gs un kÄ tÄs atŔķiras. IzdomÄsim.
ZoodÄrza uzraugs
AtslÄgas ir sakÄrtotas kokÄ un tiek sauktas par mezgliem. AttiecÄ«gi mezglam varat iegÅ«t tÄ bÄrnu sarakstu. Znode izveides (create) un vÄrtÄ«bas maiÅas (setData) darbÄ«bas ir atdalÄ«tas: var lasÄ«t un mainÄ«t tikai esoÅ”Äs atslÄgas. PulksteÅus var pievienot mezgla esamÄ«bas pÄrbaudes, vÄrtÄ«bas nolasÄ«Å”anas un bÄrnu iegÅ«Å”anas darbÄ«bÄm. Watch ir vienreizÄjs aktivizÄtÄjs, kas tiek aktivizÄts, kad serverÄ« mainÄs atbilstoÅ”o datu versija. Lai noteiktu kļūmes, tiek izmantoti Ä«slaicÄ«gi mezgli. Tie ir piesaistÄ«ti klienta sesijai, kas tos izveidoja. Kad klients aizver sesiju vai pÄrtrauc paziÅot ZooKeeper par tÄs esamÄ«bu, Å”ie mezgli tiek automÄtiski dzÄsti. Tiek atbalstÄ«tas vienkÄrÅ”as transakcijas ā darbÄ«bu kopums, kuras visas izdodas vai neizdodas, ja tas nav iespÄjams vismaz vienam no tiem.
utt
Å Ä«s sistÄmas izstrÄdÄtÄjus nepÄrprotami iedvesmoja ZooKeeper, un tÄpÄc viÅi visu darÄ«ja savÄdÄk. AtslÄgÄm nav hierarhijas, bet tÄs veido leksikogrÄfiski sakÄrtotu kopu. Varat iegÅ«t vai dzÄst visas atslÄgas, kas pieder noteiktam diapazonam. Å Ä« struktÅ«ra var Ŕķist dÄ«vaina, taÄu patiesÄ«bÄ tÄ ir ļoti izteiksmÄ«ga, un caur to var viegli lÄ«dzinÄties hierarhiskam skatÄ«jumam.
etcd nav standarta salÄ«dzinÄÅ”anas un iestatÄ«Å”anas darbÄ«bas, taÄu tai ir kaut kas labÄks: transakcijas. Protams, tie pastÄv visÄs trÄ«s sistÄmÄs, bet etcd darÄ«jumi ir Ä«paÅ”i labi. Tie sastÄv no trim blokiem: pÄrbaude, veiksme, neveiksme. PirmajÄ blokÄ ir nosacÄ«jumu kopums, otrajÄ un treÅ”ajÄ - darbÄ«bas. DarÄ«jums tiek izpildÄ«ts atomiski. Ja visi nosacÄ«jumi ir patiesi, tad tiek izpildÄ«ts veiksmes bloks, pretÄjÄ gadÄ«jumÄ tiek izpildÄ«ts neveiksmju bloks. API 3.3 veiksmes un neveiksmes blokos var bÅ«t ligzdotas transakcijas. Tas ir, ir iespÄjams atomiski izpildÄ«t gandrÄ«z patvaļīga ligzdoÅ”anas lÄ«meÅa nosacÄ«juma konstrukcijas. Varat uzzinÄt vairÄk par to, no kÄ tiek veiktas pÄrbaudes un darbÄ«bas dokumentÄcija.
PulksteÅi pastÄv arÄ« Å”eit, lai gan tie ir nedaudz sarežģītÄki un ir atkÄrtoti lietojami. Tas nozÄ«mÄ, ka pÄc pulksteÅa instalÄÅ”anas atslÄgu diapazonÄ jÅ«s saÅemsit visus Ŕī diapazona atjauninÄjumus, lÄ«dz atcelsit pulksteni, nevis tikai pirmo. ProgrammÄ etcd ZooKeeper klientu sesiju analogs ir noma.
Konsuls K.V.
Å eit nav arÄ« stingras hierarhiskas struktÅ«ras, taÄu konsuls var radÄ«t izskatu, ka tÄ pastÄv: jÅ«s varat iegÅ«t un izdzÄst visas atslÄgas ar norÄdÄ«to prefiksu, tas ir, strÄdÄt ar atslÄgas āapakÅ”kokuā. Å Ädus vaicÄjumus sauc par rekursÄ«viem. TurklÄt konsuls var atlasÄ«t tikai atslÄgas, kurÄs pÄc prefiksa nav norÄdÄ«tÄ rakstzÄ«me, kas atbilst tÅ«lÄ«tÄjai ābÄrnuā iegÅ«Å”anai. Bet ir vÄrts atcerÄties, ka tas ir tieÅ”i hierarhiskas struktÅ«ras izskats: ir pilnÄ«gi iespÄjams izveidot atslÄgu, ja tÄs vecÄka nav, vai izdzÄst atslÄgu, kurai ir bÄrni, kamÄr bÄrni turpinÄs saglabÄties sistÄmÄ.
PulksteÅu vietÄ konsuls bloÄ·Ä HTTP pieprasÄ«jumus. BÅ«tÄ«bÄ tie ir parastie datu nolasÄ«Å”anas metodes izsaukumi, kuriem kopÄ ar citiem parametriem tiek norÄdÄ«ta pÄdÄjÄ zinÄmÄ datu versija. Ja atbilstoÅ”o datu paÅ”reizÄjÄ versija serverÄ« ir lielÄka par norÄdÄ«to, atbilde tiek atgriezta nekavÄjoties, pretÄjÄ gadÄ«jumÄ - mainoties vÄrtÄ«bai. Ir arÄ« sesijas, kuras jebkurÄ laikÄ var pievienot atslÄgÄm. Ir vÄrts atzÄ«mÄt, ka atŔķirÄ«bÄ no etcd un ZooKeeper, kur sesiju dzÄÅ”ana noved pie saistÄ«to atslÄgu dzÄÅ”anas, ir režīms, kurÄ sesija tiek vienkÄrÅ”i atsaistÄ«ta no tÄm. Pieejams darÄ«jumiem, bez zariem, bet ar visÄdiem Äekiem.
Saliekot to visu kopÄ
ZooKeeper ir visstingrÄkais datu modelis. IzteiksmÄ«gos diapazona vaicÄjumus, kas pieejami programmÄ etcd, nevar efektÄ«vi emulÄt ne ZooKeeper, ne Consul. MÄÄ£inot iekļaut labÄko no visiem pakalpojumiem, mÄs ieguvÄm saskarni, kas ir gandrÄ«z lÄ«dzvÄrtÄ«ga ZooKeeper saskarnei ar Å”Ädiem bÅ«tiskiem izÅÄmumiem:
iestatÄ«Å”anas metode izveido atslÄgu, ja tÄ neeksistÄ (ZK gadÄ«jumÄ setData atgriež kļūdu)
set un cas metodes ir atdalÄ«tas (ZK tÄs bÅ«tÄ«bÄ ir viena un tÄ pati)
dzÄÅ”anas metode izdzÄÅ” mezglu kopÄ ar tÄ apakÅ”koku (ZK gadÄ«jumÄ delete atgriež kļūdu, ja mezglam ir bÄrni)
Katrai atslÄgai ir tikai viena versija - vÄrtÄ«bas versija (ZK tÄdi ir trÄ«s)
SecÄ«go mezglu noraidÄ«Å”ana ir saistÄ«ta ar faktu, ka etcd un Consul tiem nav iebÅ«vÄta atbalsta, un lietotÄjs tos var viegli ieviest iegÅ«tajÄ bibliotÄkas saskarnÄ.
IevieÅ”ot ZooKeeper lÄ«dzÄ«gu rÄ«cÄ«bu, dzÄÅ”ot virsotni, katrai atslÄgai ir jÄuztur atseviŔķs bÄrnskaitlis programmÄ etcd un Consul. TÄ kÄ mÄs centÄmies izvairÄ«ties no meta informÄcijas glabÄÅ”anas, tika nolemts izdzÄst visu apakÅ”koku.
HierarhiskÄ skatÄ«juma uzturÄÅ”ana programmÄ etcd izrÄdÄ«jÄs viens no interesantÄkajiem uzdevumiem. Diapazona vaicÄjumi ļauj viegli izgÅ«t atslÄgu sarakstu ar noteiktu prefiksu. PiemÄram, ja jums ir nepiecieÅ”ams viss, kas sÄkas ar "/foo", jÅ«s lÅ«dzat diapazonu ["/foo", "/fop"). Bet tas atgrieztu visu atslÄgas apakÅ”koku, kas var nebÅ«t pieÅemams, ja apakÅ”koks ir liels. SÄkumÄ mÄs plÄnojÄm izmantot galveno tulkoÅ”anas mehÄnismu, ieviests zetcd. Tas ietver viena baita pievienoÅ”anu atslÄgas sÄkumÄ, kas ir vienÄds ar mezgla dziļumu kokÄ. Ä»aujiet man sniegt jums piemÄru.
"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"
PÄc tam iegÅ«stiet visus tÅ«lÄ«tÄjos atslÄgas bÄrnus "/foo" iespÄjams, pieprasot diapazonu ["u02/foo/", "u02/foo0"). JÄ, ASCII formÄtÄ "0" stÄv uzreiz pÄc "/".
Bet kÄ Å”ajÄ gadÄ«jumÄ Ä«stenot virsotnes noÅemÅ”anu? IzrÄdÄs, ka jums ir jÄizdzÄÅ” visi veida diapazoni ["uXX/foo/", "uXX/foo0") XX no 01 lÄ«dz FF. Un tad mÄs saskrÄjÄmies operÄciju skaita ierobežojums viena darÄ«juma ietvaros.
RezultÄtÄ tika izgudrota vienkÄrÅ”a atslÄgu konvertÄÅ”anas sistÄma, kas ļÄva efektÄ«vi realizÄt gan atslÄgas dzÄÅ”anu, gan bÄrnu saraksta iegÅ«Å”anu. Pietiek pirms pÄdÄjÄ marÄ·iera pievienot Ä«paÅ”u rakstzÄ«mi. PiemÄram:
PÄc tam izdzÄÅ”ot atslÄgu "/very" pÄrvÄrÅ”as par dzÄÅ”anu "/u00very" un diapazons ["/very/", "/very0"), un saÅemt visus bÄrnus - pieprasot atslÄgas no diapazona ["/very/u00", "/very/u01").
AtslÄgas noÅemÅ”ana programmÄ ZooKeeper
KÄ jau minÄju, ZooKeeper nevar izdzÄst mezglu, ja tam ir bÄrni. MÄs vÄlamies dzÄst atslÄgu kopÄ ar apakÅ”koku. Ko man darÄ«t? MÄs to darÄm ar optimismu. PirmkÄrt, mÄs rekursÄ«vi ŔķÄrsojam apakÅ”koku, iegÅ«stot katras virsotnes atvasinÄjumus ar atseviŔķu vaicÄjumu. PÄc tam mÄs izveidojam darÄ«jumu, kas mÄÄ£ina dzÄst visus apakÅ”koka mezglus pareizajÄ secÄ«bÄ. Protams, starp apakÅ”koka nolasÄ«Å”anu un dzÄÅ”anu var notikt izmaiÅas. Å ajÄ gadÄ«jumÄ darÄ«jums neizdosies. TurklÄt apakÅ”koks var mainÄ«ties lasÄ«Å”anas procesÄ. PieprasÄ«jums par nÄkamÄ mezgla bÄrniem var atgriezt kļūdu, ja, piemÄram, Å”is mezgls jau ir dzÄsts. Abos gadÄ«jumos mÄs atkÄrtojam visu procesu vÄlreiz.
Å Ä« pieeja padara atslÄgas dzÄÅ”anu ļoti neefektÄ«vu, ja tai ir bÄrni, un vÄl jo vairÄk, ja lietojumprogramma turpina strÄdÄt ar apakÅ”koku, dzÄÅ”ot un veidojot atslÄgas. TomÄr tas ļÄva mums izvairÄ«ties no citu metožu ievieÅ”anas sarežģījumiem etcd un Consul.
iestatīts ZooKeeper
ProgrammÄ ZooKeeper ir atseviŔķas metodes, kas darbojas ar koka struktÅ«ru (create, delete, getChildren) un kas darbojas ar datiem mezglos (setData, getData). TurklÄt visÄm metodÄm ir stingri priekÅ”noteikumi: Create atgriezÄ«s kļūdu, ja mezgls jau ir ir izveidots, dzÄst vai setData ā ja tas vÄl neeksistÄ. Mums bija nepiecieÅ”ama noteikta metode, kuru var izsaukt, nedomÄjot par atslÄgas klÄtbÅ«tni.
Viena iespÄja ir izvÄlÄties optimistisku pieeju, tÄpat kÄ ar svÄ«troÅ”anu. PÄrbaudiet, vai mezgls pastÄv. Ja tÄda ir, izsauciet setData, pretÄjÄ gadÄ«jumÄ izveidojiet. Ja pÄdÄjÄ metode radÄ«ja kļūdu, atkÄrtojiet to vÄlreiz. Vispirms jÄatzÄ«mÄ, ka eksistences pÄrbaude ir bezjÄdzÄ«ga. JÅ«s varat nekavÄjoties piezvanÄ«t izveidot. VeiksmÄ«ga pabeigÅ”ana nozÄ«mÄs, ka mezgls neeksistÄja un tas tika izveidots. PretÄjÄ gadÄ«jumÄ Create atgriezÄ«s atbilstoÅ”o kļūdu, pÄc kuras jums jÄizsauc setData. Protams, starp zvaniem virsotne var tikt izdzÄsta ar konkurÄjoÅ”u zvanu, un setData arÄ« atgrieztu kļūdu. Å ajÄ gadÄ«jumÄ jÅ«s varat darÄ«t visu no jauna, bet vai tas ir tÄ vÄrts?
Ja abas metodes atgriež kļūdu, mÄs droÅ”i zinÄm, ka ir notikusi konkurÄjoÅ”a dzÄÅ”ana. IedomÄsimies, ka Ŕī dzÄÅ”ana notika pÄc kopas izsaukÅ”anas. Tad jebkura nozÄ«me, ko mÄs cenÅ”amies noteikt, jau ir izdzÄsta. Tas nozÄ«mÄ, ka mÄs varam pieÅemt, ka kopa tika veiksmÄ«gi izpildÄ«ta, pat ja patiesÄ«bÄ nekas netika uzrakstÄ«ts.
SÄ«kÄka tehniskÄ informÄcija
Å ajÄ sadaÄ¼Ä mÄs atpÅ«tÄ«simies no izplatÄ«tajÄm sistÄmÄm un runÄsim par kodÄÅ”anu.
Viena no klienta galvenajÄm prasÄ«bÄm bija starpplatformu sistÄma: vismaz vienam no pakalpojumiem jÄbÅ«t atbalstÄ«tiem operÄtÄjsistÄmÄs Linux, MacOS un Windows. SÄkotnÄji mÄs izstrÄdÄjÄm tikai Linux, un vÄlÄk sÄkÄm testÄt citÄs sistÄmÄs. Tas radÄ«ja daudz problÄmu, kurÄm kÄdu laiku bija pilnÄ«gi neskaidrs, kÄ pieiet. RezultÄtÄ visi trÄ«s koordinÄcijas pakalpojumi tagad tiek atbalstÄ«ti operÄtÄjsistÄmÄs Linux un MacOS, savukÄrt operÄtÄjsistÄmÄ Windows tiek atbalstÄ«ts tikai Consul KV.
No paÅ”a sÄkuma mÄs centÄmies izmantot gatavas bibliotÄkas, lai piekļūtu pakalpojumiem. ZooKeeper gadÄ«jumÄ izvÄle krita ZooKeeper C++, kuru galu galÄ neizdevÄs kompilÄt operÄtÄjsistÄmÄ Windows. TomÄr tas nav pÄrsteidzoÅ”i: bibliotÄka ir novietota tikai Linux. Konsulam vienÄ«gÄ iespÄja bija ppkonsuls. Tam bija jÄpievieno atbalsts sesijas Šø darÄ«jumiem. AttiecÄ«bÄ uz etcd netika atrasta pilnvÄrtÄ«ga bibliotÄka, kas atbalsta jaunÄko protokola versiju, tÄpÄc mÄs vienkÄrÅ”i Ä£enerÄts grpc klients.
Iedvesmojoties no ZooKeeper C++ bibliotÄkas asinhronÄs saskarnes, mÄs nolÄmÄm ieviest arÄ« asinhrono saskarni. ZooKeeper C++ Å”im nolÅ«kam izmanto nÄkotnes/solÄ«jumu primitÄ«vus. STL, diemžÄl, tie tiek Ä«stenoti ļoti pieticÄ«gi. PiemÄram, nÄ tad metode, kas piemÄro nodoto funkciju nÄkotnes rezultÄtam, kad tas kļūst pieejams. MÅ«su gadÄ«jumÄ Å”Äda metode ir nepiecieÅ”ama, lai pÄrvÄrstu rezultÄtu mÅ«su bibliotÄkas formÄtÄ. Lai apietu Å”o problÄmu, mums bija jÄievieÅ” savs vienkÄrÅ”s pavedienu kopums, jo pÄc klienta pieprasÄ«juma mÄs nevarÄjÄm izmantot smagas treÅ”o puÅ”u bibliotÄkas, piemÄram, Boost.
MÅ«su toreizÄjÄ ievieÅ”ana darbojas Å”Ädi. Izsaucot, tiek izveidots papildu solÄ«jums/nÄkotnes pÄris. JaunÄ nÄkotne tiek atgriezta, un nodotÄ āātiek ievietota rindÄ kopÄ ar atbilstoÅ”o funkciju un papildu solÄ«jumu. Pavediens no kopas atlasa vairÄkus nÄkotnes lÄ«gumus no rindas un aptauj tos, izmantojot gaidÄ«t_for. Kad rezultÄts kļūst pieejams, tiek izsaukta atbilstoÅ”Ä funkcija un tÄs atgrieÅ”anas vÄrtÄ«ba tiek nodota solÄ«jumam.
MÄs izmantojÄm to paÅ”u pavedienu kopu, lai izpildÄ«tu vaicÄjumus etcd un Consul. Tas nozÄ«mÄ, ka pamatÄ esoÅ”ajÄm bibliotÄkÄm var piekļūt, izmantojot vairÄkus dažÄdus pavedienus. ppconsul nav pavedienu droÅ”s, tÄpÄc zvani uz to ir aizsargÄti ar slÄdzenÄm.
JÅ«s varat strÄdÄt ar grpc no vairÄkiem pavedieniem, taÄu ir arÄ« smalkumi. In etcd pulksteÅi tiek ieviesti, izmantojot grpc straumes. Tie ir divvirzienu kanÄli noteikta veida ziÅojumiem. BibliotÄka izveido vienu pavedienu visiem pulksteÅiem un vienu pavedienu, kas apstrÄdÄ ienÄkoÅ”os ziÅojumus. TÄtad grpc aizliedz paralÄlu rakstÄ«Å”anu straumÄ. Tas nozÄ«mÄ, ka, inicializÄjot vai dzÄÅ”ot pulksteni, pirms nÄkamÄ pieprasÄ«juma nosÅ«tÄ«Å”anas ir jÄgaida, lÄ«dz iepriekÅ”ÄjÄ pieprasÄ«juma nosÅ«tÄ«Å”ana ir pabeigta. MÄs izmantojam sinhronizÄcijai nosacÄ«juma mainÄ«gie.