Dalibai biyar da manyan shagunan ƙima guda uku sun rarraba

Ko yadda muka rubuta ɗakin karatu na abokin ciniki C ++ don ZooKeeper, da sauransu da Consul KV

A cikin duniyar tsarin da aka rarraba, akwai ayyuka da yawa na al'ada: adana bayanai game da abun da ke ciki na tari, sarrafa daidaitawar nodes, gano kuskuren nodes, zabar jagora. da sauransu. Don magance waɗannan matsalolin, an ƙirƙiri tsarin rarraba na musamman - sabis na haɗin gwiwa. Yanzu za mu yi sha'awar uku daga cikinsu: ZooKeeper, etcd da Consul. Daga cikin dukkanin ayyukan da Consul ke da shi, za mu mai da hankali kan Consul KV.

Dalibai biyar da manyan shagunan ƙima guda uku sun rarraba

A zahiri, duk waɗannan tsarin suna jure rashin kuskure, shagunan ƙimar maɓalli masu layi. Kodayake tsarin bayanan su yana da bambance-bambance masu mahimmanci, wanda za mu tattauna daga baya, suna magance matsalolin aiki iri ɗaya. Babu shakka, kowane aikace-aikacen da ke amfani da sabis ɗin daidaitawa yana da alaƙa da ɗayansu, wanda zai iya haifar da buƙatar tallafawa tsarin da yawa a cikin cibiyar bayanai ɗaya waɗanda ke magance matsaloli iri ɗaya don aikace-aikace daban-daban.

Tunanin magance wannan matsala ya samo asali ne daga wata hukumar tuntuba ta Ostiraliya, kuma ta fado mana, ƙananan ɗalibai, don aiwatar da shi, wanda shine abin da zan yi magana akai.

Mun yi nasarar ƙirƙirar ɗakin karatu wanda ke ba da haɗin kai na gama gari don aiki tare da ZooKeeper, da sauransu da Consul KV. An rubuta ɗakin karatu a cikin C++, amma akwai shirye-shiryen aika shi zuwa wasu harsuna.

Samfuran Bayanai

Don haɓaka ƙirar gama gari don tsarin uku daban-daban, kuna buƙatar fahimtar abin da suke da alaƙa da yadda suke bambanta. Bari mu gane shi.

Kulawa da Zoo

Dalibai biyar da manyan shagunan ƙima guda uku sun rarraba

An tsara maɓallan cikin itace kuma ana kiran su nodes. Saboda haka, don kumburi za ku iya samun jerin sunayen 'ya'yansa. Ayyukan ƙirƙirar znode (ƙirƙira) da canza ƙima (setData) sun rabu: kawai maɓallan da ke akwai kawai za'a iya karantawa da canza su. Ana iya haɗa agogon hannu zuwa ayyukan duba wanzuwar kumburi, karanta ƙima, da samun yara. Watch shine faɗakarwa na lokaci ɗaya wanda ke kunna wuta lokacin da sigar bayanan da suka dace akan sabar ta canza. Ana amfani da nodes na ephemeral don gano gazawar. An haɗa su da zaman abokin ciniki wanda ya halicce su. Lokacin da abokin ciniki ya rufe zama ko ya daina sanar da ZooKeeper game da wanzuwarsa, ana share waɗannan nodes ta atomatik. Ana tallafawa ma'amaloli masu sauƙi - saitin ayyuka waɗanda ko dai duk sun yi nasara ko suka gaza idan wannan ba zai yiwu ba ga aƙalla ɗaya daga cikinsu.

da dai sauransu

Dalibai biyar da manyan shagunan ƙima guda uku sun rarraba

Masu haɓaka wannan tsarin sun fito fili wahayi daga ZooKeeper, sabili da haka sun yi komai daban. Babu matsayi na maɓallai, amma suna samar da saiti na ƙamus. Kuna iya samun ko share duk maɓallan na wani kewayo. Wannan tsarin na iya zama kamar baƙon abu, amma a zahiri yana bayyanawa sosai, kuma ana iya kwaikwayi ra'ayi mai matsayi cikin sauƙi ta hanyarsa.

etcd ba shi da ma'auni na kwatanta-da-saitin aiki, amma yana da wani abu mafi kyau: ma'amaloli. Tabbas, sun wanzu a cikin dukkanin tsarin guda uku, amma ma'amaloli da sauransu suna da kyau musamman. Sun ƙunshi tubalan guda uku: dubawa, nasara, gazawa. Toshe na farko ya ƙunshi saitin yanayi, na biyu da na uku - ayyuka. Ana aiwatar da ciniki ta atomatik. Idan duk sharuɗɗan gaskiya ne, to ana aiwatar da toshewar nasara, in ba haka ba an aiwatar da toshe gazawar. A cikin API 3.3, nasara da tubalan gazawa na iya ƙunsar ma'amaloli na gida. Wato, yana yiwuwa a aiwatar da abubuwan da suka dace na kusan matakin gida na sabani. Kuna iya ƙarin koyo game da menene cak da ayyuka ke wanzu daga takardun.

