ʻElima mau haumāna a ʻekolu hale kūʻai waiwai kī

A i ʻole pehea mākou i kākau ai i kahi waihona waihona C++ no ZooKeeper, etcd a me Consul KV

I ka honua o nā ʻōnaehana i hoʻokaʻawale ʻia, aia kekahi mau hana maʻamau: mālama i ka ʻike e pili ana i ka hoʻokumu ʻana o ka puʻupuʻu, hoʻokele i ka hoʻonohonoho ʻana o nā nodes, ʻike i nā nodes hewa, koho i kahi alakaʻi. me nā mea ʻē aʻe. No ka hoʻoponopono ʻana i kēia mau pilikia, ua hana ʻia nā ʻōnaehana hoʻolaha kūikawā - nā lawelawe hoʻonohonoho. I kēia manawa, makemake mākou i ʻekolu o lākou: ZooKeeper, etcd a me Consul. Ma waho o nā hana waiwai a pau o ke Kanikela, e kālele mākou i ke Kanikela KV.

ʻElima mau haumāna a ʻekolu hale kūʻai waiwai kī

ʻO ka mea nui, ʻo kēia mau ʻōnaehana āpau he hewa-tolerant, linearizable key-value hale kūʻai. ʻOiai he mau ʻokoʻa koʻikoʻi kā lākou mau hiʻohiʻona data, a mākou e kūkākūkā ai ma hope, hoʻoponopono lākou i nā pilikia hana like. ʻIke loa, hoʻopaʻa ʻia kēlā me kēia noi e hoʻohana ana i ka lawelawe hoʻonohonoho ʻana i kekahi o lākou, e alakaʻi paha i ka pono e kākoʻo i kekahi mau ʻōnaehana i hoʻokahi kikowaena data e hoʻoponopono i nā pilikia like no nā noi like ʻole.

ʻO ka manaʻo e hoʻoponopono i kēia pilikia i loaʻa mai i kahi hui kūkākūkā Australia, a ua hāʻawi ʻia iā mākou, kahi hui liʻiliʻi o nā haumāna, e hoʻokō, ʻo ia kaʻu e kamaʻilio ai.

Ua hiki iā mākou ke hana i hale waihona puke e hāʻawi ana i kahi kikowaena maʻamau no ka hana ʻana me ZooKeeper, etcd a me Consul KV. Ua kākau ʻia ka waihona ma C ++, akā aia nā manaʻo e hoʻopaʻa i ia i nā ʻōlelo ʻē aʻe.

Nā Kiʻi ʻIkepili

No ka hoʻomohala ʻana i kahi kikowaena maʻamau no nā ʻōnaehana ʻokoʻa ʻekolu, pono ʻoe e hoʻomaopopo i ka mea i loaʻa iā lākou a me ka ʻokoʻa. E noʻonoʻo kākou.

Kahu Zoo

ʻElima mau haumāna a ʻekolu hale kūʻai waiwai kī

Hoʻonohonoho ʻia nā kī i loko o kahi lāʻau a kapa ʻia nā nodes. No laila, no ka node hiki iā ʻoe ke kiʻi i kahi papa inoa o kāna mau keiki. Hoʻokaʻawale ʻia nā hana o ka hana ʻana i kahi znode (hana) a me ka hoʻololi ʻana i kahi waiwai (setData): hiki ke heluhelu a hoʻololi ʻia nā kī i loaʻa. Hiki ke hoʻopili ʻia nā wati i nā hana o ka nānā ʻana i ke ola o kahi node, heluhelu i kahi waiwai, a me ka loaʻa ʻana o nā keiki. ʻO ke kiaʻi he hoʻokahi manawa e hoʻā i ka wā e loli ai ka mana o ka ʻikepili pili i ke kikowaena. Hoʻohana ʻia nā node ephemeral e ʻike i nā hemahema. Hoʻopili ʻia lākou i ke kau o ka mea kūʻai aku nāna i hana iā lākou. Ke pani ka mea kūʻai aku i kahi kau a hoʻōki paha i ka hoʻolaha ʻana iā ZooKeeper i kona ola ʻana, holoi ʻia kēia mau nodes. Kākoʻo ʻia nā hana maʻalahi - kahi hoʻonohonoho o nā hana e kūleʻa a pau ʻole paha inā ʻaʻole hiki kēia i hoʻokahi o lākou.

a pēlā aku

ʻElima mau haumāna a ʻekolu hale kūʻai waiwai kī

