Lima ka mga estudyante ug tulo nga gipang-apod-apod nga mga tindahan nga hinungdanon nga kantidad

O giunsa namo pagsulat ang usa ka kliyente nga C++ library para sa ZooKeeper, etcd ug Consul KV

Sa kalibutan sa mga gipang-apod-apod nga mga sistema, adunay daghang mga tipikal nga buluhaton: pagtipig sa kasayuran bahin sa komposisyon sa cluster, pagdumala sa pag-configure sa mga node, pag-ila sa mga sayup nga node, pagpili sa usa ka lider. ug uban pa. Aron masulbad kini nga mga problema, gihimo ang mga espesyal nga sistema nga gipang-apod-apod - mga serbisyo sa koordinasyon. Karon kita interesado sa tulo niini: ZooKeeper, etcd ug Consul. Sa tanan nga adunahan nga gamit sa Consul, atong ipunting ang Consul KV.

Lima ka mga estudyante ug tulo nga gipang-apod-apod nga mga tindahan nga hinungdanon nga kantidad

Sa esensya, kining tanan nga mga sistema dili matugoton sa sayup, linearizable key-value nga mga tindahan. Bisan kung ang ilang mga modelo sa datos adunay daghang mga kalainan, nga atong hisgutan sa ulahi, gisulbad nila ang parehas nga praktikal nga mga problema. Dayag nga ang matag aplikasyon nga naggamit sa serbisyo sa koordinasyon nahigot sa usa niini, nga mahimong mosangput sa panginahanglan nga suportahan ang daghang mga sistema sa usa ka sentro sa datos nga nagsulbad sa parehas nga mga problema alang sa lainlaing mga aplikasyon.

Ang ideya sa pagsulbad niini nga problema naggikan sa usa ka ahensya sa pagkonsulta sa Australia, ug kini nahulog kanamo, usa ka gamay nga grupo sa mga estudyante, aron ipatuman kini, nga mao ang akong hisgutan.

Nakahimo kami og usa ka librarya nga naghatag og usa ka komon nga interface alang sa pagtrabaho uban sa ZooKeeper, etcd ug Consul KV. Ang librarya gisulat sa C ++, apan adunay mga plano nga ipadala kini sa ubang mga pinulongan.

Mga Modelo sa Data

Aron makahimo og usa ka komon nga interface alang sa tulo ka lain-laing mga sistema, kinahanglan nimo nga masabtan kung unsa ang ilang komon ug kung unsa ang ilang kalainan. Atong hisgotan kini.

Tigbantay sa Zoo

Lima ka mga estudyante ug tulo nga gipang-apod-apod nga mga tindahan nga hinungdanon nga kantidad

Ang mga yawe giorganisar ngadto sa usa ka kahoy ug gitawag nga mga node. Tungod niini, alang sa usa ka node mahimo nimong makuha ang usa ka lista sa mga anak niini. Ang mga operasyon sa pagmugna og znode (pagmugna) ug pag-usab sa usa ka bili (setData) gibulag: ang anaa ra nga mga yawe ang mabasa ug mausab. Ang mga relo mahimong ilakip sa mga operasyon sa pagsusi sa pagkaanaa sa usa ka node, pagbasa sa usa ka bili, ug pagkuha sa mga bata. Ang pagbantay kay usa ka higayon nga ga-trigger nga mobuto kung ang bersyon sa katugbang nga datos sa server mausab. Ang mga ephemeral node gigamit aron mahibal-an ang mga kapakyasan. Nahigot sila sa sesyon sa kliyente nga naglalang kanila. Kung ang usa ka kliyente magsira sa usa ka sesyon o mohunong sa pagpahibalo sa ZooKeeper sa paglungtad niini, kini nga mga node awtomatiko nga mapapas. Ang yano nga mga transaksyon gisuportahan - usa ka hugpong sa mga operasyon nga ang tanan molampos o mapakyas kung kini dili mahimo sa labing menos usa niini.

ug uban pa

Lima ka mga estudyante ug tulo nga gipang-apod-apod nga mga tindahan nga hinungdanon nga kantidad

