Tsib tus tub ntxhais kawm thiab peb lub khw muag khoom tseem ceeb

Los yog yuav ua li cas peb tau sau tus neeg siv khoom C ++ tsev qiv ntawv rau ZooKeeper, thiab lwm yam thiab Consul KV

Nyob rau hauv lub ntiaj teb no ntawm kev faib systems, muaj ib tug xov tooj ntawm cov hauj lwm raug: khaws cov ntaub ntawv hais txog cov muaj pes tsawg leeg ntawm pawg, tswj cov configuration ntawm nodes, nrhiav faulty nodes, xaiv ib tug thawj coj. thiab lwm tus. Txhawm rau daws cov teeb meem no, cov tshuab faib tshwj xeeb tau tsim - kev pabcuam kev sib koom tes. Tam sim no peb yuav txaus siab rau peb ntawm lawv: ZooKeeper, thiab lwm yam thiab Consul. Tawm ntawm txhua qhov kev ua haujlwm nplua nuj ntawm Consul, peb yuav tsom mus rau Consul KV.

Tsib tus tub ntxhais kawm thiab peb lub khw muag khoom tseem ceeb

Nyob rau hauv qhov tseeb, tag nrho cov tshuab no yog txhaum-tolerant, linearizable key-value khw muag khoom. Txawm hais tias lawv cov qauv ntaub ntawv muaj qhov sib txawv tseem ceeb, uas peb yuav tham tom qab, lawv daws cov teeb meem tib yam. Obviously, txhua daim ntawv thov uas siv cov kev pabcuam kev sib koom tes yog khi rau ib qho ntawm lawv, uas yuav ua rau muaj kev xav tau los txhawb ntau lub tshuab hauv ib lub chaw cov ntaub ntawv uas daws cov teeb meem tib yam rau cov ntawv thov sib txawv.

Lub tswv yim los daws qhov teeb meem no tau tshwm sim los ntawm lub koom haum pab tswv yim Australian, thiab nws tau poob rau peb, ib pab pawg me me ntawm cov tub ntxhais kawm, los ua nws, uas yog qhov kuv yuav tham txog.

Peb tau tswj los tsim ib lub tsev qiv ntawv uas muab ib qho kev sib txuas rau kev ua haujlwm nrog ZooKeeper, thiab lwm yam thiab Consul KV. Lub tsev qiv ntawv tau sau hauv C ++, tab sis muaj cov phiaj xwm xa mus rau lwm hom lus.

Cov Qauv Qauv

Txhawm rau tsim kom muaj kev sib koom ua ke rau peb lub tshuab sib txawv, koj yuav tsum nkag siab tias lawv muaj dab tsi thiab lawv txawv li cas. Cia peb xav txog nws.

ZooKeeper

Tsib tus tub ntxhais kawm thiab peb lub khw muag khoom tseem ceeb

Cov yuam sij raug teeb tsa rau hauv tsob ntoo thiab hu ua nodes. Raws li, rau ib lub node koj tuaj yeem tau txais cov npe ntawm nws cov menyuam. Cov haujlwm ntawm kev tsim znode (tsim) thiab hloov tus nqi (setData) raug cais: tsuas yog cov yuam sij uas twb muaj lawm tuaj yeem nyeem thiab hloov pauv. Cov watches tuaj yeem txuas nrog rau cov haujlwm ntawm kev kuaj xyuas qhov muaj nyob ntawm node, nyeem tus nqi, thiab tau txais cov menyuam. Saib yog ib qho tshwm sim ib zaug uas tua hluav taws thaum lub version ntawm cov ntaub ntawv sib thooj ntawm lub server hloov. Ephemeral nodes yog siv los txheeb xyuas qhov ua tsis tiav. Lawv raug khi rau qhov kev sib kho ntawm tus neeg siv khoom uas tsim lawv. Thaum tus neeg siv khoom kaw ib qho kev sib tham lossis nres ceeb toom ZooKeeper ntawm nws lub neej, cov nodes tau txiav tawm. Kev hloov pauv yooj yim tau txais kev txhawb nqa - ib txheej ntawm kev ua haujlwm uas txhua tus ua tiav lossis ua tsis tiav yog tias qhov no tsis tuaj yeem ua rau tsawg kawg yog ib qho ntawm lawv.

lwm yam

Tsib tus tub ntxhais kawm thiab peb lub khw muag khoom tseem ceeb