Watches suna wanzu a nan kuma, kodayake sun ɗan fi rikitarwa kuma ana iya sake amfani da su. Wato bayan shigar da agogon a kan kewayon maɓalli, za ku karɓi duk sabbin abubuwa a cikin wannan kewayon har sai kun soke agogon, ba kawai na farko ba. A etcd, analogue na zaman abokin ciniki na ZooKeeper na haya ne.

Consul K.V.

Hakanan babu wani tsari mai tsauri a nan, amma Consul na iya ƙirƙirar bayyanar da yake akwai: zaku iya samu kuma ku share duk maɓallan tare da ƙayyadaddun prefix, wato, aiki tare da “ƙarancin” maɓalli. Irin waɗannan tambayoyin ana kiran su recursive. Bugu da kari, Consul zai iya zaɓar kawai maɓallan da ba su ƙunshi ƙayyadadden hali ba bayan prefix, wanda ya dace da samun “yara” nan take. Amma yana da mahimmanci a tuna cewa wannan shine ainihin bayyanar tsarin tsarin: yana yiwuwa a ƙirƙiri maɓalli idan iyayensa ba su wanzu ko share maɓallin da ke da yara, yayin da yara za su ci gaba da adana su a cikin tsarin.

Dalibai biyar da manyan shagunan ƙima guda uku sun rarraba
Maimakon agogo, Consul yana toshe buƙatun HTTP. A zahiri, waɗannan kira ne na yau da kullun zuwa hanyar karatun bayanai, waɗanda, tare da sauran sigogi, ana nuna sigar ƙarshe ta bayanan. Idan sigar halin yanzu na bayanan da suka dace akan uwar garken ya fi wanda aka ƙayyade, ana mayar da martani nan da nan, in ba haka ba - lokacin da ƙimar ta canza. Hakanan akwai lokutan da za'a iya haɗa su zuwa maɓalli a kowane lokaci. Yana da kyau a lura cewa ba kamar etcd da ZooKeeper ba, inda share zaman ya kai ga goge maɓallan da ke da alaƙa, akwai yanayin da zaman kawai ba a haɗa shi da su ba. Akwai ma'amaloli, ba tare da rassan ba, amma tare da kowane irin cak.

Saka shi duka tare

ZooKeeper yana da mafi tsayayyen tsarin bayanai. Ba za a iya yin koyi da takamaiman kewayon tambayoyin da ake samu a cikin etcd ba a cikin ZooKeeper ko Consul. Ƙoƙarin ɗaukar mafi kyawun duk sabis ɗin, mun ƙare tare da keɓancewa kusan daidai da ƙirar ZooKeeper tare da keɓanta masu zuwa:

  • jerin, ganga da TTL nodes ba a tallafawa
  • Ba a tallafawa ACLs
  • Hanyar saitin yana ƙirƙirar maɓalli idan babu shi (a cikin ZK setData ya dawo da kuskure a wannan yanayin)
  • saiti da hanyoyin cas sun rabu (a cikin ZK ainihin abu ɗaya ne)
  • Hanyar gogewa tana share kumburi tare da ƙaramin itacen sa (a cikin ZK share yana dawo da kuskure idan kumburin yana da yara)
  • Ga kowane maɓalli akwai juzu'i ɗaya kawai - sigar ƙimar (a cikin ZK akwai uku daga cikinsu)

Kin amincewa da nodes na jere shine saboda gaskiyar cewa etcd da Consul ba su da ginanniyar tallafi a gare su, kuma mai amfani na iya aiwatar da su cikin sauƙi a saman abin da aka samu na ɗakin karatu.

Aiwatar da ɗabi'a mai kama da ZooKeeper lokacin share juzu'i yana buƙatar kiyaye keɓaɓɓen lissafin yara don kowane maɓalli a etcd da Consul. Tun da muka yi ƙoƙarin guje wa adana bayanan meta, an yanke shawarar share duk ƙaramin bishiyar.

Dabarun aiwatarwa

Bari mu dubi wasu fannoni na aiwatar da mu'amalar ɗakin karatu a cikin tsari daban-daban.

Matsayi a cikin etcd