Ang mga nag-develop niini nga sistema klaro nga giinspirar sa ZooKeeper, ug busa gibuhat ang tanan nga lahi. Walay hierarchy sa mga yawe, apan kini usa ka lexicographically ordered set. Mahimo nimong makuha o matangtang ang tanan nga yawe nga nahisakop sa usa ka piho nga range. Kini nga estraktura mahimo’g ingon katingad-an, apan kini sa tinuud nagpahayag kaayo, ug ang usa ka hierarchical nga pagtan-aw dali nga masundog pinaagi niini.

etcd walay standard itandi-ug-set nga operasyon, apan kini adunay usa ka butang nga mas maayo: mga transaksyon. Siyempre, naa sila sa tanan nga tulo nga mga sistema, apan ang mga transaksyon sa etcd labi ka maayo. Sila naglangkob sa tulo ka mga bloke: check, kalampusan, kapakyasan. Ang una nga block naglangkob sa usa ka hugpong sa mga kondisyon, ang ikaduha ug ikatulo - mga operasyon. Ang transaksyon gipatuman sa atomically. Kung ang tanan nga mga kondisyon tinuod, nan ang bloke sa kalampusan ipatuman, kung dili ang bloke sa kapakyasan ipatuman. Sa API 3.3, ang mga bloke sa kalampusan ug kapakyasan mahimong adunay mga nested nga transaksyon. Sa ato pa, posible nga atomically ipatuman ang conditional constructs sa halos arbitraryong nesting level. Mahibal-an nimo ang dugang bahin sa kung diin gikan ang mga tseke ug operasyon dokumentasyon.

Anaa usab ang mga relo dinhi, bisan kung kini labi ka komplikado ug magamit pag-usab. Kana mao, pagkahuman sa pag-instalar sa usa ka relo sa usa ka yawe nga sakup, madawat nimo ang tanan nga mga update sa kini nga sakup hangtod nga imong kanselahon ang relo, ug dili lang ang una. Sa etcd, ang analogue sa mga sesyon sa kliyente sa ZooKeeper kay mga pag-arkila.

Konsul K.V.

Wala usab usa ka estrikto nga hierarchical nga istruktura dinhi, apan ang Consul makahimo sa hitsura nga kini naglungtad: mahimo nimong makuha ug mapapas ang tanan nga mga yawe nga adunay gitakda nga prefix, nga mao, pagtrabaho kauban ang "subtree" sa yawe. Ang ingon nga mga pangutana gitawag nga recursive. Dugang pa, ang Consul makapili lamang sa mga yawe nga wala maglangkob sa piho nga karakter pagkahuman sa prefix, nga katumbas sa pagkuha dayon nga "mga bata". Apan angay nga hinumdoman nga kini tukma nga hitsura sa usa ka hierarchical nga istruktura: posible nga maghimo usa ka yawe kung wala ang ginikanan niini o pagtangtang sa usa ka yawe nga adunay mga anak, samtang ang mga bata magpadayon nga gitipigan sa sistema.

Lima ka mga estudyante ug tulo nga gipang-apod-apod nga mga tindahan nga hinungdanon nga kantidad
Imbis nga mga relo, gibabagan sa Consul ang mga hangyo sa HTTP. Sa esensya, kini mga ordinaryo nga tawag sa pamaagi sa pagbasa sa datos, diin, kauban ang uban pang mga parameter, gipakita ang katapusan nga nahibal-an nga bersyon sa datos. Kung ang kasamtangan nga bersyon sa katugbang nga datos sa server mas dako kay sa gitakda, ang tubag ibalik dayon, kung dili - kung ang bili mausab. Adunay usab mga sesyon nga mahimong ilakip sa mga yawe bisan unsang orasa. Angay nga hinumdoman nga dili sama sa etcd ug ZooKeeper, diin ang pagtangtang sa mga sesyon modala ngadto sa pagtangtang sa mga kauban nga yawe, adunay usa ka mode diin ang sesyon wala’y kalambigitan gikan kanila. Anaa mga transaksyon, walay mga sanga, apan uban sa tanang matang sa mga tseke.

