{"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\/da\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Den n\u00e6ste HighLoad++ konference finder sted den 6. og 7. april 2020 i Sankt Petersborg. <br \/>\nDetaljer og billetter <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">via linket<\/a><\/noindex>. HighLoad++ Siberia 2019. Sal \"Krasnoyarsk\". 25. juni, 12:00. Abstracts og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">pr\u00e6sentation<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNogle gange kan praktiske krav komme i konflikt med teorien, hvor vigtige aspekter for et kommercielt produkt ikke er taget i betragtning. I dette foredrag pr\u00e6senteres processen med at v\u00e6lge og kombinere forskellige tilgange til at skabe komponenter til Causal consistency baseret p\u00e5 akademisk forskning i overensstemmelse med kravene til det kommercielle produkt. Lytterne vil blive informeret om de eksisterende teoretiske tilgange til logiske ure, afh\u00e6ngighedssporing, system sikkerhed, tids synkronisering, og hvorfor MongoDB valgte de specifikke l\u00f8sninger.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenev (herefter \u2013 MT):<\/b> \u2013 Jeg vil tale om Causal consistency \u2013 en funktion, vi har arbejdet p\u00e5 i MongoDB. Jeg arbejder i gruppen for distribuerede systemer, og vi udviklede den for cirka to \u00e5r siden.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI processen blev det n\u00f8dvendigt at s\u00e6tte sig ind i en stor m\u00e6ngde akademisk forskning, da denne funktion er temmelig velunders\u00f8gt. Det viste sig, at ingen af artiklerne passede ind i, hvad der kr\u00e6ves i produktionen, databasen taget i betragtning de ret specifikke krav, der findes i n\u00e6rmest alle produktionsapplikationer.<\/p>\n<p>Jeg vil tale om, hvordan vi, som forbrugere af akademisk forskning, forbereder noget, som vi senere kan pr\u00e6sentere for vores brugere som en f\u00e6rdigret, der er komfortabel og sikker at bruge.<\/p>\n<h3>Causal consistency. Lad os definere begreberne<\/h3>\n<p>\nFor det f\u00f8rste vil jeg gerne overordnet sige, hvad Causal consistency er. Der er to karakterer \u2013 Leonard og Penny (fra serien \"The Big Bang Theory\"):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLad os antage, at Penny er i Europa, og Leonard \u00f8nsker at lave en overraskelse for hende, en fest. Og han kan ikke finde p\u00e5 bedre end at fjerne hende fra vennelisten og sende alle vennerne en opdatering p\u00e5 feedet: \"Lad os gl\u00e6de Penny!\" (Hun er i Europa, mens hun sover, ser ikke det hele og kan ikke se det, fordi hun ikke er der). I sidste ende sletter han dette indl\u00e6g, fjerner det fra \"Feedet\" og gendanner adgangen, s\u00e5 hun ikke bem\u00e6rker noget, og der ikke opst\u00e5r en skandale.<br \/>\nDet er alt sammen godt, men lad os antage, at systemet er distribueret, og begivenhederne forl\u00f8b ikke helt som forventet. For eksempel kan det ske, at adgangen til Penny blev begr\u00e6nset efter, at dette indl\u00e6g blev oprettet, hvis begivenhederne ikke er forbundet med \u00e5rsagssammenh\u00e6nge. Faktisk er dette et eksempel p\u00e5, hvorn\u00e5r der er brug for Causal consistency for at udf\u00f8re en forretningsfunktion (i dette tilf\u00e6lde).<\/p>\n<p>I virkeligheden er dette ret ikke-trivielle egenskaber ved databaser \u2013 meget f\u00e5 af dem underst\u00f8tter dem. Lad os g\u00e5 videre til modellerne.<\/p>\n<h3>Konsistensmodeller (Consistency Models)<\/h3>\n<p>\nHvad er egentlig en konsistensmodel i databaser? Det er nogle garantier, som et distribueret system giver vedr\u00f8rende, hvilke data og i hvilken r\u00e6kkef\u00f8lge klienten kan f\u00e5 dem.<\/p>\n<p>Grundl\u00e6ggende set reduceres alle konsistensmodeller til, hvor meget et distribueret system ligner et system, der f.eks. k\u00f8rer p\u00e5 en enkelt node p\u00e5 en laptop. Og i hvor h\u00f8j grad et system, der k\u00f8rer p\u00e5 tusinder af geospatialt distribuerede 'noder', ligner en laptop, hvor alle disse egenskaber principielt udf\u00f8res automatisk.<\/p>\n<p>Derfor g\u00e6lder konsistensmodeller kun for distribuerede systemer. Alle systemer, der tidligere eksisterede og fungerede med vertikal skalering, oplevede ikke disse problemer. Der var \u00e9t Buffer Cache, og alt blev altid l\u00e6st derfra.<\/p>\n<h3>Model Strong<\/h3>\n<p>\nDen allerf\u00f8rste model er Strong (eller line rise ability, som den ofte kaldes). Det er en konsistensmodel, der garanterer, at hver \u00e6ndring, s\u00e5 snart den bekr\u00e6ftes, bliver synlig for alle brugere af systemet.<\/p>\n<p>Dette skaber en global r\u00e6kkef\u00f8lge af alle begivenheder i databasen. Det er en meget st\u00e6rk konsistensegenskab, og den er overhovedet meget kostbar. Ikke desto mindre underst\u00f8ttes den rigtig godt. Det er bare meget dyrt og langsomt \u2013 derfor bruges den sj\u00e6ldent. Det kaldes rise ability.<\/p>\n<p>Der er ogs\u00e5 en anden, st\u00e6rkere egenskab, der underst\u00f8ttes i 'Spanner' \u2013 det kaldes External Consistency. Vi vil tale om det lidt senere.<\/p>\n<h3>Causal<\/h3>\n<p>\nDet f\u00f8lgende er Causal, som jeg netop talte om. Mellem Strong og Causal findes der flere underniveauer, som jeg ikke vil tale om, men de handler alle om Causal. Dette er en vigtig model, fordi den er den st\u00e6rkeste af alle modeller, det er den mest robuste konsistens i tilf\u00e6lde af netv\u00e6rk eller partitioner.<\/p>\n<p>Causals er faktisk den situation, hvor begivenheder er forbundet med en \u00e5rsagssammenh\u00e6ng. De opfattes ofte som Read your on rights fra kundens synspunkt. Hvis kunden har observeret nogle v\u00e6rdier, kan han ikke se de v\u00e6rdier, som var i fortiden. Han begynder allerede at se pr\u00e6fiks-l\u00e6sninger. Det hele handler om det samme.<br \/>\nCausals som konsistensmodel er en delvis r\u00e6kkef\u00f8lge af begivenheder p\u00e5 serveren, hvor begivenheder fra alle klienter observeres i den samme sekvens. I dette tilf\u00e6lde - Leonard og Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nDen tredje model er Eventual Consistency. Dette er noget, som alle distribuerede systemer underst\u00f8tter, den minimale model, der overhovedet giver mening. Det betyder f\u00f8lgende: n\u00e5r vi foretager nogle \u00e6ndringer i dataene, bliver de p\u00e5 et tidspunkt konsistente.<\/p>\n<p>I det \u00f8jeblik siger den ikke noget, ellers ville den v\u00e6re blevet til External Consistency - det ville have v\u00e6ret en helt anden historie. Ikke desto mindre er dette en meget popul\u00e6r model, den mest almindelige. Som standard bruger alle brugere af distribuerede systemer faktisk Eventual Consistency.<\/p>\n<p>Jeg vil gerne give nogle sammenlignende eksempler:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvad betyder disse pile?<\/p>\n<ul>\n<li><b>Latency.<\/b> N\u00e5r styrken af konsistensen \u00f8ges, bliver den st\u00f8rre af \u00e5benlyse grunde: Det er n\u00f8dvendigt at lave flere optegnelser, f\u00e5 bekr\u00e6ftelse fra alle v\u00e6rter og noder, der deltager i klyngen, om at dataene allerede er der. Derfor er det hurtigst i Eventual Consistency, fordi man i reglen kan committe lige i hukommelsen og det vil grundl\u00e6ggende v\u00e6re tilstr\u00e6kkeligt.<\/li>\n<li><b>Availability.<\/b> Hvis dette forst\u00e5s som systemets evne til at svare i tilf\u00e6lde af netv\u00e6rksafbrydelser, partitioner eller nogle fejl - stigende fejlmodstand ved faldende konsistensmodel, da det er tilstr\u00e6kkeligt, at \u00e9n v\u00e6rt lever og stadig udleverer nogle data. Eventual Consistency garanterer i virkeligheden slet ikke noget om dataene - det kan v\u00e6re hvad som helst.<\/li>\n<li><b>Anomalies.<\/b> N\u00e5r det kommer til det, stiger antallet af anomalier selvf\u00f8lgelig. I Strong Consistency b\u00f8r der n\u00e6sten ikke v\u00e6re nogen, mens Eventual Consistency kan have dem i alle former. Sp\u00f8rgsm\u00e5let opst\u00e5r: hvorfor v\u00e6lger folk Eventual Consistency, n\u00e5r den indeholder anomalier? Svaret ligger i, at Eventual Consistency-modeller er anvendelige, og at anomalier for eksempel kun eksisterer i kort tid; der er mulighed for at bruge en master til at l\u00e6se og f\u00e5 mere eller mindre konsistente data; ofte er der ogs\u00e5 mulighed for at bruge st\u00e6rke konsistensmodeller. Praktisk fungerer det, og ofte er antallet af anomalier tidsbegr\u00e6nset.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP-teoremet<\/h3>\n<p>\nN\u00e5r du ser ordene consistency, availability \u2013 hvad t\u00e6nker du s\u00e5 p\u00e5? Rigtigt \u2013 CAP-teoremet! Jeg vil nu gerne aflive en myte... Det er ikke mig \u2013 det er Martin Kleppmann, der har skrevet en fremragende artikel, en fremragende bog.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCAP-teoremet er et princip, der blev formuleret i 2000'erne, om at Consistency, Availability, Partitions: tag nogen to, og du kan ikke v\u00e6lge tre. Dette var en slags princip. Det blev bevist som et teorem nogle \u00e5r senere af Gilbert og Lynch. Derefter blev det brugt som en mantra \u2013 systemer blev delt op i CA, CP, AP og s\u00e5 videre.<\/p>\n<p>Dette teorem blev faktisk bevist for disse tilf\u00e6lde... For det f\u00f8rste blev Availability ikke betragtet som en kontinuerlig v\u00e6rdi fra nul til hundrede (0 \u2013 systemet er 'd\u00f8dt', 100 \u2013 svarer hurtigt; vi er vant til at betragte det s\u00e5dan), men som en egenskab ved algoritmen, der garanterer, at den ved alle sine executioner returnerer data.<\/p>\n<p>Der er overhovedet ikke noget om responstid! Der er en algoritme, der returnerer data efter 100 \u00e5r \u2013 en helt fantastisk available-algoritme, der er en del af CAP-teoremet.<br \/>\nFor det andet blev teoremet bevist for \u00e6ndringer i v\u00e6rdierne af den samme n\u00f8gle, og disse \u00e6ndringer er en resizable linje. Dette betyder, at de faktisk n\u00e6sten ikke bruges, fordi der er andre modeller som Eventual Consistency, Strong Consistency (m\u00e5ske).<\/p>\n<p>Hvad g\u00f8r vi med alt dette? At CAP-teoremet i den form, det er bevist, stort set ikke er anvendeligt, sj\u00e6ldent bruges. I teoretisk form begr\u00e6nser det p\u00e5 en eller anden m\u00e5de alt. Det resulterer i et princip, der er intuitivt sandt, men som ikke er bevist p\u00e5 nogen m\u00e5de.<\/p>\n<h3>Causal consistency \u2013 den st\u00e6rkeste model<\/h3>\n<p>\nDet, der sker nu, er, at man kan opn\u00e5 alle tre ting: Konsistens, Tilg\u00e6ngelighed kan opn\u00e5s ved hj\u00e6lp af Partitioner. Is\u00e6r Causal konsistens \u2013 den st\u00e6rkeste model for konsistens, der stadig fungerer ved tilstedev\u00e6relsen af Partitioner (netv\u00e6rksbrud). Derfor er den s\u00e5 interessant, og derfor har vi besk\u00e6ftiget os med den.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFor det f\u00f8rste forenkler det arbejdet for applikationsudviklere. Is\u00e6r er der stor support fra serveren: n\u00e5r alle optegnelser, som finder sted inden for en enkelt klient, garanteret kommer i den rigtige r\u00e6kkef\u00f8lge til en anden klient. For det andet kan den modst\u00e5 partitioner.<\/p>\n<h3>Det indre arbejde i MongoDB<\/h3>\n<p>\nHusk p\u00e5, at vi skal til frokost, s\u00e5 lad os bev\u00e6ge os ind i k\u00f8kkenet. Jeg vil fort\u00e6lle om systemmodellen, nemlig hvad MongoDB er for dem, der h\u00f8rer om denne database for f\u00f8rste gang.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (herefter \u2013 'MongoDB') er et distribueret system, der underst\u00f8tter horisontal skalering, hvilket vil sige sharding; og inden for hver shard underst\u00f8tter det ogs\u00e5 datar\u00e6kkef\u00f8lge, det vil sige replikering.<\/p>\n<p>Sharding i 'MongoDB' (ikke-relateret database) udf\u00f8rer automatisk belastningsbalancering, det vil sige, at hver dokumentkollektion (eller 'tabel' i termerne fra relationelle data) opdeles i stykker, og serveren bev\u00e6ger dem automatisk mellem sharder.<\/p>\n<p>Query Router, der distribuerer fores requests, er for klienten en slags klient, som han arbejder igennem. Den ved allerede, hvor og hvilke data der ligger, og dirigerer alle fores requests til den rigtige shard.<\/p>\n<p>Endnu et vigtigt punkt: MongoDB er en enkelt master. Der er \u00e9n Primary \u2013 den kan tage optegnelser, der underst\u00f8tter de n\u00f8gler, den indeholder. Multi-master write er ikke muligt.<\/p>\n<p>Vi har udgivet version 4.2 \u2013 der er kommet nye interessante ting. Is\u00e6r er Lucene blevet lagt ind \u2013 s\u00f8gning \u2013 alts\u00e5 executable java direkte i 'Mongo', og det er nu muligt at udf\u00f8re s\u00f8gning gennem Lucene, pr\u00e6cis som i 'Elasticsearch'.<\/p>\n<p>Og vi har lavet et nyt produkt \u2013 Charts, som ogs\u00e5 er tilg\u00e6ngeligt p\u00e5 'Atlas' (Mongo's egen Cloud). De har en Free Tier \u2013 man kan lege med det. Jeg var meget glad for Charts \u2013 datavisualisering, meget intuitiv.<\/p>\n<h3>Ingredienserne til Causal konsistens<\/h3>\n<p>\nJeg har talt mig frem til cirka 230 artikler, der er blevet publiceret om dette emne \u2013 fra Leslie Lampert. Nu vil jeg fra hukommelsen viderebringe nogle dele af disse materialer til jer.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet hele begyndte med en artikel af Leslie Lampert, skrevet i 1970'erne. Som I kan se, er der stadig forskning i dette emne i gang. I dag oplever kausal konsistens en ren\u00e6ssance sammen med udviklingen af distribuerede systemer.<\/p>\n<h3>Begr\u00e6nsninger<\/h3>\n<p>\nHvilke begr\u00e6nsninger findes der? Dette er faktisk et af de vigtigste punkter, for begr\u00e6nsningerne, som produktionssystemer p\u00e5l\u00e6gger, adskiller sig betydeligt fra de begr\u00e6nsninger, der findes i akademiske artikler. Ofte er de ret kunstige.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>For det f\u00f8rste er 'MongoDB' en single master, som jeg allerede har n\u00e6vnt (det forenkler det meget).<\/li>\n<li>Vi mener, at systemet skal kunne underst\u00f8tte omkring 10.000 shards. Vi kan ikke tr\u00e6ffe arkitektoniske beslutninger, der klart vil begr\u00e6nse denne v\u00e6rdi.<\/li>\n<li>Vi har en cloud-l\u00f8sning, men vi mener, at en bruger skal have mulighed for at downloade en binary, k\u00f8re den p\u00e5 sin laptop, og s\u00e5 fungerer det hele perfekt.<\/li>\n<li>Vi antager, at det, der sj\u00e6ldent anvendes i forskning: eksterne kunder kan g\u00f8re hvad som helst. 'MongoDB' er open source. Derfor kan kunderne v\u00e6re meget kloge, og onde \u2013 de kan v\u00e6re interesserede i at bryde alt. Vi forudser, at byzantinske fejlsituationer kan forekomme.<\/li>\n<li>For eksterne kunder, der befinder sig uden for perimeteren \u2013 en vigtig begr\u00e6nsning: hvis denne funktion er deaktiveret, skal der ikke observeres nogen performance degradation.<\/li>\n<li>Et andet aspekt \u2013 helt imod akademiske principper: kompatibilitet mellem tidligere og fremtidige versioner. Gamle drivere skal underst\u00f8tte nye opdateringer, og databasen skal underst\u00f8tte gamle drivere.<\/li>\n<\/ul>\n<p>\nGenerelt p\u00e5l\u00e6gger alt dette begr\u00e6nsninger.<\/p>\n<h3>Komponenter af kausal konsistens<\/h3>\n<p>\nJeg vil nu fort\u00e6lle om nogle komponenter. Hvis man ser p\u00e5 kausal konsistens i det hele taget, kan man identificere blokke. Vi har udvalgt fra arbejde, der relaterer til en given blok: Dependency Tracking, valg af tid, hvordan disse ure kan synkroniseres med hinanden, og hvordan vi sikrer sikkerhed \u2013 det er en skitse af, hvad jeg vil tale om.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Fuldt afh\u00e6ngighedssporing (Full Dependency Tracking)<\/h3>\n<p>\nHvad er det n\u00f8dvendigt for? For at n\u00e5r data replikeres - hver post, hver \u00e6ndring af data indeholder information om, hvilke \u00e6ndringer det afh\u00e6nger af. Den allerf\u00f8rste og naiveste \u00e6ndring er, n\u00e5r hver besked, der indeholder en post, indeholder information om de tidligere beskeder:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI dette eksempel er nummeret i kr\u00f8llede parenteser - dette er postnumre. Nogle gange overf\u00f8res disse poster med v\u00e6rdier endda helt, andre gange overf\u00f8res nogle versioner. Essensen er, at hver \u00e6ndring indeholder information om den tidligere (den b\u00e6rer alt dette eksplicit).<\/p>\n<p>Hvorfor besluttede vi ikke at bruge denne tilgang (fuld sporbarhed)? \u00c5rsagen er \u00e5benlys: denne tilgang er upraktisk: enhver \u00e6ndring i et socialt netv\u00e6rk afh\u00e6nger af alle tidligere \u00e6ndringer i dette sociale netv\u00e6rk, og det ville betyde at overf\u00f8re \"Facebook\" eller \"Vkontakte\" i hver opdatering. Alligevel er der mange unders\u00f8gelser vedr\u00f8rende Full Dependency Tracking - det er pr\u00e6-sosiale netv\u00e6rk, og i nogle situationer fungerer det virkelig.<\/p>\n<h3>Eksplisit sporingsafh\u00e6ngigheder (Explicit Dependency Tracking)<\/h3>\n<p>\nDen n\u00e6ste - mere begr\u00e6nset. Her overvejes ogs\u00e5 overf\u00f8rsel af information, men kun den, der afh\u00e6nger eksplicit. Hvad der afh\u00e6nger af hvad, bestemmes typisk allerede af applikationen. N\u00e5r data replikeres, gives der kun svar, n\u00e5r de tidligere afh\u00e6ngigheder er blevet opfyldt, det vil sige vist. Det er essensen af, hvordan Causal consistency fungerer.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet kan se, at post 5 afh\u00e6nger af posterne 1, 2, 3, 4 \u2013 derfor venter den, f\u00f8r klienten f\u00e5r adgang til de \u00e6ndringer, der er foretaget ved r\u00e6kkef\u00f8lgen for adgang fra Penny, n\u00e5r alle tidligere \u00e6ndringer allerede er gennemf\u00f8rt i databasen.<\/p>\n<p>Dette er heller ikke acceptabelt for os, fordi der stadig er for meget information, og det vil bremse systemet. Der er en anden tilgang\u2026<\/p>\n<h3>Lamport Ur (Lamport Clock)<\/h3>\n<p>\nDe er meget gamle. Lamport Clock indeb\u00e6rer, at disse afh\u00e6ngigheder komprimeres til en skalarfunktion, som kaldes Lamport Clock.<\/p>\n<p>En skalar funktion er et abstrakt tal. Det kaldes ofte logisk tid. Ved hver h\u00e6ndelse \u00f8ges denne counter. Den counter, som i \u00f8jeblikket er kendt af processen, sender hver besked. Det er klart, at processerne kan v\u00e6re desynkroniserede, og de kan have helt forskellig tid. Ikke desto mindre balancerer systemet p\u00e5 en eller anden m\u00e5de klokkens tid gennem denne beskedudveksling. Hvad sker der i dette tilf\u00e6lde?<\/p>\n<p>Jeg har delt den store shard i to for at g\u00f8re det klart: Friends kan leve i en node, som rummer en del af samlingen, mens Feed \u2013 kan v\u00e6re i en helt anden node, der indeholder en del af denne samling. Hvordan kan de s\u00e5 undg\u00e5 at blive i r\u00e6kkef\u00f8lge? F\u00f8rst vil Feed sige: \"Replikeret\", og s\u00e5 \u2013 Friends. Hvis systemet ikke sikrer, at Feed ikke vises, f\u00f8r afh\u00e6ngighederne fra Friends i samlingen af Friends ogs\u00e5 er leveret, s\u00e5 f\u00e5r vi netop den situation, som jeg n\u00e6vnte.<\/p>\n<p>Du kan se, hvordan den logiske tid counter p\u00e5 Feed\u2019en \u00f8ges:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDermed er den grundl\u00e6ggende egenskab ved dette Lamport Clock og Causal consistency (forklaret gennem Lamport Clock) f\u00f8lgende: hvis vi har h\u00e6ndelser A og B, og h\u00e6ndelse B afh\u00e6nger af h\u00e6ndelse A *, s\u00e5 f\u00f8lger det, at LogicalTime for Event A er mindre end LogicalTime for Event B.<\/p>\n<p><i>* Nogle gange siges det ogs\u00e5, at A indtraf f\u00f8r B, alts\u00e5 A skete f\u00f8r B \u2013 det er et forhold, der delvist ordner hele m\u00e6ngden af h\u00e6ndelser, der overhovedet er sket.<\/i><\/p>\n<p>Den omvendte vej er ikke korrekt. Dette er faktisk en af de grundl\u00e6ggende ulemper ved Lamport Clock \u2013 delvis r\u00e6kkef\u00f8lge. Der er et begreb om samtidige h\u00e6ndelser, dvs. h\u00e6ndelser, hvor hverken (A skete f\u00f8r B) eller (A skete efter B) holder. Et eksempel kunne v\u00e6re, n\u00e5r Leonard parallel tilf\u00f8jer nogen som ven (eller endda Sheldon, for eksempel).<br \/>\nDette er den egenskab, som ofte bruges ved arbejde med Lamport-ure: man ser netop p\u00e5 funktionen og drager derudfra konklusionen \u2013 m\u00e5ske er disse h\u00e6ndelser afh\u00e6ngige. Fordi det er korrekt i en retning: hvis LogicalTime A er mindre end LogicalTime B, s\u00e5 kan B ikke v\u00e6re sket f\u00f8r A; og hvis det er st\u00f8rre, kan det v\u00e6re.<\/p>\n<h3>Vektor ure (Vector Clock)<\/h3>\n<p>\nDen logiske udvikling af Lamport-uret er Vektor ure. De adskiller sig ved, at hver node, der findes her, indeholder sine egne, separate ure, og de sendes som et vektorsystem.<br \/>\nI dette tilf\u00e6lde ser du, at den nul-indeks vektor svarer til Feed, mens den f\u00f8rste indeks vektor svarer til Friends (hver af disse noder). Og nu vil de begynde at stige: nul-indekset for \"Feed\" stiger med \u00e9n, to, tre:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHvad g\u00f8r Vektor Timer bedre? De hj\u00e6lper med at afklare, hvilke h\u00e6ndelser der er samtidige, og hvorn\u00e5r de sker p\u00e5 forskellige noder. Dette er meget vigtigt for shardingsystemet, s\u00e5som \"MongoDB\". Men vi valgte ikke det, selvom det er en fremragende l\u00f8sning, der fungerer godt, og det ville sandsynligvis have v\u00e6ret en god pasform for os ...<\/p>\n<p>Hvis vi har 10.000 shards, kan vi ikke overf\u00f8re 10.000 komponenter, selv hvis vi komprimerer, og finder p\u00e5 noget andet - nyttelasten vil stadig v\u00e6re mange gange mindre end omfanget af hele denne vektor. Derfor, med tungt hjerte og gennem sammenbidte t\u00e6nder, har vi opgivet denne tilgang og gik videre til en anden.<\/p>\n<h3>Spanner TrueTime. Atomure<\/h3>\n<p>\nJeg n\u00e6vnte, at der vil v\u00e6re en tale om \"Spanner\". Det er en fantastisk ting, virkelig fra det 21. \u00e5rhundrede: atomure, GPS-synkronisering.<\/p>\n<p>Hvad er ideen? \"Spanner\" er et Google-system, som for nylig er blevet gjort tilg\u00e6ngeligt for folk (de har tilf\u00f8jet SQL til det). Hver transaktion har et bestemt tidsstempel. Da tiden er synchroniseret*, kan hver h\u00e6ndelse tildeles et bestemt tidspunkt - atomure har en ventetid, hvorefter et andet tidspunkt garanteres at \"forekomme\".<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e5 denne m\u00e5de, ved blot at skrive til databasen og vente et stykke tid, garanteres automatisk Serializability for h\u00e6ndelsen. De har den st\u00e6rkeste konsistensmodel, der overhovedet kan forestilles - den er ekstern konsistens.<\/p>\n<p>* Dette er det grundl\u00e6ggende problem med Lamport-ure - de er aldrig synkroniserede p\u00e5 distribuerede systemer. De kan divergere, selv med NTP fungerer de stadig ikke s\u00e6rlig godt. \"Spanner\" har atomure og synkronisering, ser det ud til, i mikrosekunder.<\/p>\n<p>Hvorfor valgte vi ikke det? Vi antager ikke, at vores brugere har indbyggede atomure. N\u00e5r de bliver tilg\u00e6ngelige, indbygget i hver laptop, vil der v\u00e6re en super cool GPS-synkronisering - s\u00e5 ja ... Men indtil da er det bedste, der er muligt - \"Amazon\", base stationer - for entusiasterne ... S\u00e5 vi brugte andre ure.<\/p>\n<h3>Hybrid Clock (Hybridur)<\/h3>\n<p>\nDet er faktisk det, der tikker i \u00abMongoDB\u00bb ved sikring af kausal konsistens. Hvad er de hybride i? Hybrid er en skalar v\u00e6rdi, men den best\u00e5r af to komponenter:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Den f\u00f8rste er Unix-epoken (hvor mange sekunder der er g\u00e5et siden \u00abcomputverdenens begyndelse\u00bb).<\/li>\n<li>Den anden er et inkrement, ogs\u00e5 32-bit unsigned int.<\/li>\n<\/ul>\n<p>\nDet er faktisk det hele. Der er en tilgang: den del, der h\u00e5ndterer tiden, synkroniseres hele tiden med klokken; hver gang der sker en opdatering, synkroniseres denne del med klokken, og det resulterer i, at tiden altid er mere eller mindre korrekt, mens inkrementet g\u00f8r det muligt at skelne mellem h\u00e6ndelser, der fandt sted p\u00e5 samme tid.<\/p>\n<p>Hvorfor er det vigtigt for \u00abMongoDB\u00bb? Fordi det g\u00f8r det muligt at udf\u00f8re nogle backup-gendannelser p\u00e5 et bestemt tidspunkt, hvilket betyder, at en h\u00e6ndelse indekseres med tid. Dette er vigtigt, n\u00e5r specifikke h\u00e6ndelser er p\u00e5kr\u00e6vet; for databasen er h\u00e6ndelser \u00e6ndringer i databasen, der fandt sted inden for bestemte tidsrammer.<\/p>\n<p>Den vigtigste grund vil jeg kun fort\u00e6lle dig (v\u00e6r venlig ikke at sige det til andre)! Vi gjorde det s\u00e5dan, fordi det er, hvordan ordnede, indekserede data ser ud i MongoDB OpLog. OpLog er en datastruktur, der indeholder alle \u00e6ndringer i databasen: de g\u00e5r f\u00f8rst ind i OpLog og anvendes derefter konkret p\u00e5 Storage, n\u00e5r det er replikeret data eller shardet.<\/p>\n<p>Det var den vigtigste grund. Der findes dog ogs\u00e5 praktiske krav til udviklingen af databasen, hvilket betyder, at det skal v\u00e6re enkelt \u2013 s\u00e5 lidt kode som muligt, og s\u00e5 f\u00e5 defekte ting, der skal skrives om og testes. At vores oplogs viste sig at v\u00e6re indekseret med hybride tidsfiler har virkelig hjulpet og gjort det muligt at tr\u00e6ffe de rigtige valg. Det viste sig virkelig at give mening og fungerede p\u00e5 en eller anden m\u00e5de magisk i den f\u00f8rste prototype. Det var virkelig sejt!<\/p>\n<h3>Tidsynkronisering<\/h3>\n<p>\nDer er flere m\u00e5der at synkronisere p\u00e5, som beskrevet i videnskabelig litteratur. Jeg taler om synkronisering, n\u00e5r vi har to forskellige shards. Hvis der er et replica-set, er der ingen synkronisering n\u00f8dvendig: det er \"single-master\"; vi har en OpLog, hvor alle \u00e6ndringer lander \u2013 i dette tilf\u00e6lde er alt allerede sekventielt ordnet i selve \"OpLog\". Men hvis vi har to forskellige shards, er tids-synkronisering vigtigt. Her har de vektoriske ure v\u00e6ret til stor hj\u00e6lp! Men dem har vi ikke.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen anden metode er \"Heartbeats\". Man kan udveksle nogle signaler, der sker med en bestemt tidsinterval. Men \"Heartbeats\" er for langsomme, vi kan ikke sikre acceptable latenstider for vores kunder.<\/p>\n<p>True time \u2013 det er selvf\u00f8lgelig en vidunderlig ting. Men igen, det er nok fremtiden... Selvom man i \"Atlas\" allerede kan g\u00f8re det, der er allerede hurtige \"Amazon\" tids-synkronisatorer. Men det vil ikke v\u00e6re tilg\u00e6ngeligt for alle.<\/p>\n<p>Gossiping \u2013 det er, n\u00e5r alle beskeder inkluderer tid. Det er omtrent det, vi anvender. Hver besked mellem noderne, drivere, routere for data-noder, absolut alt for \"MongoDB\" \u2013 er nogle elementer, databaskomponenter, der indeholder ure, som k\u00f8rer. De har alle et hybridt tidsv\u00e6rd, som sendes. 64 bit? Det er muligt, det kan lade sig g\u00f8re.<\/p>\n<h3>Hvordan fungerer det hele sammen?<\/h3>\n<p>\nHer ser jeg p\u00e5 et enkelt replica-set for at g\u00f8re det lidt lettere. Der er en Primary og en Secondary. Secondary foretager replikering og er ikke altid fuldst\u00e6ndig synkroniseret med Primary.<\/p>\n<p>Der sker en inds\u00e6ttelse (insert) i \"Primary\" med en bestemt tidsv\u00e6rdi. Denne inds\u00e6ttelse \u00f8ger den interne t\u00e6ller med 11, hvis det er maks. Ellers vil den kontrollere tidsv\u00e6rdierne og synkronisere if\u00f8lge urene, hvis tidsv\u00e6rdierne er st\u00f8rre. Dette tillader tidsm\u00e6ssig orden.<\/p>\n<p>Efter at han laver skrivningen, sker der et vigtigt \u00f8jeblik. Urene i \"MongoDB\" inkrementeres kun, hvis der er en skrivning i \"OpLog\". Dette er begivenheden, der \u00e6ndrer systemets tilstand. I alle klassiske artikler betragtes en begivenhed som en besked, der n\u00e5r en node: beskeden er ankommet \u2013 s\u00e5 har systemet \u00e6ndret sin tilstand.<\/p>\n<p>Det h\u00e6nger sammen med, at man ikke helt kan forst\u00e5, hvordan denne meddelelse vil blive fortolket, n\u00e5r man unders\u00f8ger det. Vi ved helt sikkert, at hvis det ikke er afspejlet i \"Oplogen\", vil det slet ikke blive fortolket, og en \u00e6ndring af systemets tilstand er kun en indtastning i \"Oplogen\". Dette g\u00f8r det hele enklere for os: b\u00e5de modellen bliver simplere, og det tillader os at opretholde orden inden for et enkelt replikaset, samt flere andre nyttige ting.<\/p>\n<p>Der returneres en v\u00e6rdi, der allerede er indtastet i \"Oplogen\" - vi ved, at denne v\u00e6rdi allerede ligger i \"Oplogen\", og dens tid er 12. Nu, lad os sige, at l\u00e6sningen starter fra en anden node (Secondary), og den sender allerede afterClusterTime i selve meddelelsen. Den siger: \"Jeg har brug for alt, hvad der skete mindst efter 12 eller p\u00e5 tidspunktet tolv\" (se fig. ovenfor).<\/p>\n<p>Dette kaldes Causal a consistent (CAT). Der er et s\u00e5dant begreb i teorien, at dette er et tidsudsnit, der er konsistent i sig selv. I dette tilf\u00e6lde kan man sige, at dette er systemets tilstand, der blev observeret p\u00e5 tidspunktet 12.<\/p>\n<p>Der er endnu ikke noget her, fordi det ligesom imiterer en situation, hvor Secondary skal replikere data fra Primary. Den venter... Og nu er dataene kommet - returnerer disse v\u00e6rdier tilbage.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5dan fungerer det cirka. N\u00e6sten.<\/p>\n<p>Hvad betyder \"n\u00e6sten\"? Lad os antage, at der er en person, der har l\u00e6st og forst\u00e5et, hvordan det hele fungerer. Forst\u00e5et, at hver gang der sker ClusterTime, opdaterer den de interne logiske ure, og s\u00e5 \u00f8ger den n\u00e6ste indtastning med \u00e9n. Denne funktion tager 20 linjer. Antag, at denne person sender det maksimalt store 64-bit tal minus \u00e9n.<\/p>\n<p>Hvorfor \"minus \u00e9n\"? Fordi de interne ure vil blive anvendt i denne v\u00e6rdi (\u00e5benbart det st\u00f8rste mulige og st\u00f8rre end den nuv\u00e6rende tid), s\u00e5 vil der blive en indtastning i \"Oplogen\", og uret vil blive inkrementeret med endnu en - og det vil allerede v\u00e6re den absolut maksimale v\u00e6rdi (der er simpelthen alle enere, der er ikke mere at tilf\u00f8je, unsaint int'ere).<\/p>\n<p>Det er klart, at efter dette bliver systemet absolut utilg\u00e6ngeligt for noget som helst. Det kan kun eksporteres, reng\u00f8res - meget manuelt arbejde. Fuldt tilg\u00e6ngelighed:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e5r dette replikeres et andet sted, kan hele klyngen g\u00e5 ned. En absolut uacceptabel situation, som enhver kan skabe meget hurtigt og nemt! Derfor betragtede vi dette aspekt som et af de vigtigste. Hvordan kan vi forhindre det?<\/p>\n<h3>Vores l\u00f8sning er at underskrive clusterTime<\/h3>\n<p>\nDet sendes i beskeden (indtil den bl\u00e5 tekst). Men vi begyndte ogs\u00e5 at generere en signatur (bl\u00e5 tekst):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSignaturen genereres med en n\u00f8gle, der opbevares inden for databasen, inden for en sikret perimeter; den genereres og opdateres (brugerne ser ikke dette). En hash genereres, og hver besked underskrives, n\u00e5r den oprettes, og valideres, n\u00e5r den modtages.<br \/>\nM\u00e5ske stiller folk sp\u00f8rgsm\u00e5let: \"Hvor meget bremser det her?\" Jeg har sagt, at det skal fungere hurtigt, is\u00e6r uden denne funktion.<\/p>\n<p>Hvad betyder det at bruge Causal consistency i dette tilf\u00e6lde? Det er at vise afterClusterTime-parameteren. Uden dette vil den simpelthen sende v\u00e6rdier uanset hvad. Gossiping har k\u00f8rt konstant siden version 3.6.<\/p>\n<p>Hvis vi lader signaturen genereres konstant, vil det bremse systemet selv uden funktionaliteten, hvilket ikke stemmer overens med vores tilgang og krav. Hvad gjorde vi?<\/p>\n<h3>G\u00f8r det hurtigt!<\/h3>\n<p>\nDet er en ganske enkel ting, men et interessant trick \u2013 jeg vil dele det, m\u00e5ske finder nogen det interessant.<br \/>\nVi har en hash, hvor de underskrevne data opbevares. Alle data g\u00e5r gennem cachen. Cachen underskriver ikke specifikt tid, men Range. N\u00e5r en v\u00e6rdi kommer ind, genererer vi et Range, masker de sidste 16 bits, og denne v\u00e6rdi skal vi underskrive:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVed at f\u00e5 en s\u00e5dan signatur kan vi (teoretisk) accelerere systemet 65.000 gange. Det fungerer fantastisk: n\u00e5r vi satte eksperimenterne op, blev tiden virkelig reduceret med 10.000 gange, n\u00e5r vi havde sekventiel opdatering. Det er klart, at n\u00e5r de er ude af sync, fungerer det ikke. Men i de fleste praktiske tilf\u00e6lde fungerer det. Kombinationen af signaturer med Range sammen med signaturen l\u00f8ste sikkerhedsproblemet.<\/p>\n<h3>Hvad har vi l\u00e6rt?<\/h3>\n<p>\nLektionerne, vi har trukket herfra:<\/p>\n<ul>\n<li>Det er n\u00f8dvendigt at l\u00e6se materialer, historier, artikler, fordi vi har mange sp\u00e6ndende ting at dele. N\u00e5r vi arbejder p\u00e5 en funktion (is\u00e6r nu, hvor vi har arbejdet med transaktioner osv.), er det vigtigt at l\u00e6se og s\u00e6tte sig ind i tingene. Det tager tid, men det er faktisk meget nyttigt, fordi det bliver klart, hvor vi st\u00e5r. Vi har ikke fundet p\u00e5 noget nyt \u2013 vi har blot taget ingredienserne.\n<p>Der er generelt en forskel i t\u00e6nkningen, n\u00e5r der er en akademisk konferencen (som f.eks. \u00abSigmon\u00bb) \u2013 der fokuserer alle p\u00e5 nye id\u00e9er. Hvad er nyheden i vores algoritme? Der er ikke meget nyhed her. Nyheden ligger snarere i, hvordan vi har blandet eksisterende tilgange sammen. Derfor er det f\u00f8rste skridt \u2013 at l\u00e6se klassikere, startende med Lamport.<\/li>\n<li>I produktion er kravene helt andre. Jeg er sikker p\u00e5, at mange af jer ikke st\u00e5r overfor \u00absferiske\u00bb databaser i et abstrakt vakuum, men overfor normale, virkelige ting, som har problemer med tilg\u00e6ngelighed, latenstid og fejltolerance.<\/li>\n<li>Det sidste er, at vi m\u00e5tte overveje forskellige id\u00e9er og kombinere flere vidt forskellige artikler til en samlet tilgang. Ideen om signaturer kom f.eks. fra en artikel, der betragtede Paxos-protokollen, som er til ikke-bizantinske fejl i en autorisationsprotokol, og for bizantinske fejl \u2013 uden for autorisationsprotokollen\u2026 Dette er pr\u00e6cist, hvad vi i sidste ende gjorde.\n<p>Der er absolut intet nyt her! Men s\u00e5 snart vi blandede det hele sammen... Det er som at sige, at opskriften p\u00e5 Olivier-salat ikke er noget s\u00e6rligt, fordi \u00e6g, mayonnaise og agurker allerede har v\u00e6ret opfundet\u2026 Det er omtrent den samme historie.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJeg afslutter hermed. Tak!<\/p>\n<h3>Sp\u00f8rgsm\u00e5l<\/h3>\n<p>\n<b>Sp\u00f8rgsm\u00e5l fra salen (herefter \u2013 S):<\/b> \u2013 Tak, Mikhail, for pr\u00e6sentationen! Emnet om tid er interessant. Du bruger Gossiping. Du sagde, at alle har deres egen tid, og alle kender deres lokale tid. Jeg forstod det s\u00e5dan, at vi har drivere \u2013 der kan v\u00e6re mange kunder med drivere, ogs\u00e5 mange query-planl\u00e6ggere, og ogs\u00e5 mange shards\u2026 Hvad sker der med systemet, hvis der pludselig opst\u00e5r uoverensstemmelse: nogen mener, at de er et minut foran, nogen \u2013 et minut bagud? Hvor vil vi ende?<\/p>\n<p><b>MT:<\/b> \u2013 Et virkelig godt sp\u00f8rgsm\u00e5l! Jeg ville lige tage fat i shards. Hvis jeg forst\u00e5r sp\u00f8rgsm\u00e5let korrekt, har vi denne situation: der er shard 1 og shard 2, og l\u00e6sningerne sker fra disse to shards \u2013 de er ikke synkroniserede, fordi de kender forskellige tidspunkter, is\u00e6r det tidspunkt, de eksisterer p\u00e5 i oploggerne.<br \/>\nLad os sige, at shard 1 har lavet en million optegnelser, mens shard 2 ikke har lavet nogen. Hvis en foresp\u00f8rgsel kommer til begge shards, og shard 1 har afterClusterTime p\u00e5 mere end en million, s\u00e5 vil shard 2 aldrig svare i denne situation, som jeg forklarede.<\/p>\n<p><b>Q:<\/b> \u2013 Jeg ville gerne vide, hvordan de synkroniseres og v\u00e6lger et logisk tidspunkt?<\/p>\n<p><b>MT:<\/b> \u2013 De synkroniseres meget enkelt. N\u00e5r en shard modtager afterClusterTime og ikke finder tiden i oploggen \u2013 initierer den no approved. Det betyder, at den manuelt justerer sin tid op til dette niveau. Dette betyder, at den ikke har nogen begivenheder, der svarer til denne foresp\u00f8rgsel. Den skaber denne begivenhed kunstigt og bliver dermed Causal Consistent.<\/p>\n<p><b>Q:<\/b> \u2013 Hvad nu hvis der efterf\u00f8lgende kommer nogle begivenheder, som er forsvundet et sted i netv\u00e6rket?<\/p>\n<p><b>MT:<\/b> \u2013 Shard er s\u00e5dan indrettet, at de ikke vil komme, fordi det er single master. Hvis den allerede har skrevet, vil de ikke komme, men vil komme bagefter. Det kan ikke ske, at noget har h\u00e6ngt, s\u00e5 laver den no write, og derefter kommer disse begivenheder \u2013 og Causal consistency bliver brudt. N\u00e5r den laver no write, skal de alle komme videre (den vil vente p\u00e5 dem).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Q:<\/b> \u2013 Jeg har nogle sp\u00f8rgsm\u00e5l omkring k\u00f8er. Causal consistency foruds\u00e6tter, at der er en bestemt r\u00e6kkef\u00f8lge af handlinger, der skal udf\u00f8res. Hvad sker der, hvis vi mister en pakke? Her kom 10., 11... 12. forsvandt, men alle de andre venter p\u00e5, at den bliver udf\u00f8rt. Hvis vores maskine pludselig d\u00f8r, kan vi ikke g\u00f8re noget. Er der en maksimal l\u00e6ngde p\u00e5 k\u00f8en, der akkumuleres, f\u00f8r den udf\u00f8res? Hvad for en fatal fejl opst\u00e5r ved tab af en enkelt tilstand? Desuden, hvis vi skriver, at der er en tidligere tilstand, s\u00e5 m\u00e5 vi jo basere os p\u00e5 den? Men vi er ikke baseret p\u00e5 den!<\/p>\n<p><b>MT:<\/b> \u2013 Ogs\u00e5 et glimrende sp\u00f8rgsm\u00e5l! Hvad g\u00f8r vi? I MongoDB er der en forst\u00e5else af quorum-optegnelser, quorum-l\u00e6sninger. Under hvilke omst\u00e6ndigheder kan en besked forsvinde? N\u00e5r optegnelsen ikke er quorum-baseret, eller n\u00e5r l\u00e6sningen ikke er quorum-baseret (kan ogs\u00e5 medf\u00f8re en del junk).<br \/>\nVi har udf\u00f8rt en omfattende eksperimentel unders\u00f8gelse af Causal consistency, som viste, at n\u00e5r b\u00e5de skrivning og l\u00e6sning er non-quorum, opst\u00e5r der overtr\u00e6delser af Causal consistency. Pr\u00e6cis det, du n\u00e6vner!<\/p>\n<p>Vores r\u00e5d: brug i det mindste quorum-l\u00e6sning ved anvendelse af Causal consistency. P\u00e5 den m\u00e5de g\u00e5r der ikke noget tabt, ogs\u00e5 selvom quorum-skrivningen forsvinder... Dette er en orthogonal situation: hvis en bruger ikke \u00f8nsker at miste data, skal der anvendes quorum-skrivning. Causal consistency giver ikke garantier for holdbarhed. Holdbarhed garanteres af replication og det udstyr, der er relateret til replication.<\/p>\n<p><b>Q:<\/b> \u2013 N\u00e5r vi opretter en instans, der udf\u00f8rer sharding (ikke master, men slave derfor), baserer den sig p\u00e5 tidsstemplet fra dens egen maskine eller tiden fra \"master\"; synkroniseres det f\u00f8rste gang eller periodisk?<\/p>\n<p><b>MT:<\/b> \u2013 Jeg vil pr\u00e6cisere. En shard (dvs. en horisontal partition) har altid en Primary. Og i en shard kan der v\u00e6re \"master\" og der kan v\u00e6re replikaer. Men shard'en skal altid underst\u00f8tte skrivning, fordi den skal opretholde et bestemt dom\u00e6ne (der st\u00e5r en Primary i shard'en).<\/p>\n<p><b>Q:<\/b> \u2013 S\u00e5 alt afh\u00e6nger fuldst\u00e6ndigt af \"master\"? Bruges der altid \"master\"-tid?<\/p>\n<p><b>MT:<\/b> \u2013 Ja. Man kan metaforisk sige: uret tikker, n\u00e5r der skrives til \"master\", i \"Optog\".<\/p>\n<p><b>Q:<\/b> \u2013 Vi har en kunde, der forbinder sig, og det er ikke n\u00f8dvendigt for ham at vide noget om tiden?<\/p>\n<p><b>MT:<\/b> \u2013 Overhovedet ikke! Hvis vi taler om, hvordan det fungerer for klienten: n\u00e5r kunden \u00f8nsker at bruge Causal consistency, skal han \u00e5bne en session. Lige nu er alt der: transaktioner i sessionen og retrieve a rights... En session er en r\u00e6kkef\u00f8lge af logiske h\u00e6ndelser, der sker for klienten.<\/p>\n<p>Hvis han \u00e5bner denne session og siger, at han \u00f8nsker Causal consistency (hvis sessionen som standard underst\u00f8tter Causal consistency), fungerer alt automatisk. Driveren husker dette tidspunkt og \u00f8ger det, n\u00e5r den modtager en ny meddelelse. Den husker, hvilket svar den tidligere modtog fra serveren, der returnerede data. N\u00e6ste foresp\u00f8rgsel vil indeholde afterCluster (\"tid st\u00f8rre end dette\").<\/p>\n<p>Kunden beh\u00f8ver slet ikke at vide noget! Det er helt uklar for dem. Hvis folk bruger disse funktioner, hvad kan de s\u00e5 g\u00f8re? For det f\u00f8rste kan man sikkert l\u00e6se fra secondaries: man kan skrive til Primary og l\u00e6se fra geografisk replikerede secondaries og v\u00e6re sikker p\u00e5, at det fungerer. Samtidig kan sessioner, der er optaget p\u00e5 Primary, overf\u00f8res til Secondary, alts\u00e5 kan man bruge flere sessioner i stedet for kun \u00e9n.<\/p>\n<p><b>Q:<\/b> \u2013 Med Eventual consistency er der t\u00e6t forbindelse til et nyt omr\u00e5de inden for datalogi \u2013 CRDT (Conflict-free Replicated Data Types). Har I overvejet at integrere disse datatyper i databasen, og hvad kan I sige om dette?<\/p>\n<p><b>MT:<\/b> \u2013 Godt sp\u00f8rgsm\u00e5l! CRDT giver mening i tilf\u00e6lde af konflikter ved skrivning: i MongoDB \u2013 single master.<\/p>\n<p><b>Q:<\/b> \u2013 Jeg har et sp\u00f8rgsm\u00e5l fra devops. I den virkelige verden er der situationer, hvor byzantinsk fejl opst\u00e5r, og onde mennesker inden for det beskyttede omr\u00e5de begynder at pille i protokollen ved at sende specielt tilpassede pakker?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Onde mennesker inde i perimeteren er som en trojansk hest! Onde mennesker inde i perimeteren kan g\u00f8re mange d\u00e5rlige ting.<\/p>\n<p><b>Q:<\/b> \u2013 Det er klart, at det er forkert at lade en slags \u00e5bning i serveren, hvorigennem man kan presse en zoo af elefanter og nedbryde hele klyngen for altid\u2026 Det vil tage tid at genoprette manuelt\u2026 Det er mildt sagt forkert. P\u00e5 den anden side er det interessant at sp\u00f8rge: i det virkelige liv m\u00f8der vi situationer, hvor s\u00e5danne indre angreb virkelig finder sted?<\/p>\n<p><b>MT:<\/b> \u2013 Da jeg sj\u00e6ldent st\u00f8der p\u00e5 security breaches i det virkelige liv, kan jeg ikke sige \u2013 m\u00e5ske sker de. Men hvis vi taler om udviklerfilosofien, s\u00e5 mener vi: vi har en perimeter, der beskytter dem, der laver sikkerhed \u2013 det er l\u00e5sen, muren; og inden for perimeteren kan man g\u00f8re, hvad man vil. Det er klart, at der er brugere, der kun kan se, og brugere, der kan slette kataloget.<\/p>\n<p>Afh\u00e6ngig af rettighederne kan den skade, brugerne kan for\u00e5rsage, v\u00e6re som med en mus, og nogle gange som med en elefant. Det er klart, at en bruger med fulde rettigheder kan g\u00f8re hvad som helst. En bruger med begr\u00e6nsede rettigheder kan for\u00e5rsage v\u00e6sentligt mindre skade. Specifikt kan han ikke bryde systemet.<\/p>\n<p><b>Q:<\/b> \u2013 I den beskyttede perimeter pr\u00f8ver nogen at formulere uventede protokoller for serveren, s\u00e5 serveren kan s\u00e6ttes i kn\u00e6, og hvis de er heldige, m\u00e5ske hele klyngen\u2026 Er det nogensinde \"godt\" nok?<\/p>\n<p><b>MT:<\/b> \u2013 Jeg har aldrig h\u00f8rt om s\u00e5danne ting. At det er muligt p\u00e5 den m\u00e5de at overbelaste serveren \u2013 det er ikke en hemmelighed. At overbelaste den indefra, som en godkendt bruger, der kan skrive noget ind i beskeden\u2026 Det kan egentlig ikke lade sig g\u00f8re, fordi det stadig vil blive verificeret. Der er mulighed for at slukke for denne autentificering for brugere, der ikke \u00f8nsker det \u2013 s\u00e5 er det deres problem; de har groft sagt selv revet v\u00e6ggene ned, og man kan putte en elefant ind, der vil trampe\u2026 Men generelt kan man kl\u00e6de sig som en reparationstekniker, komme ind og tr\u00e6kke den ud!<\/p>\n<p><b>Q:<\/b> \u2013 Tak for pr\u00e6sentationen. Sergey (\"Yandex\"). I \"Mongo\" er der en konstant, der limiterer antallet af stemmende medlemmer i Replica Set, og denne konstant er lig med 7 (syv). Hvorfor er det en konstant? Hvorfor er det ikke en parameter af en slags?<\/p>\n<p><b>MT:<\/b> \u2013 Vi har Replica Set, der kan have op til 40 noder. Der er altid et flertal. Jeg ved ikke, hvilken version\u2026<\/p>\n<p><b>Q:<\/b> \u2013 I en Replica Set kan man k\u00f8re ikke-stemmende medlemmer, men stemmende \u2013 h\u00f8jst 7. Hvordan skal vi klare et nedbrud i dette tilf\u00e6lde, hvis vores Replica Set er fordelt over 3 datacentre? Et datacenter kan sagtens g\u00e5 ned, og en maskine falder ogs\u00e5 ud.<\/p>\n<p><b>MT:<\/b> \u2013 Det ligger allerede lidt uden for pr\u00e6sentationen. Det er et generelt sp\u00f8rgsm\u00e5l. M\u00e5ske kan jeg fort\u00e6lle det senere.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Kausal konsistens: fra teori til praksis\" 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=\"Afspil video\" 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>Lidt reklame \ud83d\ude42<\/h3>\n<p>\nTak fordi du bliver hos os. Kan du lide vores artikler? \u00d8nsker du at se flere interessante materialer? St\u00f8t os ved at bestille eller anbefale os til dine bekendte, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS til udviklere fra 4,99 $<\/a><\/noindex>, <b>en unik analog til entry-level servere, som vi har designet til dig:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Alt om VPS (KVM) E5-2697 v3 (6 kerner) 10 GB DDR4 480 GB SSD 1 Gbps fra 19 $ eller hvordan man deler serveren korrekt?<\/a><\/noindex> (tilg\u00e6ngelige muligheder med RAID1 og RAID10, op til 24 kerner og op til 40 GB DDR4).<\/p>\n<p><b>Dell R730xd til halv pris i datacenteret Equinix Tier IV i Amsterdam?<\/b> Kun hos os <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 fra 199 $<\/a><\/noindex> i Holland! <b>Dell R420 - 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - fra 99 $!<\/b><\/b> L\u00e6s om hvordan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">man bygger enterprise-infrastruktur ved hj\u00e6lp af Dell R730xd E5-2650 v4 servere til 9000 euro for en br\u00f8kdel af prisen?<\/a><\/noindex><br \/>\n<br \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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++, Mikhail Tyulenev (MongoDB): Causal consistency: fra teori til praksis | ProHoster","description":"N\u00e6ste konferencen HighLoad++ finder sted den 6. og 7. april 2020 i Sankt Petersborg. Detaljer og billetter findes p\u00e5 linket.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}