ʻO nā mea hoʻomohala o kēia ʻōnaehana ua hoʻoikaika ʻia e ZooKeeper, a no laila ua hana ʻokoʻa nā mea āpau. ʻAʻohe hierarchy o nā kī, akā hana lākou i kahi lexicographically i kauoha ʻia. Hiki iā ʻoe ke loaʻa a hoʻopau paha i nā kī āpau o kekahi ʻano. He ʻano ʻē paha kēia ʻano, akā ʻoiaʻiʻo, ʻike maoli ʻia, a hiki ke maʻalahi ka nānā ʻana i kahi hierarchical ma o ia.

etcd ʻaʻohe hana hoʻohālikelike maʻamau, akā loaʻa iā ia kahi mea ʻoi aku ka maikaʻi: nā kālepa. ʻOiaʻiʻo, aia lākou i nā ʻōnaehana ʻekolu, akā maikaʻi loa nā kālepa etcd. Aia lākou i ʻekolu poloka: nānā, kūleʻa, hāʻule. Aia ka poloka mua i nā kūlana, ka lua a me ke kolu - nā hana. Hoʻokō ʻia ke kālepa i ka atomically. Inā ʻoiaʻiʻo nā kūlana a pau, a laila e hoʻokō ʻia ka poloka kūleʻa, i ʻole e hoʻokō ʻia ka poloka hāʻule. I ka API 3.3, hiki i nā poloka kūleʻa a me ka hāʻule ʻole ke loaʻa i nā kālepa pūnana. ʻO ia hoʻi, hiki ke hoʻokō ʻia i nā mea hana kūlana o ka pae nesting ʻaneʻane. Hiki iā ʻoe ke aʻo hou e pili ana i nā loiloi a me nā hana i loaʻa mai palapala.

Aia nā wati ma ʻaneʻi, ʻoiai ʻoi aku ka paʻakikī a hiki ke hoʻohana hou ʻia. ʻO ia hoʻi, ma hope o ka hoʻokomo ʻana i kahi wati ma kahi kī, e loaʻa iā ʻoe nā mea hou i kēia pae a hiki i kou hoʻopau ʻana i ka wati, ʻaʻole ka mea mua wale nō. Ma etcd, ʻo ka hoʻohālikelike o nā hui mea kūʻai aku ZooKeeper he mau hoʻolimalima.

Na ke Kanikela K.V.

ʻAʻohe hoʻonohonoho hierarchical koʻikoʻi ma ʻaneʻi, akā hiki i ke Kanikela ke hana i ke ʻano o ia mea: hiki iā ʻoe ke kiʻi a holoi i nā kī āpau me ka prefix i kuhikuhi ʻia, ʻo ia hoʻi, e hana me ka "subtree" o ke kī. Ua kapa ʻia kēlā mau nīnau he recursive. Eia hou, hiki i ke Kanikela ke koho i nā kī wale nō i loaʻa ʻole ka ʻano i ʻōlelo ʻia ma hope o ka prefix, e pili ana i ka loaʻa koke ʻana o nā "keiki". Akā he mea pono e hoʻomanaʻo ʻo ia ke ʻano o kahi hierarchical structure: hiki ke hana i kahi kī inā ʻaʻole i loaʻa kona makua a holoi paha i kahi kī i loaʻa nā keiki, ʻoiai e hoʻomau ʻia nā keiki i ka ʻōnaehana.

ʻElima mau haumāna a ʻekolu hale kūʻai waiwai kī
Ma kahi o nā wati, ua pāpā ʻo Consul i nā noi HTTP. ʻO ka mea nui, he mau kelepona maʻamau kēia i ke ʻano heluhelu ʻikepili, no laila, me nā ʻāpana ʻē aʻe, hōʻike ʻia ka mana hope loa o ka ʻikepili. Inā ʻoi aku ka nui o ka mana o kēia manawa o ka ʻikepili e pili ana i ka kikowaena ma mua o ka mea i ʻōlelo ʻia, e hoʻihoʻi koke ʻia ka pane, inā ʻaʻole - ke loli ka waiwai. Aia kekahi mau kau e hiki ke hoʻopili ʻia i nā kī i kēlā me kēia manawa. He mea pono e hoʻomaopopo ʻaʻole like me etcd a me ZooKeeper, kahi e holoi ai i nā kau e alakaʻi i ka holoi ʻana i nā kī pili, aia kahi ʻano e wehe ʻole ʻia ai ka hui mai ia mau mea. Loaʻa nā kālepa, ʻaʻohe lālā, akā me nā ʻano kikoʻī like ʻole.