Paghiusa sa tanan

Ang ZooKeeper adunay labing higpit nga modelo sa datos. Ang nagpahayag nga mga pangutana nga anaa sa etcd dili epektibong masundog sa ZooKeeper o Consul. Naningkamot nga ilakip ang labing kaayo gikan sa tanan nga mga serbisyo, natapos namon ang usa ka interface nga halos katumbas sa interface sa ZooKeeper nga adunay mga mosunod nga hinungdanon nga mga eksepsiyon:

  • han-ay, sudlanan ug TTL nodes wala gisuportahan
  • Ang mga ACL wala gisuportahan
  • ang set nga pamaagi nagmugna og usa ka yawe kung wala kini (sa ZK setData nagbalik sa usa ka sayup niini nga kaso)
  • set ug cas nga mga pamaagi gibulag (sa ZK sila sa tinuud parehas nga butang)
  • ang paagi sa pagtangtang nagtangtang sa usa ka node kauban ang subtree niini (sa ZK delete nagbalik usa ka sayup kung ang node adunay mga anak)
  • Alang sa matag yawe adunay usa lamang ka bersyon - ang bili nga bersyon (sa ZK tulo sila)

Ang pagsalikway sa sunud-sunod nga mga node tungod sa kamatuoran nga etcd ug Consul walay built-in nga suporta alang kanila, ug sila mahimong dali nga ipatuman sa user sa ibabaw sa resulta librarya interface.

Ang pag-implementar sa kinaiya nga susama sa ZooKeeper sa dihang ang pagtangtang sa usa ka vertex nagkinahanglan sa pagmentinar ug bulag nga child counter alang sa matag yawe sa etcd ug Consul. Tungod kay gisulayan namon nga likayan ang pagtipig sa impormasyon sa meta, nakahukom nga tangtangon ang tibuuk nga subtree.

Mga subtlety sa pagpatuman

Atong tan-awon pag-ayo ang pipila ka mga aspeto sa pagpatuman sa interface sa librarya sa lain-laing mga sistema.

Hierarchy sa etcd

Ang pagpadayon sa usa ka hierarchical nga pagtan-aw sa etcd nahimo nga usa sa labing makapaikag nga mga buluhaton. Ang han-ay nga mga pangutana makapasayon ​​sa pagkuha sa listahan sa mga yawe nga adunay espesipikong prefix. Pananglitan, kung kinahanglan nimo ang tanan nga nagsugod "/foo", nangayo ka ug range ["/foo", "/fop"). Apan ibalik niini ang tibuok subtree sa yawe, nga mahimong dili madawat kon dako ang subtree. Sa sinugdan kami nagplano sa paggamit sa usa ka yawe nga mekanismo sa paghubad, gipatuman sa zetcd. Naglakip kini sa pagdugang og usa ka byte sa sinugdanan sa yawe, nga katumbas sa giladmon sa node sa kahoy. Hatagan ko ikaw ug usa ka pananglitan.

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

Dayon kuhaa ang tanan nga mga anak sa yawe "/foo" posible pinaagi sa pagpangayo ug range ["u02/foo/", "u02/foo0"). Oo, sa ASCII "0" mibarog pagkahuman "/".

Apan kung giunsa ipatuman ang pagtangtang sa usa ka vertex sa kini nga kaso? Kini nahimo nga kinahanglan nimo nga papason ang tanan nga mga han-ay sa tipo ["uXX/foo/", "uXX/foo0") para sa XX gikan sa 01 hangtod sa FF. Ug dayon nagdagan mi limitasyon sa numero sa operasyon sulod sa usa ka transaksyon.

Ingon usa ka sangputanan, usa ka yano nga yawe nga sistema sa pagkakabig ang naimbento, nga nagpaposible nga epektibo nga ipatuman ang parehas nga pagtangtang sa usa ka yawe ug pagkuha usa ka lista sa mga bata. Igo na ang pagdugang usa ka espesyal nga karakter sa wala pa ang katapusan nga timaan. Pananglitan:

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

