Ħames studenti u tliet ħwienet ta’ valur ewlieni mqassma

Jew kif ktibna librerija klijent C++ għal ZooKeeper, etcd u Consul KV

Fid-dinja tas-sistemi distribwiti, hemm numru ta 'ħidmiet tipiċi: il-ħażna ta' informazzjoni dwar il-kompożizzjoni tal-cluster, il-ġestjoni tal-konfigurazzjoni tan-nodi, l-iskoperta ta 'nodi difettużi, l-għażla ta' mexxej u oħrajn. Biex issolvi dawn il-problemi, inħolqu sistemi distribwiti speċjali - servizzi ta 'koordinazzjoni. Issa se nkunu interessati fi tlieta minnhom: ZooKeeper, etcd u Consul. Mill-funzjonalità rikka kollha tal-Konslu, aħna se niffukaw fuq il-Konslu KV.

Ħames studenti u tliet ħwienet ta’ valur ewlieni mqassma

Essenzjalment, dawn is-sistemi kollha huma ħwienet ta' valur ewlieni linearizzabbli u tolleranti għall-ħsarat. Għalkemm il-mudelli tad-dejta tagħhom għandhom differenzi sinifikanti, li ser niddiskutu aktar tard, isolvu l-istess problemi prattiċi. Ovvjament, kull applikazzjoni li tuża s-servizz ta 'koordinazzjoni hija marbuta ma' waħda minnhom, li jista 'jwassal għall-ħtieġa li jiġu appoġġjati diversi sistemi f'ċentru tad-dejta wieħed li jsolvu l-istess problemi għal applikazzjonijiet differenti.

L-idea li tissolva din il-problema oriġinat f’aġenzija ta’ konsulenza Awstraljana, u f’idejna, tim żgħir ta’ studenti, nimplimentawha, li hu li se nitkellem dwaru.

Irnexxielna noħolqu librerija li tipprovdi interface komuni biex naħdmu ma' ZooKeeper, etcd u Consul KV. Il-librerija hija miktuba f'C++, iżda hemm pjanijiet biex tittrasferixxiha għal lingwi oħra.

Mudelli tad-Data

Biex tiżviluppa interface komuni għal tliet sistemi differenti, trid tifhem x'għandhom komuni u kif huma differenti. Ejja insemmu.

ŻooKeeper

Ħames studenti u tliet ħwienet ta’ valur ewlieni mqassma

Iċ-ċwievet huma organizzati f'siġra u jissejħu nodes. Għaldaqstant, għal nodu tista 'tikseb lista tat-tfal tagħha. L-operazzjonijiet tal-ħolqien ta 'znode (create) u l-bidla ta' valur (setData) huma separati: ċwievet eżistenti biss jistgħu jinqraw u jinbidlu. L-arloġġi jistgħu jiġu mehmuża mal-operazzjonijiet ta 'verifika tal-eżistenza ta' node, qari ta 'valur, u jkollna t-tfal. Watch huwa grillu ta 'darba li jispara meta l-verżjoni tad-dejta korrispondenti fuq is-server tinbidel. Nodi effimeri huma użati biex jiskopru fallimenti. Huma marbuta mas-sessjoni tal-klijent li ħoloqhom. Meta klijent jagħlaq sessjoni jew jieqaf jinnotifika lil ZooKeeper bl-eżistenza tiegħu, dawn in-nodi jitħassru awtomatikament. Tranżazzjonijiet sempliċi huma appoġġjati - sett ta 'operazzjonijiet li jew kollha jirnexxu jew ifallu jekk dan ma jkunx possibbli għal mill-inqas waħda minnhom.

eċċd

Ħames studenti u tliet ħwienet ta’ valur ewlieni mqassma

L-iżviluppaturi ta 'din is-sistema kienu ispirati b'mod ċar minn ZooKeeper, u għalhekk għamlu kollox b'mod differenti. M'hemm l-ebda ġerarkija ta 'ċwievet, iżda jiffurmaw sett ordnat lessikografikament. Tista 'tikseb jew tħassar iċ-ċwievet kollha li jappartjenu għal ċertu firxa. Din l-istruttura tista 'tidher stramba, iżda fil-fatt hija espressiva ħafna, u ħarsa ġerarkika tista' tiġi imitata faċilment permezz tagħha.

