HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Pwochen konferans HighLoad++ la ap fèt 6 ak 7 avril 2020 nan Saint Petersburg.
Detay ak tikè по ссылке. HighLoad++ Siberia 2019. Hall "Krasnoyarsk". 25 jen, 12:00. Tèz ak prezantasyon.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Li rive ke kondisyon pratik konfli ak teyori, kote aspè enpòtan pou yon pwodwi komèsyal yo pa pran an kont. Diskou sa a prezante yon pwosesis pou chwazi ak konbine diferan apwòch pou kreye eleman konsistans kozatif ki baze sou rechèch akademik ki baze sou egzijans yon pwodwi komèsyal yo. Moun k ap koute yo pral aprann sou apwòch teyorik ki egziste deja nan revèy lojik, swiv depandans, sekirite sistèm, senkronizasyon revèy, ak poukisa MongoDB te deside sou sèten solisyon.

Mikhail Tyulenev (ki refere yo kòm MT): – Mwen pral pale sou konsistans kozatif - sa a se yon karakteristik nou te travay sou nan MongoDB. Mwen travay nan yon gwoup sistèm distribiye, nou te fè li anviwon de zan de sa.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Nan pwosesis la, mwen te oblije familyarize tèt mwen ak yon anpil nan rechèch akademik, paske karakteristik sa a te etidye byen. Li te tounen soti ke pa yon sèl atik adapte nan sa ki nesesè nan yon baz done pwodiksyon akòz kondisyon trè espesifik ki pwobableman prezan nan nenpòt aplikasyon pwodiksyon an.

Mwen pral pale sou fason nou, kòm konsomatè nan rechèch akademik, prepare yon bagay nan li ke nou ka Lè sa a, prezante bay itilizatè nou yo kòm yon plat pare-fè ki se pratik ak san danje pou itilize.

Konsistans kozatif. Ann defini konsèp yo

Pou kòmanse, mwen vle di an tèm jeneral ki sa konsistans kozal ye. Gen de karaktè - Leonard ak Penny (seri televizyon "The Big Bang Theory"):

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Ann di Penny an Ewòp e Leonard vle fè l yon fèt sipriz. Apre sa, li pa ka panse a anyen pi bon pase jete l 'soti nan lis zanmi l', voye tout zanmi l 'yon aktyalizasyon sou manje: "Ann fè Penny kontan!" (li an Ewòp, pandan l ap dòmi, li pa wè tout bagay sa yo epi li pa ka wè li, paske li pa la). Finalman, li efase pòs sa a, efase li nan Feed la epi retabli aksè pou li pa remake anyen epi pa gen okenn eskandal.
Sa a se tout byen ak bon, men an n sipoze ke sistèm nan distribye ak bagay sa yo te ale yon ti kras mal. Li ka, pou egzanp, rive ke restriksyon aksè Penny a te fèt apre pòs sa a parèt, si evènman yo pa gen rapò ak kòz ak efè. Aktyèlman, sa a se yon egzanp lè konsistans kozatif obligatwa pou fè yon fonksyon biznis (nan ka sa a).

An reyalite, sa yo se byen ki pa trivial pwopriyete nan baz done a - trè kèk moun sipòte yo. Ann ale nan modèl yo.

Modèl konsistans

Ki sa egzakteman se yon modèl konsistans nan baz done? Sa yo se kèk nan garanti yo ke yon sistèm distribiye bay sou ki done kliyan an ka resevwa ak nan ki sekans.

Nan prensip, tout modèl konsistans desann nan ki jan menm jan yon sistèm distribiye se ak yon sistèm ki kouri, pou egzanp, sou yon sèl ne sou yon laptop. Ak sa a se ki jan menm jan yon sistèm ki kouri sou dè milye de "nœuds" geo-distribiye se ak yon laptop, nan ki tout pwopriyete sa yo yo fèt otomatikman nan prensip.

Se poutèt sa, modèl konsistans yo aplike sèlman nan sistèm distribiye. Tout sistèm ki te egziste deja e ki te opere nan menm dekale vètikal la pa t fè eksperyans pwoblèm sa yo. Te gen yon sèl Buffer Cache, ak tout bagay te toujou li nan li.

Modèl fò

Aktyèlman, premye modèl la se Strong (oswa liy kapasite ogmantasyon, jan yo rele l souvan). Sa a se yon modèl konsistans ki asire ke chak chanjman, yon fwa konfime ke li te fèt, vizib pou tout itilizatè nan sistèm nan.

Sa a kreye yon lòd mondyal nan tout evènman nan baz done a. Sa a se yon pwopriyete konsistans trè fò, epi li se jeneralman trè chè. Sepandan, li trè byen sipòte. Li jis trè chè ak dousman - li jis raman itilize. Yo rele sa kapasite ogmantasyon.

Gen yon lòt, pi fò pwopriyete ki sipòte nan Spanner - yo rele Konsistans ekstèn. Nou pral pale sou li yon ti kras pita.

Kozal

Pwochen an se Causal, ki se egzakteman sa m t ap pale a. Genyen plizyè plis sous-nivo ant Strong ak Causal ke mwen pa pral pale sou, men yo tout bouyi desann nan Causal. Sa a se yon modèl enpòtan paske li se pi fò nan tout modèl, konsistans ki pi fò nan prezans yon rezo oswa patisyon.

Causals se aktyèlman yon sitiyasyon kote evènman yo konekte pa yon relasyon kòz ak efè. Trè souvan yo pèrsu kòm Li sou dwa ou nan pwen de vi kliyan an. Si kliyan an te obsève kèk valè, li pa ka wè valè ki te nan tan lontan an. Li deja kòmanse wè lekti prefiks yo. Li tout vini desann nan menm bagay la.
Causals kòm yon modèl konsistans se yon lòd pasyèl nan evènman sou sèvè a, nan ki evènman soti nan tout kliyan yo obsève nan sekans nan menm. Nan ka sa a, Leonard ak Penny.

