{"id":56365,"date":"2020-02-11T00:00:00","date_gmt":"2020-02-10T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike"},"modified":"2020-02-18T14:04:37","modified_gmt":"2020-02-18T11:04:37","slug":"highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>j\u00e4rgmine HighLoad++ konverents toimub 6. ja 7. aprillil 2020 Peterburis. <br \/>\n\u00dcksikasjad ja piletid <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">lingi kaudu<\/a><\/noindex>. HighLoad++ Siberia 2019. Saal \u00abKrasnojarsk\u00bb. 25. juuni, 12:00. Teesid ja <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">esitlus<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKui praktilised n\u00f5udmised ja teooria ei \u00fchti, unustades kaubanduse jaoks olulised aspektid. Selles ettekandes tutvustatakse erinevate l\u00e4henemisviiside valiku ja kombineerimise protsessi Causal consistency komponentide loomisel akadeemiliste uurimuste p\u00f5hjal, arvestades kaubanduse vajadusi. Kuulajad saavad teada olemasolevatest teoreetilistest l\u00e4henemisviisidest, nagu loogilised kellad, s\u00f5ltuvuse j\u00e4lgimine, s\u00fcsteemi turvalisus, kella s\u00fcnkroniseerimine, ja miks MongoDB valis teatud lahendused.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenev (edaspidi - MT):<\/b> \u2013 R\u00e4\u00e4gin Causal consistency'st \u2013 funktsioonist, millega t\u00f6\u00f6tasime MongoDB-s. T\u00f6\u00f6tan jaotatud s\u00fcsteemide grupis, me valmistasime selle toodanguks umbes kaks aastat tagasi.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProtsessis tuli tutvuda suure hulga akadeemilise uurimist\u00f6\u00f6ga, kuna see funktsioon on piisavalt h\u00e4sti uuritud. Selgus, et \u00fckski artikkel ei vasta sellele, mida produktsioonis vaja, andmebaasi arvestades erilisi n\u00f5udeid, mis on t\u00f5en\u00e4oliselt igas produktsioonirakenduses.<\/p>\n<p>Ma r\u00e4\u00e4gin sellest, kuidas meie, olles akadeemilise uurimist\u00f6\u00f6 tarbija, valmistame sellest midagi, mida saame hiljem esitada oma kasutajatele valmistoiduna, millega on mugav ja ohutu t\u00f6\u00f6tada.<\/p>\n<h3>Kausaalne \u00fchtsus (Causal consistency). M\u00e4\u00e4ratleme m\u00f5isted<\/h3>\n<p>\nEsiteks tahan ma \u00fcldiselt \u00f6elda, mis on kausaalne \u00fchtsus. On kaks tegelast \u2013 Leonard ja Penny (sarjast \u201eSuure P\u00e4ikese Teooria\u201c):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKujutage ette, et Penny on Euroopas ja Leonard soovib talle \u00fcllatust korraldada, n\u00e4iteks pidu. Ta ei tule aga midagi paremat p\u00e4he, kui kustutada Penny s\u00f5bralistist, saata k\u00f5igile s\u00f5pradele uuendus feedis: \"Naeratame Penny!\" (ta on Euroopas, magab, ei n\u00e4e seda k\u00f5ike ja ei saa seda haarata, sest ta ei ole seal). L\u00f5puks eemaldab ta selle postituse, kustutab selle \"Feedist\" ja taastab accessi, et ta ei m\u00e4rkaks midagi ja skandaali ei tekiks.<br \/>\nSee k\u00f5ik on tore, aga oletame, et s\u00fcsteem on jaotatud ja asjad ei l\u00e4he p\u00e4ris nii. N\u00e4iteks v\u00f5ib juhtuda, et Penny accessi piiramine toimus p\u00e4rast seda, kui postitus ilmus, kui s\u00fcndmused ei ole omavahel otseselt seotud. Tegelikult on see n\u00e4ide, kus on vajalik Kausaalne koosk\u00f5la, et t\u00e4ita \u00e4ri\u00fclesanne (antud juhul).<\/p>\n<p>Tegelikult on need \u00fcsna mittetriviaalne omadus andmebaasides \u2013 v\u00e4ga v\u00e4hesed toetavad neid. Liigume n\u00fc\u00fcd mudelite juurde.<\/p>\n<h3>Koosk\u00f5la mudelid (Consistency Models)<\/h3>\n<p>\nMis on konsistentsi mudel andmebaasides? Need on teatud garantiid, mida jaotuss\u00fcsteem annab seoses sellega, milliseid andmeid ja millises j\u00e4rjekorras klient saab.<\/p>\n<p>P\u00f5him\u00f5tteliselt p\u00f5hinevad k\u00f5ik konsistentsimudelid sellele, kui sarnane jaotuss\u00fcsteem on s\u00fcsteemile, mis t\u00f6\u00f6tab n\u00e4iteks \u00fchel madala taseme seadmel. Ja kui sarnane on s\u00fcsteem, mis t\u00f6\u00f6tab tuhandetel geograafiliselt jaotatud nod\u2019del, s\u00fclearvutile, kus k\u00f5ik need omadused toimivad p\u00f5him\u00f5tteliselt automaatsetena.<\/p>\n<p>Seet\u00f5ttu rakendatakse konsistentsimudeleid ainult jaotuss\u00fcsteemide puhul. K\u00f5ik s\u00fcsteemid, mis varem eksisteerisid ja t\u00f6\u00f6tasid \u00fchel vertikaalsel skaleerimisel, selliseid probleeme ei kogenud. Seal oli \u00fcks Buffer Cache ja sealt luges k\u00f5ik alati v\u00e4lja.<\/p>\n<h3>Mudel Strong<\/h3>\n<p>\nEsimene mudel on Strong (v\u00f5i j\u00e4rjepidevuse mudel, nagu seda sageli nimetatakse). See on konsistentsimudel, mis garanteerib, et iga muudatus, kui selle toimumise kohta on saadud kinnitus, muutub n\u00e4htavaks k\u00f5igile s\u00fcsteemi kasutajatele.<\/p>\n<p>See loob globaalne j\u00e4rjestus k\u00f5igile s\u00fcndmustele andmebaasis. See on v\u00e4ga tugev j\u00e4rjepidevuse omadus ja \u00fcldiselt on see v\u00e4ga kulukas. Siiski on see h\u00e4sti toetatud. See on lihtsalt v\u00e4ga kallis ja aeglane \u2013 seda kasutatakse harva. Seda nimetatakse rise ability.<\/p>\n<p>On veel \u00fcks, tugevam omadus, mida toetab \u00abSpanner\u00bb \u2013 seda nimetatakse v\u00e4liseks j\u00e4rjepidevuseks. R\u00e4\u00e4gime sellest natuke hiljem.<\/p>\n<h3>Causal<\/h3>\n<p>\nJ\u00e4rgmine on Causal, just see, mille \u00fcle ma r\u00e4\u00e4kisin. Tugeva ja Causal vahel on veel mitmeid alaliike, millest ma ei hakka r\u00e4\u00e4kima, kuid need k\u00f5ik viivad Causal\u2019i. See on oluline mudel, kuna see on k\u00f5ige tugevam k\u00f5igist mudelitest, k\u00f5ige tugevam j\u00e4rjepidevus v\u00f5rgu v\u00f5i jagunemiste korral.<\/p>\n<p>Causals \u2013 see t\u00e4hendab olukorda, kus s\u00fcndmused on omavahel seotud p\u00f5hjuslikus seoses. Sageli t\u00f5lgendatakse neid kui oma \u00f5igusi kliendi vaatenurgast. Kui klient on n\u00e4inud m\u00f5ningaid v\u00e4\u00e4rtusi, ei saa ta n\u00e4ha minevikus olnud v\u00e4\u00e4rtusi. Ta hakkab juba n\u00e4gema prefikskohaseid lugemisi. See k\u00f5ik viib ikkagi samasse kohta.<br \/>\nCausals nagu koosk\u00f5la mudel \u2013 osaline s\u00fcndmuste j\u00e4rjestamine serveris, kus k\u00f5ik kliendi s\u00fcndmused j\u00e4lgitakse samas j\u00e4rjestuses. Antud juhul \u2013 Leonard ja Penny.<\/p>\n<h3>L\u00f5plik<\/h3>\n<p>\nKolmas mudel on L\u00f5plik Koosk\u00f5la. See on see, mida toetavad k\u00f5ik jaotatud s\u00fcsteemid, minimaalne mudel, mis m\u00f5istuse poolest \u00fcldse olemas on. See t\u00e4hendab j\u00e4rgmist: kui andmetes toimuvad mingid muutused, siis mingil hetkel muutuvad nad koosk\u00f5laliseks.<\/p>\n<p>Selle hetke kohta ei \u00f6elda midagi muud, muidu muutuks see V\u00e4liseks Koosk\u00f5laks \u2013 see oleks hoopis teine lugu. Sellegipoolest on see v\u00e4ga populaarne mudel, k\u00f5ige levinum. Vaikimisi kasutavad k\u00f5ik jaotatud s\u00fcsteemide kasutajad just L\u00f5plikku Koosk\u00f5la.<\/p>\n<p>Tahaksin tuua m\u00f5ned v\u00f5rdlevad n\u00e4ited:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMida need nooled t\u00e4hendavad?<\/p>\n<ul>\n<li><b>Latentsus.<\/b> Konsistentsuse tugevuse suurenedes muutub see arusaadavatel p\u00f5hjustel suuremaks: tuleb teha rohkem kirjeid, saada kinnitust k\u00f5igilt hostidelt ja s\u00f5lmedelt, mis osalevad klastris, et andmed seal juba olemas on. Seega on Eventual Consistency k\u00f5ige kiirem vastus, kuna seal on tavaliselt v\u00f5imalik isegi m\u00e4lus kinnitada ja sellest piisab.<\/li>\n<li><b>Saadavus.<\/b> Kui seda m\u00f5ista kui s\u00fcsteemi v\u00f5imet vastata, kui esinevad v\u00f5rgu katkestused, jaotused v\u00f5i mingid t\u00f5rked \u2013 vigadetaluvus suureneb konsistentsimudeli v\u00e4henedes, kuna piisab sellest, et \u00fcks host p\u00fcsiks elus ja samal ajal edastaks m\u00f5ningaid andmeid. Eventual Consistency ei garanteeri andmete osas \u00fcldse mitte midagi \u2013 see v\u00f5ib olla mis tahes.<\/li>\n<li><b>Anomaaliad.<\/b> Samas, loomulikult suureneb anomaaliate arv. Strong Consistency puhul ei tohiks neid peaaegu \u00fcldse olla, samas kui Eventual Consistency puhul v\u00f5ivad need olla igasugused. Tekib k\u00fcsimus: miks inimesed valivad Eventual Consistency, kui see sisaldab anomaaliaid? Vastus peitub selles, et Eventual Consistency mudelid on rakendatavad ning anomaaliad eksisteerivad n\u00e4iteks l\u00fchikese aja jooksul; on v\u00f5imalik kasutada peamudi lugemiseks ja enam-v\u00e4hem j\u00e4rjepidevaid andmeid lugeda; sageli on v\u00f5imalus kasutada tugevaid j\u00e4rjepidevuse mudeleid. Praktikas toimib see ning sageli on anomaaliate arv ajaliselt piiratud.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP teoreem<\/h3>\n<p>\nKui n\u00e4ete s\u00f5nu j\u00e4rjepidevus, k\u00e4tte saadavus \u2013 mis teile p\u00e4he tuleb? \u00d5ige \u2013 CAP teoreem! Soovin n\u00fc\u00fcd m\u00fc\u00fcti hajutada\u2026 See ei ole minu teema \u2013 on Martin Kleppmann, kes on kirjutanud suurep\u00e4rase artikli, suurep\u00e4rase raamatu.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCAP-teoreem on 2000-ndatel formuleeritud p\u00f5him\u00f5te, mis k\u00e4sitleb j\u00e4rjepidevust, k\u00e4ttesaadavust ja jagunemisi: v\u00f5tke \u00fcksk\u00f5ik millised kaks, kolmandat ei saa valida. See oli teatud p\u00f5him\u00f5te, mis t\u00f5estati teoreemina m\u00f5ned aastat hiljem, seda tegid Gilbert ja Lynch. Seej\u00e4rel hakkas seda kasutama kui mantrana - s\u00fcsteemid jagunesid CA, CP, AP jne.<\/p>\n<p>Tegelikult t\u00f5estati see teoreem j\u00e4rgmiste olukordade jaoks... Esiteks k\u00e4sitleti k\u00e4ttesaadavust mitte kui pidevat v\u00e4\u00e4rtust nullist sajani (0 - s\u00fcsteem on 'surnud', 100 - reageerib kiiresti; me oleme harjunud seda nii vaatama), vaid kui algoritmi omadust, mis tagab, et k\u00f5ikide selle k\u00e4ivitamiste k\u00e4igus tagastatakse andmed.<\/p>\n<p>K\u00e4ivitamise ajast ei r\u00e4\u00e4gita \u00fcldse midagi! On olemas algoritm, mis tagastab andmed 100 aasta p\u00e4rast - t\u00e4iesti hea k\u00e4ttesaadavus-algoritm, mis on osa CAP-teoreemist.<br \/>\nTeiseks: teoreemi t\u00f5estamine toimus \u00fche ja sama v\u00f5tme v\u00e4\u00e4rtuste muutuste puhul, kusjuures need muutused on resizable rida. See t\u00e4hendab, et neid ei kasutata praktiliselt, kuna mudelid on muud Eventual Consistency, Strong Consistency (v\u00f5ib-olla).<\/p>\n<p>Mille see k\u00f5ik on? Ajavahemik CAP teoreemina, nagu see t\u00f5estatud on, ei ole praktiliselt kasutatav, harva kasutatakse. Teoreetilises vormis piirab see mingil moel k\u00f5ike. Tekib mingi p\u00f5him\u00f5te, mis on intuitiivselt \u00f5ige, kuid ei ole t\u00f5estatud.<\/p>\n<h3>Kaasne konsistents \u2013 k\u00f5ige tugevam mudel<\/h3>\n<p>\nSee, mis praegu toimub \u2013 on v\u00f5imalik saada k\u00f5ik kolm asja: Konsistents, Saadavus, kasutada Partitions. Eelk\u00f5ige kaasne konsistents \u2013 k\u00f5ige tugevam konsistentsi mudel, mis t\u00f6\u00f6tas isegi Partitions (s\u00fcsteemi katkestuste) olemasolul. Seet\u00f5ttu on see nii suur huvi ja me hakkasime sellega tegelema.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEsiteks lihtsustab see rakenduste arendajate t\u00f6\u00f6d. Eelk\u00f5ige on serveri suur toetus: kui k\u00f5ik kirjed, mis toimuvad \u00fche kliendi sees, garanteeritult j\u00f5uavad teise kliendi juurde \u00f5iges j\u00e4rjekorras. Teiseks talub see partitions.<\/p>\n<h3>MongoDB sisemised protsessid<\/h3>\n<p>\nKuna on aeg l\u00f5unat, liigume k\u00f6\u00f6ki. R\u00e4\u00e4gin s\u00fcsteemi mudelist, nimelt \u2013 mis on MongoDB neile, kes kuulevad sellisest andmebaasist esmakordselt.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (edasi \u2013 \u00abMongoDB\u00bb) on jaotatud s\u00fcsteem, mis toetab horisontaalset skaleerimist, st sharding'i; ja iga shard'i sees toetab ta ka andmete \u00fclem\u00e4\u00e4rasust, st replikatsiooni.<\/p>\n<p>Shardimine \u00abMongoDB's\u00bb (mitte-relationaalne andmebaas) teostab automaatset tasakaalustamist, st iga dokumendi kogu (v\u00f5i \u00abtabel\u00bb relationaalsete andmete terminoloogias) jagatakse t\u00fckkideks, ja server liigub need automaatselt shardi vahel.<\/p>\n<p>K\u00fcsimuste marsruuter, mis jaotab p\u00e4ringud, on kliendi jaoks teatud klient, mille kaudu ta t\u00f6\u00f6tab. Ta juba teab, kus ja millised andmed asuvad ning suunab k\u00f5ik p\u00e4ringud \u00f5igesse shardi.<\/p>\n<p>Veel \u00fcks oluline punkt: MongoDB on single master. On \u00fcks Primaarne \u2013 ta v\u00f5ib v\u00f5tta kirjeid, s\u00e4ilitades need v\u00f5tmed, mis tal endas on. Multi-master kirjutamist teha ei saa.<\/p>\n<p>Oleme v\u00e4lja andnud versiooni 4.2 \u2013 seal on ilmunud uusi huvitavaid asju. Esiteks, oleme lisanud Lucene \u2013 otsing \u2013 nimelt executable java otse \u00abMongo's\u00bb, ja seal on n\u00fc\u00fcd v\u00f5imalik teha otsingut l\u00e4bi Lucene, sama nagu \u00abElasticsearchis\u00bb.<\/p>\n<p>Ja tegime uue toote \u2013 Charts, mis on samuti saadaval \u201eAtlasel\u201d (meie enda Cloud \u201eMongo\u201d). Neil on Free Tier \u2013 saad sellega m\u00e4ngida. Charts meeldis mulle v\u00e4ga \u2013 andmete visualiseerimine on v\u00e4ga intuitiivne.<\/p>\n<h3>Koosseis Causal consistency<\/h3>\n<p>\nOlen kokku lugenud umbes 230 artiklit, mis on selles k\u00fcsimuses avaldatud \u2013 Leslie Lampertilt. Praegu jagan teiega oma m\u00e4lust m\u00f5ningaid neist materjalidest.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00f5ik algas Leslie Lamperti artiklist, mis ilmus 1970. aastatel. Nagu n\u00e4ete, j\u00e4tkatakse selle teema uurimist siiani. Praegu on Causal consistency taas t\u00e4helepanu keskmes seoses jaotatud s\u00fcsteemide arenguga.<\/p>\n<h3>Piirangud<\/h3>\n<p>\nMillised piirangud on olemas? See on tegelikult \u00fcks peamisi punkte, sest tootmiss\u00fcsteemide kehtestatud piirangud erinevad oluliselt akadeemilistes artiklites esitatud piirangutest. Need on sageli \u00fcsna kunstlikud.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Esiteks, \u201eMongoDB\u201d \u2013 see on single master, nagu ma juba \u00fctlesin (see lihtsustab asju oluliselt).<\/li>\n<li>Arvame, et s\u00fcsteem peaks toetama umbes 10 000 shard'i. Me ei saa teha m\u00f5ningaid arhitektuurilisi otsuseid, mis selgelt piiraksid seda v\u00e4\u00e4rtust.<\/li>\n<li>Meil on pilv, kuid me arvame, et inimesel peaks olema v\u00f5imalus, kui ta laadib alla binaarfaili, k\u00e4ivitab selle oma s\u00fclearvutis ja k\u00f5ik t\u00f6\u00f6tab suurep\u00e4raselt.<\/li>\n<li>Me arvame, et Researchis kasutatakse harva: v\u00e4lised kliendid v\u00f5ivad teha, mida iganes tahavad. \u00abMongoDB\u00bb on avatud l\u00e4htekoodiga. Seega v\u00f5ivad kliendid olla sedav\u00f5rd nutikad, halvad \u2013 v\u00f5ivad soovida k\u00f5ike purustada. Me arvame, et v\u00f5ib esineda byzantilisi vigu.<\/li>\n<li>V\u00e4liste klientide jaoks, kes on v\u00e4ljaspool perimeetrit \u2013 oluline piirang: kui see funktsioon on v\u00e4lja l\u00fclitatud, siis ei tohiks esineda mingeid j\u00f5udluse langusi.<\/li>\n<li>Veel \u00fcks punkt \u2013 t\u00e4iesti antiakadeemiline: varasemate ja tulevaste versioonide \u00fchilduvus. Vanad draiverid peavad toetama uusi uuendusi ning andmebaas peab toetama vanu draivereid.<\/li>\n<\/ul>\n<p>\n\u00dcldiselt seab see k\u00f5ik piiranguid.<\/p>\n<h3>Causal consistency komponendid<\/h3>\n<p>\nKannan r\u00e4\u00e4gin m\u00f5nest komponendist. Kui vaadata \u00fcldiselt Causal consistency, v\u00f5ib eristada plokke. Valisime v\u00e4lja t\u00f6\u00f6d, mis kuuluvad teatud plokkidesse: Dependency Tracking, kellade valimine, kuidas neid kellasid omavahel s\u00fcnkroonida ja kuidas me tagame turvalisuse \u2013 see on ligikaudne plaan, millest ma r\u00e4\u00e4gin:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>T\u00e4ielik s\u00f5ltuvuste j\u00e4lgimine (Full Dependency Tracking)<\/h3>\n<p>\nMiks see vajalik on? Selleks, et kui andmed replitseeritakse \u2013 igal kirjal, igal andme muutmisel oleks teave selle kohta, milliseid muudatusi need s\u00f5ltuvad. K\u00f5ige esmane ja naiivsem muudatus on see, et iga s\u00f5num, mis sisaldab kirja, sisaldab teavet eelnevate s\u00f5numite kohta:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles n\u00e4ites on sulgudes number kirje number. M\u00f5nikord edastatakse need kirjed v\u00e4\u00e4rtustega isegi t\u00e4ielikult, m\u00f5nikord edastatakse mingid versioonid. Oluline on see, et iga muudatus sisaldab teavet eelneva kohta (ilmselt kannab seda endas).<\/p>\n<p>Miks me otsustasime mitte kasutada sellist l\u00e4henemist (t\u00e4ielik j\u00e4lgimine)? Ilmselgelt, sest see l\u00e4henemine pole praktiline: iga muutus sotsiaalv\u00f5rgustikus s\u00f5ltub k\u00f5igist varasematest muudatustest selles sotsiaalv\u00f5rgustikus, edastades n\u00e4iteks \"Facebooki\" v\u00f5i \"VKontakte\" igas uuenduses. Siiski on palju uuringuid, mis k\u00e4sitlevad just Full Dependency Tracking \u2013 see on ennetav s\u00f5ltuvuste j\u00e4lgimine, mis m\u00f5nes olukorras t\u00f5esti toimib.<\/p>\n<h3>Selge s\u00f5ltuvuste j\u00e4lgimine (Explicit Dependency Tracking)<\/h3>\n<p>\nJ\u00e4rgmine on piiratum. Siin k\u00e4sitletakse samuti informatsiooni edastamist, kuid ainult seda, mis on selgelt s\u00f5ltuv. Mida miski s\u00f5ltub, m\u00e4\u00e4rab tavaliselt rakendus. Andmeid replikatsiooni k\u00e4igus v\u00e4ljastatakse ainult vastuseid, kui eelnevad s\u00f5ltuvused on rahuldatud, st n\u00e4htavaks tehtud. Just nii t\u00f6\u00f6tab Causal consistency.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee n\u00e4eb, et sissekanne 5 s\u00f5ltub sissekanne 1, 2, 3, 4 \u2013 seet\u00f5ttu ootab ta, kuni klient p\u00e4\u00e4seb juurde nendele muudatustele, mida Penny juurdep\u00e4\u00e4su m\u00e4\u00e4ruse alusel tehti, kui k\u00f5ik eelnevad muudatused on juba andmebaasis l\u00e4bitud.<\/p>\n<p>See, we are not satisfied with this either, because there is still too much information, and it will slow things down. There is another approach\u2026<\/p>\n<h3>Lamporti kella (Lamport Clock)<\/h3>\n<p>\nNeedless to say, they are very old. Lamport Clock implies that these dependencies are compressed into a scalar function known as Lamport Clock.<\/p>\n<p>A scalar function is an abstract number. It is often referred to as logical time. With each event, this counter increases. The counter known to the process sends every message. It is clear that the processes can be desynchronized, having completely different times. Nevertheless, this message exchange somehow balances the clocks. What happens in this case?<\/p>\n<p>Ma jagasin selle suure shard'i kahte ossa, et oleks selge: Friends v\u00f5ivad elada \u00fches s\u00f5lmes, mis sisaldab osa kollektsioonist, samas kui Feed \u2013 teises s\u00f5lmes, kus hoitakse samuti osa sellest kollektsioonist. Kuidas nad siis j\u00e4rjekorda ei satu? Esiteks \u00fctleb Feed: \u201eReplitseeriti\u201d, ja seej\u00e4rel \u2013 Friends. Kui s\u00fcsteem ei tagada, et Feed ei kuvata, kuni Friends kollektsioonis olevad s\u00f5ltuvused on samuti esitatud, tekib meil just see olukord, millest ma r\u00e4\u00e4kisin.<\/p>\n<p>Te n\u00e4ete, kuidas Feed'i loogiline loendur t\u00f5useb:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega on selle Lamport Clock'i ja Causal consistency (Lamport Clock'i kaudu seletatud) peamine omadus j\u00e4rgmine: kui meil on s\u00fcndmused A ja B, ja s\u00fcndmus B s\u00f5ltub s\u00fcndmusest A *, siis j\u00e4reldub, et Event A loogiline aeg on v\u00e4iksem kui Event B loogiline aeg.<\/p>\n<p><i>* M\u00f5nikord \u00f6eldakse ka, et A juhtus enne B, st A juhtus enne B \u2013 see on suhe, mis osaliselt j\u00e4rjestab kogu s\u00fcndmuste kogumi, mis kunagi toimus.<\/i><\/p>\n<p>Vale suunas on vale. See on tegelikult \u00fcks peamisi Lamporti kella miinuseid \u2013 osaline j\u00e4rjestus. Seal on m\u00f5isted samasuguste s\u00fcndmuste kohta, mis t\u00e4hendab, et ei (A juhtus enne B), ega (A juhtus p\u00e4rast B). N\u00e4iteks v\u00f5ib tuua paralleelse s\u00f5bra lisamise, n\u00e4iteks Leonard lisab Sheldonit s\u00f5braks.<br \/>\nSee ongi omadus, millega sageli t\u00f6\u00f6delda Lamporti kelladega: vaadatakse just funktsiooni ja sellest tehakse j\u00e4reldus \u2013 v\u00f5ib-olla on need s\u00fcndmused omavahel seotud. Sest \u00fches suunas on see t\u00f5si: kui LogicalTime A on v\u00e4iksem kui LogicalTime B, siis B ei saa juhtuda enne A; aga kui on suurem, siis v\u00f5ib juhtuda.<\/p>\n<h3>Vektorkellad (Vector Clock)<\/h3>\n<p>\nLamporti kella loogiline areng on Vektorkellad. Need erinevad seet\u00f5ttu, et igas siin olevas s\u00f5lmes on oma, eraldi kell, ja need edastatakse vektorina.<br \/>\nAntud juhul n\u00e4ete, et vektori nullindeks vastab Feedile ja vektori esimene indeks s\u00f5pradele (iga\u00fche jaoks nendes s\u00f5lmedes). Ja n\u00fc\u00fcd hakkavad need suurenema: nullindeksi \"Feed\" v\u00e4\u00e4rtus suureneb kirjutades \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMiks on vektorkellad paremad? Sest need aitavad m\u00f5ista, millised s\u00fcndmused toimuvad samaaegselt ja millal need eri noodides aset leiavad. See on v\u00e4ga oluline sharding-s\u00fcsteemi, nagu \"MongoDB\", jaoks. Siiski ei valinud me seda, kuigi see oleks olnud suurep\u00e4rane lahendus ja toimib suurep\u00e4raselt, oleks see meile t\u00f5en\u00e4oliselt sobinud\u2026<\/p>\n<p>Kui meil on 10 tuhat shard'i, ei saa me edastada 10 tuhat komponenti, isegi kui me tihendame v\u00f5i leiutame midagi muud \u2013 kasulik koormus on siiski mitu korda v\u00e4iksem kui kogu selle vektori maht. Seet\u00f5ttu, s\u00fcdamevaluga ja hambaid peedes, loobusime sellest l\u00e4henemisviisist ja l\u00e4ksime edasi teise juurde.<\/p>\n<h3>Spanner TrueTime. Aatomikellad<\/h3>\n<p>\nMa \u00fctlesin, et tuleb jutt \"Spannerist\". See on \u00e4ge asi, otse 21. sajandist: aatomikellad, GPS-s\u00fcnkroniseerimine.<\/p>\n<p>Milline on idee? \"Spanner\" on Google'i s\u00fcsteem, mis hiljuti sai isegi inimestele k\u00e4ttesaadavaks (nad lisasid sellele SQL-i). Igal tehingul on seal mingi aja m\u00e4rgistus. Kuna aeg on s\u00fcnkroniseeritud*, saab igale s\u00fcndmusele m\u00e4\u00e4rata kindla aja \u2013 aatomikelladel on ooteaeg, p\u00e4rast mida toimub kindel muudatus ajas.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega tagab lihtsalt andmebaasi kirjutamine ja teatud aja ootamine automaatselt s\u00fcndmuse serialiseeritavuse. Neil on k\u00f5ige tugevam j\u00e4rjepidevuse mudel, mida \u00fcldse kujutada v\u00f5ib \u2013 see on v\u00e4line j\u00e4rjepidevus.<\/p>\n<p>* See on p\u00f5hiprobleem Lamporti kellade puhul \u2013 need ei ole kunagi s\u00fcnkroonitud jaotatud s\u00fcsteemides. Need v\u00f5ivad erineda isegi NTP olemasolul, t\u00f6\u00f6tavad endiselt mitte eriti h\u00e4sti. \"Spanner\" omab aatomikellasid ja s\u00fcnkroniseerimist, tundub, et mikrosekundite t\u00e4psusega.<\/p>\n<p>Miks me ei valinud? Me ei eelda, et meie kasutajatel on sisseehitatud aatomikellad. Kui need kunagi tulevad, olles sisseehitatud igasse s\u00fclearvutisse, on olemas mingi super\u00e4ge GPS-s\u00fcnkroniseerimine \u2013 siis jah... Praegu on parim, mis v\u00f5imalik \u2013 \"Amazon\", baasjaamad \u2013 f\u00e4nnide jaoks... Seega kasutasime teisi kellasid.<\/p>\n<h3>H\u00fcbriidkell (Hybrid Clock)<\/h3>\n<p>\nSee on tegelikult see, mis tiksub \"MongoDB\"-s, pakkudes kausaalset j\u00e4rjepidevust. Miks nad on h\u00fcbriidsed? H\u00fcbriid on skalaarsed v\u00e4\u00e4rtused, kuid koosneb kahest komponendist:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Esimene on unix\u2019i ajastu (kui palju sekundeid on m\u00f6\u00f6dunud \"arvutimaailma algusest\").<\/li>\n<li>Teiseks \u2013 teatav inkrement, samuti 32-bitine unsigned int.<\/li>\n<\/ul>\n<p>\nSee ongi k\u00f5ik. On olemas l\u00e4henemine: osa, mis vastutab aja eest, s\u00fcnkroonib pidevalt kelladega; iga kord, kui toimub uuendus, s\u00fcnkroonitakse see osa kelladega ja tulemuseks on, et aeg on enam-v\u00e4hem \u00f5ige, samas kui inkrement v\u00f5imaldab eristada s\u00fcndmusi, mis toimusid samal hetkel.<\/p>\n<p>Miks on see oluline 'MongoDB'-le? Sest see v\u00f5imaldab teha mingit t\u00fc\u00fcpi varukoopiaid kindlal ajahetkel, st s\u00fcndmus indekseeritakse ajaga. See on oluline, kui on vaja teatud s\u00fcndmusi; andmebaasi jaoks on s\u00fcndmused andmebaasis toimunud muudatused, mis on toimunud teatud aja jooksul.<\/p>\n<p>Ma \u00fctlen teile vaid k\u00f5ige olulisema p\u00f5hjuse (palun, \u00e4rge \u00f6elge seda kellelegi)! Me tegime seda, kuna just niimoodi n\u00e4evad v\u00e4lja j\u00e4rjestatud, indekseeritud andmed MongoDB OpLog-is. OpLog on andmestruktuur, mis sisaldab k\u00f5iki muudatusi andmebaasis: need l\u00e4hevad esmalt OpLog-i ja seej\u00e4rel rakendatakse neid juba Storage'ile, kui tegemist on replikatsioonitud andmete v\u00f5i sharding'iga.<\/p>\n<p>See oli peamine p\u00f5hjus. On olemas ka praktilised n\u00f5uded andmebaasi arendusele, mis t\u00e4hendab, et see peab olema lihtne \u2013 v\u00f5imalikult v\u00e4he koodi ja v\u00f5imalikult v\u00e4he katki minevaid asju, mida tuleb \u00fcmber kirjutada ja testida. Et meie OpLogid osutusid h\u00fcbriidh\u00e4\u00e4lte poolt indekseerituks, aitas see palju ja v\u00f5imaldas teha \u00f5iged valikud. See t\u00f5eliselt tasus end \u00e4ra ja t\u00f6\u00f6tas kuidagi maagiliselt, juba esimesel protot\u00fc\u00fcbil. Oli t\u00f5eliselt \u00e4ge!<\/p>\n<h3>Kellade s\u00fcnkroniseerimine<\/h3>\n<p>\nTeaduslikus kirjanduses on kirjeldatud mitmeid kellade s\u00fcnkroniseerimise meetodeid. R\u00e4\u00e4gin s\u00fcnkroniseerimisest siis, kui meil on kaks erinevat shard'i. Kui on \u00fcks replika komplekt \u2013 ei ole mingit s\u00fcnkroniseerimist vaja: see on '\u00fche meistri' situatsioon; meil on OpLog, kuhu k\u00f5ik muudatused satuvad \u2013 sel juhul on k\u00f5ik juba j\u00e4rjestatud 'OpLog'is'. Kuid kui meil on kaks erinevat shard'i, on siin aja s\u00fcnkroniseerimine oluline. Siin aitasid meile vektorkellad rohkem! Kuid meil neid ei ole.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeine sobiv variant on \u201eS\u00fcdamel\u00f6\u00f6gid\u201c (Heartbeats). Sa saad jagada teatud signaale, mis toimuvad igas aja\u00fchikus. Kuid \u201eS\u00fcdamel\u00f6\u00f6gid\u201c on liiga aeglased, me ei saa oma kliendile latentsust tagada.<\/p>\n<p>T\u00f5eline aeg on loomulikult imeasi. Kuid see on t\u00f5en\u00e4oliselt tulevik\u2026 Kuigi \u201eAtlases\u201c on juba v\u00f5imalik kasutada kiireid \u201eAmazoni\u201c ajas\u00fcnkronisaatoreid. Kuid see ei ole k\u00f5igile kergesti k\u00e4ttesaadav.<\/p>\n<p>Kahese suhtlemine t\u00e4hendab, et k\u00f5ik s\u00f5numid sisaldavad aega. See on umbes see, mida me kasutame. Iga s\u00f5num node'ide vahel, draiver, router, andme-node, absoluutselt k\u00f5ik MongoDB jaoks \u2013 need on mingid elemendid, andmebaasi komponendid, mis sisaldavad endas kellasid, mis kulgevad. Igal pool on h\u00fcbriidaja v\u00e4\u00e4rtus, see edastatakse. 64 bitti? See on v\u00f5imalik, see t\u00f6\u00f6tab.<\/p>\n<h3>Kuidas see k\u00f5ik koos t\u00f6\u00f6tab?<\/h3>\n<p>\nSiin arenen lihtsustatult \u00fchte replikatsioonisetti. On olemas Primary ja Secondary. Secondary teeb replikatsiooni ja ei ole alati t\u00e4ielikult s\u00fcnkroonitud Primaryga.<\/p>\n<p>Tegemist on aja v\u00e4\u00e4rtuse sisestamisega 'Prymerys'. See sisestamine suurendab sisemist loendurit kuni 11, kui see on maksimaalne. Vastasel juhul kontrollib see tunni v\u00e4\u00e4rtusi ja s\u00fcnkroniseerib need, kui tunni v\u00e4\u00e4rtused on suuremad. See v\u00f5imaldab korraldada ajaliselt.<\/p>\n<p>P\u00e4rast salvestamist toimub oluline hetk. Tunnid 'MongoDBs' suurenevad ainult siis, kui salvestus toimub 'OpLogis'. Just see on s\u00fcndmus, mis muudab s\u00fcsteemi seisundit. K\u00f5ikides klassikalistes artiklites loetakse s\u00fcndmuseks s\u00f5numi j\u00f5udmist nodi: s\u00f5num on saabunud \u2013 see t\u00e4hendab, et s\u00fcsteem on muutnud oma seisundit.<\/p>\n<p>See tuleneb sellest, et uurimise k\u00e4igus ei saa alati aru, kuidas seda s\u00f5numit t\u00f5lgendatakse. Me teame t\u00e4pselt, et kui see ei ole 'OpLogis' kajastatud, siis seda ei t\u00f5lgendata kuidagi, ja s\u00fcsteemi seisundi muutmine on ainult salvestamine 'OpLogisse'. See lihtsustab meie jaoks k\u00f5ike: nii mudelit kui ka v\u00f5imalust korraldada \u00fches replikas komplektis, ja palju muud kasulikku.<\/p>\n<p>Tagastatakse v\u00e4\u00e4rtus, mis on juba salvestatud \"Oplogi\" \u2013 me teame, et \"Oplogis\" on see v\u00e4\u00e4rtus olemas ja selle aeg on 12. N\u00fc\u00fcd, \u00fctleme, et lugemine algab teiselt s\u00f5lmpunktilt (Secondary) ja ta edastab juba afterClusterTime s\u00f5numis. Ta \u00fctleb: \"Mul on vaja k\u00f5ike, mis toimus v\u00e4hemalt p\u00e4rast 12 v\u00f5i t\u00e4pselt kell kaksteist\" (vt \u00fclalolevat joonist).<\/p>\n<p>See on see, mida nimetatakse Causal a consistent (CAT). On selline m\u00f5isted teoorias, et see on mingi ajas l\u00f5ige, mis on enda jaoks j\u00e4rjepidev. Antud juhul v\u00f5ib \u00f6elda, et see on s\u00fcsteemi olek, mida j\u00e4lgiti ajahetkel 12.<\/p>\n<p>Praegu pole siin veel midagi, sest see simuleerib olukorda, kus on vajalik, et Secondary kopeeriks andmeid Primarylt. Ta ootab... Ja n\u00fc\u00fcd on andmed saabunud \u2013 tagastab tagasi need v\u00e4\u00e4rtused.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii umbes k\u00f5ik t\u00f6\u00f6tab. Peaaegu.<\/p>\n<p>Mis t\u00e4hendab \u00abpeaaegu\u00bb? Oletame, et on mingisugune inimene, kes on lugenud ja aru saanud, kuidas see k\u00f5ik t\u00f6\u00f6tab. Ta m\u00f5istab, et iga kord toimub ClusterTime, see uuendab sisemisi loogilisi kelli, ja siis j\u00e4rgmine kirje suurendab seda \u00fche v\u00f5rra. See funktsioon koosneb 20 reast. Oletame, et see inimene edastab maksimaalselt suure 64-bitise arvu, miinus \u00fcks.<\/p>\n<p>Miks \u00abmiinus \u00fcks\u00bb? Sest et sisemised kellad seadistatakse sellele v\u00e4\u00e4rtusele (ilmne, et see on k\u00f5ige suurem v\u00f5imalik ja suurem praegusest ajast), siis toimub kirje \u00abOpilogisse\u00bb, ja kellad suurenevad veel \u00fche v\u00f5rra \u2013 ning seal on juba maksimaalne v\u00e4\u00e4rtus (seal on lihtsalt k\u00f5ik \u00fched, enam ei ole kuhugi minna, unsaint int\u2019id).<\/p>\n<p>Selge, et p\u00e4rast seda muutub s\u00fcsteem t\u00e4iesti k\u00e4ttesaamatuks. Seda saab ainult v\u00e4ljastada, puhastada \u2013 palju k\u00e4sit\u00f6\u00f6d. T\u00e4ielik availability:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa kui see veel kuhugi replitseeritakse, siis kukub kogu klaster lihtsalt kokku. Absoluutselt vastuv\u00f5etamatu olukord, mille iga inimene saab v\u00e4ga kiiresti ja lihtsalt korraldada! Seet\u00f5ttu pidasime seda momenti \u00fcheks k\u00f5ige olulisemaks. Kuidas seda \u00e4ra hoida?<\/p>\n<h3>Meie tee on allkirjastada clusterTime<\/h3>\n<p>\nNii see edastatakse s\u00f5numis (kuni sinise tekstini). Kuid me hakkasime ka allkirja genereerima (sinine tekst):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAllkiri genereeritakse v\u00f5tme abil, mis hoitakse andmebaasis, kaitstud perimeetriga; see genereeritakse ja uuendatakse (kasutajad ei n\u00e4e seda). Genereeritakse hash ning iga s\u00f5num allkirjastatakse loomise hetkel ja valideeritakse vastuv\u00f5tmise hetkel.<br \/>\nInimestel v\u00f5ib tekkida k\u00fcsimus: \u201eKui palju see k\u00f5ik aeglustab?\u201d Ma \u00fctlesin, et see peab kiiresti t\u00f6\u00f6tama, eriti kui seda omadust pole.<\/p>\n<p>Mida t\u00e4hendab Causal consistency kasutamine antud juhul? See n\u00e4itab afterClusterTime parameetrit. Ilma selleta edastatakse v\u00e4\u00e4rtusi igal juhul. Gossiping, alates versioonist 3.6, t\u00f6\u00f6tab alati.<\/p>\n<p>Kui me j\u00e4tame pideva allkirjade genereerimise, siis see aeglustab s\u00fcsteemi isegi omaduse puudumisel, mis ei vasta meie l\u00e4henemistele ja n\u00f5udmistele. Ja mida me tegime?<\/p>\n<h3>Tee seda kiiresti!<\/h3>\n<p>\nPiisavalt lihtne asi, kuid trikk on huvitav \u2013 jagan, v\u00f5ib-olla on kellelegi huvitav.<br \/>\nMeil on hash, kus salvestatakse allkirjastatud andmed. K\u00f5ik andmed l\u00e4hevad l\u00e4bi cache'i. Cache ei allkirjasta mitte kindlat aega, vaid Range'i. Kui tuleb mingi v\u00e4\u00e4rtus, genereerime Range'i, varjame viimased 16 bitti ja allkirjastame selle v\u00e4\u00e4rtuse:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSaades sellise allkirja, kiirendame s\u00fcsteemi (tinglikult) 65 000 korda. See t\u00f6\u00f6tab suurep\u00e4raselt: kui katseid tehti \u2013 siis kahanes aeg t\u00f5eliselt 10 000 korda, kui meil oli j\u00e4rjestikune uuendus. Selge on, et kui nad on erinevas j\u00e4rjekorras, siis see ei toimi. Kuid enamikus praktilistes juhtumites t\u00f6\u00f6tab see. Range'i allkirja kombinatsioon koos allkirjaga aitas lahendada turvalisuse probleemi.<\/p>\n<h3>Mida me \u00f5ppisime?<\/h3>\n<p>\n\u00d5ppetunnid, mille me sellest saime:<\/p>\n<ul>\n<li>Tuleb lugeda materjale, lugusid, artikleid, sest meil on palju huvitavat. Kui t\u00f6\u00f6tame mingi funktsiooni kallal (eriti n\u00fc\u00fcd, kui me tegime tehinguid jne), tuleb lugeda, aru saada. See v\u00f5tab aega, kuid see on tegelikult v\u00e4ga kasulik, sest saab aru, kus me oleme. Me ei ole nagu midagi uut v\u00e4lja m\u00f5elnud \u2013 lihtsalt v\u00f5tsime koostisosad.\n<p>K\u00fcsimus on \u00fcldiselt m\u00f5tteviisi erinevuses, kui tegemist on akadeemilise konverentsiga (n\u00e4iteks 'Sigmon') \u2013 seal keskendutakse uutele ideedele. Mis on meie algoritmi uuenduslik? Siin ei ole suurt uudset. Uudsus seisneb pigem selles, kuidas me kokku segasime olemasolevaid l\u00e4henemisviise. Seet\u00f5ttu tuleb esmalt lugeda klassikuid, alustades Lampardist.<\/li>\n<li>Tootmisprotsessis on t\u00e4iesti teised n\u00f5udmised. Olen kindel, et paljud teist ei tegele mitte \"sf\u00e4\u00e4riliste\" andmebaasidega abstraktses vaakumis, vaid t\u00f5eliste, normaalse elu probleemidega, kus esinevad availability, latency ja talitlush\u00e4ired.<\/li>\n<li>Viimane \u2013 see, et pidime arvesse v\u00f5tma erinevaid ideid ja kombineerima mitmeid t\u00e4iesti erinevaid artikleid \u00fchte l\u00e4henemisviisi. N\u00e4iteks allkirjastamise idee p\u00e4rineb artiklist, mis k\u00e4sitles Paxos protokolli, mis on m\u00f5eldud mitte-b\u00fctsantslike veakindlate s\u00fcsteemide jaoks autoriseerimisprotokollis, b\u00fctsantslike jaoks aga autoriseerimisprotokollist v\u00e4ljaspool\u2026 \u00dches\u00f5naga, just seda me l\u00f5puks ka tegime.\n<p>Siin pole t\u00f5esti midagi uut! Aga kui me k\u00f5ike koos segame... See on umbes sama, nagu \u00f6elda, et Olivier salati retsept on m\u00f5ttetu, kuna munad, majonees ja kurgid on juba v\u00e4lja m\u00f5eldud... See on umbes sama lugu.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSellega l\u00f5petan. Ait\u00e4h!<\/p>\n<h3>K\u00fcsimused<\/h3>\n<p>\n<b>K\u00fcsimus publikust (edasi \u2013 K):<\/b> \u2013 Ait\u00e4h, Mihhail esitluse eest! Aeg teema on huvitav. Te kasutate Gossiping. \u00dctlesite, et k\u00f5igil on oma aeg, k\u00f5ik tunnevad oma lokaalset aega. Ma sain aru, et meil on draiver \u2013 kliente koos draiveritega v\u00f5ib olla palju, ka query-planner\u2019eid on palju, shard'eid on ka palju\u2026 Kuhu meie s\u00fcsteem j\u00f5uab, kui \u00e4kki tekib lahknevus: keegi arvab, et ta on minut aega ees, keegi \u2013 minut aega taga? Kus me oleme?<\/p>\n<p><b>MT:<\/b> \u2013 Tegelikult v\u00e4ga hea k\u00fcsimus! Ma tahtsin just shardeist r\u00e4\u00e4kida. Kui ma \u00f5igesti aru saan k\u00fcsimusest, siis meil on selline olukord: shard 1 ja shard 2, lugemine toimub nende kahe shard'i pealt \u2013 neil on lahknevus, nad ei suhtle omavahel, kuna aeg, mida nad tunnevad, on erinev, eriti aeg, mis nende logides eksisteerib.<br \/>\nOletame, et shard 1 tegi miljon kirjet, shard 2 ei teinud \u00fcldse midagi, ja p\u00e4ring tuli kahele shardi. Ja esimesel on afterClusterTime \u00fcle miljoni. Sellises olukorras, nagu ma selgitasin, shard 2 ei vasta kunagi.<\/p>\n<p><b>K:<\/b> \u2013 Ma tahtsin teada, kuidas nad s\u00fcnkroneeruvad ja valitakse \u00fcks loogiline aeg?<\/p>\n<p><b>MT:<\/b> \u2013 V\u00e4ga lihtsalt s\u00fcnkroneeritakse. Shard, kui sellele tuleb afterClusterTime ja ta ei leia aega 'Optlog'is \u2013 algatab no approved. See t\u00e4hendab, et ta t\u00f5stab oma aega k\u00e4sitsi sellele v\u00e4\u00e4rtusele. See n\u00e4itab, et tal ei ole s\u00fcndmusi, mis sellele p\u00e4ringule vastavad. Ta loob selle s\u00fcndmuse kunstlikult ja muutub seel\u00e4bi Causal Consistent.<\/p>\n<p><b>K:<\/b> \u2013 Aga kui tema juurde p\u00e4rast seda veel j\u00f5uavad mingid s\u00fcndmused, mis kuskil v\u00f5rgus kaduma l\u00e4ksid?<\/p>\n<p><b>MT:<\/b> \u2013 Shard on kujundatud nii, et need ei j\u00f5ua enam, kuna see on single master. Kui ta on juba kirja pannud, siis need ei tule enam ja on p\u00e4rast. Ei saa juhtuda nii, et kuskil midagi kinni j\u00e4\u00e4b, siis ta teeb no write ja p\u00e4rast j\u00f5uavad need s\u00fcndmused \u2013 ja Causal consistency on rikutud. Kui ta teeb no write, siis k\u00f5ik peavad edasi j\u00f5udma (ta ootab neid).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>K:<\/b> \u2013 Mul on m\u00f5ned k\u00fcsimused j\u00e4rjekordade kohta. Causal consistency eeldab, et on olemas teatud tegevuste j\u00e4rjekord, mida tuleb t\u00e4ita. Mis juhtub, kui meil kaob \u00fcks pakett? Siin tuli 10., 11.. 12. kaob \u00e4ra, samas kui k\u00f5ik teised ootavad, kuni see t\u00e4idetakse. Ja \u00e4kki sureb meie masin, me ei saa midagi teha. Kas on olemas maksimaalne j\u00e4rjekorra pikkus, mis akumuleerub, enne kui see t\u00e4idetakse? Milline fataalne viga toimub, kui m\u00f5ni seisund kaob? Eriti kuna me salvestame, et on olemas mingi eelnevalt m\u00e4\u00e4ratud seisund, millelt me peame kuidagi tuginema? Ja sellest ei saadudki tuge!<\/p>\n<p><b>MT:<\/b> \u2013 Samuti suurep\u00e4rane k\u00fcsimus! Mida me teeme? MongoDB-s on olemas kvoorumite kirjutamise ja lugemise kontseptsioon. Millal v\u00f5ib s\u00f5num kaduma minna? Kui kirjutamine ei ole kvoorum v\u00f5i kui lugemine ei ole kvoorum (ka see v\u00f5ib osutuda mingiks pr\u00fcgiseks).<br \/>\nSeoses Causal consistency oleme l\u00e4bi viinud ulatusliku eksperimentaalse kontrolli, mille tulemusena selgus, et juhul, kui kirjutamised ja lugemised on kvoorumita, tekivad Causal consistency rikkumised. Just nii, nagu te \u00fctlete!<\/p>\n<p>Meie soovitus: kasutada v\u00e4hemalt kvoorumi lugemist, kui tegeletakse Causal consistency'ga. Sel juhul ei kao mitte midagi, isegi kui kvoorumi kirjutamine kaob... See on ortogonaalne olukord: kui kasutaja ei soovi, et andmed kaoksid, tuleb kasutada kvoorumi kirjutamist. Causal consistency ei anna p\u00fcsivuse garantiid. P\u00fcsivuse garantii annab replikatsioon ja replikatsiooniga seotud masinav\u00e4rk.<\/p>\n<p><b>K:<\/b> \u2013 Kui me loome instantsi, mida meie \u0161ardid teostavad (mitte master, vaid slave vastavalt), toetub see oma masina unix-ajale v\u00f5i \u00abmeistri\u00bb ajale; s\u00fcnkroniseeritakse esmakordselt v\u00f5i perioodiliselt?<\/p>\n<p><b>MT:<\/b> \u2013 Praegu selgitan. \u0160ard (tlk. horisontaalne partitsioon) \u2013 seal on alati Primaarne. Ja \u0161ardis v\u00f5ib olla \u00abmeister\u00bb ning v\u00f5ivad olla replikatsioonid. Kuid \u0161ard toetab alati kirjutamist, sest see peab toetama mingit domeeni (\u0161ardis on Primaarne).<\/p>\n<p><b>K:<\/b> \u2013 Nii et k\u00f5ik s\u00f5ltub t\u00e4ielikult \u00abmeistrist\u00bb? Kas alati kasutatakse \u00abmeistri\u00bb aega?<\/p>\n<p><b>MT:<\/b> \u2013 Jah. V\u00f5ib \u00f6elda, et kell tiksub, kui toimub kirjutamine \u00abmeistrisse\u00bb, \u00abOplogisse\u00bb.<\/p>\n<p><b>K:<\/b> \u2013 Meil on klient, kellel on \u00fchendus, ja tal ei ole vaja ajast midagi teada?<\/p>\n<p><b>MT:<\/b> \u2013 Ei ole vaja midagi teada! Kui r\u00e4\u00e4kida, kuidas see kliendil t\u00f6\u00f6tab: kliendil, kui ta soovib kasutada Causal consistency, peab ta avama seansi. Praegu on seal k\u00f5ik: ka tehingud seansis ja retrieve a rights... Seanss on loogiliste s\u00fcndmuste j\u00e4rjestamine, mis toimub kliendiga.<\/p>\n<p>Kui ta avab selle seansi ja \u00fctleb, et soovib Causal consistency (kui seanss toetab Causal consistency vaikimisi), siis k\u00f5ik t\u00f6\u00f6tab automaatselt. Juhtimisseade salvestab selle aja ja suurendab seda, kui saab uue s\u00f5numi. Ta m\u00e4letab, millise vastuse eelmisel serverilt saadi, mis andmed tagastati. J\u00e4rgmine p\u00e4ring sisaldab afterCluster (\"aeg, mis on suurem kui see\").<\/p>\n<p>Kliendil ei ole vaja t\u00e4iesti midagi teada! See on tema jaoks t\u00e4iesti l\u00e4bipaistmatu. Kui inimesed kasutavad neid funktsioone, mida see v\u00f5imaldab? Esiteks, saab ohutult lugeda secondaries: saab kirjutada Primary'le ja lugeda geograafiliselt replitseeritud secondaries'ilt ning olla kindel, et see toimib. Samal ajal saab seanss, mis on salvestatud Primary'le, edastada isegi Secondary'le, st saab kasutada mitte \u00fchte seanssi, vaid mitu.<\/p>\n<p><b>K:<\/b> \u2013 Teema Eventual consistency on tihedalt seotud uue taseme Compute science'iga \u2013 andmet\u00fc\u00fcpidega CRDT (Conflict-free Replicated Data Types). Kas olete kaalunud nende andmet\u00fc\u00fcpide integreerimist andmebaasi ja mida sellest arvate?<\/p>\n<p><b>MT:<\/b> \u2013 Hea k\u00fcsimus! CRDT on m\u00f5istlik andmevahetuse konfliktide korral: MongoDB-s on see \u00fcksik meistreid.<\/p>\n<p><b>K:<\/b> \u2013 Mul on devopsidelt k\u00fcsimus. T\u00f5elises maailmas esinevad sellised jezuidlikud olukorrad, kus toimub byzantine failure ja kurjad inimesed kaitstud perimeetris hakkavad protokolli segama, saates spetsiaalselt koostatud pakette?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Kurjad inimesed perimeetris on nagu trooja hobune! Perimeetris olevad kurjad inimesed v\u00f5ivad teha palju halbu asju.<\/p>\n<p><b>K:<\/b> \u2013 Loomulikult on vale j\u00e4tta serverisse, \u00fctleme nii, auk, mille kaudu saab l\u00e4bi lasta elevantide loomaaeda ja kogu klastrit igaveseks kokku varisemise\u2026 K\u00e4esolevaks taastamiseks on vajalik aeg\u2026 See on pehmelt \u00f6eldes vale. Teisest k\u00fcljest, huvitav on, et p\u00e4riselus, praktikas esinevad sarnased sisemised r\u00fcnnakud?<\/p>\n<p><b>MT:<\/b> \u2013 Kuna ma ei puutu tihti kokku turvarikkumisega, ei saa ma \u00f6elda \u2013 v\u00f5ib-olla need t\u00f5esti juhtuvad. Aga kui r\u00e4\u00e4kida arendajate filosoofiast, siis meie arvates on asi nii: meil on perimeeter, mis tagab turva, \u2013 see on lukud, sein; ja perimeetri sees v\u00f5ib teha k\u00f5ike, mida soovid. Loomulikult on kasutajaid, kellel on vaid vaatamis\u00f5igus, ja on ka kasutajaid, kellel on \u00f5igus katalooge kustutada.<\/p>\n<p>S\u00f5ltuvalt \u00f5igustest v\u00f5ib kasutaja tekitada kahju kas hiirega v\u00f5i isegi elevandiga. On selge, et kasutaja t\u00e4ie\u00f5iguslike \u00f5igustega saab teha k\u00f5ik, mida soovib. Kasutaja, kelle \u00f5igused on piiratud, v\u00f5ib tekitada oluliselt v\u00e4hem kahju. Eelk\u00f5ige ei saa ta s\u00fcsteemi purustada.<\/p>\n<p><b>K:<\/b> \u2013 Kaitstud perimeetri sees v\u00f5ib keegi hakata vormima ootamatuid protokolle serveri jaoks, et serverit nurka suruda, ja kui vedasi, siis v\u00f5ib kogu klaster\u2026 Kas selliseid olukordi ka juhtub?<\/p>\n<p><b>MT:<\/b> \u2013 Ma ei ole kunagi sellistest asjadest kuulnud. Et serverit saab niimoodi kokku kukutada \u2013 see ei ole saladus. Kukkuda seespool, olles protokollist, kui autoriseeritud kasutaja, kes saab s\u00f5numisse midagi sellist kirjutada... Tegelikult ei saa, sest see peab ikkagi valideeruma. On v\u00f5imalus keelata see autentimine kasutajatele, kes ei soovi \u2013 see siis on nende probleem; nad on, n-\u00f6, ise seinad l\u00f5hkunud ja sinna saab sisestada elevandi, kes k\u00f5ik tallab... Ja tegelikult, v\u00f5ib end remontijana riidesse panna, tulla ja v\u00e4lja v\u00f5tta!<\/p>\n<p><b>K:<\/b> \u2013 Ait\u00e4h ettekande eest. Sergei (\u201eYandex\u201d). \u201eMonges\u201d on konstandina, mis piirab h\u00e4\u00e4letavate liikmete arvu Replica Set\u2019is, ja see konstant on 7 (seitsme). Miks see on konstant? Miks see ei ole mingi parameeter?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set on meil ka 40 noodiga. Seal on alati enamuse reegel. Ma ei tea, mis versioon see on\u2026<\/p>\n<p><b>K:<\/b> \u2013 Replica Set\u2019is v\u00f5ib olla ka h\u00e4\u00e4letamata liikmeid, kuid h\u00e4\u00e4letavate \u2013 maksimaalselt 7. Kuidas sel juhul taluda v\u00e4ljal\u00fclitamist, kui meil Replica Set on hajutatud kolme andmekeskuse peale? \u00dcks andmekeskus v\u00f5ib lihtsalt v\u00e4lja l\u00fclituda ja \u00fcks masin veel v\u00e4lja langeda.<\/p>\n<p><b>MT:<\/b> \u2013 See on juba veidi v\u00e4ljaspool ettekannet. See on \u00fcldine k\u00fcsimus. V\u00f5ib-olla saan sellest hiljem r\u00e4\u00e4kida.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne j\u00e4rjepidevus: teooriast praktikani\" src=\"\/wp-content\/uploads\/2020\/02\/161966c7e77704dc619674ff0302ff57.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"UnAprFMX1d4\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/UnAprFMX1d4\/hqdefault.jpg\" alt=\"Vaata videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h3>Veidi reklaami \ud83d\ude42<\/h3>\n<p>\nAit\u00e4h, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite n\u00e4ha rohkem huvitavaid materjale? Toetage meid, tehes tellimuse v\u00f5i soovitades meid tuttavatele. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">pilve VPS arendajatele alates $4,99<\/a><\/noindex>, <b>ainulaadne sisenemise taseme serverite analoog, mille oleme teie jaoks v\u00e4lja m\u00f5elnud:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Kogu t\u00f5de VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps alates $19 v\u00f5i kuidas \u00f5ieti serverit jagada?<\/a><\/noindex> (saadaval on RAID1 ja RAID10 variandid, kuni 24 s\u00fcdamikku ja kuni 40GB DDR4).<\/p>\n<p><b>Kas Dell R730xd on kaks korda odavam Equinixi Tier IV andmete keskuses Amsterdamis?<\/b> Ainult meie juures <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199<\/a><\/noindex> Hollandi turul! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 alates $99!<\/b><\/b> Lugege, kuidas <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Luua ettev\u00f5tte tasemel infrastruktuur Dell R730xd E5-2650 v4 serveritega, mille hind on 9000 eurot, madala hinnaga?<\/a><\/noindex><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/487638\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-56365","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Causal consistency: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:37+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47HighLoad++, Mihhail Tjulenjev (MongoDB): Causal consistency: teooriast praktikani | ProHoster","description":"J\u00e4rgmine HighLoad++ konverents toimub 6. ja 7. aprillil 2020 Peterburis. \u00dcksikasjad ja piletid leiate lingilt.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Causal consistency: \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster","og:description":"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-10T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"56365","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:26:38","updated":"2022-09-29 16:36:31","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}