Senk elèv ak twa magazen kle-valè distribye

Oswa kijan nou te ekri yon bibliyotèk kliyan C++ pou ZooKeeper, etcd ak Consul KV

Nan mond lan nan sistèm distribiye, gen yon kantite travay tipik: estoke enfòmasyon sou konpozisyon an nan gwoup la, jere konfigirasyon an nan nœuds, detekte nœuds defo, chwazi yon lidè. ak lòt moun. Pou rezoud pwoblèm sa yo, yo te kreye sistèm distribye espesyal - sèvis kowòdinasyon. Kounye a nou pral enterese nan twa nan yo: ZooKeeper, etcd ak Consul. Nan tout fonksyonalite rich Consul, nou pral konsantre sou Consul KV.

Senk elèv ak twa magazen kle-valè distribye

Nan sans, tout sistèm sa yo se magazen kle-valè ki toleran, linearizable. Malgre ke modèl done yo gen diferans enpòtan, ke nou pral diskite pita, yo rezoud pwoblèm yo menm pratik. Li evidan, chak aplikasyon ki sèvi ak sèvis kowòdinasyon an mare nan youn nan yo, ki ka mennen nan bezwen nan sipòte plizyè sistèm nan yon sant done ki rezoud pwoblèm yo menm pou aplikasyon diferan.

Lide a rezoud pwoblèm sa a soti nan yon ajans konsiltasyon Ostralyen, epi li te tonbe nan men nou, yon ti ekip etidyan, aplike li, ki se sa mwen pral pale sou.

Nou jere yo kreye yon bibliyotèk ki bay yon koòdone komen pou travay ak ZooKeeper, etcd ak Consul KV. Bibliyotèk la ekri nan C++, men gen plan pou pò li nan lòt lang.

Modèl done yo

Pou devlope yon koòdone komen pou twa sistèm diferan, ou bezwen konprann sa yo genyen an komen ak ki jan yo diferan. Ann kalkile li.

ZooKeeper

Senk elèv ak twa magazen kle-valè distribye

Kle yo òganize nan yon pye bwa epi yo rele nœuds. An konsekans, pou yon ne ou ka jwenn yon lis pitit li yo. Operasyon yo nan kreye yon znode (kreye) ak chanje yon valè (setData) yo separe: sèlman kle ki egziste deja ka li ak chanje. Mont yo ka tache ak operasyon yo nan tcheke egzistans lan nan yon ne, li yon valè, ak jwenn timoun. Watch se yon deklanche yon sèl fwa ki dife lè vèsyon an nan done korespondan yo sou sèvè a chanje. Nœuds efemèr yo itilize pou detekte echèk. Yo mare nan sesyon an nan kliyan an ki te kreye yo. Lè yon kliyan fèmen yon sesyon oswa sispann notifye ZooKeeper sou egzistans li, nœuds sa yo otomatikman efase. Tranzaksyon senp yo sipòte - yon seri operasyon ki swa tout reyisi oswa echwe si sa a pa posib pou omwen youn nan yo.

elatriye

Senk elèv ak twa magazen kle-valè distribye

Devlopè yo nan sistèm sa a te klèman enspire pa ZooKeeper, ak Se poutèt sa te fè tout bagay yon fason diferan. Pa gen yerachi kle yo, men yo fòme yon seri òdone leksikografik. Ou ka jwenn oswa efase tout kle ki fè pati yon seri sèten. Estrikti sa a ka sanble etranj, men li se aktyèlman trè ekspresif, ak yon View yerarchize ka fasil imite atravè li.

etcd pa gen yon operasyon estanda konpare-ak-set, men li gen yon bagay pi bon: tranzaksyon. Natirèlman, yo egziste nan tout twa sistèm, men tranzaksyon etcd yo espesyalman bon. Yo konpoze de twa blòk: chèk, siksè, echèk. Premye blòk la gen yon seri kondisyon, dezyèm ak twazyèm - operasyon yo. Tranzaksyon an egzekite atomikman. Si tout kondisyon yo vre, Lè sa a, blòk la siksè egzekite, otreman blòk la echèk egzekite. Nan API 3.3, blòk siksè ak echèk ka genyen tranzaksyon anbrike. Sa vle di, li posib pou egzekite atomikman konstriksyon kondisyonèl nan nivo nidifikasyon prèske abitrè. Ou ka aprann plis sou ki chèk ak operasyon ki egziste dokiman.