Unya pagtangtang sa yawe "/very" nahimong pagtangtang "/u00very" ug range ["/very/", "/very0"), ug pagkuha sa tanang mga bata - sa usa ka hangyo alang sa mga yawe gikan sa range ["/very/u00", "/very/u01").

Pagtangtang sa yawe sa ZooKeeper

Sama sa akong nahisgutan, sa ZooKeeper dili nimo mapapas ang usa ka node kung kini adunay mga anak. Gusto namon nga papason ang yawe kauban ang subtree. Unsa ang akong buhaton? Gibuhat namo kini uban ang pagkamalaumon. Una, gibalikbalik namo ang subtree, nga nagkuha sa mga bata sa matag vertex nga adunay lahi nga pangutana. Dayon nagtukod kami og usa ka transaksyon nga misulay sa pagtangtang sa tanang mga node sa subtree sa husto nga han-ay. Siyempre, ang mga pagbag-o mahimong mahitabo tali sa pagbasa sa usa ka subtree ug pagtangtang niini. Sa kini nga kaso, ang transaksyon mapakyas. Dugang pa, ang subtree mahimong mausab sa panahon sa proseso sa pagbasa. Ang usa ka hangyo alang sa mga bata sa sunod nga node mahimong magbalik sa usa ka sayup kung, pananglitan, kini nga node natangtang na. Sa duha ka mga kaso, atong balikon ang tibuok proseso pag-usab.

Kini nga pamaagi naghimo sa pagtangtang sa usa ka yawe nga dili epektibo kung kini adunay mga anak, ug labi pa kung ang aplikasyon nagpadayon sa pagtrabaho kauban ang subtree, pagtangtang ug paghimo sa mga yawe. Apan, kini nagtugot kanato sa paglikay sa komplikado sa pagpatuman sa uban nga mga pamaagi sa etcd ug Consul.

gibutang sa ZooKeeper

Sa ZooKeeper adunay bulag nga mga pamaagi nga magamit sa istruktura sa kahoy (paghimo, pagtangtang, pagkuhaChildren) ug nga nagtrabaho sa data sa mga node (setData, getData). gibuhat, tangtangon o setData - kung wala pa kini. Nagkinahanglan kami og usa ka set nga pamaagi nga matawag nga walay paghunahuna mahitungod sa presensya sa usa ka yawe.

Usa ka kapilian mao ang pagkuha sa usa ka malaumon nga pamaagi, sama sa pagtangtang. Susiha kung adunay usa ka node. Kung naa, tawga ang setData, kung dili paghimo. Kung ang katapusan nga pamaagi nagbalik usa ka sayup, balika kini pag-usab. Ang una nga butang nga matikdan mao nga ang pagsulay sa paglungtad walay kapuslanan. Mahimo nimong tawagan dayon ang paghimo. Ang malampuson nga pagkompleto magpasabot nga ang node wala maglungtad ug kini gibuhat. Kung dili, ibalik sa paghimo ang angay nga sayup, pagkahuman kinahanglan nimo tawagan ang setData. Siyempre, tali sa mga tawag, ang usa ka vertex mahimong matanggal sa usa ka kompetisyon nga tawag, ug ang setData magbalik usab og usa ka sayup. Sa kini nga kaso, mahimo nimo kini pag-usab, apan takus ba kini?

Kung ang duha nga mga pamaagi nagbalik usa ka sayup, nan nahibal-an namon nga sigurado nga nahitabo ang usa ka kompetisyon nga pagtangtang. Hunahunaa nga kini nga pagtangtang nahitabo pagkahuman sa pagtawag set. Unya bisan unsa nga kahulogan nga atong gipaningkamutan nga matukod napapas na. Nagpasabot kini nga mahimo natong hunahunaon nga malampuson nga gipatuman ang set, bisan kung sa tinuud wala’y gisulat.

Dugang teknikal nga mga detalye