Cov neeg tsim tawm ntawm cov kab ke no tau pom meej meej los ntawm ZooKeeper, thiab yog li ua txhua yam txawv. Tsis muaj hierarchy ntawm cov yuam sij, tab sis lawv tsim cov lexicographically txiav txim. Koj tuaj yeem tau txais lossis tshem tawm tag nrho cov yuam sij uas muaj nyob rau hauv qee yam. Cov qauv no yuav zoo li coj txawv txawv, tab sis nws yog qhov qhia tau zoo heev, thiab kev pom hierarchical tuaj yeem yooj yim emulated los ntawm nws.

etcd tsis muaj tus qauv sib piv-thiab-teeb ua haujlwm, tab sis nws muaj qee yam zoo dua: kev lag luam. Tau kawg, lawv muaj nyob rau hauv tag nrho peb lub tshuab, tab sis lwm yam kev lag luam yog qhov tshwj xeeb zoo. Lawv muaj peb lub blocks: kos, ua tiav, tsis ua haujlwm. Thawj qhov thaiv muaj cov txheej txheem, qhov thib ob thiab thib peb - ​​kev ua haujlwm. Kev lag luam yog ua tiav atomically. Yog tias tag nrho cov xwm txheej muaj tseeb, ces qhov kev vam meej block raug tua, txwv tsis pub qhov kev ua tsis tiav yog raug tua. Hauv API 3.3, kev ua tiav thiab tsis ua haujlwm thaiv tuaj yeem muaj cov khoom lag luam nested. Ntawd yog, nws muaj peev xwm ua tau rau atomically ua raws li cov qauv tsim ntawm yuav luag arbitrary nesting theem. Koj tuaj yeem kawm paub ntau ntxiv txog cov tshev thiab kev ua haujlwm muaj nyob ntawm cov ntaub ntawv.

Watches muaj nyob ntawm no ib yam nkaus, txawm hais tias lawv nyuaj me ntsis thiab rov siv tau dua. Ntawd yog, tom qab txhim kho lub moos ntawm qhov tseem ceeb, koj yuav tau txais txhua qhov hloov tshiab hauv qhov no kom txog thaum koj tso tseg lub moos, thiab tsis yog thawj zaug xwb. Hauv lwm yam, cov lus piv txwv ntawm ZooKeeper cov neeg siv khoom siv yog kev xauj tsev.

Consul K.V.

Kuj tsis muaj cov qauv hierarchical nruj ntawm no, tab sis Consul tuaj yeem tsim qhov zoo li nws muaj: koj tuaj yeem tau txais thiab tshem tawm tag nrho cov yuam sij nrog cov lus qhia ua ntej, uas yog, ua haujlwm nrog "subtree" ntawm tus yuam sij. Cov lus nug no hu ua recursive. Tsis tas li ntawd, Consul tuaj yeem xaiv cov yuam sij nkaus xwb uas tsis muaj cov cim tshwj xeeb tom qab ua ntej, uas sib haum mus rau qhov tau txais "cov menyuam yaus" tam sim ntawd. Tab sis nws tsim nyog nco ntsoov tias qhov no yog qhov tseeb ntawm cov qauv hierarchical: nws yog qhov tsim nyog los tsim tus yuam sij yog tias nws niam txiv tsis muaj lossis tshem tawm tus yuam sij uas muaj menyuam, thaum cov menyuam tseem yuav khaws cia rau hauv qhov system.

Tsib tus tub ntxhais kawm thiab peb lub khw muag khoom tseem ceeb
Hloov chaw saib, Consul tau thaiv HTTP thov. Nyob rau hauv qhov tseeb, cov no yog cov lus hu mus rau cov ntaub ntawv nyeem txoj kev, uas, nrog rau lwm yam tsis, qhov kawg paub version ntawm cov ntaub ntawv yog qhia. Yog hais tias qhov tam sim no version ntawm cov ntaub ntawv sib raug ntawm tus neeg rau zaub mov yog ntau dua li qhov tau teev tseg, cov lus teb rov qab tam sim ntawd, txwv tsis pub - thaum tus nqi hloov. Kuj tseem muaj cov ntu uas tuaj yeem txuas rau cov yuam sij txhua lub sijhawm. Nws yog ib qho tsim nyog sau cia tias tsis zoo li lwm yam thiab ZooKeeper, qhov kev tshem tawm cov kev sib tham ua rau tshem tawm cov yuam sij cuam tshuam, muaj ib hom kev sib kho tsuas yog unlinked los ntawm lawv. Muaj kev lag luam, tsis muaj ceg, tab sis nrog txhua yam kev kuaj xyuas.

Muab tag nrho ua ke