Evantyèlman

Twazyèm modèl la se Evantyèlman Konsistans. Sa a se sa absoliman tout sistèm distribye sipòte, modèl la minim ki fè sans nan tout. Sa vle di sa ki annapre yo: lè nou gen kèk chanjman nan done yo, nan kèk pwen yo vin konsistan.

Nan yon moman konsa li pa di anyen, otreman li ta tounen nan Konsistans Ekstèn - li ta yon istwa konplètman diferan. Men, sa a se yon modèl trè popilè, ki pi komen an. Pa default, tout itilizatè yo nan sistèm distribye itilize Konsistans Evantyèlman.

Mwen vle bay kèk egzanp konparatif:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Kisa flèch sa yo vle di?

  • Latansi. Kòm fòs konsistans la ogmante, li vin pi gwo pou rezon evidan: ou bezwen fè plis dosye, jwenn konfimasyon nan tout lame ak nœuds ki patisipe nan gwoup la ke done yo deja la. An konsekans, Evantyèlman Konsistans gen repons ki pi rapid, paske gen, kòm yon règ, ou ka menm komèt li nan memwa ak sa a pral, nan prensip, ase.
  • Disponibilite. Si nou konprann sa a kòm kapasite nan sistèm nan reponn nan prezans rezo kraze, patisyon, oswa kèk kalite echèk, tolerans fay ogmante kòm modèl konsistans la diminye, paske li ase pou nou ke yon sèl lame ap viv ak menm jan an. tan pwodui kèk done. Konsistans evantyèlman pa garanti anyen sou done yo ditou - li kapab anyen.
  • Anomalies. An menm tan an, nan kou, kantite anomali yo ogmante. Nan Konsistans fò yo prèske pa ta dwe egziste nan tout, men nan Konsistans evantyèlman yo ka anyen. Kesyon an rive: poukisa moun chwazi Evantyèlman Konsistans si li gen anomali? Repons lan se ke modèl Konsistans Evantyèlman aplikab ak anomali egziste, pou egzanp, nan yon peryòd tan kout; li posib pou itilize sòsye an pou li ak plis oswa mwens li done ki konsistan; Li se souvan posib yo sèvi ak modèl konsistans fò. Nan pratik sa a ap travay, e souvan kantite anomali limite nan tan.

Teyorèm CAP

Lè ou wè mo konsistans, disponiblite - kisa ki vin nan tèt ou? Se vre - teyorèm CAP! Koulye a, mwen vle disparèt mit la ... Se pa mwen - se Martin Kleppmann, ki te ekri yon atik bèl bagay, yon liv bèl bagay.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Teyorèm CAP a se yon prensip ki te fòme nan ane 2000 yo ke Konsistans, Disponibilite, Partitions: pran nenpòt de, epi ou pa ka chwazi twa. Se te yon prensip sèten. Li te pwouve kòm yon teyorèm kèk ane pita pa Gilbert ak Lynch. Lè sa a, sa a te kòmanse itilize kòm yon maître - sistèm yo te kòmanse divize an CA, CP, AP ak sou sa.

Teyorèm sa a te aktyèlman pwouve pou ka sa yo... Premyerman, Disponibilite te konsidere kòm pa yon valè kontinyèl soti nan zewo a dè santèn (0 - sistèm nan "mouri", 100 - reponn byen vit; nou yo te abitye konsidere li konsa) , men kòm yon pwopriyete nan algorithm la , ki garanti ke pou tout ekzekisyon li yo li retounen done.

Pa gen yon mo sou tan repons ditou! Gen yon algorithm ki retounen done apre 100 ane - yon algorithm ki disponib absoliman bèl bagay, ki se yon pati nan teyorèm CAP la.
Dezyèmman: teyorèm la te pwouve pou chanjman nan valè yo nan menm kle a, malgre lefèt ke chanjman sa yo se redimensionnable. Sa vle di ke an reyalite yo pratikman pa itilize, paske modèl yo diferan Konsistans evantyèlman, Konsistans fò (petèt).

Pou kisa tout bagay sa yo? Anplis, teyorèm CAP nan egzakteman fòm nan ki li te pwouve se pratikman pa aplikab epi li se raman itilize. Nan fòm teyorik, li yon jan kanmenm limite tout bagay. Li vire soti yon sèten prensip ki se entwitif kòrèk, men an jeneral pa te pwouve.

Konsistans kozatif se modèl ki pi fò

Sa k ap pase kounye a se ke ou ka jwenn tout twa bagay: Konsistans, Disponibilite lè l sèvi avèk Partitions. An patikilye, konsistans kozal se modèl konsistans ki pi fò, ki toujou ap travay nan prezans Partitions (kraze nan rezo a). Se poutèt sa li gen yon gwo enterè konsa, e se poutèt sa nou te pran li.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Premyèman, li senplifye travay devlopè aplikasyon yo. An patikilye, prezans nan gwo sipò nan men sèvè a: lè tout dosye ki rive andedan yon sèl kliyan yo garanti yo rive nan sekans nan menm sou yon lòt kliyan. Dezyèmman, li kenbe tèt ak Partitions.

Kizin Entèn MongoDB

Sonje ke se manje midi, nou deplase nan kwizin nan. Mwen pral di w sou modèl sistèm lan, sètadi, kisa MongoDB ye pou moun ki tande pale de yon baz done pou premye fwa.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

MongoDB (ki refere yo kòm "MongoDB") se yon sistèm distribiye ki sipòte dechèl orizontal, se sa ki, sharding; ak nan chak shard li sipòte tou redondance done, se sa ki, replikasyon.