Hoʻohui pū ʻia

Loaʻa iā ZooKeeper ka hoʻohālike ʻikepili koʻikoʻi loa. ʻAʻole hiki ke hoʻohālike maikaʻi ʻia nā nīnau kikoʻī i loaʻa ma etcd ma ZooKeeper a i ʻole Consul. Ke hoʻāʻo nei e hoʻohui i ka mea maikaʻi loa mai nā lawelawe āpau, ua hoʻopau mākou me kahi interface kokoke like me ka interface ZooKeeper me nā ʻokoʻa koʻikoʻi aʻe:

  • kaʻina, pahu a me nā pūnae TTL ʻaʻole i kākoʻo ʻia
  • ʻAʻole kākoʻo ʻia nā ACL
  • hana ke ala hoʻonohonoho i kahi kī inā ʻaʻole ia (ma ZK setData e hoʻihoʻi i kahi hewa i kēia hihia)
  • Ua hoʻokaʻawale ʻia nā ʻano hana hoʻonohonoho a me cas (ma ZK he mea like lākou)
  • ʻO ke ala holoi e holoi i kahi node me kāna subtree (i ka ZK delete e hoʻihoʻi i kahi hewa inā he keiki ka node)
  • No kēlā me kēia kī hoʻokahi wale nō mana - ka mana waiwai (ma ZK he ʻekolu lākou)

ʻO ka hōʻole ʻana i nā nodes sequential ma muli o ka etcd a me ke Kanikela ʻaʻohe kākoʻo i kūkulu ʻia no lākou, a hiki ke hoʻokō maʻalahi ʻia e ka mea hoʻohana ma luna o ka hopena waihona waihona.

ʻO ka hoʻokō ʻana i nā ʻano like me ZooKeeper i ka wā e holoi ana i kahi vertex e pono e mālama i kahi helu keiki kaʻawale no kēlā me kēia kī ma etcd a me ke Kanikela. No ka mea ua hoʻāʻo mākou e pale i ka mālama ʻana i ka ʻike meta, ua hoʻoholo ʻia e holoi i ka subtree holoʻokoʻa.

Nā mea maʻalahi o ka hoʻokō

E nānā pono kākou i kekahi mau hiʻohiʻona o ka hoʻokō ʻana i ke kikowaena waihona ma nā ʻōnaehana like ʻole.

Hierarchy ma etcd

ʻO ka mālama ʻana i kahi hierarchical view ma etcd ua lilo ia i kekahi o nā hana hoihoi loa. Hiki ke maʻalahi ka loaʻa ʻana o kahi papa inoa o nā kī me kahi prefix i kuhikuhi ʻia. Eia kekahi laʻana, inā makemakeʻoe i nā mea a pau e hoʻomaka me "/foo", ke noi nei ʻoe i kahi laulā ["/foo", "/fop"). Akā ʻo kēia ka mea e hoʻihoʻi i ke kumulāʻau holoʻokoʻa o ke kī, ʻaʻole hiki ke ʻae ʻia inā nui ke kumulāʻau. I ka wā mua, hoʻolālā mākou e hoʻohana i kahi ʻano unuhi kī nui, hoʻokō ʻia ma zetcd. Hoʻohui ia i hoʻokahi byte ma ka hoʻomaka ʻana o ke kī, e like me ka hohonu o ka node o ka lāʻau. E hāʻawi wau i kumu hoʻohālike.

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

A laila e kiʻi i nā keiki a pau o ke kī "/foo" hiki ma ke noi ʻana i kahi laulā ["u02/foo/", "u02/foo0"). ʻAe, ma ASCII "0" kū pono ma hope "/".

Akā pehea e hoʻokō ai i ka wehe ʻana i kahi vertex i kēia hihia? ʻIke ʻia e pono ʻoe e holoi i nā pae āpau o ke ʻano ["uXX/foo/", "uXX/foo0") no XX mai 01 a FF. A laila holo mākou i loko palena helu hana i loko o hoʻokahi kālepa.

ʻO ka hopena, ua hoʻokumu ʻia kahi ʻōnaehana hoʻololi kī maʻalahi, i hiki ai ke hoʻokō pono i ka holoi ʻana i kahi kī a loaʻa i kahi papa inoa o nā keiki. Ua lawa ia e hoʻohui i kahi ʻano kūikawā ma mua o ka hōʻailona hope. ʻo kahi laʻana:

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