etcd m'għandux operazzjoni standard ta' tqabbil u ssettjar, iżda għandu xi ħaġa aħjar: transazzjonijiet. Naturalment, jeżistu fit-tliet sistemi kollha, iżda t-tranżazzjonijiet etcd huma speċjalment tajbin. Huma jikkonsistu fi tliet blokki: kontroll, suċċess, falliment. L-ewwel blokk fih sett ta 'kundizzjonijiet, it-tieni u t-tielet - operazzjonijiet. It-tranżazzjoni hija esegwita atomikament. Jekk il-kundizzjonijiet kollha huma veri, allura l-blokk ta 'suċċess jiġi esegwit, inkella l-blokk ta' falliment jiġi esegwit. Fl-API 3.3, il-blokki ta 'suċċess u ta' falliment jista 'jkun fihom transazzjonijiet nested. Jiġifieri, huwa possibbli li tesegwixxi atomikament kostruzzjonijiet kondizzjonali ta 'livell ta' nesting kważi arbitrarju. Tista' titgħallem aktar dwar minn liema kontrolli u operazzjonijiet jeżistu dokumentazzjoni.

Arloġġi jeżistu hawn ukoll, għalkemm huma ftit aktar ikkumplikati u jistgħu jerġgħu jintużaw. Jiġifieri, wara li tinstalla għassa fuq firxa ewlenija, tirċievi l-aġġornamenti kollha f'din il-firxa sakemm tikkanċella l-għassa, u mhux biss l-ewwel waħda. Fl-etcd, l-analogu tas-sessjonijiet tal-klijenti ZooKeeper huma kirjiet.

Konslu K.V.

Hawnhekk ukoll m'hemm l-ebda struttura ġerarkika stretta, iżda l-Konslu jista 'joħloq id-dehra li teżisti: tista' tikseb u tħassar iċ-ċwievet kollha bil-prefiss speċifikat, jiġifieri, taħdem mas-"subtree" taċ-ċavetta. Mistoqsijiet bħal dawn jissejħu rikorsivi. Barra minn hekk, Konslu jista 'jagħżel biss ċwievet li ma fihomx il-karattru speċifikat wara l-prefiss, li jikkorrispondi għall-kisba immedjata ta' "tfal". Iżda ta 'min jiftakar li din hija preċiżament id-dehra ta' struttura ġerarkika: huwa pjuttost possibbli li tinħoloq ċavetta jekk il-ġenitur tagħha ma teżistix jew tħassar ċavetta li għandha t-tfal, filwaqt li t-tfal se jkomplu jinħażnu fis-sistema.

Ħames studenti u tliet ħwienet ta’ valur ewlieni mqassma
Minflok arloġġi, Konslu għandu jimblokka talbiet HTTP. Essenzjalment, dawn huma sejħiet ordinarji għall-metodu tal-qari tad-dejta, li għalihom, flimkien ma 'parametri oħra, hija indikata l-aħħar verżjoni magħrufa tad-dejta. Jekk il-verżjoni attwali tad-dejta korrispondenti fuq is-server hija akbar minn dik speċifikata, ir-rispons jintbagħat immedjatament, inkella - meta l-valur jinbidel. Hemm ukoll sessjonijiet li jistgħu jitwaħħlu maċ-ċwievet fi kwalunkwe ħin. Ta 'min jinnota li b'differenza mill-etcd u ZooKeeper, fejn it-tħassir tas-sessjonijiet iwassal għat-tħassir ta' ċwievet assoċjati, hemm mod li fih is-sessjoni hija sempliċement mhux konnessa minnhom. Disponibbli transazzjonijiet, mingħajr fergħat, iżda b'kull tip ta 'kontrolli.

Tpoġġiha kollha flimkien