Tsayar da ra'ayi mai matsayi a cikin etcd ya zama ɗayan ayyuka masu ban sha'awa. Tambayoyin kewayo suna sauƙaƙa don dawo da jerin maɓallai tare da ƙayyadadden prefix. Misali, idan kuna buƙatar duk abin da ya fara da "/foo", kuna neman zango ["/foo", "/fop"). Amma wannan zai dawo da duka juzu'in maɓalli, wanda ƙila ba za a karɓa ba idan ƙaramin bishiyar yana da girma. Da farko mun shirya yin amfani da mahimmin tsarin fassara, aiwatar a cikin zetcd. Ya ƙunshi ƙara byte ɗaya a farkon maɓalli, daidai da zurfin kumburin bishiyar. Bari in ba ku misali.

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

Sa'an nan kuma sami duk 'ya'yan mabuɗin nan da nan "/foo" mai yiwuwa ta hanyar neman zango ["u02/foo/", "u02/foo0"). Ee, in ASCII "0" tsaye bayan "/".

Amma yadda za a aiwatar da kawar da vertex a cikin wannan yanayin? Ya bayyana cewa kana buƙatar share duk jeri na nau'in ["uXX/foo/", "uXX/foo0") don XX daga 01 zuwa FF. Daga nan muka ci karo iyaka adadin aiki a cikin ciniki ɗaya.

A sakamakon haka, an ƙirƙiri tsarin juyawa mai sauƙi, wanda ya ba da damar aiwatar da yadda ya kamata duka share maɓalli da samun jerin yara. Ya isa don ƙara hali na musamman kafin alamar ta ƙarshe. Misali:

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

Sannan goge maɓalli "/very" ya koma gogewa "/u00very" da zango ["/very/", "/very0"), da samun duk yara - a cikin buƙatar maɓalli daga kewayon ["/very/u00", "/very/u01").

Cire maɓalli a cikin ZooKeeper

Kamar yadda na ambata a baya, a cikin ZooKeeper ba za ku iya share kumburi ba idan yana da yara. Muna son share maɓalli tare da itacen ƙasa. Me zan yi? Muna yin hakan da kyakkyawan fata. Na farko, muna ratsawa a kan bishiyar ƙasa, muna samun yaran kowane juyi tare da tambaya daban. Sa'an nan kuma mu gina ma'amala da ke ƙoƙarin share duk nodes na subtree a daidai tsari. Tabbas, canje-canje na iya faruwa tsakanin karatun bishiya da share ta. A wannan yanayin, ciniki zai gaza. Bugu da ƙari, ƙananan bishiyar na iya canzawa yayin aikin karatun. Buƙatar yaran kumburi na gaba na iya dawo da kuskure idan, alal misali, an riga an goge wannan kumburin. A cikin lokuta biyu, muna sake maimaita tsarin gaba ɗaya.

Wannan hanya ta sa share maɓalli ba shi da tasiri sosai idan yana da yara, har ma fiye da haka idan aikace-aikacen ya ci gaba da aiki tare da ƙaramin itace, sharewa da ƙirƙirar maɓalli. Koyaya, wannan ya ba mu damar guje wa rikitarwa aiwatar da wasu hanyoyin a cikin etcd da Consul.

saita a cikin ZooKeeper

A cikin ZooKeeper akwai hanyoyi daban-daban waɗanda ke aiki tare da tsarin bishiyar (ƙirƙira, sharewa, samun Yara) da kuma yin aiki tare da bayanai a cikin nodes (setData, getData). an ƙirƙira, share ko saitaData - idan babu shi. Muna buƙatar hanyar da aka saita da za a iya kira ba tare da tunanin kasancewar maɓalli ba.

Ɗayan zaɓi shine ɗaukar kyakkyawan fata, kamar yadda yake tare da gogewa. Bincika idan akwai kumburi. Idan akwai, kira setData, in ba haka ba ƙirƙira. Idan hanya ta ƙarshe ta dawo da kuskure, sake maimaita shi duka. Abu na farko da za a lura shi ne cewa gwajin wanzuwar ba shi da ma'ana. Kuna iya kiran ƙirƙira nan da nan. Nasarar kammalawa zai nuna cewa kumburin bai wanzu ba kuma an ƙirƙira shi. In ba haka ba, ƙirƙira zai dawo da kuskuren da ya dace, bayan haka kuna buƙatar kiran setData. Tabbas, tsakanin kira, za'a iya share fage ta hanyar kira mai gasa, kuma saitinData shima zai dawo da kuskure. A wannan yanayin, za ku iya sake yin shi duka, amma yana da daraja?