A laila holoi i ke kī "/very" lilo i holoi "/u00very" a me ka laulā ["/very/", "/very0"), a me ka loaʻa ʻana o nā keiki a pau - ma kahi noi no nā kī mai ka laulā ["/very/u00", "/very/u01").

Ke wehe nei i kahi kī ma ZooKeeper

E like me kaʻu i ʻōlelo ai, ma ZooKeeper ʻaʻole hiki iā ʻoe ke holoi i kahi node inā he mau keiki. Makemake mākou e holoi i ke kī me ka subtree. He aha kaʻu e hana ai? Hana mākou i kēia me ka manaʻolana. ʻO ka mea mua, hele hou mākou i ka subtree, loaʻa nā keiki o kēlā me kēia vertex me kahi nīnau ʻokoʻa. A laila kūkulu mākou i kahi kālepa e hoʻāʻo nei e holoi i nā nodes a pau o ka subtree ma ke ʻano kūpono. ʻOiaʻiʻo, hiki ke loli ma waena o ka heluhelu ʻana i kahi subtree a me ka holoi ʻana. I kēia hihia, e hāʻule ke kālepa. Eia kekahi, hiki ke loli ka subtree i ka wā o ka heluhelu ʻana. Hiki i kahi noi no nā keiki o ka node aʻe ke hoʻihoʻi i kahi hewa inā, no ka laʻana, ua holoi ʻia kēia node. I nā hihia ʻelua, hana hou mākou i ke kaʻina holoʻokoʻa.

ʻO kēia ala e hoʻopau ʻole i ke kī inā loaʻa iā ia nā keiki, a ʻoi aku hoʻi inā e hoʻomau ka hana me ka subtree, holoi a hana i nā kī. Eia naʻe, ua ʻae kēia iā mākou e pale i ka hoʻopili ʻana i ka hoʻokō ʻana i nā ʻano hana ʻē aʻe ma etcd a me Consul.

kau ʻia ma ZooKeeper

Aia ma ZooKeeper nā ʻano hana like ʻole e hana pū me ke ʻano kumulāʻau (hana, holoi, getChildren) a hana pū me ka ʻikepili i nā nodes (setData, getData). i hana ʻia, holoi a hoʻonohonoho paha - inā ʻaʻole i loaʻa. Pono mākou i kahi ala hoʻonohonoho i hiki ke kāhea ʻia me ka noʻonoʻo ʻole i ke alo o kahi kī.

ʻO kahi koho, ʻo ia ka lawe ʻana i kahi ala maikaʻi, e like me ka holoi ʻana. E nānā inā loaʻa kahi node. Inā loaʻa, e kāhea iā setData, i ʻole e hana. Inā hoʻihoʻi ke ala hope i kahi hewa, e hana hou i nā mea āpau. ʻO ka mea mua e hoʻomaopopo ai he mea ʻole ka hoʻāʻo ola. Hiki iā ʻoe ke kāhea koke i ka haku. ʻO ka hoʻokō pono ʻana, ʻaʻole i loaʻa ka node a ua hana ʻia. A i ʻole, e hoʻihoʻi ka hana i ka hewa kūpono, a laila pono ʻoe e kāhea iā setData. ʻOiaʻiʻo, ma waena o nā kelepona, hiki ke hoʻopau ʻia kahi vertex e kahi kelepona hoʻokūkū, a hoʻihoʻi pū ʻo setData i kahi hewa. I kēia hihia, hiki iā ʻoe ke hana hou i nā mea āpau, akā pono ia?

Inā hoʻihoʻi ʻia nā ala ʻelua i kahi hewa, a laila ʻike maopopo mākou i kahi holoi hoʻokūkū. E noʻonoʻo kākou ua hana ʻia kēia holoi ʻana ma hope o ke kāhea ʻana i set. A laila ua holoi ʻia nā manaʻo a mākou e hoʻokumu ai. ʻO ia ke ʻano hiki iā mākou ke manaʻo ua hoʻokō pono ʻia kēlā set, ʻoiai inā ʻaʻohe mea i kākau ʻia.

Nā kikoʻī loea hou aku

Ma kēia ʻāpana e hoʻomaha mākou mai nā ʻōnaehana puʻupuʻu a kamaʻilio e pili ana i ka coding.
ʻO kekahi o nā koi koʻikoʻi o ka mea kūʻai aku he cross-platform: pono e kākoʻo ʻia kekahi o nā lawelawe ma Linux, MacOS a me Windows. I ka hoʻomaka ʻana, kūkulu mākou no Linux wale nō, a hoʻomaka i ka hoʻāʻo ʻana ma nā ʻōnaehana ʻē aʻe ma hope. ʻO kēia ka mea i nui ai nā pilikia, a no kekahi manawa ʻaʻole maopopo loa pehea e hoʻokokoke ai. ʻO ka hopena, ua kākoʻo ʻia nā lawelawe hoʻonohonoho ʻekolu ma Linux a me MacOS, ʻoiai ʻo Consul KV wale nō ke kākoʻo ʻia ma Windows.