ZooKeeper muaj cov qauv ntaub ntawv nruj tshaj plaws. Cov lus nug ntau yam muaj nyob rau hauv etcd tsis tuaj yeem ua tau zoo hauv ZooKeeper lossis Consul. Sim muab qhov zoo tshaj plaws los ntawm tag nrho cov kev pabcuam, peb tau xaus nrog lub interface yuav luag sib npaug rau ZooKeeper interface nrog cov kev zam tseem ceeb hauv qab no:

  • ib ntus, ntim thiab TTL nodes tsis txhawb
  • ACLs tsis txhawb
  • cov txheej txheem teeb tsa tsim tus yuam sij yog tias nws tsis muaj nyob (hauv ZK setData rov ua qhov yuam kev hauv qhov no)
  • teeb thiab cas txoj kev sib cais (hauv ZK lawv yog qhov tseem ceeb tib yam)
  • txoj kev tshem tawm tshem tawm ib qho nrog rau nws cov subtree (hauv ZK rho tawm rov qab qhov yuam kev yog tias cov node muaj menyuam)
  • Rau txhua tus yuam sij muaj tsuas yog ib qho version - tus nqi version (hauv ZK muaj peb ntawm lawv)

Kev tsis lees paub ntawm cov kab ke sib txuas yog vim qhov tseeb tias etcd thiab Consul tsis muaj kev txhawb nqa rau lawv, thiab lawv tuaj yeem siv tau yooj yim los ntawm cov neeg siv nyob rau sab saum toj ntawm lub tsev qiv ntawv interface.

Kev coj tus cwj pwm zoo ib yam li ZooKeeper thaum tshem tawm lub vertex yuav tsum muaj kev tswj hwm tus me nyuam cov txee rau txhua tus yuam sij hauv etcd thiab Consul. Txij li thaum peb sim tsis txhob khaws cov ntaub ntawv meta, nws tau txiav txim siab tshem tawm tag nrho cov ntoo.

Subtleties ntawm kev siv

Cia peb ua tib zoo saib qee yam ntawm kev siv lub tsev qiv ntawv interface hauv cov tshuab sib txawv.

Hierarchy hauv lwm yam

Tuav ib qho kev pom hierarchical hauv etcd tau dhau los ua ib qho haujlwm txaus nyiam tshaj plaws. Cov lus nug ntau ua rau nws yooj yim los khaws cov npe ntawm cov yuam sij nrog cov lus sau ua ntej. Piv txwv li, yog tias koj xav tau txhua yam uas pib nrog "/foo", koj tab tom thov kom muaj ntau yam ["/foo", "/fop"). Tab sis qhov no yuav rov qab tag nrho subtree ntawm tus yuam sij, uas tej zaum yuav tsis tsim nyog yog hais tias lub subtree loj. Thaum xub thawj peb tau npaj siv lub tshuab txhais lus tseem ceeb, siv hauv zetcd. Nws suav nrog ntxiv ib byte ntawm qhov pib ntawm tus yuam sij, sib npaug ntawm qhov tob ntawm qhov ntawm tsob ntoo. Cia kuv muab piv txwv rau koj.

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

Ces tau tag nrho cov me nyuam tam sim ntawd ntawm tus yuam sij "/foo" ua tau los ntawm kev thov kom muaj ntau yam ["u02/foo/", "u02/foo0"). Yog, hauv ASCII "0" sawv tom qab "/".

Tab sis yuav ua li cas los siv qhov kev tshem tawm ntawm lub vertex hauv qhov no? Nws hloov tawm tias koj yuav tsum rho tawm tag nrho cov ntau yam ntawm hom ["uXX/foo/", "uXX/foo0") rau XX los ntawm 01 rau FF. Thiab ces peb khiav mus rau hauv ua haujlwm tus lej txwv hauv ib qho kev sib pauv.

Yog li ntawd, ib qho yooj yim hloov dua siab tshiab system tau tsim, uas ua rau nws muaj peev xwm siv tau zoo ob qho tib si rho tawm tus yuam sij thiab tau txais cov npe ntawm cov menyuam yaus. Nws yog txaus kom ntxiv ib tug tshwj xeeb cim ua ntej lub xeem token. Piv txwv li:

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

Tom qab ntawd tshem tus yuam sij "/very" hloov mus rau hauv kev tshem tawm "/u00very" thiab ntau yam ["/very/", "/very0"), thiab tau txais tag nrho cov me nyuam - nyob rau hauv ib qho kev thov rau cov yuam sij los ntawm ntau yam ["/very/u00", "/very/u01").