Sharding nan MongoDB (pa yon baz done relasyon) fè balans otomatik, se sa ki, chak koleksyon dokiman (oswa "tab" an tèm de done relasyon) divize an moso, ak sèvè a otomatikman deplase yo ant shards.

Routeur rechèch la, ki distribye demann, pou yon kliyan se kèk kliyan nan ki li travay. Li deja konnen ki kote ak ki done yo ye epi li dirije tout demann yo nan shard ki kòrèk la.

Yon lòt pwen enpòtan: MongoDB se yon sèl mèt. Gen yon sèl Prensipal - li ka pran dosye ki sipòte kle yo ke li genyen. Ou pa ka fè ekri Multi-mèt.

Nou te fè lage 4.2 - nouvo bagay enteresan parèt la. An patikilye, yo mete Lucene - rechèch - sètadi ègzèkutabl java dirèkteman nan Mongo, epi la li te vin posib pou fè rechèch atravè Lucene, menm jan ak nan Elastica.

Apre sa, yo te fè yon nouvo pwodwi - Charts, li disponib tou sou Atlas (Pwòp Cloud Mongo a). Yo gen yon nivo gratis - ou ka jwe otou ak li. Mwen vrèman te renmen Tablo - vizyalizasyon done, trè entwisyon.

Engredyan konsistans kozatif

Mwen konte sou 230 atik ki te pibliye sou sijè sa a - soti nan Leslie Lampert. Koulye a, nan memwa mwen mwen pral transmèt ba ou kèk pati nan materyèl sa yo.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Tout bagay te kòmanse ak yon atik pa Leslie Lampert, ki te ekri nan ane 1970 yo. Kòm ou ka wè, kèk rechèch sou sijè sa a toujou ap kontinye. Koulye a, konsistans kozal ap fè eksperyans enterè an koneksyon avèk devlopman nan sistèm distribiye.

Restriksyon yo

Ki restriksyon ki genyen? Sa a se aktyèlman youn nan pwen prensipal yo, paske restriksyon yo ke yon sistèm pwodiksyon enpoze yo trè diferan de restriksyon yo ki egziste nan atik akademik yo. Yo souvan byen atifisyèl.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

  • Premyèman, "MongoDB" se yon sèl mèt, jan mwen te deja di (sa a anpil senplifye).
  • Nou kwè ke sistèm nan ta dwe sipòte anviwon 10 mil shards. Nou pa ka pran okenn desizyon achitekti ki pral limite valè sa a klèman.
  • Nou gen yon nwaj, men nou sipoze ke yon moun ta dwe toujou gen opòtinite a lè li telechaje binè, kouri li sou laptop li, ak tout bagay ap mache byen.
  • Nou sipoze yon bagay ke Rechèch raman sipoze: kliyan ekstèn ka fè tou sa yo vle. MongoDB se sous louvri. An konsekans, kliyan yo ka tèlman entelijan ak fache - yo ka vle kraze tout bagay. Nou espekile ke Bizanten Feilors ka orijin.
  • Pou kliyan ekstèn ki deyò perimèt la, gen yon limit enpòtan: si karakteristik sa a enfim, Lè sa a, pa gen okenn degradasyon pèfòmans yo ta dwe obsève.
  • Yon lòt pwen se jeneralman anti-akademik: konpatibilite nan vèsyon anvan yo ak sa ki nan lavni. Ansyen chofè yo dwe sipòte nouvo mizajou, epi baz done a dwe sipòte ansyen chofè yo.

An jeneral, tout bagay sa yo enpoze restriksyon.

Konpozan konsistans kozatif

Mwen pral kounye a pale sou kèk nan eleman yo. Si nou konsidere konsistans kozal an jeneral, nou ka chwazi blòk. Nou te chwazi nan travay ki fè pati yon sèten blòk: Tracking Depandans, chwazi revèy, ki jan revèy sa yo ka senkronize youn ak lòt, ak ki jan nou asire sekirite - sa a se yon deskripsyon ki graj sou sa mwen pral pale sou:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Suivi Depandans konplè

Poukisa li nesesè? Se konsa, lè done yo replike, chak dosye, chak chanjman done gen enfòmasyon sou ki chanjman li depann de. Premye ak nayif chanjman an se lè chak mesaj ki gen yon dosye gen enfòmasyon sou mesaj anvan yo:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Nan egzanp sa a, nimewo ki nan parantèz yo se nimewo dosye yo. Pafwa dosye sa yo ak valè yo menm transfere nan antye yo, pafwa gen kèk vèsyon yo transfere. Liy anba a se ke chak chanjman gen enfòmasyon sou yon sèl anvan an (evidamman pote tout sa a nan tèt li).

Poukisa nou deside pa sèvi ak apwòch sa a (full tracking)? Li evidan, paske apwòch sa a se enposib: nenpòt chanjman nan yon rezo sosyal depann de tout chanjman anvan yo nan rezo sosyal sa a, transfere, di, Facebook oswa VKontakte nan chak aktyalizasyon. Men, gen anpil rechèch sou Tracking Depandans konplè - sa yo se rezo pre-sosyal; pou kèk sitiyasyon li vrèman travay.

Swiv Depandans Eksplis

Pwochen an pi limite. Se transfè a nan enfòmasyon tou konsidere isit la, men se sèlman sa ki klèman depann. Ki sa ki depann de sa, kòm yon règ, se detèmine pa Aplikasyon an. Lè done yo repwodui, rechèch la sèlman retounen repons lè depandans anvan yo te satisfè, se sa ki montre. Sa a se sans nan ki jan konsistans kozal travay.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Li wè ke dosye 5 depann de dosye 1, 2, 3, 4 - kòmsadwa, li tann anvan kliyan an gen aksè a chanjman ki fèt pa desizyon aksè Penny a, lè tout chanjman anvan yo te deja pase nan baz done a.

Sa a pa kostim nou tou, paske toujou gen twòp enfòmasyon, epi li pral ralanti bagay sa yo. Gen yon lòt apwòch...