Mont yo egziste isit la tou, byenke yo se yon ti kras pi konplike epi yo ka itilize ankò. Sa vle di, apre w fin enstale yon mont sou yon seri kle, w ap resevwa tout mizajou nan seri sa a jiskaske ou anile mont lan, epi pa jis premye a. Nan etcd, analòg la nan sesyon kliyan ZooKeeper yo se lwaye.

Konsil K.V.

Pa gen okenn estrikti yerarchik strik isit la, men Konsil ka kreye aparans ke li egziste: ou ka jwenn ak efase tout kle ak prefiks espesifye a, se sa ki, travay ak yon "subtree" nan kle a. Rekèt sa yo rele recursive. Anplis de sa, Konsil ka chwazi sèlman kle ki pa gen karaktè espesifye apre prefiks la, ki koresponn ak jwenn imedya "timoun". Men, li vo sonje ke sa a se jisteman aparans nan yon estrikti yerarchize: li se byen posib yo kreye yon kle si paran li pa egziste oswa efase yon kle ki gen timoun, pandan y ap timoun yo ap kontinye estoke nan sistèm nan.

Senk elèv ak twa magazen kle-valè distribye
Olye pou yo mont, Konsil te bloke demann HTTP. Nan sans, sa yo se apèl òdinè nan metòd la lekti done, pou ki, ansanm ak lòt paramèt, se dènye vèsyon an li te ye nan done yo endike. Si vèsyon aktyèl la nan done ki koresponn lan sou sèvè a pi gran pase youn nan espesifye, repons lan retounen imedyatman, otreman - lè valè a chanje. Genyen tou sesyon ki ka tache ak kle nenpòt ki lè. Li se vo anyen ke kontrèman ak etcd ak ZooKeeper, kote efase sesyon mennen nan efase kle ki asosye yo, gen yon mòd nan ki se sesyon an tou senpleman dekonekte nan men yo. Disponib tranzaksyon yo, san branch, men ak tout kalite chèk.

Mete li tout ansanm

ZooKeeper gen modèl done ki pi solid. Rekèt ranje ekspresyon ki disponib nan etcd pa ka efektivman imite nan swa ZooKeeper oswa Consul. Eseye enkòpore pi bon nan tout sèvis yo, nou te fini ak yon koòdone prèske ekivalan a koòdone ZooKeeper ak eksepsyon enpòtan sa yo:

  • sekans, veso ak nœuds TTL pa sipòte
  • ACL yo pa sipòte
  • metòd la mete kreye yon kle si li pa egziste (nan ZK setData retounen yon erè nan ka sa a)
  • metòd set ak cas yo separe (nan ZK yo esansyèlman menm bagay la)
  • metòd la efase efase yon ne ansanm ak subtree li yo (nan ZK efase retounen yon erè si ne la gen timoun)
  • Pou chak kle gen yon sèl vèsyon - vèsyon an valè (nan ZK gen twa ladan yo)

Rejè a nan nœuds sekans se akòz lefèt ke etcd ak Consul pa gen bati-an sipò pou yo, epi yo ka fasilman aplike pa itilizatè a sou tèt koòdone nan bibliyotèk ki kapab lakòz.

Enplemante konpòtman ki sanble ak ZooKeeper lè w efase yon somè ta mande pou kenbe yon kontwa timoun apa pou chak kle nan etcd ak Consul. Depi nou te eseye evite estoke enfòmasyon meta, li te deside efase subtree a tout antye.

sibtilite nan aplikasyon

Ann pran yon gade pi pre nan kèk aspè nan aplikasyon koòdone bibliyotèk la nan diferan sistèm.

Yerachi nan etcd