Tshem tawm tus yuam sij hauv ZooKeeper

Raws li kuv twb tau hais lawm, hauv ZooKeeper koj tsis tuaj yeem rho tawm ib qho yog tias nws muaj menyuam. Peb xav rho tawm tus yuam sij nrog rau lub subtree. Kuv yuav ua li cas? Peb ua qhov no nrog kev cia siab. Ua ntej, peb recursively traverse subtree, tau cov me nyuam ntawm txhua vertex nrog ib tug cais cov lus nug. Tom qab ntawd peb tsim ib qho kev sib pauv uas sim tshem tawm tag nrho cov nodes ntawm lub subtree hauv qhov kev txiav txim kom raug. Tau kawg, kev hloov pauv tuaj yeem tshwm sim ntawm kev nyeem ntawv subtree thiab rho tawm nws. Hauv qhov no, kev hloov pauv yuav ua tsis tiav. Ntxiv mus, lub subtree yuav hloov thaum lub sij hawm nyeem ntawv. Ib qho kev thov rau cov me nyuam ntawm lub tom ntej node yuav rov qab ib qho kev ua yuam kev yog hais tias, piv txwv li, node twb twb deleted lawm. Hauv ob qho tib si, peb rov ua tag nrho cov txheej txheem dua.

Txoj hauv kev no ua rau kev rho tawm tus yuam sij tsis zoo yog tias nws muaj menyuam yaus, thiab ntau dua yog tias daim ntawv thov txuas ntxiv ua haujlwm nrog subtree, tshem tawm thiab tsim cov yuam sij. Txawm li cas los xij, qhov no tau tso cai rau peb kom tsis txhob cuam tshuam qhov kev siv ntawm lwm txoj hauv kev thiab Consul.

teeb tsa hauv ZooKeeper

Hauv ZooKeeper muaj cov txheej txheem sib cais uas ua haujlwm nrog cov qauv ntoo (tsim, rho tawm, getChildren) thiab ua haujlwm nrog cov ntaub ntawv hauv cov nodes (setData, getData). Tsis tas li ntawd, txhua txoj hauv kev muaj cov txheej txheem nruj heev: tsim yuav rov qab qhov yuam kev yog tias cov node twb muaj lawm. tau tsim, rho tawm lossis setData - yog tias nws tsis muaj lawm. Peb xav tau txoj kev teeb tsa uas tuaj yeem hu tsis tau xav txog qhov muaj tus yuam sij.

Ib qho kev xaiv yog coj txoj hauv kev zoo, zoo li kev tshem tawm. Xyuas seb puas muaj cov node. Yog tias muaj, hu rau setData, txwv tsis pub tsim. Yog tias txoj kev kawg rov qab ua qhov yuam kev, rov ua dua. Thawj qhov uas yuav tsum nco ntsoov yog qhov kev sim muaj nyob tsis muaj ntsiab lus. Koj tuaj yeem hu tam sim tsim. Kev ua tiav tiav yuav txhais tau tias qhov node tsis muaj nyob thiab nws tau tsim. Txwv tsis pub, tsim yuav rov qab qhov tsim nyog yuam kev, tom qab ntawd koj yuav tsum hu rau setData. Tau kawg, ntawm kev hu xov tooj, vertex tuaj yeem raug tshem tawm los ntawm kev sib tw hu, thiab setData kuj tseem yuav rov qab ua qhov yuam kev. Hauv qhov no, koj tuaj yeem ua nws dua, tab sis nws puas tsim nyog?

Yog tias ob txoj hauv kev rov qab ua qhov yuam kev, peb paub tseeb tias kev sib tw tshem tawm tau tshwm sim. Cia peb xav txog tias qhov kev tshem tawm no tshwm sim tom qab hu xov tooj. Ces txawm lub ntsiab twg peb tab tom sim tsim yog twb muab tshem lawm. Qhov no txhais tau tias peb tuaj yeem xav tias qhov teeb tsa tau ua tiav, txawm tias qhov tseeb tsis muaj dab tsi tau sau.

Cov ntsiab lus technical ntxiv