Revèy Lampport

Yo granmoun anpil. Lamport Clock vle di ke depandans sa yo pliye nan yon fonksyon eskalè, ki rele Lamport Clock.

Yon fonksyon eskalè se kèk nimewo abstrè. Li souvan rele tan lojik. Avèk chak evènman, kontwa sa a ogmante. Counter, ki kounye a konnen nan pwosesis la, voye chak mesaj. Li klè ke pwosesis yo ka soti nan senkronizasyon, yo ka gen tan konplètman diferan. Men, sistèm nan yon jan kanmenm balanse revèy la ak mesaj sa yo. Kisa k ap pase nan ka sa a?

Mwen fann gwo teson sa a an de pou fè li klè: Zanmi yo ka viv nan yon sèl nod, ki gen yon moso nan koleksyon an, ak Feed ka viv nan yon lòt ne, ki gen yon moso nan koleksyon sa a. Èske li klè ki jan yo ka soti nan liy? Premye Feed pral di: "Repwodui", ak Lè sa a, Zanmi. Si sistèm nan pa bay yon kalite garanti ke Feed a pa pral montre jiskaske depandans yo Friends nan koleksyon an zanmi yo tou delivre, Lè sa a, nou pral gen egzakteman sitiyasyon an ke mwen mansyone.

Ou wè ki jan kontwa tan an sou Feed lojikman ogmante:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Se konsa, pwopriyete prensipal la nan revèy Lamport sa a ak konsistans kozatif (eksplike atravè revèy Lamport) se sa a: si nou gen Evènman A ak B, ak Evènman B depann de Evènman A *, Lè sa a, li swiv ke LogicalTime nan Evènman A se mwens pase LogicalTime soti nan Evènman B.

* Pafwa yo di tou ke A te pase anvan B, sa vle di, A te rive anvan B - sa a se yon sèten relasyon ki pasyèlman lòd tout seri evènman ki te pase an jeneral.

Opoze a pa kòrèk. Sa a se aktyèlman youn nan dezavantaj prensipal yo nan Lamport Clock - lòd pasyèl. Gen yon konsèp sou evènman similtane, se sa ki, evènman kote ni (A te rive anvan B) ni (A te rive anvan B). Yon egzanp ta dwe adisyon paralèl Leonard nan yon lòt moun kòm yon zanmi (pa menm Leonard, men Sheldon, pou egzanp).
Sa a se pwopriyete a ki souvan itilize lè w ap travay ak revèy Lamport: yo gade espesyalman nan fonksyon an ak nan sa a yo konkli ke petèt evènman sa yo depann. Paske yon fason se vre: si LogicalTime A se mwens pase LogicalTime B, Lè sa a, B pa ka rive anvan A; epi si plis, Lè sa a, petèt.

vektè revèy

Devlopman lojik revèy Lamport se revèy vektè a. Yo diferan nan ke chak ne ki isit la gen pwòp revèy separe li yo, epi yo transmèt kòm yon vektè.
Nan ka sa a, ou wè ke zewoyèm endèks vektè a responsab pou Feed, epi premye endèks vektè a se pou Zanmi (yo chak nan nœuds sa yo). Epi, koulye a yo pral ogmante: endèks zewo nan "Feed" ogmante lè w ap ekri - 1, 2, 3:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Poukisa Vector Clock pi bon? Paske yo pèmèt ou konnen ki evènman yo similtane ak lè yo rive sou nœuds diferan. Sa enpòtan anpil pou yon sistèm sharding tankou MongoDB. Sepandan, nou pa t 'chwazi sa a, byenke li se yon bagay bèl bagay, epi li travay gwo, epi li ta pwobableman kostim nou ...

Si nou gen 10 mil shards, nou pa ka transfere 10 mil eleman, menm si nou konprese li oswa vini ak yon lòt bagay - chaj la ap toujou plizyè fwa pi piti pase volim nan tout vektè sa a. Se poutèt sa, griyen kè nou ak dan nou, nou abandone apwòch sa a ak deplase sou yon lòt.

Spanner TrueTime. Revèy atomik

Mwen te di ke ta gen yon istwa sou Spanner. Sa a se yon bagay fre, tou dwat soti nan XNUMXyèm syèk la: revèy atomik, senkronizasyon GPS.

Ki lide a? "Spanner" se yon sistèm Google ki dènyèman menm te vin disponib pou moun (yo te ajoute SQL nan li). Chak tranzaksyon gen yon koupon tan. Depi lè yo senkronize *, yo ka bay chak evènman yon tan espesifik - revèy atomik gen yon tan ap tann, apre sa yo garanti yon tan diferan "rive".

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Kidonk, pa senpleman ekri nan baz done a epi tann pou kèk peryòd de tan, Serializability evènman an otomatikman garanti. Yo gen pi fò modèl Konsistans ki ka imajine nan prensip - li se Konsistans ekstèn.

* Sa a se pwoblèm prensipal la ak revèy Lampart - yo pa janm synchrone sou sistèm distribiye. Yo ka diverge; menm ak NTP, yo toujou pa travay trè byen. "Spanner" gen yon revèy atomik ak senkronizasyon, li sanble, se mikrosgond.

Poukisa nou pa t chwazi? Nou pa sipoze ke itilizatè nou yo gen yon revèy atomik entegre. Lè yo parèt, yo te bati nan chak laptop, pral gen kèk kalite super cool GPS senkronizasyon - Lè sa a, wi... Men, pou kounye a, pi bon an ki posib se Amazon, Base Stations - pou fanatik ... Se konsa, nou te itilize lòt mont. .

Ibrid revèy