Kenbe yon vi yerarchize nan etcd te tounen youn nan travay ki pi enteresan. Rekèt seri fè li fasil pou rekipere yon lis kle ak yon prefiks espesifye. Pou egzanp, si ou bezwen tout bagay ki kòmanse ak "/foo", w ap mande yon seri ["/foo", "/fop"). Men, sa a ta retounen tout subtree kle a, ki ka pa akseptab si subtree a gwo. Okòmansman, nou te planifye pou itilize yon mekanis tradiksyon kle, aplike nan zetcd. Li enplike ajoute yon byte nan kòmansman kle a, ki egal a pwofondè ne nan pye bwa a. Kite m ba w yon egzanp.

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

Lè sa a, jwenn tout timoun imedya kle a "/foo" posib lè w mande yon seri ["u02/foo/", "u02/foo0"). Wi, nan ASCII "0" kanpe imedyatman apre "/".

Men, ki jan yo aplike retire yon somè nan ka sa a? Li sanble ke ou bezwen efase tout chenn nan kalite a ["uXX/foo/", "uXX/foo0") pou XX soti nan 01 rive nan FF. Apre sa, nou kouri antre limit nimewo operasyon nan yon sèl tranzaksyon.

Kòm yon rezilta, yon senp sistèm konvèsyon kle yo te envante, ki te fè li posib efektivman aplike tou de efase yon kle ak jwenn yon lis timoun yo. Li se ase yo ajoute yon karaktè espesyal anvan dènye siy la. Pa egzanp:

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

Lè sa a, efase kle a "/very" vire nan efase "/u00very" ak ranje ["/very/", "/very0"), ak jwenn tout timoun - nan yon demann pou kle nan seri a ["/very/u00", "/very/u01").

Retire yon kle nan ZooKeeper

Kòm mwen deja mansyone, nan ZooKeeper ou pa ka efase yon ne si li gen timoun. Nou vle efase kle a ansanm ak subtree la. Kisa mwen ta dwe fè? Nou fè sa ak optimis. Premyèman, nou rekursif travèse subtree a, jwenn pitit yo nan chak somè ak yon rechèch separe. Lè sa a, nou bati yon tranzaksyon ki eseye efase tout nœuds nan subtree a nan lòd ki kòrèk la. Natirèlman, chanjman ka rive ant lekti yon subtree ak efase li. Nan ka sa a, tranzaksyon an ap echwe. Anplis, subtree a ka chanje pandan pwosesis lekti a. Yon demann pou timoun yo nan pwochen ne ka retounen yon erè si, pou egzanp, ne sa a te deja efase. Nan de ka yo, nou repete tout pwosesis la ankò.

Apwòch sa a fè efase yon kle trè efikas si li gen timoun, e menm plis si aplikasyon an kontinye travay ak subtree a, efase ak kreye kle. Sepandan, sa te pèmèt nou evite konplike aplikasyon lòt metòd nan etcd ak Konsil.

mete nan ZooKeeper

Nan ZooKeeper gen metòd separe ki travay ak estrikti pye bwa a (create, delete, getChildren) epi ki travay ak done nan nœuds (setData, getData).Anplis, tout metòd gen kondisyon strik: create ap retounen yon erè si nœud la deja. te kreye, efase oswa setData - si li pa egziste deja. Nou te bezwen yon metòd seri ki ka rele san yo pa reflechi sou prezans yon kle.

Yon opsyon se pran yon apwòch optimis, menm jan ak sipresyon. Tcheke si yon ne egziste. Si egziste, rele setData, otreman kreye. Si dènye metòd la te retounen yon erè, repete l ankò. Premye bagay ou dwe sonje se ke tès egzistans la se initil. Ou ka imedyatman rele kreye. Fini avèk siksè pral vle di ke ne a pa t egziste e li te kreye. Sinon, kreye ap retounen erè ki apwopriye a, apre sa ou bezwen rele setData. Natirèlman, ant apèl yo, yon somè ta ka efase pa yon apèl konpetisyon, ak setData ta tou retounen yon erè. Nan ka sa a, ou ka fè li tout ankò, men èske li vo li?