Hauv seem no peb yuav so los ntawm kev faib tshuab thiab tham txog coding.
Ib qho ntawm cov kev cai tseem ceeb ntawm cov neeg siv khoom yog hla lub platform: tsawg kawg ib qho ntawm cov kev pabcuam yuav tsum tau txhawb nqa ntawm Linux, MacOS thiab Windows. Thaum pib, peb tsim tsuas yog rau Linux, thiab pib sim ntawm lwm lub tshuab tom qab. Qhov no ua rau muaj teeb meem ntau, uas rau qee lub sijhawm tsis paub meej tias yuav ua li cas. Raws li qhov tshwm sim, tag nrho peb qhov kev pabcuam kev sib koom tes tam sim no tau txais kev txhawb nqa ntawm Linux thiab MacOS, thaum tsuas yog Consul KV tau txais kev txhawb nqa ntawm Windows.

Txij thaum pib, peb tau sim siv cov tsev qiv ntawv npaj tau los nkag mus rau cov kev pabcuam. Nyob rau hauv rooj plaub ntawm ZooKeeper, qhov kev xaiv poob rau ZooKeeper C++, uas thaum kawg ua tsis tau tiav los sau rau ntawm Windows. Qhov no, txawm li cas los xij, tsis yog qhov xav tsis thoob: lub tsev qiv ntawv tau muab tso rau hauv linux nkaus xwb. Rau Consul tsuas yog kev xaiv ppconsul ua. Kev them nyiaj yug yuav tsum tau ntxiv rau nws Kev Sib Tham и kev lag luam. Rau lwm yam, tsis muaj lub tsev qiv ntawv uas txhawb nqa qhov tseeb version ntawm cov txheej txheem tsis pom, yog li peb tsuas tsim cov neeg siv khoom grpc.

Kev tshoov siab los ntawm asynchronous interface ntawm ZooKeeper C ++ lub tsev qiv ntawv, peb tau txiav txim siab los ua ib qho asynchronous interface. ZooKeeper C ++ siv yav tom ntej / cog lus primitives rau qhov no. Nyob rau hauv STL, hmoov tsis, lawv yog siv heev modestly. Piv txwv li, tsis muaj ces txoj kev, uas siv cov haujlwm dhau mus rau qhov tshwm sim ntawm lub neej yav tom ntej thaum nws muaj. Nyob rau hauv peb cov ntaub ntawv, xws li ib tug txheej txheem yog tsim nyog los hloov qhov tshwm sim rau hauv hom ntawv ntawm peb lub tsev qiv ntawv. Txhawm rau kom tau txais qhov teeb meem no, peb yuav tsum siv peb tus kheej cov xov xov yooj yim, txij li thaum tus neeg siv khoom thov peb tsis tuaj yeem siv cov tsev qiv ntawv thib peb hnyav xws li Boost.

Peb qhov kev ua haujlwm tom qab ntawd ua haujlwm zoo li no. Thaum hu, ib qho kev cog lus ntxiv / yav tom ntej khub raug tsim. Lub neej yav tom ntej tshiab raug xa rov qab, thiab qhov dhau los tau muab tso nrog rau cov haujlwm sib xws thiab cov lus cog tseg ntxiv hauv cov kab. Ib txoj xov los ntawm lub pas dej ua ke xaiv ntau lub neej yav tom ntej los ntawm kab thiab xaiv lawv siv wait_for. Thaum muaj qhov tshwm sim muaj, cov haujlwm sib raug raug hu thiab nws cov nqi xa rov qab mus rau qhov kev cog lus.

Peb siv tib lub pas dej ua ke los ua cov lus nug rau etcd thiab Consul. Qhov no txhais tau tias cov tsev qiv ntawv hauv qab tuaj yeem nkag tau los ntawm ntau cov xov sib txawv. ppconsul tsis yog xov muaj kev nyab xeeb, yog li hu mus rau nws muaj kev tiv thaiv los ntawm xauv.
Koj tuaj yeem ua haujlwm nrog grpc los ntawm ntau cov xov, tab sis muaj cov subtleties. Hauv lwm yam watches yog siv los ntawm grpc kwj. Cov no yog bidirectional channels rau cov lus ntawm ib hom. Lub tsev qiv ntawv tsim ib txoj xov rau txhua lub moos thiab ib txoj xov uas ua cov lus tuaj. Yog li grpc txwv tsis pub sib luag sau rau kwj. Qhov no txhais tau hais tias thaum pib lossis rho tawm lub moos, koj yuav tsum tos kom txog thaum qhov kev thov dhau los tau ua tiav xa ua ntej xa ib qho ntxiv. Peb siv rau synchronization conditional variables.

Qhov no

Saib rau koj tus kheej: liboffkv.

Peb pab neeg: Raed Romanov, Ivan Glushenkov, Dmitry Kamaldinov, Victor Krapivensky, Vitaly Ivanin.

Tau qhov twg los: www.hab.com

Ntxiv ib saib