Niini nga seksyon magpahulay kami gikan sa gipang-apod-apod nga mga sistema ug maghisgot bahin sa coding.
Usa sa mga nag-unang kinahanglanon sa kustomer mao ang cross-platform: labing menos usa sa mga serbisyo kinahanglan suportahan sa Linux, MacOS ug Windows. Sa sinugdan, nag-develop lang kami para sa Linux, ug nagsugod sa pagsulay sa ubang mga sistema sa ulahi. Nagpahinabo kini og daghang mga problema, nga sulod sa pipila ka panahon hingpit nga dili klaro kung unsaon pagduol. Ingon usa ka sangputanan, ang tanan nga tulo nga mga serbisyo sa koordinasyon gisuportahan na karon sa Linux ug MacOS, samtang ang Consul KV ra ang gisuportahan sa Windows.

Sukad pa sa sinugdanan, gisulayan namo nga gamiton ang andam nang mga librarya aron ma-access ang mga serbisyo. Sa kaso sa ZooKeeper, ang pagpili nahulog sa ZooKeeper C++, nga sa katapusan napakyas sa pag-compile sa Windows. Kini, bisan pa, dili katingad-an: ang librarya gipahimutang ingon linux-only. Alang sa Consul ang bugtong kapilian mao ppconsul. Ang suporta kinahanglang idugang niini sesyon и mga transaksyon. Alang sa etcd, ang usa ka hingpit nga librarya nga nagsuporta sa pinakabag-o nga bersyon sa protocol wala makit-an, busa kami yano namugna nga kliyente sa grpc.

Nadasig sa asynchronous nga interface sa ZooKeeper C++ library, nakahukom kami nga ipatuman usab ang usa ka asynchronous interface. Ang ZooKeeper C++ naggamit sa umaabot/nagsaad nga mga primitibo alang niini. Sa STL, sa walay palad, sila gipatuman nga kasarangan kaayo. Pananglitan, dili unya pamaagi, nga magamit ang gipasa nga function sa resulta sa umaabot kung kini magamit. Sa among kaso, ang ingon nga pamaagi gikinahanglan aron mabag-o ang resulta sa format sa among librarya. Aron masulbad kini nga problema, kinahanglan namon nga ipatuman ang among kaugalingon nga yano nga pool pool, tungod kay sa hangyo sa kustomer dili kami makagamit sa bug-at nga mga librarya sa ikatulo nga partido sama sa Boost.

Ang among implementasyon unya sama niini. Kung gitawag, usa ka dugang nga saad / umaabot nga pares gihimo. Ang bag-ong kaugmaon gibalik, ug ang gipasa gibutang kauban ang katugbang nga function ug usa ka dugang nga saad sa pila. Ang usa ka hilo gikan sa pool nagpili ug daghang kaugmaon gikan sa pila ug gibotar kini gamit ang wait_for. Kung ang usa ka resulta mahimong magamit, ang katugbang nga function gitawag ug ang pagbalik nga kantidad ipasa sa saad.

Gigamit namo ang parehas nga thread pool aron ipatuman ang mga pangutana sa etcd ug Consul. Kini nagpasabot nga ang nagpahiping mga librarya mahimong ma-access sa daghang lain-laing mga thread. Ang ppconsul dili luwas sa hilo, mao nga ang mga tawag niini gipanalipdan sa mga kandado.
Makatrabaho ka sa grpc gikan sa daghang mga hilo, apan adunay mga subtleties. Sa etcd relo gipatuman pinaagi sa grpc sapa. Kini mga bidirectional nga mga channel alang sa mga mensahe sa usa ka matang. Ang librarya nagmugna og usa ka thread alang sa tanang relo ug usa ka thread nga nagproseso sa umaabot nga mga mensahe. Mao nga gidili sa grpc ang parallel writes sa pag-stream. Kini nagpasabot nga sa pagsugod o pagtangtang sa usa ka relo, kinahanglan ka maghulat hangtud nga ang miaging hangyo makompleto sa pagpadala sa dili pa ipadala ang sunod. Gigamit namon ang pag-synchronize conditional variables.

Ang resulta

Tan-awa ang imong kaugalingon: liboffkv.

Ang among team: Raed Romanov, Ivan Glushenkov, Dmitry Kamaldinov, Victor Krapivensky, Vitaly Ivanin.

Source: www.habr.com

Idugang sa usa ka comment