Sa a se aktyèlman sa tik nan MongoDB lè asire konsistans kozatif. Ki jan yo ibrid? Hybrid se yon valè eskalè, men li gen de eleman:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

  • Premye a se epòk Unix (konbyen segonn te pase depi "kòmansman mond òdinatè a").
  • Dezyèm lan se kèk enkreman, tou yon int 32-bit ki pa siyen.

Sa a tout, aktyèlman. Gen apwòch sa a: pati ki responsab pou tan an senkronize ak revèy la tout tan; chak fwa yon aktyalizasyon rive, pati sa a senkronize ak revèy la epi li sanble ke lè a toujou plis oswa mwens kòrèk, ak ogmantasyon pèmèt ou fè distenksyon ant evènman ki te fèt nan menm moman an.

Poukisa sa enpòtan pou MongoDB? Paske li pèmèt ou fè kèk kalite restoran backup nan yon sèten pwen nan tan, se sa ki, evènman an endis pa tan. Sa a enpòtan lè sèten evènman yo bezwen; Pou yon baz done, evènman yo se chanjman nan baz done a ki te fèt nan sèten entèval nan tan.

Mwen pral di ou rezon ki pi enpòtan an sèlman pou ou (tanpri, pa di pèsonn)! Nou te fè sa paske se sa ki òganize, done endis sanble nan MongoDB OpLog. OpLog se yon estrikti done ki gen absoliman tout chanjman ki fèt nan baz done a: yo premye ale nan OpLog, ak Lè sa a, yo aplike nan Depo tèt li nan ka a lè li se yon dat replike oswa shard.

Sa a te rezon prensipal la. Toujou, gen tou kondisyon pratik pou devlope yon baz done, ki vle di ke li ta dwe senp - ti kòd, kòm kèk bagay kase ke posib ki bezwen yo dwe reekri ak teste. Lefèt ke oplogs nou yo te endèks pa revèy ibrid te ede anpil epi pèmèt nou fè bon chwa. Li vrèman peye ak yon jan kanmenm maji te travay sou pwototip nan trè premye. Li te trè fre!

Revèy senkronizasyon

Gen plizyè metòd senkronizasyon ki dekri nan literati syantifik la. M ap pale de senkronizasyon lè nou gen de shards diferan. Si gen yon seri kopi, pa gen okenn nesesite pou nenpòt senkronizasyon: sa a se yon "mèt sèl"; nou gen yon OpLog, nan ki tout chanjman tonbe - nan ka sa a, tout bagay deja lòd sekans nan "Oplog la" tèt li. Men, si nou gen de shards diferan, tan senkronizasyon enpòtan isit la. Sa a se kote revèy vektè a te ede plis! Men nou pa genyen yo.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Dezyèm lan se apwopriye - sa a se "Heartbeats". Li posib pou chanje kèk siyal ki rive chak inite tan. Men, batman kè yo twò dousman, nou pa ka bay kliyan nou an latansi.

Vrè tan se, nan kou, yon bèl bagay. Men, ankò, sa a se pwobableman tan kap vini an ... Malgre ke li ka deja fè nan Atlas, gen deja rapid "Amazon" senkronize tan. Men, li p ap disponib pou tout moun.

Tripotay se lè tout mesaj gen ladann tan. Sa a se apeprè sa nou itilize. Chak mesaj ant nœuds, yon chofè, yon routeur ne done, absoliman tout bagay pou MongoDB se yon kalite eleman, yon eleman baz done ki gen yon revèy ki kouri. Yo gen siyifikasyon an nan tan ibrid toupatou, li se transmèt. 64 bits? Sa a pèmèt, sa a se posib.

Ki jan li tout travay ansanm?

Isit la mwen ap gade nan yon seri kopi fè li yon ti kras pi fasil. Gen Primè ak Segondè. Segondè fè replikasyon epi li pa toujou konplètman senkronize ak Prensipal.

Yon ensèsyon fèt nan "Primary" a ak yon sèten valè tan. Insert sa a ogmante konte entèn la pa 11, si sa a se maksimòm. Oswa li pral tcheke valè revèy yo epi senkronize ak revèy la si valè revèy yo pi gwo. Sa a pèmèt ou òganize pa tan.

Apre li fin fè anrejistreman an, yon moman enpòtan rive. Revèy la se nan "MongoDB" epi li ogmante sèlman nan ka ekri nan "Oplog". Sa a se evènman an ki chanje eta a nan sistèm nan. Nan absoliman tout atik klasik, yon evènman konsidere kòm lè yon mesaj frape yon ne: mesaj la te rive, ki vle di sistèm nan chanje eta li.

Sa a se akòz lefèt ke pandan rechèch li pa totalman klè ki jan mesaj sa a pral entèprete. Nou konnen pou asire w ke si li pa reflete nan "Oplog la", Lè sa a, li pa pral entèprete nan okenn fason, ak yon chanjman nan eta a nan sistèm nan se sèlman yon antre nan "Oplog la". Sa a senplifye tout bagay pou nou: modèl la senplifye li, epi li pèmèt nou òganize li nan yon seri kopi, ak anpil lòt bagay itil.

Valè ki deja ekri nan "Oplog la" retounen - nou konnen ke "Oplog la" deja gen valè sa a, ak tan li se 12. Koulye a, di, lekti kòmanse nan yon lòt ne (Segondè), epi li transmèt apre ClusterTime nan. mesaj la. Li di: "Mwen bezwen tout sa ki te rive omwen apre 12 oswa pandan douz" (gade foto anlè a).

Se sa yo rele kozal yon konsistan (CAT). Gen yon konsèp konsa nan teyori ke sa a se kèk tranch nan tan, ki se ki konsistan nan tèt li. Nan ka sa a, nou ka di ke sa a se eta a nan sistèm nan ki te obsève nan tan 12.

Koulye a, pa gen anyen isit la ankò, paske kalite sa a simulation sitiyasyon an lè ou bezwen segondè a repwodui done ki soti nan Prensipal la. Li tann... Epi kounye a done yo te rive - li retounen valè sa yo tounen.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Sa se bèl anpil jan li tout travay. Prèske.