Idan hanyoyin biyu sun dawo da kuskure, to mun san tabbas cewa gogewar gasa ya faru. Bari mu yi tunanin cewa wannan shafewar ya faru ne bayan saitin kira. Sannan duk wata ma'anar da muke kokarin kafawa ta riga ta goge. Wannan yana nufin za mu iya ɗauka cewa an aiwatar da saitin cikin nasara, koda kuwa ba a rubuta komai ba.

Ƙarin cikakkun bayanai na fasaha

A cikin wannan sashe za mu huta daga tsarin da aka rarraba kuma muyi magana game da coding.
Ɗaya daga cikin manyan buƙatun abokin ciniki shine giciye-dandamali: aƙalla ɗaya daga cikin ayyukan dole ne a tallafawa akan Linux, MacOS da Windows. Da farko, mun haɓaka don Linux kawai, kuma mun fara gwaji akan wasu tsarin daga baya. Wannan ya haifar da matsaloli da yawa, wanda a cikin ɗan lokaci ba a san yadda za a tunkari su ba. Sakamakon haka, ana tallafawa duk ayyukan haɗin gwiwa guda uku a yanzu akan Linux da MacOS, yayin da Consul KV kawai ke tallafawa akan Windows.

Tun daga farko, mun yi ƙoƙarin yin amfani da shirye-shiryen dakunan karatu don samun damar sabis. Game da ZooKeeper, zaɓi ya faɗi ZooKeeper C++, wanda a ƙarshe ya kasa haɗawa akan Windows. Wannan, duk da haka, ba abin mamaki bane: an sanya ɗakin karatu azaman Linux-kawai. Ga Consul zaɓi kawai shine ppconsul. Dole ne a kara masa tallafi zaman и ma'amaloli. Don etcd, ba a sami cikakken ɗakin karatu mai goyan bayan sabuwar sigar ƙa'idar ba, don haka mu kawai haifar grpc abokin ciniki.

An yi wahayi ta hanyar mahallin asynchronous na ɗakin karatu na ZooKeeper C++, mun yanke shawarar aiwatar da abin dubawa asynchronous. ZooKeeper C++ yana amfani da na gaba/alkawari na gaba don wannan. A cikin STL, da rashin alheri, ana aiwatar da su cikin ladabi. Misali, a'a sai hanya, wanda ke amfani da aikin da aka wuce zuwa sakamakon gaba lokacin da ya samu. A cikin yanayinmu, irin wannan hanya ya zama dole don canza sakamakon zuwa tsarin ɗakin karatu. Don shawo kan wannan matsala, dole ne mu aiwatar da namu mai sauƙi mai sauƙi, tun da a buƙatar abokin ciniki ba za mu iya amfani da manyan ɗakunan karatu na ɓangare na uku kamar Boost ba.

Aiwatar da mu sai aiwatar da ita tana aiki kamar haka. Lokacin da ake kira, an ƙirƙiri ƙarin alkawari/na gaba. An dawo da sabuwar gaba, kuma an sanya wanda ya wuce tare da aikin da ya dace da kuma ƙarin alkawari a cikin jerin gwano. Zaren daga tafkin yana zaɓar gaba da yawa daga jerin gwano kuma ya zaɓe su ta amfani da wait_for. Lokacin da sakamako ya samu, ana kiran aikin da ya dace kuma ana wuce ƙimar dawowar sa zuwa ga alkawari.

Mun yi amfani da tafkin zaren guda ɗaya don aiwatar da tambayoyi zuwa etcd da Consul. Wannan yana nufin cewa ɗakunan karatu na da ke ƙasa za a iya shiga ta hanyar zare daban-daban. ppconsul ba madaidaicin zaren ba ne, don haka ana kiyaye kiran da aka yi masa ta makullai.
Kuna iya aiki tare da grpc daga zaren da yawa, amma akwai dabara. Ana aiwatar da agogon etcd ta rafukan grpc. Waɗannan tashoshi biyu ne don saƙonnin wani nau'i. Laburaren yana ƙirƙirar zare guda ɗaya don duk agogon da zare guda ɗaya wanda ke aiwatar da saƙonni masu shigowa. Don haka grpc ya hana yin rubutu a layi daya zuwa yawo. Wannan yana nufin cewa lokacin farawa ko share agogo, dole ne ku jira har sai buƙatar da ta gabata ta kammala aikawa kafin aika na gaba. Muna amfani da aiki tare masu canjin yanayi.

Sakamakon

Dubi kan kanka: liboffkv.

Tawagar mu: Raed Romanov, Ivan Glushenkov, Dmitry Kamaldinov, Victor Krapvensky, Vitaly Ivanin asalin.

source: www.habr.com

Add a comment