ZooKeeper għandu l-aktar mudell ta’ data rigoruż. Il-mistoqsijiet tal-firxa espressiva disponibbli f'etcd ma jistgħux jiġu emulati b'mod effettiv jew fiż-ZooKeeper jew fil-Konslu. Filwaqt li nippruvaw ninkorporaw l-aħjar mis-servizzi kollha, spiċċajna b'interface kważi ekwivalenti għall-interface ZooKeeper bl-eċċezzjonijiet sinifikanti li ġejjin:

  • sekwenza, kontenitur u nodi TTL mhux appoġġjat
  • L-ACLs mhumiex appoġġjati
  • il-metodu stabbilit joħloq ċavetta jekk ma teżistix (f'ZK setData jirritorna żball f'dan il-każ)
  • il-metodi sett u cas huma separati (f'ZK huma essenzjalment l-istess ħaġa)
  • il-metodu tat-tħassir iħassar node flimkien mas-subtree tiegħu (f'ZK delete jirritorna żball jekk in-node jkollu t-tfal)
  • Għal kull ċavetta hemm verżjoni waħda biss - il-verżjoni tal-valur (f'ZK hemm tlieta minnhom)

Ir-rifjut tan-nodi sekwenzjali huwa dovut għall-fatt li etcd u Consul m'għandhomx appoġġ inkorporat għalihom, u jistgħu jiġu implimentati faċilment mill-utent fuq l-interface tal-librerija li tirriżulta.

L-implimentazzjoni ta' mġieba simili għal ZooKeeper meta tħassar vertiċi tkun teħtieġ iż-żamma ta' counter tat-tfal separat għal kull ċavetta f'etcd u Consul. Peress li ppruvajna nevitaw li naħżnu meta informazzjoni, ġie deċiż li titħassar is-subtree kollu.

Irqaq ta' implimentazzjoni

Ejja nagħtu ħarsa aktar mill-qrib lejn xi aspetti tal-implimentazzjoni tal-interface tal-librerija f'sistemi differenti.

Ġerarkija fl-eċċd

Iż-żamma ta' ħarsa ġerarkika fl-etcd irriżulta li kienet waħda mill-aktar kompiti interessanti. Il-mistoqsijiet tal-firxa jagħmluha faċli biex tiġi rkuprata lista ta 'ċwievet bi prefiss speċifikat. Per eżempju, jekk għandek bżonn dak kollu li jibda bih "/foo", qed titlob għal firxa ["/foo", "/fop"). Iżda dan jirritorna s-subtree kollu taċ-ċavetta, li jista 'ma jkunx aċċettabbli jekk is-subtree hija kbira. Għall-ewwel ippjanajna li nużaw mekkaniżmu ta' traduzzjoni ewlieni, implimentati f'zetcd. Jinvolvi li żżid byte wieħed fil-bidu taċ-ċavetta, ugwali għall-fond tan-node fis-siġra. Ħa nagħtikom eżempju.

"/foo" -> "u01/foo"
"/foo/bar" -> "u02/foo/bar"

Imbagħad tikseb it-tfal immedjati kollha taċ-ċavetta "/foo" possibbli billi titlob firxa ["u02/foo/", "u02/foo0"). Iva, f'ASCII "0" joqgħod dritt wara "/".

Imma kif timplimenta t-tneħħija ta 'vertiċi f'dan il-każ? Jirriżulta li għandek bżonn tħassar il-firxiet kollha tat-tip ["uXX/foo/", "uXX/foo0") għal XX minn 01 sa FF. U mbagħad ħsibna limitu tan-numru tal-operazzjoni fi ħdan transazzjoni waħda.

Bħala riżultat, ġiet ivvintata sistema sempliċi ta 'konverżjoni taċ-ċavetta, li għamlitha possibbli li jiġu implimentati b'mod effettiv kemm it-tħassir ta' ċavetta kif ukoll il-kisba ta 'lista ta' tfal. Huwa biżżejjed li żżid karattru speċjali qabel l-aħħar token. Pereżempju:

"/very" -> "/u00very"
"/very/long" -> "/very/u00long"
"/very/long/path" -> "/very/long/u00path"

Imbagħad tħassar iċ-ċavetta "/very" jinbidel fi tħassir "/u00very" u l-firxa ["/very/", "/very0"), u jkollna t-tfal kollha - f'talba għal ċwievet mill-firxa ["/very/u00", "/very/u01").

Tneħħi ċ-ċavetta f'ZooKeeper

Kif diġà semmejt, f'ZooKeeper ma tistax tħassar node jekk ikollu t-tfal. Irridu nħassru ċ-ċavetta flimkien mas-subtree. X'irrid nagħmel? Dan nagħmluh b’ottimiżmu. L-ewwel, aħna rikorsiv travers l-subtree, jiksbu t-tfal ta 'kull vertiċi b'mistoqsija separata. Imbagħad nibnu transazzjoni li tipprova tħassar in-nodi kollha tas-subtree fl-ordni korretta. Naturalment, jistgħu jseħħu bidliet bejn il-qari ta’ subtree u t-tħassir tagħha. F'dan il-każ, it-tranżazzjoni se tfalli. Barra minn hekk, is-subtree tista' tinbidel matul il-proċess tal-qari. Talba għat-tfal tan-node li jmiss tista' tirritorna żball jekk, pereżempju, dan in-node jkun diġà tħassar. Fiż-żewġ każijiet, nerġgħu nirrepetu l-proċess kollu.

Dan l-approċċ jagħmel it-tħassir ta 'ċavetta ineffettiv ħafna jekk ikollha t-tfal, u aktar u aktar jekk l-applikazzjoni tkompli taħdem mas-subtree, tħassar u toħloq ċwievet. Madankollu, dan ippermetta li nevitaw li nikkomplikaw l-implimentazzjoni ta 'metodi oħra fl-etcd u l-Konslu.

stabbilit fi ZooKeeper

F'ZooKeeper hemm metodi separati li jaħdmu ma' l-istruttura tas-siġra (create, delete, getChildren) u li jaħdmu bid-dejta f'nodes (setData, getData). Barra minn hekk, il-metodi kollha għandhom prekundizzjonijiet stretti: create se tirritorna żball jekk in-node jkun diġà inħoloq, ħassar jew issettja Data – jekk ma teżistix diġà. Kellna metodu stabbilit li jista 'jissejjaħ mingħajr ma naħsbu dwar il-preżenza ta' ċavetta.

Għażla waħda hija li tieħu approċċ ottimist, bħal fil-każ tat-tħassir. Iċċekkja jekk jeżistix node. Jekk teżisti, ċempel setData, inkella oħloq. Jekk l-aħħar metodu rritorna żball, irrepetih mill-ġdid. L-ewwel ħaġa li wieħed jinnota hija li t-test tal-eżistenza huwa inutli. Tista' immedjatament sejħa toħloq. It-tlestija b'suċċess se tfisser li n-node ma kienx jeżisti u nħoloq. Inkella, toħloq se terġa 'lura l-iżball xieraq, wara li għandek bżonn issejjaħ setData. Naturalment, bejn sejħiet, vertex jista 'jitħassar minn sejħa li tikkompeti, u setData wkoll jirritorna żball. F'dan il-każ, tista 'tagħmel dan mill-ġdid, iżda huwa worth it?

Jekk iż-żewġ metodi jirritornaw żball, allura nafu żgur li seħħet tħassir kompetitur. Ejja nimmaġinaw li dan it-tħassir seħħ wara li sejħet is-sett. Imbagħad tkun xi tkun it-tifsira li qed nippruvaw nistabbilixxu hija diġà mħassra. Dan ifisser li nistgħu nassumu li s-sett ġie esegwit b'suċċess, anki jekk fil-fatt ma nkiteb xejn.

Aktar dettalji tekniċi

F'din it-taqsima se nieħdu pawża mis-sistemi distribwiti u nitkellmu dwar il-kodifikazzjoni.
Wieħed mir-rekwiżiti ewlenin tal-klijent kien cross-platform: mill-inqas wieħed mis-servizzi għandu jkun appoġġjat fuq Linux, MacOS u Windows. Inizjalment, żviluppajna biss għal Linux, u bdejna l-ittestjar fuq sistemi oħra aktar tard. Dan ikkawża ħafna problemi, li għal xi żmien kienu kompletament mhux ċari kif approċċ. Bħala riżultat, it-tliet servizzi ta 'koordinazzjoni issa huma appoġġjati fuq Linux u MacOS, filwaqt li Consul KV biss huwa appoġġjat fuq Windows.

Mill-bidu nett, ippruvajna nużaw libreriji lesti biex naċċessaw is-servizzi. Fil-każ ta 'ZooKeeper, l-għażla waqgħet fuq ZooKeeper C++, li fl-aħħar mill-aħħar naqas milli jikkompila fuq Windows. Dan, madankollu, mhuwiex sorprendenti: il-librerija hija pożizzjonata bħala Linux-only. Għal Konslu l-unika għażla kienet ppconsul. L-appoġġ kellu jiżdied miegħu sessjonijiet и transazzjonijiet. Għal etcd, ma nstabitx librerija sħiħa li tappoġġja l-aħħar verżjoni tal-protokoll, għalhekk aħna sempliċement klijent grpc iġġenerat.

Ispirati mill-interface mhux sinkroniku tal-librerija ZooKeeper C++, iddeċidejna li nimplimentaw ukoll interface asinkroniku. F'ZooKeeper C++, il-primittivi futuri/wegħda jintużaw għal dan. Fl-STL, sfortunatament, huma implimentati b'mod modest ħafna. Per eżempju, le imbagħad metodu, li tapplika l-funzjoni mgħoddija għar-riżultat tal-futur meta ssir disponibbli. Fil-każ tagħna, metodu bħal dan huwa meħtieġ biex jikkonverti r-riżultat fil-format tal-librerija tagħna. Biex nersqu din il-problema, kellna nimplimentaw il-grupp ta 'ħajt sempliċi tagħna stess, peress li fuq talba tal-klijent ma stajniex nużaw libreriji tqal ta' partijiet terzi bħal Boost.

Imbagħad l-implimentazzjoni tagħna taħdem bħal din. Meta tissejjaħ, jinħoloq par wegħda/futur addizzjonali. Il-futur il-ġdid jiġi rritornat, u dak li għadda jitqiegħed flimkien mal-funzjoni korrispondenti u wegħda addizzjonali fil-kju. Thread mill-pool jagħżel diversi futuri mill-kju u jeżaminahom billi juża wait_for. Meta riżultat isir disponibbli, il-funzjoni korrispondenti tissejjaħ u l-valur tar-ritorn tagħha jiġi mgħoddi lill-wegħda.

Aħna użajna l-istess pool ta 'ħajt biex inwettqu mistoqsijiet lil etcd u Consul. Dan ifisser li l-libreriji sottostanti jistgħu jiġu aċċessati minn ħjut differenti multipli. ppconsul mhuwiex ħajt sigur, għalhekk is-sejħiet għalih huma protetti minn serraturi.
Tista 'taħdem ma' grpc minn ħjut multipli, iżda hemm irqaq. Fl-arloġġi etcd huma implimentati permezz ta 'flussi grpc. Dawn huma kanali bidirezzjonali għal messaġġi ta' ċertu tip. Il-librerija toħloq ħajta waħda għall-arloġġi kollha u ħajta waħda li tipproċessa messaġġi deħlin. Allura grpc jipprojbixxi kitba parallela għal stream. Dan ifisser li meta tibda jew tħassar għassa, trid tistenna sakemm it-talba preċedenti tkun lesta tintbagħat qabel ma tibgħat dik li jmiss. Aħna nużaw għas-sinkronizzazzjoni varjabbli kondizzjonali.

Total

Ara għalik innifsek: liboffkv.

It-tim tagħna: Raed Romanov, Ivan Glushenkov, Dmitry Kamaldinov, Victor Krapivensky, Vitaly Ivanin.

Sors: www.habr.com

Żid kumment