Iesaku izlasÄ«t lekcijas "Hadoop. ZooKeeper" stenogrammu no sÄrijas "Metodes liela apjoma datu izplatÄ«tai apstrÄdei programmÄ Hadoop"
Kas ir ZooKeeper, tÄ vieta Hadoop ekosistÄmÄ. NepatiesÄ«ba par izplatÄ«to skaitļoÅ”anu. Standarta sadalÄ«tÄs sistÄmas diagramma. GrÅ«tÄ«bas koordinÄt sadalÄ«tÄs sistÄmas. Tipiskas koordinÄcijas problÄmas. ZooKeeper dizaina principi. ZooKeeper datu modelis. znode karogi. Sesijas. Klienta API. PrimitÄ«vie (konfigurÄcija, dalÄ«ba grupÄ, vienkÄrÅ”as slÄdzenes, lÄ«deru ievÄlÄÅ”ana, bloÄ·ÄÅ”ana bez bara efekta). ZooKeeper arhitektÅ«ra. ZooKeeper DB. ZAB. PieprasÄ«jumu apstrÄdÄtÄjs.
Å odien mÄs runÄsim par ZooKeeper. Å Ä« lieta ir ļoti noderÄ«ga. Tam, tÄpat kÄ jebkuram Apache Hadoop produktam, ir logotips. Tas attÄlo vÄ«rieti.
Pirms tam mÄs galvenokÄrt runÄjÄm par to, kÄ tur var apstrÄdÄt datus, kÄ tos uzglabÄt, tas ir, kÄ tos kaut kÄ izmantot un kaut kÄ ar tiem strÄdÄt. Un Å”odien es gribÄtu nedaudz runÄt par izplatÄ«to lietojumprogrammu izveidi. Un ZooKeeper ir viena no tÄm lietÄm, kas ļauj vienkÄrÅ”ot Å”o lietu. Å is ir sava veida pakalpojums, kas paredzÄts kaut kÄdai procesu mijiedarbÄ«bas koordinÄÅ”anai sadalÄ«tajÄs sistÄmÄs, izplatÄ«tajÄs lietojumprogrammÄs.
VajadzÄ«ba pÄc Å”ÄdÄm aplikÄcijÄm ar katru dienu kļūst arvien lielÄka, tas ir mÅ«su kurss. No vienas puses, MapReduce un Å”is gatavais ietvars ļauj izlÄ«dzinÄt Å”o sarežģītÄ«bu un atbrÄ«vot programmÄtÄju no tÄdu primitÄ«vu rakstÄ«Å”anas kÄ mijiedarbÄ«ba un procesu koordinÄÅ”ana. TaÄu, no otras puses, neviens negarantÄ, ka tas tik un tÄ nebÅ«s jÄdara. MapReduce vai citi gatavi ietvari ne vienmÄr pilnÄ«bÄ aizvieto dažus gadÄ«jumus, kurus nevar ieviest, izmantojot Å”o. Ieskaitot paÅ”u MapReduce un virkni citu Apache projektu; patiesÄ«bÄ tÄs ir arÄ« izplatÄ«tas lietojumprogrammas. Un, lai atvieglotu rakstÄ«Å”anu, viÅi uzrakstÄ«ja ZooKeeper.
TÄpat kÄ visas ar Hadoop saistÄ«tÄs lietojumprogrammas, to izstrÄdÄja Yahoo! Tagad tÄ ir arÄ« oficiÄla Apache lietojumprogramma. Tas nav tik aktÄ«vi izstrÄdÄts kÄ HBase. Ja dodaties uz JIRA HBase, tad katru dienu ir kaudze kļūdu ziÅojumu, kaudze priekÅ”likumu kaut ko optimizÄt, t.i., dzÄ«ve projektÄ nepÄrtraukti rit. Un ZooKeeper, no vienas puses, ir salÄ«dzinoÅ”i vienkÄrÅ”s produkts, un, no otras puses, tas nodroÅ”ina tÄ uzticamÄ«bu. Un tas ir diezgan viegli lietojams, tÄpÄc tas ir kļuvis par standartu lietojumprogrammÄs Hadoop ekosistÄmÄ. TÄpÄc es domÄju, ka bÅ«tu lietderÄ«gi to pÄrskatÄ«t, lai saprastu, kÄ tas darbojas un kÄ to izmantot.
Å Ä« ir bilde no kÄdas mÅ«su lekcijas. MÄs varam teikt, ka tas ir ortogonÄls visam, ko mÄs lÄ«dz Å”im esam apsvÄruÅ”i. Un viss, kas Å”eit ir norÄdÄ«ts, vienÄ vai otrÄ pakÄpÄ darbojas ar ZooKeeper, t.i., tas ir pakalpojums, kas izmanto visus Å”os produktus. Ne HDFS, ne MapReduce nerada savus lÄ«dzÄ«gus pakalpojumus, kas tiem Ä«paÅ”i derÄtu. AttiecÄ«gi tiek izmantots ZooKeeper. Un tas vienkÄrÅ”o izstrÄdi un dažas lietas, kas saistÄ«tas ar kļūdÄm.
No kurienes tas viss nÄk? Å Ä·iet, ka mÄs paralÄli palaižam divas lietojumprogrammas dažÄdos datoros, savienojÄm tÄs ar virkni vai sietu, un viss darbojas. Bet problÄma ir tÄ, ka tÄ«kls nav uzticams, un, ja jÅ«s smirdÄjat trafiku vai paskatÄs, kas tur notiek zemÄ lÄ«menÄ«, kÄ klienti mijiedarbojas tÄ«klÄ, jÅ«s bieži varat redzÄt, ka dažas paketes tiek pazaudÄtas vai nosÅ«tÄ«tas atkÄrtoti. Ne velti tika izgudroti TCP protokoli, kas ļauj izveidot noteiktu sesiju un garantÄt ziÅojumu piegÄdi. Bet jebkurÄ gadÄ«jumÄ pat TCP ne vienmÄr var jÅ«s izglÄbt. Visam ir taimauts. TÄ«kls kÄdu laiku var vienkÄrÅ”i nokrist. Tas var tikai mirgot. Un tas viss noved pie tÄ, ka nevar paļauties uz tÄ«kla uzticamÄ«bu. TÄ ir galvenÄ atŔķirÄ«ba no paralÄlu programmu rakstÄ«Å”anas, kas darbojas vienÄ datorÄ vai vienÄ superdatorÄ, kur nav TÄ«kla, kur atmiÅÄ ir uzticamÄka datu apmaiÅas kopne. Un tÄ ir bÅ«tiska atŔķirÄ«ba.
Cita starpÄ, izmantojot tÄ«klu, vienmÄr ir noteikts latentums. Diskam arÄ« tas ir, bet tÄ«klam tÄ ir vairÄk. Latentums ir zinÄms aizkaves laiks, kas var bÅ«t mazs vai diezgan nozÄ«mÄ«gs.
TÄ«kla topoloÄ£ija mainÄs. Kas ir topoloÄ£ija - tas ir mÅ«su tÄ«kla aprÄ«kojuma izvietojums. Ir datu centri, ir plaukti, kas tur stÄv, ir sveces. To visu var atkÄrtoti savienot, pÄrvietot utt. Tas viss arÄ« jÄÅem vÄrÄ. MainÄs IP nosaukumi, mainÄs marÅ”ruts, caur kuru pÄrvietojas mÅ«su satiksme. Tas arÄ« ir jÄÅem vÄrÄ.
TÄ«kls var mainÄ«ties arÄ« aprÄ«kojuma ziÅÄ. No prakses varu teikt, ka mÅ«su tÄ«kla inženieriem ļoti patÄ«k periodiski kaut ko atjauninÄt uz svecÄm. PÄkÅ”Åi parÄdÄ«jÄs jauna programmaparatÅ«ra, un viÅus Ä«paÅ”i neinteresÄja kÄds Hadoop klasteris. ViÅiem ir savs darbs. ViÅiem galvenais, lai TÄ«kls strÄdÄ. AttiecÄ«gi viÅi tur vÄlas kaut ko atkÄrtoti augÅ”upielÄdÄt, veikt aparatÅ«ras mirgoÅ”anu, un arÄ« aparatÅ«ra periodiski mainÄs. Tas viss kaut kÄ ir jÄÅem vÄrÄ. Tas viss ietekmÄ mÅ«su izplatÄ«to lietojumprogrammu.
Parasti cilvÄki, kuri kaut kÄdu iemeslu dÄļ sÄk strÄdÄt ar lielu datu apjomu, uzskata, ka internets ir neierobežots. Ja tur ir vairÄku terabaitu fails, varat to nogÄdÄt savÄ serverÄ« vai datorÄ un atvÄrt, izmantojot kaÄ·is un skatÄ«ties. Ir vÄl viena kļūda spars paskaties uz baļķiem. Nekad nedariet to, jo tas ir slikti. Jo Vim mÄÄ£ina visu buferÄt, visu ielÄdÄt atmiÅÄ, it Ä«paÅ”i, kad sÄkam pÄrvietoties pa Å”o žurnÄlu un kaut ko meklÄt. TÄs ir lietas, kas ir aizmirstas, bet ir vÄrts padomÄt.
VienkÄrÅ”Äk ir uzrakstÄ«t vienu programmu, kas darbojas vienÄ datorÄ ar vienu procesoru.
Kad mÅ«su sistÄma attÄ«stÄs, mÄs vÄlamies to visu paralÄli un paralÄli ne tikai datorÄ, bet arÄ« klasterÄ«. Rodas jautÄjums: kÄ saskaÅot Å”o lietu? MÅ«su lietojumprogrammas, iespÄjams, pat nesadarbojas savÄ starpÄ, taÄu mÄs veicÄm vairÄkus procesus paralÄli vairÄkos serveros. Un kÄ uzraudzÄ«t, lai viÅiem viss iet labi? PiemÄram, viÅi kaut ko sÅ«ta pa internetu. ViÅiem kaut kur jÄraksta par savu stÄvokli, piemÄram, kaut kÄdÄ datu bÄzÄ vai žurnÄlÄ, tad Å”is žurnÄls ir jÄapkopo un pÄc tam kaut kur jÄanalizÄ. TurklÄt jÄÅem vÄrÄ, ka process darbojÄs un darbojÄs, pÄkÅ”Åi tajÄ parÄdÄ«jÄs kÄda kļūda vai avarÄja, tad cik Ätri mÄs par to uzzinÄsim?
Skaidrs, ka to visu var Ätri uzraudzÄ«t. Tas arÄ« ir labi, taÄu uzraudzÄ«ba ir ierobežota lieta, kas ļauj pÄrraudzÄ«t dažas lietas visaugstÄkajÄ lÄ«menÄ«.
Kad vÄlamies, lai mÅ«su procesi sÄk mijiedarboties viens ar otru, piemÄram, sÅ«tÄ«t viens otram kÄdus datus, tad arÄ« rodas jautÄjums ā kÄ tas notiks? Vai bÅ«s kaut kÄds sacensÄ«bu stÄvoklis, pÄrrakstÄ«s viens otru, vai pareizi ieradÄ«sies dati, vai pa ceļam kaut kas pazudÄ«s? JÄizstrÄdÄ kaut kÄds protokols utt.
Visu Å”o procesu koordinÄÅ”ana nav mazsvarÄ«ga lieta. Un tas liek izstrÄdÄtÄjam nolaisties vÄl zemÄkÄ lÄ«menÄ« un rakstÄ«t sistÄmas vai nu no nulles, vai ne gluži no nulles, taÄu tas nav tik vienkÄrÅ”i.
Ja jÅ«s izdomÄjat vai pat ievieÅ”at kriptogrÄfijas algoritmu, tad nekavÄjoties izmetiet to, jo, visticamÄk, tas jums nederÄs. VisticamÄk, tajÄ bÅ«s virkne kļūdu, kuras esat aizmirsis norÄdÄ«t. Nekad neizmantojiet to nekam nopietnam, jo āātas, visticamÄk, bÅ«s nestabils. Jo visi pastÄvoÅ”ie algoritmi ir ļoti ilgi pÄrbaudÄ«ti laika gaitÄ. To sagrauj sabiedrÄ«ba. Å Ä« ir atseviŔķa tÄma. Un Å”eit ir tas pats. Ja ir iespÄjams paÅ”am neieviest kaut kÄdu procesu sinhronizÄciju, tad labÄk to nedarÄ«t, jo tas ir diezgan sarežģīti un ved pa nestabilo nepÄrtrauktas kļūdu meklÄÅ”anas ceļu.
Å odien mÄs runÄjam par ZooKeeper. No vienas puses, tas ir ietvars, no otras puses, tas ir pakalpojums, kas atvieglo izstrÄdÄtÄja dzÄ«vi un maksimÄli vienkÄrÅ”o loÄ£ikas ievieÅ”anu un mÅ«su procesu koordinÄciju.
AtcerÄsimies, kÄ varÄtu izskatÄ«ties standarta izplatÄ«tÄ sistÄma. Tas ir tas, par ko mÄs runÄjÄm - HDFS, HBase. Ir galvenais process, kas pÄrvalda strÄdnieku un vergu procesus. ViÅÅ” ir atbildÄ«gs par uzdevumu koordinÄÅ”anu un sadali, darbinieku atsÄkÅ”anu, jaunu darbu uzsÄkÅ”anu un slodzes sadali.
AdvancÄtÄka lieta ir KoordinÄcijas dienests, tas ir, pÄrcelt paÅ”u koordinÄcijas uzdevumu uz atseviŔķu procesu, plus paralÄli palaist kaut kÄdu rezerves jeb stanby Master, jo Master var neizdoties. Un, ja SkolotÄjs krÄ«t, tad mÅ«su sistÄma nedarbosies. MÄs veicam dublÄÅ”anu. Daži norÄda, ka galvenais ir jÄreplicÄ dublÄÅ”anai. To var uzticÄt arÄ« KoordinÄcijas dienestam. Bet Å”ajÄ diagrammÄ par strÄdnieku koordinÄÅ”anu ir atbildÄ«gs pats Meistars, Å”eit dienests koordinÄ datu replikÄcijas darbÄ«bas.
Uzlabota iespÄja ir tad, ja visu koordinÄciju veic mÅ«su dienests, kÄ tas parasti tiek darÄ«ts. ViÅÅ” uzÅemas atbildÄ«bu par to, lai viss darbotos. Un, ja kaut kas nedarbojas, mÄs par to uzzinÄm un mÄÄ£inÄm apiet Å”o situÄciju. JebkurÄ gadÄ«jumÄ mums paliek Meistars, kurÅ” kaut kÄdÄ veidÄ mijiedarbojas ar vergiem un caur kÄdu pakalpojumu var nosÅ«tÄ«t datus, informÄciju, ziÅas utt.
Ir vÄl progresÄ«vÄka shÄma, kad mums nav Master, visi mezgli ir galvenie vergi, atŔķirÄ«gi savÄ uzvedÄ«bÄ. Bet viÅiem joprojÄm ir jÄsadarbojas vienam ar otru, tÄpÄc joprojÄm ir atlicis kÄds dienests Å”o darbÄ«bu koordinÄÅ”anai. DroÅ”i vien Cassandra, kas darbojas pÄc Ŕī principa, atbilst Å”ai shÄmai.
Ir grÅ«ti pateikt, kura no Ŕīm shÄmÄm darbojas labÄk. Katram savi plusi un mÄ«nusi.
Un no dažÄm lietÄm ar SkolotÄju nav jÄbaidÄs, jo, kÄ rÄda prakse, viÅÅ” nav tik uzÅÄmÄ«gs pret pastÄvÄ«gu kalpoÅ”anu. Å eit galvenais ir izvÄlÄties pareizo risinÄjumu Ŕī pakalpojuma mitinÄÅ”anai atseviÅ”Ä·Ä jaudÄ«gÄ mezglÄ, lai tam bÅ«tu pietiekami daudz resursu, lai pÄc iespÄjas lietotÄjiem tur nebÅ«tu piekļuves, lai viÅi nejauÅ”i nenogalinÄtu Å”o procesu. Bet tajÄ paÅ”Ä laikÄ Å”ÄdÄ shÄmÄ ir daudz vieglÄk vadÄ«t strÄdniekus no Master procesa, t.i., Ŕī shÄma ir vienkÄrÅ”Äka no ievieÅ”anas viedokļa.
Un Ŕī shÄma (iepriekÅ”), iespÄjams, ir sarežģītÄka, bet uzticamÄka.
GalvenÄ problÄma ir daļÄjas atteices. PiemÄram, kad mÄs nosÅ«tÄm ziÅojumu pa tÄ«klu, notiek kÄda veida negadÄ«jums, un tas, kurÅ” nosÅ«tÄ«ja ziÅojumu, nezinÄs, vai viÅa ziÅojums ir saÅemts un kas notika saÅÄmÄja pusÄ, nezinÄs, vai ziÅojums tika pareizi apstrÄdÄts. , t.i., viÅÅ” nesaÅems nekÄdu apstiprinÄjumu.
AttiecÄ«gi mums Ŕī situÄcija ir jÄapstrÄdÄ. Un visvienkÄrÅ”Äkais ir atkÄrtoti nosÅ«tÄ«t Å”o ziÅojumu un gaidÄ«t, lÄ«dz saÅemsim atbildi. Å ajÄ gadÄ«jumÄ netiek Åemts vÄrÄ, vai ir mainÄ«jies uztvÄrÄja stÄvoklis. MÄs varam nosÅ«tÄ«t ziÅojumu un pievienot tos paÅ”us datus divas reizes.
ZooKeeper piedÄvÄ veidus, kÄ tikt galÄ ar Å”Ädiem atteikumiem, kas arÄ« atvieglo mÅ«su dzÄ«vi.
KÄ minÄts nedaudz iepriekÅ”, tas ir lÄ«dzÄ«gs daudzpavedienu programmu rakstÄ«Å”anai, taÄu galvenÄ atŔķirÄ«ba ir tÄda, ka izplatÄ«tajÄs lietojumprogrammÄs, kuras mÄs veidojam uz dažÄdÄm iekÄrtÄm, vienÄ«gais saziÅas veids ir tÄ«kls. BÅ«tÄ«bÄ Å”Ä« ir dalÄ«ta nekÄda arhitektÅ«ra. Katram procesam vai pakalpojumam, kas darbojas vienÄ maŔīnÄ, ir sava atmiÅa, savs disks, savs procesors, ko tas ne ar vienu nedala.
Ja vienÄ datorÄ rakstÄm daudzpavedienu programmu, tad datu apmaiÅai varam izmantot koplietojamo atmiÅu. Mums tur ir konteksta slÄdzis, procesi var pÄrslÄgties. Tas ietekmÄ veiktspÄju. No vienas puses, klastera programmÄ tÄda nav, taÄu ir problÄmas ar tÄ«klu.
AttiecÄ«gi galvenÄs problÄmas, kas rodas, rakstot sadalÄ«tÄs sistÄmas, ir konfigurÄcija. Rakstam kaut kÄdu iesniegumu. Ja tas ir vienkÄrÅ”i, tad kodÄ iekodÄjam visÄdus skaitļus, taÄu tas ir neÄrti, jo, ja nolemjam, ka pussekundes taimauta vietÄ vÄlamies vienas sekundes taimautu, tad ir jÄpÄrkompilÄ aplikÄcija un izrullÄ visu vÄlreiz. Viena lieta ir, ja tas ir vienÄ iekÄrtÄ, kad jÅ«s varat to vienkÄrÅ”i restartÄt, bet, ja mums ir daudz iekÄrtu, mums ir pastÄvÄ«gi jÄkopÄ viss. Mums jÄmÄÄ£ina padarÄ«t lietojumprogrammu konfigurÄjamu.
Å eit mÄs runÄjam par sistÄmas procesu statisko konfigurÄciju. Tas nav pilnÄ«bÄ, varbÅ«t no operÄtÄjsistÄmas viedokļa tÄ var bÅ«t mÅ«su procesu statiska konfigurÄcija, tas ir, Ŕī ir konfigurÄcija, kuru nevar vienkÄrÅ”i Åemt un atjauninÄt.
Ir arÄ« dinamiska konfigurÄcija. Tie ir parametri, kurus mÄs vÄlamies mainÄ«t lidojuma laikÄ, lai tie tiktu tur uzÅemti.
KÄda Å”eit ir problÄma? MÄs atjauninÄjÄm konfigurÄciju, izlaidÄm to, un ko tad? ProblÄma var bÅ«t tajÄ, ka no vienas puses mÄs izrullÄjÄm konfigurÄciju, bet aizmirsÄm par jauno lietu, konfigurÄcija palika tur. OtrkÄrt, kamÄr mÄs izlaidÄm, dažÄs vietÄs konfigurÄcija tika atjauninÄta, bet citÄs ne. Un daži mÅ«su lietojumprogrammas procesi, kas darbojas vienÄ maŔīnÄ, tika restartÄti ar jaunu konfigurÄciju un kaut kur ar veco. TÄ rezultÄtÄ mÅ«su izplatÄ«tÄ lietojumprogramma var bÅ«t nekonsekventa no konfigurÄcijas viedokļa. Å Ä« problÄma ir izplatÄ«ta. Dinamiskajai konfigurÄcijai tas ir atbilstoÅ”Äks, jo tas nozÄ«mÄ, ka to var mainÄ«t lidojuma laikÄ.
VÄl viena problÄma ir dalÄ«ba grupÄ. Mums vienmÄr ir kÄds strÄdnieku kopums, mÄs vienmÄr gribam zinÄt, kurÅ” no viÅiem ir dzÄ«vs, kurÅ” ir miris. Ja ir Meistars, tad viÅam jÄsaprot, kurus darbiniekus var novirzÄ«t pie klientiem, lai tie veiktu aprÄÄ·inus vai strÄdÄtu ar datiem, un kurus nevar. PastÄvÄ«gi rodas problÄma, ka mums ir jÄzina, kas strÄdÄ mÅ«su klasterÄ«.
VÄl viena tipiska problÄma ir lÄ«deru vÄlÄÅ”anas, kad mÄs gribam zinÄt, kurÅ” ir atbildÄ«gs. Viens piemÄrs ir replikÄcija, kad mums ir kÄds process, kas saÅem rakstÄ«Å”anas darbÄ«bas un pÄc tam atkÄrto tÄs citos procesos. ViÅÅ” bÅ«s vadÄ«tÄjs, visi pÄrÄjie viÅam paklausÄ«s, sekos viÅam. JÄizvÄlas process, lai tas bÅ«tu visiem nepÄrprotams, lai neiznÄk, ka tiek izvÄlÄti divi vadÄ«tÄji.
Ir arÄ« savstarpÄji izslÄdzoÅ”a piekļuve. Å eit problÄma ir sarežģītÄka. PastÄv tÄda lieta kÄ mutex, kad rakstÄt daudzpavedienu programmas un vÄlaties, lai piekļuve kÄdam resursam, piemÄram, atmiÅas Ŕūnai, tiktu ierobežota un tiktu veikta tikai ar vienu pavedienu. Å eit resurss varÄtu bÅ«t kaut kas abstraktÄks. Un dažÄdÄm lietojumprogrammÄm no dažÄdiem mÅ«su tÄ«kla mezgliem vajadzÄtu saÅemt tikai ekskluzÄ«vu piekļuvi konkrÄtam resursam, nevis tÄpÄc, lai ikviens varÄtu to mainÄ«t vai tur kaut ko ierakstÄ«t. TÄs ir tÄ sauktÄs slÄdzenes.
ZooKeeper ļauj vienÄ vai otrÄ pakÄpÄ atrisinÄt visas Ŕīs problÄmas. Un es parÄdÄ«Å”u ar piemÄriem, kÄ tas ļauj jums to izdarÄ«t.
Nav bloÄ·ÄjoÅ”u primitÄ«vu. Kad mÄs sÄkam kaut ko lietot, Å”is primitÄ«vs negaidÄ«s, kad notiks kÄds notikums. VisticamÄk, Ŕī lieta darbosies asinhroni, tÄdÄjÄdi ļaujot procesiem neaizkavÄties, kamÄr tie kaut ko gaida. Å Ä« ir ļoti noderÄ«ga lieta.
Visi klientu pieprasÄ«jumi tiek apstrÄdÄti vispÄrÄjÄs rindas kÄrtÄ«bÄ.
Un klientiem ir iespÄja saÅemt paziÅojumu par izmaiÅÄm kÄdÄ stÄvoklÄ«, par izmaiÅÄm datos, pirms klients pats redz mainÄ«tos datus.
ZooKeeper var strÄdÄt divos režīmos. Pirmais ir savrups, vienÄ mezglÄ. Tas ir Ärti testÄÅ”anai. Tas var darboties arÄ« klastera režīmÄ jebkurÄ serveru skaitÄ. Ja mums ir 100 maŔīnu klasteris, tad nav nepiecieÅ”ams, lai tas strÄdÄtu uz 100 maŔīnÄm. Pietiek atlasÄ«t vairÄkas maŔīnas, kurÄs var palaist ZooKeeper. Un tas atbilst augstas pieejamÄ«bas principam. KatrÄ darbÄ«gajÄ instancÄ ZooKeeper saglabÄ visu datu kopiju. VÄlÄk es jums pastÄstÄ«Å”u, kÄ viÅÅ” to dara. Tas nesadala datus un nesadala tos. No vienas puses, tas ir mÄ«nuss, ka mÄs nevaram daudz uzglabÄt, no otras puses, tas nav jÄdara. Tas nav paredzÄts tam, tÄ nav datubÄze.
Datus var saglabÄt keÅ”atmiÅÄ klienta pusÄ. Å is ir standarta princips, lai mÄs nepÄrtrauktu pakalpojumu un neielÄdÄtu to ar vienÄdiem pieprasÄ«jumiem. Gudrs klients parasti par to zina un saglabÄ to keÅ”atmiÅÄ.
PiemÄram, pie mums kaut kas ir mainÄ«jies. Ir sava veida pielietojums. Tika ievÄlÄts jauns vadÄ«tÄjs, kurÅ” atbild, piemÄram, par rakstÄ«Å”anas darbÄ«bu apstrÄdi. Un mÄs vÄlamies replicÄt datus. Viens risinÄjums ir ievietot to cilpÄ. Un mÄs pastÄvÄ«gi apÅ”aubÄm mÅ«su pakalpojumu - vai kas ir mainÄ«jies? Otrais variants ir optimÄlÄks. Å is ir pulksteÅa mehÄnisms, kas ļauj informÄt klientus, ka kaut kas ir mainÄ«jies. Å Ä« ir resursu ziÅÄ lÄtÄka un klientiem ÄrtÄka metode.
Klients ir lietotÄjs, kurÅ” izmanto ZooKeeper.
Serveris ir pats ZooKeeper process.
Znode ir galvenais ZooKeeper. Visas znodes tiek glabÄtas atmiÅÄ ZooKeeper un ir sakÄrtotas hierarhiskas diagrammas veidÄ koka formÄ.
Ir divu veidu operÄcijas. Pirmais ir atjauninÄÅ”ana/rakstÄ«Å”ana, kad kÄda darbÄ«ba maina mÅ«su koka stÄvokli. Koks ir kopÄ«gs.
Un ir iespÄjams, ka klients neizpilda vienu pieprasÄ«jumu un tiek atvienots, bet var izveidot sesiju, caur kuru tas mijiedarbojas ar ZooKeeper.
ZooKeeper datu modelis atgÄdina failu sistÄmu. Ir standarta sakne, un tad mÄs gÄjÄm cauri direktorijiem, kas iet no saknes. Un tad pirmÄ lÄ«meÅa, otrÄ lÄ«meÅa katalogs. Tas viss ir znodes.
Katrs znode var uzglabÄt dažus datus, parasti ne pÄrÄk lielus, piemÄram, 10 kilobaitus. Un katrÄ znode var bÅ«t noteikts bÄrnu skaits.
Znodes ir vairÄku veidu. Tos var izveidot. Un, veidojot znode, mÄs norÄdÄm veidu, kuram tai vajadzÄtu piederÄt.
Ir divi veidi. Pirmais ir Ä«slaicÄ«gs karogs. Znode dzÄ«vo sesijas ietvaros. PiemÄram, klients ir izveidojis sesiju. Un, kamÄr Ŕī sesija ir dzÄ«va, tÄ pastÄvÄs. Tas ir nepiecieÅ”ams, lai neradÄ«tu kaut ko nevajadzÄ«gu. Tas ir piemÄrots arÄ« brīžiem, kad mums ir svarÄ«gi sesijas ietvaros saglabÄt datu primitÄ«vus.
Otrais veids ir secÄ«gs karogs. Tas palielina skaitÄ«tÄju ceÄ¼Ä uz znode. PiemÄram, mums bija direktorijs ar lietojumprogrammu 1_5. Un, kad mÄs izveidojÄm pirmo mezglu, tas saÅÄma p_1, otro - p_2. Un, katru reizi izsaucot Å”o metodi, mÄs izejam visu ceļu, norÄdot tikai daļu no ceļa, un Å”is skaitlis tiek automÄtiski palielinÄts, jo mÄs norÄdÄm mezgla veidu - secÄ«gi.
RegulÄra znode. ViÅa vienmÄr dzÄ«vos un viÅai bÅ«s vÄrds, ko mÄs viÅai sakÄm.
VÄl viena noderÄ«ga lieta ir pulksteÅa karogs. Ja mÄs to instalÄjam, klients var abonÄt dažus notikumus konkrÄtam mezglam. Es jums parÄdÄ«Å”u vÄlÄk ar piemÄru, kÄ tas tiek darÄ«ts. ZooKeeper pats informÄ klientu, ka mezglÄ ir mainÄ«juÅ”ies dati. TomÄr paziÅojumi negarantÄ, ka ir saÅemti daži jauni dati. ViÅi vienkÄrÅ”i saka, ka kaut kas ir mainÄ«jies, tÄpÄc jums joprojÄm ir jÄsalÄ«dzina dati vÄlÄk ar atseviŔķiem zvaniem.
Un kÄ jau teicu, datu secÄ«bu nosaka kilobaiti. Tur nav jÄglabÄ lieli teksta dati, jo tÄ nav datu bÄze, tas ir darbÄ«bu koordinÄcijas serveris.
Es jums pastÄstÄ«Å”u nedaudz par sesijÄm. Ja mums ir vairÄki serveri, mÄs varam pÄrredzami pÄriet no servera uz serveri, izmantojot sesijas identifikatoru. Tas ir diezgan Ärti.
Katrai sesijai ir sava veida taimauts. Sesiju nosaka, vai klients Ŕīs sesijas laikÄ kaut ko nosÅ«ta serverim. Ja viÅÅ” taimauta laikÄ neko nepÄrsÅ«tÄ«ja, sesija tiek pÄrtraukta vai klients var to aizvÄrt pats.
Tam nav tik daudz funkciju, taÄu ar Å”o API varat veikt dažÄdas darbÄ«bas. Å is zvans, ko mÄs redzÄjÄm, izveido znode un aizÅem trÄ«s parametrus. Å is ir ceļŔ uz znode, un tas ir jÄnorÄda pilnÄ«bÄ no saknes. Un arÄ« Å”ie ir daži dati, kurus mÄs vÄlamies tur pÄrsÅ«tÄ«t. Un karoga veids. Un pÄc izveides tas atgriež ceļu uz znode.
OtrkÄrt, varat to izdzÄst. Å eit viltÄ«ba ir tÄda, ka otrais parametrs, papildus ceļam uz znode, var norÄdÄ«t versiju. AttiecÄ«gi Å”is znode tiks dzÄsts, ja tÄ versija, kuru mÄs pÄrsÅ«tÄ«jÄm, ir lÄ«dzvÄrtÄ«ga tai, kas faktiski pastÄv.
Ja mÄs nevÄlamies pÄrbaudÄ«t Å”o versiju, mÄs vienkÄrÅ”i nododam argumentu "-1".
TreÅ”kÄrt, tÄ pÄrbauda znode esamÄ«bu. Atgriež True, ja mezgls pastÄv, false pretÄjÄ gadÄ«jumÄ.
Un tad parÄdÄs karoga pulkstenis, kas ļauj uzraudzÄ«t Å”o mezglu.
Varat iestatÄ«t Å”o karogu pat neesoÅ”am mezglam un saÅemt paziÅojumu, kad tas parÄdÄs. Tas var bÅ«t arÄ« noderÄ«gi.
Ir vÄl pÄris izaicinÄjumi getData. Ir skaidrs, ka mÄs varam saÅemt datus caur znode. Varat arÄ« izmantot karoga pulksteni. Å ajÄ gadÄ«jumÄ tas netiks instalÄts, ja nav mezgla. TÄpÄc jums ir jÄsaprot, ka tas pastÄv, un pÄc tam jÄsaÅem dati.
Ir arÄ« SetData. Å eit mÄs nododam versiju. Un, ja mÄs to nodosim, dati par noteiktas versijas znode tiks atjauninÄti.
Varat arÄ« norÄdÄ«t "-1", lai izslÄgtu Å”o pÄrbaudi.
VÄl viena noderÄ«ga metode ir getChildren. MÄs varam arÄ« iegÅ«t visu tai piederoÅ”o znode sarakstu. MÄs to varam uzraudzÄ«t, iestatot karoga pulksteni.
Un metode sinhronizÄt ļauj nosÅ«tÄ«t visas izmaiÅas uzreiz, tÄdÄjÄdi nodroÅ”inot, ka tÄs tiek saglabÄtas un visi dati ir pilnÄ«bÄ izmainÄ«ti.
Ja mÄs velkam analoÄ£ijas ar parasto programmÄÅ”anu, tad, ja izmantojat tÄdas metodes kÄ rakstÄ«Å”ana, kas ieraksta kaut ko diskÄ un pÄc tam atgriež jums atbildi, nav garantijas, ka esat ierakstÄ«jis datus diskÄ. Un pat tad, kad operÄtÄjsistÄma ir pÄrliecinÄta, ka viss ir uzrakstÄ«ts, paÅ”Ä diskÄ ir mehÄnismi, kur process iet cauri buferu slÄÅiem, un tikai pÄc tam dati tiek ievietoti diskÄ.
PÄrsvarÄ tiek izmantoti asinhronie zvani. Tas ļauj klientam strÄdÄt paralÄli ar dažÄdiem pieprasÄ«jumiem. Varat izmantot sinhrono pieeju, taÄu tÄ ir mazÄk produktÄ«va.
Divas darbÄ«bas, par kurÄm mÄs runÄjÄm, ir atjauninÄÅ”ana/rakstÄ«Å”ana, kas maina datus. Tie ir izveidot, setData, sinhronizÄt, dzÄst. Un lasÄ«Å”ana pastÄv, getData, getChildren.
Tagad daži piemÄri, kÄ jÅ«s varat izveidot primitÄ«vus darbam sadalÄ«tÄ sistÄmÄ. PiemÄram, kas saistÄ«ts ar kaut kÄ konfigurÄciju. Ir parÄdÄ«jies jauns darbinieks. MÄs pievienojÄm maŔīnu un sÄkÄm procesu. Un ir Å”Ädi trÄ«s jautÄjumi. KÄ tas vaicÄ ZooKeeper konfigurÄcijai? Un, ja mÄs vÄlamies mainÄ«t konfigurÄciju, kÄ mÄs to mainÄm? Un pÄc tam, kad mÄs to mainÄ«jÄm, kÄ tie darbinieki, kas mums bija, to iegÅ«st?
ZooKeeper to padara salÄ«dzinoÅ”i vienkÄrÅ”u. PiemÄram, ir mÅ«su znode koks. Å eit ir mÅ«su lietojumprogrammas mezgls, tajÄ izveidojam papildu mezglu, kurÄ ir dati no konfigurÄcijas. Tie var bÅ«t vai nebÅ«t atseviŔķi parametri. TÄ kÄ izmÄrs ir mazs, arÄ« konfigurÄcijas izmÄrs parasti ir mazs, tÄpÄc to Å”eit ir iespÄjams uzglabÄt.
JÅ«s izmantojat metodi getData lai no mezgla iegÅ«tu darbinieka konfigurÄciju. IestatÄ«t uz patiesu. Ja kÄda iemesla dÄļ Å”is mezgls neeksistÄ, mÄs par to informÄsim, kad tas parÄdÄ«sies vai mainÄ«sies. Ja mÄs vÄlamies zinÄt, ka kaut kas ir mainÄ«jies, tad mÄs to nosakÄm kÄ patiesÄ«bu. Un, ja dati Å”ajÄ mezglÄ mainÄ«sies, mÄs par to uzzinÄsim.
SetData. MÄs iestatÄm datus, iestatÄm ā-1ā, t.i., mÄs nepÄrbaudÄm versiju, mÄs pieÅemam, ka mums vienmÄr ir viena konfigurÄcija, mums nav jÄuzglabÄ daudzas konfigurÄcijas. Ja jums ir nepiecieÅ”ams uzglabÄt daudz, jums bÅ«s jÄpievieno vÄl viens lÄ«menis. Å eit mÄs uzskatÄm, ka ir tikai viens, tÄpÄc mÄs atjauninÄm tikai jaunÄko, tÄpÄc mÄs nepÄrbaudÄm versiju. Å obrÄ«d visi klienti, kuri ir iepriekÅ” abonÄjuÅ”i, saÅem paziÅojumu, ka Å”ajÄ mezglÄ kaut kas ir mainÄ«jies. Un pÄc tam, kad viÅi tos ir saÅÄmuÅ”i, viÅiem tie arÄ« jÄpieprasa vÄlreiz. PaziÅojums ir tÄds, ka viÅi nesaÅem paÅ”us datus, bet tikai paziÅojumu par izmaiÅÄm. PÄc tam viÅiem ir jÄpieprasa jauni dati.
Otra primitÄ«va izmantoÅ”anas iespÄja ir dalÄ«ba grupÄ. Mums ir izplatÄ«ta aplikÄcija, ir bariÅÅ” strÄdnieku un gribam saprast, ka viÅi visi ir savÄs vietÄs. TÄpÄc viÅiem ir jÄreÄ£istrÄjas, ka viÅi strÄdÄ mÅ«su pieteikumÄ. Un mÄs arÄ« vÄlamies uzzinÄt vai nu no Meistara procesa, vai kaut kur citur par visiem aktÄ«vajiem darbiniekiem, kas mums Å”obrÄ«d ir.
KÄ mÄs to darÄm? Lietojumprogrammai mÄs izveidojam darbinieku mezglu un pievienojam tur apakÅ”lÄ«meni, izmantojot izveides metodi. Man ir kļūda slaidÄ. Å eit tev vajag sequential norÄdiet, tad visi darbinieki tiks izveidoti pa vienam. Un lietojumprogramma, pieprasot visus datus par Ŕī mezgla bÄrniem, saÅem visus esoÅ”os aktÄ«vos darbiniekus.
Å Ä« ir tik Å”ausmÄ«ga ievieÅ”ana, kÄ to var izdarÄ«t Java kodÄ. SÄksim no beigÄm, ar galveno metodi. Å Ä« ir mÅ«su klase, izveidosim tÄs metodi. KÄ pirmo argumentu mÄs izmantojam host, kur mÄs savienojam, t.i., mÄs to iestatÄm kÄ argumentu. Un otrs arguments ir grupas nosaukums.
KÄ notiek savienojums? Å is ir vienkÄrÅ”s izmantotÄs API piemÄrs. Å eit viss ir salÄ«dzinoÅ”i vienkÄrÅ”i. Ir standarta klases ZooKeeper. MÄs nododam tai saimniekus. Un iestatiet taimautu, piemÄram, uz 5 sekundÄm. Un mums ir dalÄ«bnieks ar nosaukumu connectSignal. BÅ«tÄ«bÄ mÄs izveidojam grupu pa pÄrraidÄ«to ceļu. MÄs tur nerakstÄm datus, lai gan kaut ko varÄja ierakstÄ«t. Un mezgls Å”eit ir noturÄ«ga tipa. BÅ«tÄ«bÄ tas ir parasts regulÄrs mezgls, kas pastÄvÄs visu laiku. Å eit tiek izveidota sesija. TÄ ir paÅ”a klienta Ä«stenoÅ”ana. MÅ«su klients periodiski sÅ«tÄ«s ziÅojumus, norÄdot, ka sesija ir dzÄ«va. Un, kad mÄs beidzam sesiju, mÄs piezvanÄm aizvÄrt, un viss, sesija izkrÄ«t. Tas ir gadÄ«jumÄ, ja mums kaut kas nokrÄ«t, lai ZooKeeper par to uzzinÄtu un pÄrtrauktu sesiju.
KÄ bloÄ·Ät resursu? Å eit viss ir nedaudz sarežģītÄk. Mums ir strÄdnieku kopums, ir kÄds resurss, ko vÄlamies bloÄ·Ät. Lai to izdarÄ«tu, mÄs izveidojam atseviŔķu mezglu, piemÄram, ar nosaukumu lock1. Ja varÄjÄm to izveidot, tad dabÅ«jÄm Å”eit slÄdzeni. Un, ja mÄs nevarÄjÄm to izveidot, tad darbinieks mÄÄ£ina iegÅ«t getData no Å”ejienes, un, tÄ kÄ mezgls jau ir izveidots, mÄs ievietojam Å”eit novÄrotÄju un tajÄ brÄ«dÄ«, kad mainÄ«sies Ŕī mezgla stÄvoklis, mÄs par to uzzinÄsim. Un mÄs varam mÄÄ£inÄt atrast laiku, lai to atjaunotu. Ja mÄs paÅÄmÄm Å”o mezglu, paÅÄmÄm Å”o slÄdzeni, tad pÄc tam, kad slÄdzene mums vairs nebÅ«s vajadzÄ«ga, mÄs to atteiksim, jo āāmezgls pastÄv tikai sesijas ietvaros. AttiecÄ«gi tas pazudÄ«s. Un cits klients, citas sesijas ietvaros, varÄs paÅemt Ŕī mezgla slÄdzeni, pareizÄk sakot, saÅems paziÅojumu, ka kaut kas ir mainÄ«jies un var mÄÄ£inÄt to izdarÄ«t laicÄ«gi.
VÄl viens piemÄrs tam, kÄ var izvÄlÄties galveno vadÄ«tÄju. Tas ir nedaudz sarežģītÄks, bet arÄ« salÄ«dzinoÅ”i vienkÄrÅ”s. Kas Å”eit notiek? Ir galvenais mezgls, kas apkopo visus darbiniekus. MÄs cenÅ”amies iegÅ«t datus par vadÄ«tÄju. Ja tas notika veiksmÄ«gi, t.i., mÄs saÅÄmÄm dažus datus, tad mÅ«su darbinieks sÄk sekot Å”im vadÄ«tÄjam. ViÅÅ” uzskata, ka jau ir lÄ«deris.
Ja vadÄ«tÄjs kÄdu iemeslu dÄļ nomira, piemÄram, nokrita, tad cenÅ”amies izveidot jaunu vadÄ«tÄju. Un, ja mums izdodas, tad mÅ«su strÄdnieks kļūst par vadÄ«tÄju. Un, ja kÄdam Å”ajÄ brÄ«dÄ« izdevÄs izveidot jaunu vadÄ«tÄju, tad cenÅ”amies saprast, kas tas ir, un tad viÅam sekot.
Å eit rodas tÄ saucamais bara efekts, t.i., bara efekts, jo, vadonim nomirstot, par vadÄ«tÄju kļūs tas, kurÅ” laikÄ ir pirmais.
Tverot resursu, varat mÄÄ£inÄt izmantot nedaudz atŔķirÄ«gu pieeju, kas ir Å”Äda. PiemÄram, mÄs vÄlamies iegÅ«t slÄdzeni, bet bez herta efekta. Tas sastÄvÄs no tÄ, ka mÅ«su lietojumprogramma pieprasa visu mezglu ID sarakstus jau esoÅ”am mezglam ar bloÄ·ÄÅ”anu. Un, ja pirms tam mezgls, kuram mÄs izveidojÄm slÄdzeni, ir mazÄkais no komplekta, ko mÄs saÅÄmÄm, tad tas nozÄ«mÄ, ka esam fiksÄjuÅ”i slÄdzeni. PÄrbaudÄm, vai esam saÅÄmuÅ”i slÄdzeni. PÄrbaudei bÅ«s nosacÄ«jums, ka id, ko saÅÄmÄm, veidojot jaunu slÄdzeni, ir minimÄls. Un, ja saÅÄmÄm, tad strÄdÄjam tÄlÄk.
Ja ir noteikts id, kas ir mazÄks par mÅ«su slÄdzeni, tad Å”im notikumam ievietojam novÄrotÄju un gaidÄm paziÅojumu, lÄ«dz kaut kas mainÄ«sies. Tas ir, mÄs saÅÄmÄm Å”o slÄdzeni. Un kamÄr tas nenokritÄ«s, mÄs nekļūsim par minimÄlo id un nesaÅemsim minimÄlo slÄdzeni un lÄ«dz ar to varÄsim ielogoties. Un, ja Å”is nosacÄ«jums nav izpildÄ«ts, tad uzreiz ejam uz Å”ejieni un mÄÄ£inÄm Å”o slÄdzeni dabÅ«t vÄlreiz, jo pa Å”o laiku varÄtu bÅ«t kaut kas mainÄ«jies.
No kÄ sastÄv ZooKeeper? Ir 4 galvenÄs lietas. Tie ir apstrÄdes procesi - PieprasÄ«jums. Un arÄ« ZooKeeper Atomic Broadcast. Ir saistÄ«bu žurnÄls, kurÄ tiek reÄ£istrÄtas visas darbÄ«bas. Un pati In-memory Replicated DB, t.i., pati datu bÄze, kurÄ tiek glabÄts viss koks.
Ir vÄrts atzÄ«mÄt, ka visas rakstÄ«Å”anas darbÄ«bas tiek veiktas caur pieprasÄ«jumu procesoru. Un lasÄ«Å”anas darbÄ«bas nonÄk tieÅ”i atmiÅas datubÄzÄ.
Pati datu bÄze ir pilnÄ«bÄ replicÄta. Visi ZooKeeper gadÄ«jumi saglabÄ pilnÄ«gu datu kopiju.
Lai atjaunotu datubÄzi pÄc avÄrijas, tiek izveidots Commit žurnÄls. Standarta prakse ir tÄda, ka pirms datu nokļūŔanas atmiÅÄ tie tiek ierakstÄ«ti tur, lai, ja tas avarÄ, Å”o žurnÄlu varÄtu atskaÅot un atjaunot sistÄmas stÄvokli. Tiek izmantoti arÄ« periodiski datu bÄzes momentuzÅÄmumi.
ZooKeeper Atomic Broadcast ir lieta, ko izmanto replicÄtu datu uzturÄÅ”anai.
ZAB iekÅ”Äji izvÄlas lÄ«deri no ZooKeeper mezgla viedokļa. Citi mezgli kļūst par viÅas sekotÄjiem un sagaida no viÅas dažas darbÄ«bas. Ja viÅi saÅem ierakstus, viÅi tos visus pÄrsÅ«ta vadÄ«tÄjam. Vispirms viÅÅ” veic rakstÄ«Å”anas darbÄ«bu un pÄc tam nosÅ«ta saviem sekotÄjiem ziÅu par to, kas ir mainÄ«jies. Tas faktiski ir jÄveic atomiski, t.i., visas lietas ierakstÄ«Å”anas un pÄrraidÄ«Å”anas darbÄ«ba jÄveic atomiski, tÄdÄjÄdi garantÄjot datu konsekvenci.
Tas apstrÄdÄ tikai rakstÄ«Å”anas pieprasÄ«jumus. TÄs galvenais uzdevums ir pÄrveidot darbÄ«bu par darÄ«jumu atjauninÄjumu. Å is ir Ä«paÅ”i Ä£enerÄts pieprasÄ«jums.
Un Å”eit ir vÄrts atzÄ«mÄt, ka tiek garantÄta vienas un tÄs paÅ”as darbÄ«bas atjauninÄjumu idempotence. Kas tas ir? Å ai lietai, ja tÄ tiks izpildÄ«ta divas reizes, bÅ«s tÄds pats stÄvoklis, t.i., pats pieprasÄ«jums nemainÄ«sies. Un tas ir jÄdara, lai avÄrijas gadÄ«jumÄ jÅ«s varÄtu restartÄt darbÄ«bu, tÄdÄjÄdi atceļot izmaiÅas, kas Å”obrÄ«d ir izkrituÅ”as. Å ajÄ gadÄ«jumÄ sistÄmas stÄvoklis kļūs vienÄds, t.i., nevajadzÄtu bÅ«t tÄ, ka virkne vienÄdu, piemÄram, atjauninÄÅ”anas procesu noveda pie dažÄdiem sistÄmas gala stÄvokļiem.
Avots: www.habr.com