Si tou de metòd retounen yon erè, Lè sa a, nou konnen pou asire w ke yon sipresyon konpetisyon te pran plas. Ann imajine ke sipresyon sa a te fèt apre yo fin rele mete. Lè sa a, kèlkeswa siyifikasyon nou ap eseye etabli deja efase. Sa vle di ke nou ka asime ke seri te egzekite avèk siksè, menm si an reyalite pa gen anyen ki te ekri.

Plis detay teknik

Nan seksyon sa a nou pral pran yon ti repo nan sistèm distribiye epi pale sou kodaj.
Youn nan kondisyon prensipal yo nan kliyan an te kwa-platfòm: omwen youn nan sèvis yo dwe sipòte sou Linux, MacOS ak Windows. Okòmansman, nou devlope sèlman pou Linux, epi yo te kòmanse fè tès sou lòt sistèm pita. Sa a te lakòz anpil pwoblèm, ki pou kèk tan te konplètman klè ki jan yo apwòch. Kòm yon rezilta, tout twa sèvis kowòdinasyon yo kounye a sipòte sou Linux ak MacOS, pandan y ap sèlman Consul KV sipòte sou Windows.

Depi nan konmansman an, nou te eseye sèvi ak bibliyotèk pare pou jwenn aksè nan sèvis yo. Nan ka ZooKeeper, chwa a te tonbe sou ZooKeeper C++, ki finalman echwe pou pou konpile sou Windows. Sa a, sepandan, se pa etone: bibliyotèk la pozisyone kòm linux-sèlman. Pou Konsil sèl opsyon a te ppconsul. Sipò te dwe ajoute nan li sesyon yo и tranzaksyon yo. Pou etcd, yon bibliyotèk plen véritable ki sipòte dènye vèsyon pwotokòl la pa te jwenn, kidonk nou tou senpleman pwodwi grpc kliyan.

Enspire pa koòdone asynchrone bibliyotèk ZooKeeper C++, nou deside aplike tou yon koòdone asynchrone. ZooKeeper C++ itilize primitif lavni/pwomès pou sa. Nan STL, malerezman, yo aplike trè modèst. Pa egzanp, non Lè sa a, metòd, ki aplike fonksyon pase a nan rezilta a nan tan kap vini an lè li vin disponib. Nan ka nou an, metòd sa a nesesè pou konvèti rezilta a nan fòma bibliyotèk nou an. Pou rezoud pwoblèm sa a, nou te oblije aplike pwòp pisin fil senp nou an, paske sou demann kliyan an nou pa t 'kapab itilize bibliyotèk lou twazyèm pati tankou Boost.

Lè sa a, aplikasyon nou an ap travay konsa. Lè yo rele, yo kreye yon pè pwomès/avni adisyonèl. Nouvo avni an retounen, epi yo mete youn nan pase ansanm ak fonksyon ki koresponn lan ak yon pwomès adisyonèl nan keu la. Yon fil ki soti nan pisin lan chwazi plizyè avni nan keu la epi vote yo lè l sèvi avèk wait_for. Lè yon rezilta vin disponib, yo rele fonksyon korespondan an epi yo pase valè retounen li bay pwomès la.

Nou te itilize menm pisin fil pou egzekite demann nan etcd ak Consul. Sa vle di ke bibliyotèk ki kache yo ka jwenn aksè pa plizyè fil diferan. ppconsul pa an sekirite fil, kidonk apèl yo pwoteje pa kadna.
Ou ka travay ak grpc nan plizyè fil, men gen sibtilite. Nan etcd mont yo aplike atravè kouran grpc. Sa yo se chanèl bidireksyon pou mesaj nan yon sèten kalite. Bibliyotèk la kreye yon sèl fil pou tout mont ak yon sèl fil ki trete mesaj fèk ap rantre. Se konsa, grpc entèdi ekri paralèl nan kouran. Sa vle di lè w inisyalize oswa efase yon mont, ou dwe tann jiskaske demann anvan an fini voye anvan w voye pwochen an. Nou itilize pou senkronizasyon varyab kondisyonèl.

Total

Gade pou tèt ou: liboffkv.

Ekip nou an: Raed Romanov, Ivan Glushenkov, Dmitri Kamaldinov, Victor Krapivensky, Vitali Ivanin.

Sous: www.habr.com

Add nouvo kòmantè