Ki sa "prèske" vle di? Ann sipoze ke gen yon moun ki te li ak konprann ki jan tout bagay sa yo ap travay. Mwen reyalize ke chak fwa ClusterTime rive, li mete ajou revèy lojik entèn la, ak Lè sa a, pwochen antre a ogmante pa youn. Fonksyon sa a pran 20 liy. Ann di moun sa a transmèt pi gwo nimewo 64-bit la, mwens youn.

Poukisa "mwens youn"? Paske revèy entèn la pral ranplase nan valè sa a (evidamman, sa a se pi gwo posib ak pi gran pase tan aktyèl la), Lè sa a, yon antre ap fèt nan "Oplog", epi revèy la ap ogmante pa yon lòt inite - epi li pral deja. gen yon valè maksimòm (genyen tou senpleman tout inite yo, pa gen okenn lòt kote pou ale), unsaint ints).

Li klè ke apre sa sistèm lan vin absoliman inaksesibl pou anyen. Li kapab sèlman dechaje ak netwaye - yon anpil nan travay manyèl. Disponibilite konplè:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Anplis, si sa a se repwodui yon lòt kote, Lè sa a, tout gwoup la tou senpleman tonbe. Yon sitiyasyon absoliman akseptab ke nenpòt moun ka òganize trè vit ak fasil! Se poutèt sa, nou konsidere moman sa a kòm youn nan pi enpòtan an. Ki jan yo anpeche li?

Fason nou se siyen clusterTime

Men ki jan li transmèt nan mesaj la (anvan tèks ble a). Men, nou menm tou nou te kòmanse jenere yon siyati (tèks ble):

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Siyati a pwodwi pa yon kle ki estoke andedan baz done a, andedan yon perimèt ki an sekirite; tèt li pwodwi ak mete ajou (itilizatè yo pa wè anyen sou li). Yon hash pwodwi, epi chak mesaj siyen lè yo kreye epi valide lè yo resevwa.
Pwobableman kesyon an parèt nan lespri moun: "Konbyen bagay sa yo ralanti?" Mwen te di ou ke li ta dwe travay byen vit, espesyalman nan absans karakteristik sa a.

Kisa sa vle di pou itilize konsistans kozal nan ka sa a? Sa a se montre paramèt afterClusterTime. San sa, li pral tou senpleman pase valè de tout fason. Tripotay, kòmanse nan vèsyon 3.6, toujou ap travay.

Si nou kite jenerasyon an konstan nan siyati, li pral ralanti sistèm nan menm nan absans la nan yon karakteristik, ki pa satisfè apwòch nou yo ak kondisyon. Se konsa, kisa nou te fè?

Fè li byen vit!

Li se yon bagay jistis senp, men jwe fent la se enteresan - mwen pral pataje li, petèt yon moun pral enterese.
Nou gen yon hash ki estoke done yo siyen. Tout done ale nan kachèt la. Kachèt la pa siyen tan an espesifik, men Range la. Lè kèk valè rive, nou jenere yon Range, maske dènye 16 bit yo, epi nou siyen valè sa a:

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Lè nou resevwa yon siyati konsa, nou akselere sistèm nan (relativman) 65 mil fwa. Li travay gwo: lè nou te pote soti eksperyans, tan an aktyèlman diminye pa 10 mil fwa lè nou te gen yon aktyalizasyon sekans. Li klè ke lè yo nan akwochaj, sa a pa travay. Men, nan pifò ka pratik li travay. Konbinezon an nan siyati a Range ansanm ak siyati a rezoud pwoblèm nan sekirite.

Kisa nou aprann?

Leson nou te aprann nan sa a:

  • Nou bezwen li materyèl, istwa, atik, paske nou gen anpil bagay enteresan. Lè nou travay sou kèk karakteristik (sitou kounye a, lè nou te fè tranzaksyon, elatriye), nou bezwen li ak konprann. Li pran tan, men li aktyèlman trè itil paske li fè li klè kote nou ye. Nou pa t 'sanble yo vini ak anyen nouvo - nou jis pran engredyan yo.

    An jeneral, gen yon sèten diferans nan panse lè gen yon konferans akademik (Sigmon, pou egzanp) - tout moun konsantre sou nouvo lide. Ki sa ki nouvo sou algorithm nou an? Pa gen anyen patikilyèman nouvo isit la. Kado a pito se nan fason nou melanje apwòch ki egziste deja ansanm. Se poutèt sa, premye bagay la se li klasik yo, kòmanse ak Lampart.

  • Nan pwodiksyon, kondisyon yo konplètman diferan. Mwen sèten ke anpil nan nou pa fè fas ak baz done "esferik" nan yon vakyòm abstrè, men ak bagay nòmal, reyèl ki gen pwoblèm ak disponiblite, latansi ak tolerans fay.
  • Bagay ki sot pase a se ke nou te dwe gade nan lide diferan ak konbine plizyè atik konplètman diferan nan yon sèl apwòch, ansanm. Lide siyen pa egzanp, jeneralman te soti nan yon atik ki te konsidere kòm pwotokòl Paxos, ki pou moun ki pa Byzantine Failors se andedan pwotokòl otorizasyon, pou moun Bizanten - deyò pwotokòl otorizasyon... An jeneral, se egzakteman sa nou. te fini fè.

    Pa gen absoliman anyen nouvo isit la! Men, le pli vit ke nou melanje tout ansanm... Se menm jan ak di ke resèt salad Olivier a se yon istwa san sans, paske ze, mayonèz ak konkonm deja envante ... Se sou menm istwa a.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Mwen pral fini ak sa a. Mèsi!

Kesyon ou yo

Kesyon odyans lan (ki refere yo kòm B): – Mèsi, Mikhail, pou rapò a! Sijè a sou tan se enteresan. W ap itilize Tripotay. Yo te di ke tout moun gen tan pa yo, tout moun konnen lè lokal yo. Jan mwen konprann li, nou gen yon chofè - kapab genyen anpil kliyan ki gen chofè, kery-planners tou, shards tou... E kisa sistèm nan vini si nou rete konsa gen yon diferans: yon moun deside ke li se pou yon minit devan, yon moun yon minit dèyè? Ki kote nou pral fini?

MT: – Gwo kesyon vre! Mwen jis te vle pale sou shards. Si mwen konprann kesyon an kòrèkteman, nou gen sitiyasyon sa a: gen shard 1 ak shard 2, lekti rive nan de shards sa yo - yo gen yon diferans, yo pa kominike youn ak lòt, paske tan ke yo konnen se diferan, espesyalman tan ke yo egziste nan oplogs.
Ann di ke shard 1 te fè yon milyon dosye, shard 2 pa fè anyen ditou, epi demann lan te vini nan de shards. Ak premye a gen yon afterClusterTime ki gen plis pase yon milyon. Nan yon sitiyasyon konsa, jan mwen te eksplike, shard 2 pap janm reponn ditou.

NAN: – Mwen te vle konnen ki jan yo senkronize epi chwazi yon sèl tan ki lojik?

MT: - Trè fasil pou senkronize. Shard, lè apre ClusterTime vin jwenn li epi li pa jwenn tan nan "Oplog la", inisye pa gen okenn apwouve. Sa vle di, li ogmante tan li ak men l 'nan valè sa a. Sa vle di ke li pa gen okenn evènman ki matche demann sa a. Li kreye evènman sa a atifisyèlman e konsa vin Kozèl konsistan.

NAN: – E si apre sa kèk lòt evènman vin jwenn li ki te pèdi yon kote nan rezo a?

MT: – Shard fèt nan yon fason ke yo pa pral vini ankò, depi li se yon sèl mèt. Si li te deja enskri, Lè sa a, yo pa pral vini, men yo pral vini pita. Li pa ka rive ke yon bagay vin kole yon kote, Lè sa a, li pa ekri, ak Lè sa a, evènman sa yo rive - ak konsistans nan Causal kase. Lè li pa ekri, yo tout ta dwe vini apre (li pral tann yo).

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

NAN: – Mwen gen plizyè kesyon konsènan ke moun kap kriye yo. Konsistans kozatif sipoze ke gen yon keu espesifik nan aksyon ki bezwen fèt. Kisa k ap pase si youn nan pakè nou yo disparèt? Men 10yèm, 11yèm... 12yèm lan disparèt, tout lòt moun ap tann li rive vre. Epi toudenkou machin nou an mouri, nou pa ka fè anyen. Èske gen yon maksimòm longè keu a ki akimile anvan yo egzekite? Ki echèk fatal ki rive lè yon sèl eta pèdi? Anplis, si nou ekri ke gen kèk eta anvan, Lè sa a, nou ta dwe yon jan kanmenm kòmanse soti nan li? Men, yo pa t 'pouse l' ale!

MT: – Epitou yon gwo kesyon! Kisa nap fè? MongoDB gen konsèp ekriti kowòm, lekti kowòm. Nan ki ka yon mesaj ka pèdi? Lè yon ekri pa kowòm oswa lè yon lekti pa kowòm (yon kalite fatra ka kole tou).
Konsènan konsistans kozal, yo te fè yon gwo tès eksperimantal, rezilta a se ke nan ka a lè ekri ak li pa kowòm, vyolasyon konsistans kozal rive. Egzakteman sa ou di!

Konsèy nou an: itilize omwen lekti kowòm lè w ap itilize konsistans kozatif. Nan ka sa a, pa gen anyen yo pral pèdi, menm si dosye kowòm la pèdi... Sa a se yon sitiyasyon orthogonal: si itilizatè a pa vle done yo dwe pèdi, li bezwen sèvi ak yon dosye kowòm. Konsistans kozatif pa garanti durability. Durabilité garanti pa réplication Et machin ki asosye ak réplication.

NAN: – Lè nou kreye yon egzanp ki fè sharding pou nou (pa mèt, men esklav, respektivman), li konte sou tan Unix nan pwòp machin li oswa sou tan an nan "mèt la"; Èske li senkronize pou premye fwa oswa detanzantan?

MT: - Mwen pral klarifye kounye a. Shard (sa vle di patisyon orizontal) - toujou gen yon Prensipal la. Ak yon teson ka gen yon "mèt" epi ka gen kopi. Men shard la toujou sipòte anrejistreman, paske li dwe sipòte kèk domèn (shard la gen Prensipal).

NAN: – Se konsa, tout bagay depann piman sou "mèt la"? Èske lè mèt toujou itilize?

MT: - Wi. Ou ka di yon fason senbolik: revèy la ap mache lè yon antre nan "mèt la", nan "Oplog la" rive.

NAN: – Nou gen yon kliyan ki konekte epi ki pa bezwen konnen anyen sou tan an?

MT: - Ou pa bezwen konnen anyen ditou! Si nou pale sou ki jan li fonksyone sou kliyan an: lè kliyan an vle sèvi ak konsistans kozatif, li bezwen louvri yon sesyon. Koulye a, tout bagay la: tranzaksyon nan sesyon an, ak rekipere yon dwa ... Yon sesyon se lòd la nan evènman ki lojik ki fèt ak kliyan an.

Si li ouvri sesyon sa a epi li di la ke li vle konsistans koz (si sesyon an sipòte konsistans kozal pa default), tout bagay ap travay otomatikman. Chofè a sonje tan sa a epi li ogmante li lè li resevwa yon nouvo mesaj. Li sonje ki repons anvan an te retounen nan sèvè a ki te retounen done yo. Pwochen demann lan ap genyen afterCluster ("tan ki pi gran pase sa a").

Kliyan an pa bezwen konnen absoliman anyen! Sa a se konplètman opak pou li. Si moun sèvi ak karakteristik sa yo, kisa yo ka fè? Premyèman, ou ka li an sekirite segondè: ou ka ekri nan Primè epi li soti nan segondè repwodwi jeyografik epi asire w ke li fonksyone. An menm tan an, sesyon ki te anrejistre sou Prensipal yo ka menm transfere nan Segondè, sa vle di ou ka itilize pa yon sèl sesyon, men plizyè.

NAN: – Yon nouvo kouch syans enfòmatik – kalite done CRDT (Tip done repwodwi san konfli) – gen anpil rapò ak sijè konsistans evantyèlman an. Eske ou te konsidere entegre kalite done sa yo nan baz done a e kisa ou ka di sou li?

MT: - Bon kesyon! CRDT fè sans pou konfli ekri: nan MongoDB, sèl mèt.

NAN: – Mwen gen yon kesyon devops yo. Nan mond reyèl la, gen sitiyasyon sa yo Jezwitik lè Echèk Bizanten an rive, ak move moun ki andedan perimèt la pwoteje kòmanse pike nan pwotokòl la, voye pakè navèt nan yon fason espesyal?

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

MT: – Moun ki mal andedan perimèt la se tankou yon chwal Trojan! Moun ki mal anndan perimèt la ka fè anpil move bagay.

NAN: – Li klè ke kite, apeprè pale, yon twou nan sèvè a nan ki ou ka mete yon zou nan elefan ak efondre gwoup la tout antye pou tout tan ... Li pral pran tan pou rekiperasyon manyèl ... Sa a, pou mete l 'dous, se mal. Nan lòt men an, sa a se enteresan: nan lavi reyèl, nan pratik, gen sitiyasyon lè natirèlman menm jan atak entèn rive?

MT: - Depi mwen raman rankontre vyolasyon sekirite nan lavi reyèl, mwen pa ka di si yo rive. Men, si nou pale de filozofi devlopman, nou panse konsa: nou gen yon perimèt ki bay mesye yo ki fè sekirite - sa a se yon chato, yon miray; ak andedan perimèt la ou ka fè tou sa ou vle. Li klè ke gen itilizatè ki gen kapasite pou sèlman wè, e gen itilizatè ki gen kapasite pou efase anyè a.

Tou depan de dwa yo, domaj ke itilizatè yo ka fè ka yon sourit, oswa li kapab yon elefan. Li klè ke yon itilizatè ki gen tout dwa ka fè anyen nan tout. Yon itilizatè ki gen dwa limite ka lakòz anpil mwens domaj. An patikilye, li pa ka kraze sistèm nan.

NAN: – Nan perimèt pwoteje, yon moun te eseye kreye pwotokòl inatandi pou sèvè a yo nan lòd yo konplètman detwi sèvè a, epi si w gen chans, gwoup la tout antye ... Èske li janm jwenn sa a "bon"?

MT: "Mwen pa janm tande pale de bagay sa yo." Lefèt ke ou ka fè aksidan yon sèvè nan fason sa a se pa sekrè. Echwe andedan, yo te soti nan pwotokòl la, yo te yon itilizatè otorize ki ka ekri yon bagay tankou sa a nan mesaj la ... An reyalite, li enposib, paske li pral toujou verifye. Li posib pou enfim otantifikasyon sa a pou itilizatè ki pa vle li - Lè sa a, se pwoblèm yo; yo, apeprè pale, detwi mi yo tèt yo epi ou ka pouse yon elefan nan la, ki pral pilonnen ... Men, an jeneral, ou ka abiye tankou yon reparateur, vini epi rale li soti!

NAN: – Mèsi pou rapò a. Sergey (Yandex). Gen yon konstan nan Mong ki limite kantite manm vòt yo nan seri replik la, ak konstan sa a se 7 (sèt). Poukisa sa se yon konstan? Poukisa sa a pa yon kalite paramèt?

MT: – Nou gen Replica Sets ak 40 nœuds. Toujou genyen majorite. Mwen pa konnen ki vèsyon...

NAN: – Nan Replica Set ou ka kouri manm ki pa vote, men gen yon maksimòm manm vòt 7. Ki jan nou ka siviv fèmen an nan ka sa a si Replica Set nou an gaye nan 3 sant done? Yon sant done ka fasil fèmen, ak yon lòt machin ka tonbe.

MT: – Sa a deja yon ti kras pi lwen pase sijè ki abòde lan rapò a. Sa a se yon kesyon jeneral. Petèt mwen ka di w sou sa pita.

HighLoad++, Mikhail Tyulenev (MongoDB): Konsistans kozatif: soti nan teyori a pratik

Kèk piblisite 🙂

Mèsi paske w rete avèk nou. Ou renmen atik nou yo? Vle wè plis kontni enteresan? Sipòte nou pa mete yon lòd oswa rekòmande pou zanmi, nwaj VPS pou devlopè soti nan $ 4.99, yon analogue inik nan sèvè nivo antre, ki te envante pa nou pou ou: Tout verite sou VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps soti nan $ 19 oswa ki jan yo pataje yon sèvè? (disponib ak RAID1 ak RAID10, jiska 24 nwayo ak jiska 40GB DDR4).

Dell R730xd 2 fwa pi bon mache nan sant done Equinix Tier IV nan Amstèdam? Sèlman isit la 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV soti nan $199 nan Netherlands! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - soti nan $ 99! Li sou Ki jan yo bati enfrastrikti corp. klas ak itilizasyon Dell R730xd E5-2650 v4 serveurs ki vo 9000 ero pou yon jounen travay?

Sous: www.habr.com

Add nouvo kòmantè