Mai ka hoʻomaka ʻana, ua hoʻāʻo mākou e hoʻohana i nā hale waihona puke i mākaukau e komo i nā lawelawe. I ka hihia o ZooKeeper, ua hāʻule ka koho ZooKeeper C++, ka mea i hiki ʻole ke hōʻuluʻulu ma Windows. Eia naʻe, ʻaʻole ia he mea kupanaha: ua hoʻonohonoho ʻia ka waihona ma ke ʻano he linux-wale nō. No ke Kanikela ka mea koho wale no ppkonsul. Pono e hoʻohui ʻia ke kākoʻo iā ia mau kau и nā kālepa. No etcd, ʻaʻole i loaʻa kahi waihona piha piha e kākoʻo ana i ka mana hou loa o ka protocol, no laila mākou maʻalahi hana ʻia ka mea kūʻai aku grpc.

Hoʻoulu ʻia e ka interface asynchronous o ka waihona ZooKeeper C++, ua hoʻoholo mākou e hoʻokō i kahi interface asynchronous. Hoʻohana ʻo ZooKeeper C++ i nā mea mua / hoʻohiki mua no kēia. Ma STL, akā, ua hoʻokō ʻia lākou me ka haʻahaʻa loa. No ka laʻana, ʻaʻole a laila ʻano hana, e pili ana i ka hana i hala i ka hopena o ka wā e hiki mai ana. I kā mākou hihia, pono ia ʻano hana e hoʻohuli i ka hopena i ke ʻano o kā mākou waihona. No ka hoʻopau ʻana i kēia pilikia, pono mākou e hoʻokō i kā mākou kolamu ponoʻī maʻalahi, no ka mea ma ke noi a ka mea kūʻai aku ʻaʻole hiki iā mākou ke hoʻohana i nā hale waihona puke kaumaha ʻekolu e like me Boost.

ʻO kā mākou hoʻokō a laila hana e like me kēia. Ke kāhea ʻia, hoʻokumu ʻia kahi ʻōlelo hoʻohiki hou aʻe. Hoʻihoʻi ʻia ka wā e hiki mai ana, a kau ʻia ka mea i hala me ka hana pili a me kahi ʻōlelo hoʻohiki hou i ka pila. E koho ana kekahi pae mai ka loko wai i kekahi mau wā e hiki mai ana mai ka queue a koho iā lākou me ka hoʻohana ʻana iā wait_for. Ke loaʻa ka hopena, kāhea ʻia ka hana pili a hāʻawi ʻia kona waiwai hoʻihoʻi i ka ʻōlelo hoʻohiki.

Ua hoʻohana mākou i ka wai puna like e hoʻokō i nā nīnau iā etcd a me Consul. 'O ia ho'i, hiki ke ki'i 'ia nā hale waihona puke e nā loina like 'ole. ʻAʻole palekana ʻo ppconsul, no laila ua pale ʻia nā kelepona iā ia e nā laka.
Hiki iā ʻoe ke hana pū me grpc mai nā pae he nui, akā aia nā subtleties. Hoʻokomo ʻia nā wati etcd ma o nā kahawai grpc. He mau ala ʻelua no nā memo o kekahi ʻano. Hoʻokumu ka waihona i hoʻokahi pae no nā wati a pau a me hoʻokahi kaula e hoʻoponopono i nā memo e hiki mai ana. No laila, pāpā ʻo grpc i nā kākau like ʻana i ke kahawai. ʻO ia ke ʻano o ka hoʻomaka ʻana a i ʻole ka holoi ʻana i kahi wati, pono ʻoe e kali a pau ka noi mua i ka hoʻouna ʻana ma mua o ka hoʻouna ʻana i ka mea aʻe. Hoʻohana mākou no ka synchronization nā hoʻololi kūlana.

ʻO ka hopena

E ʻike iā ʻoe iho: liboffkv.

ʻO kā mākou hui: Raed Romanov, ʻO Ivan Glushenkov, Dmitry Kamaldinov, ʻO Victor Krapivensky, Vitaly Ivanin.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka