{"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\/sv\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>N\u00e4sta konferens HighLoad++ \u00e4ger rum den 6 och 7 april 2020 i Sankt Petersburg. <br \/>\nDetaljer och biljetter <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">via l\u00e4nken<\/a><\/noindex>. HighLoad++ Sibirien 2019. Sal \"Krasnojarsk\". 25 juni, 12:00. Sammanfattningar och <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">presentation<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet f\u00f6rekommer att praktiska krav krockar med teorin, d\u00e4r viktiga aspekter f\u00f6r kommersiella produkter inte beaktas. I detta f\u00f6redrag presenteras processen f\u00f6r att v\u00e4lja och kombinera olika metoder f\u00f6r att skapa komponenter f\u00f6r kausal konsistens baserat p\u00e5 akademiska studier, med utg\u00e5ngspunkt i kraven f\u00f6r kommersiella produkter. Lyssnarna f\u00e5r veta mer om de teoretiska metoderna f\u00f6r logiska klockor, beroendesp\u00e5rning, systemett\u00e4nkande, klocksynchronisering, och varf\u00f6r MongoDB valde vissa l\u00f6sningar.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenev (h\u00e4danefter MT):<\/b> \u2013 Jag kommer att prata om kausal konsistens \u2013 en funktion som vi arbetade med p\u00e5 MongoDB. Jag jobbar i gruppen f\u00f6r distribuerade system, vi utvecklade den f\u00f6r cirka tv\u00e5 \u00e5r sedan.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUnder processen var jag tvungen att bekanta mig med en stor m\u00e4ngd akademisk forskning, eftersom denna funktion \u00e4r ganska v\u00e4lstudierad. Det visade sig att ingen artikel passar in i vad som kr\u00e4vs i produktion, en databas med mycket specifika krav som i stort sett finns i alla produktionsapplikationer.<\/p>\n<p>Jag kommer att diskutera hur vi, som konsumenter av akademisk forskning, f\u00f6rbereder n\u00e5got s\u00e5dant som vi sedan kan erbjuda v\u00e5ra anv\u00e4ndare i form av en f\u00e4rdig produkt, som \u00e4r bekv\u00e4m och s\u00e4ker att anv\u00e4nda.<\/p>\n<h3>Kausal konsistens. Definiera termer<\/h3>\n<p>\nTill att b\u00f6rja med vill jag i allm\u00e4nna termer f\u00f6rklara vad kausal konsistens \u00e4r. Det finns tv\u00e5 karakt\u00e4rer \u2013 Leonard och Penny (fr\u00e5n serien \"Den stora uppt\u00e4ckten\"):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnta att Penny \u00e4r i Europa, och Leonard vill g\u00f6ra en \u00f6verraskning f\u00f6r henne, en fest. Och han kommer inte p\u00e5 n\u00e5got b\u00e4ttre \u00e4n att ta bort henne fr\u00e5n v\u00e4nlistan, skicka en uppdatering till alla sina v\u00e4nner p\u00e5 fl\u00f6det: \"L\u00e5t oss gl\u00e4dja Penny!\" (hon \u00e4r i Europa, sover, ser inget av detta och kan inte se, eftersom hon inte \u00e4r d\u00e4r). I slutet tar han bort det inl\u00e4gget, raderar det fr\u00e5n \"Fl\u00f6det\" och \u00e5terst\u00e4ller tillg\u00e5ngen s\u00e5 att hon inte m\u00e4rker n\u00e5got och inga skandaler uppst\u00e5r.<br \/>\nDet h\u00e4r \u00e4r allt utm\u00e4rkt, men l\u00e5t oss anta att systemet \u00e4r distribuerat och att h\u00e4ndelserna inte har g\u00e5tt riktigt som de borde. Det kan till exempel h\u00e4nda att begr\u00e4nsningen av access till Penny intr\u00e4ffade efter att detta inl\u00e4gg postades, om h\u00e4ndelserna inte \u00e4r relaterade till varandra med orsakssamband. Detta \u00e4r i sj\u00e4lva verket ett exempel p\u00e5 n\u00e4r kausal konsistens kr\u00e4vs f\u00f6r att genomf\u00f6ra en aff\u00e4rsfunktion (i detta fall).<\/p>\n<p>Detta \u00e4r faktiskt ganska icke-triviala egenskaper hos databaser \u2013 mycket f\u00e5 system st\u00f6djer dem. L\u00e5t oss g\u00e5 vidare till modellerna.<\/p>\n<h3>Konsistensmodeller (Consistency Models)<\/h3>\n<p>\nVad \u00e4r egentligen en konsistensmodell i databaser? Det \u00e4r vissa garantier som ett distribuerat system ger ang\u00e5ende vilka data och i vilken ordning en kund kan f\u00e5 dem.<\/p>\n<p>I princip kan alla konsistensmodeller reduceras till hur likt det distribuerade systemet fungerar som ett system som till exempel k\u00f6rs p\u00e5 en nod p\u00e5 en b\u00e4rbar dator. Och i vilken grad ett system som k\u00f6rs p\u00e5 tusentals geografiskt distribuerade noder liknar en b\u00e4rbar dator d\u00e4r alla dessa egenskaper uppfylls automatiskt.<\/p>\n<p>D\u00e4rf\u00f6r till\u00e4mpas konsistensmodeller endast p\u00e5 distribuerade system. Alla system som tidigare existerade och fungerade med vertikal skalning upplevde inte s\u00e5dana problem. Det fanns en Buffer Cache och all data l\u00e4stes alltid d\u00e4rifr\u00e5n.<\/p>\n<h3>Stark modell<\/h3>\n<p>\nDen allra f\u00f6rsta modellen \u00e4r den Starka (eller Linearity, som den ofta kallas). Det \u00e4r en konsistensmodell som garanterar att varje \u00e4ndring, s\u00e5 snart den bekr\u00e4ftas, blir synlig f\u00f6r alla anv\u00e4ndare av systemet.<\/p>\n<p>Detta skapar en global ordning f\u00f6r alla h\u00e4ndelser i databasen. Detta \u00e4r en mycket stark konsistensegenskap och den \u00e4r dessutom kostsam. \u00c4nd\u00e5 har den mycket bra st\u00f6d. Den \u00e4r bara mycket dyr och l\u00e5ngsam \u2013 den anv\u00e4nds s\u00e4llan. Detta kallas linearitet.<\/p>\n<p>Det finns en annan, \u00e4nnu starkare egenskap som st\u00f6ds i 'Spanner' \u2013 den kallas extern konsistens. Vi kommer att prata mer om det senare.<\/p>\n<h3>Kausal<\/h3>\n<p>\nN\u00e4sta \u00e4r Causal, precis det jag pratade om. Mellan Strong och Causal finns det ytterligare n\u00e5gra underniv\u00e5er, som jag inte kommer att g\u00e5 in p\u00e5, men de alla relaterar till Causal. Detta \u00e4r en viktig modell, eftersom den \u00e4r den starkaste av alla modeller, den starkaste konsistensen vid n\u00e4tverk eller partitioner.<\/p>\n<p>Causals \u00e4r faktiskt en situation d\u00e4r h\u00e4ndelser \u00e4r kopplade genom orsak och verkan. De uppfattas ofta som Read your on rights ur kundens perspektiv. Om en kund har observerat vissa v\u00e4rden kan han eller hon inte se v\u00e4rden som fanns i det f\u00f6rflutna. De b\u00f6rjar redan se prefixl\u00e4sningar. Allt detta handlar om samma sak.<br \/>\nCausals som en konsistensmodell inneb\u00e4r en partiell ordning av h\u00e4ndelser p\u00e5 servern d\u00e4r h\u00e4ndelser fr\u00e5n alla kunder observeras i samma sekvens. I detta fall \u2013 Leonard och Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nDen tredje modellen \u00e4r Eventual Consistency. Detta \u00e4r n\u00e5got som alla distribuerade system st\u00f6der, den minimi modell som \u00f6verhuvudtaget \u00e4r meningsfull. Den inneb\u00e4r f\u00f6ljande: n\u00e4r vi g\u00f6r vissa f\u00f6r\u00e4ndringar i data, blir de vid en viss tidpunkt konsistenta.<\/p>\n<p>Vid den tidpunkten s\u00e4ger den ingenting, annars skulle den ha blivit External Consistency \u2013 det skulle ha blivit en helt annan historia. Trots det \u00e4r detta en mycket popul\u00e4r modell, den mest utbredda. Som standard anv\u00e4nder alla anv\u00e4ndare av distribuerade system Eventual Consistency.<\/p>\n<p>Jag vill ge n\u00e5gra j\u00e4mf\u00f6rande exempel:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVad betyder dessa pilar?<\/p>\n<ul>\n<li><b>Latens.<\/b> N\u00e4r styrkan i konsistensen \u00f6kar blir den st\u00f6rre av uppenbara sk\u00e4l: man beh\u00f6ver g\u00f6ra fler skrivningar, f\u00e5 bekr\u00e4ftelse fr\u00e5n alla v\u00e4rdar och noder som deltar i klustret p\u00e5 att data redan finns d\u00e4r. D\u00e4rf\u00f6r ger Eventual Consistency det snabbaste svaret, eftersom man vanligtvis kan committa \u00e4ven i minnet och att detta i princip r\u00e4cker.<\/li>\n<li><b>Tillg\u00e4nglighet.<\/b> Om detta f\u00f6rst\u00e5s som systemets m\u00f6jlighet att svara vid n\u00e4tverksavbrott, partitioner eller n\u00e5gra typer av fel \u2013 \u00f6kar felmotst\u00e5ndet n\u00e4r konsistensmodellen minskar, eftersom vi bara beh\u00f6ver att en v\u00e4rd fungerar och samtidigt ger viss data. Eventual Consistency garanterar \u00f6verhuvudtaget ingenting om data \u2013 det kan vara vad som helst.<\/li>\n<li><b>Anomalier.<\/b> Det \u00e4r dock sj\u00e4lvklart att antalet anomalier \u00f6kar. I stark konsistens b\u00f6r det knappt f\u00f6rekomma n\u00e5gra, medan eventual consistency kan ha vilka anomalier som helst. Fr\u00e5gan uppst\u00e5r: varf\u00f6r v\u00e4ljer m\u00e4nniskor eventual consistency om den inneh\u00e5ller anomalier? Svaret ligger i att eventual consistency-modeller \u00e4r till\u00e4mpliga och anomalier finns, till exempel under en kort tid; det finns m\u00f6jlighet att anv\u00e4nda en master f\u00f6r att l\u00e4sa och mer eller mindre l\u00e4sa konsekventa data; det finns ofta m\u00f6jlighet att anv\u00e4nda starka konsistensmodeller. Praktiskt fungerar detta, och ofta \u00e4r antalet anomalier tidsbegr\u00e4nsat.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP-teoremet<\/h3>\n<p>\nN\u00e4r du ser orden konsistens, tillg\u00e4nglighet \u2013 vad kommer d\u00e5 till ditt sinne? R\u00e4tt, CAP-teoremet! Jag vill nu avf\u00e4rda en myt... Det \u00e4r inte jag \u2013 det \u00e4r Martin Kleppmann som har skrivit en utm\u00e4rkt artikel, en utm\u00e4rkt bok.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCAP-teoremet \u00e4r ett principiellt uttalande som formulerades under 2000-talet, om att konsistens, tillg\u00e4nglighet och partitioner: ta vilken som helst av de tv\u00e5, och du kan inte v\u00e4lja tre. Det var ett slags princip. Det bevisades som en teorem n\u00e5gra \u00e5r senare av Gilbert och Lynch. Sedan b\u00f6rjade det anv\u00e4nda som en mantra \u2013 system b\u00f6rjade delas upp i CA, CP, AP och s\u00e5 vidare.<\/p>\n<p>Detta teorem bevisades faktiskt f\u00f6r specifika fall... F\u00f6rst betraktades tillg\u00e4nglighet inte som ett kontinuerligt v\u00e4rde fr\u00e5n noll till hundra (0 \u2013 systemet \"d\u00f6tt\", 100 \u2013 svarar snabbt; vi \u00e4r vana vid att se det s\u00e5), utan som en egenskap hos en algoritm som garanterar att den vid alla sina k\u00f6rningar \u00e5terger data.<\/p>\n<p>Det finns ingen information om svarstiden! Det finns en algoritm som returnerar data efter 100 \u00e5r \u2013 en helt utm\u00e4rkt tillg\u00e4nglig algoritm, som \u00e4r en del av CAP-teoremet.<br \/>\nF\u00f6r det andra: teoremet bevisades f\u00f6r f\u00f6r\u00e4ndringar i v\u00e4rdena av samma nyckel, medan dessa f\u00f6r\u00e4ndringar \u00e4r en resizable-linje. Det betyder att de i praktiken n\u00e4stan inte anv\u00e4nds eftersom andra modeller, eventual consistency, strong consistency (kan vara) \u00e4r mer till\u00e4mpbara.<\/p>\n<p>Vad leder allt detta till? Jo, att CAP-teoremet i den form det bevisats \u00e4r praktiskt taget inte till\u00e4mpligt, s\u00e4llan anv\u00e4nds. I teoretisk form begr\u00e4nsar det p\u00e5 n\u00e5got s\u00e4tt allt. Det blir en slags princip som \u00e4r intuitivt korrekt men p\u00e5 n\u00e5got s\u00e4tt inte bevisad.<\/p>\n<h3>Causal consistency \u2013 den starkaste modellen<\/h3>\n<p>\nDet som h\u00e4nder just nu \u00e4r att man kan f\u00e5 alla tre saker: Konsistens, Tillg\u00e4nglighet kan uppn\u00e5s med Partitioner. S\u00e4rskilt Causal consistency \u2013 den starkaste konsistensmodellen, som trots Partitioner (n\u00e4tverksavbrott) fortfarande fungerar. D\u00e4rf\u00f6r \u00e4r den av s\u00e5 stort intresse, och d\u00e4rf\u00f6r har vi arbetat med den.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r det f\u00f6rsta f\u00f6renklar den utvecklarnas arbete. Speciellt finns det stort st\u00f6d fr\u00e5n servern: n\u00e4r alla poster som g\u00f6rs av en enda klient garanterat kommer i r\u00e4tt ordning till en annan klient. F\u00f6r det andra klarar den av partitioner.<\/p>\n<h3>Den interna verksamheten i MongoDB<\/h3>\n<p>\nMed tanke p\u00e5 att det \u00e4r lunch, r\u00f6r vi oss till k\u00f6ket. Jag kommer att f\u00f6rklara systemmodellen, n\u00e4mligen vad MongoDB \u00e4r f\u00f6r dem som h\u00f6r talas om denna databas f\u00f6r f\u00f6rsta g\u00e5ngen.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" 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): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (nedan kallad \"MongoDB\") \u00e4r ett distribuerat system som st\u00f6der horisontell skalning, det vill s\u00e4ga sharding; och inom varje shard st\u00f6der den ocks\u00e5 datar\u00f6da, det vill s\u00e4ga replikering.<\/p>\n<p>Sharding i \"MongoDB\" (en icke-relationell databas) utf\u00f6r automatisk balans, vilket inneb\u00e4r att varje dokumentkollektion (eller \"tabell\" i relationella datatermer) delas upp i bitar, och servern flyttar automatiskt dem mellan sharden.<\/p>\n<p>Query Router, som distribuerar f\u00f6rfr\u00e5gningar, \u00e4r en slags klient f\u00f6r kunden, genom vilken denne arbetar. Den vet redan var och vilka data som finns, och dirigerar alla f\u00f6rfr\u00e5gningar till r\u00e4tt shard.<\/p>\n<p>Ytterligare en viktig punkt: MongoDB \u00e4r en single master. Det finns en Primary \u2013 den kan ta emot poster som st\u00f6djer de nycklar den inneh\u00e5ller. Multi-master skrivning \u00e4r inte m\u00f6jligt.<\/p>\n<p>Vi har sl\u00e4ppt version 4.2 \u2013 d\u00e4r finns nya intressanta saker. S\u00e4rskilt har vi inf\u00f6rt Lucene \u2013 s\u00f6kningen \u2013 precis executable java direkt i \"Mongo\", och d\u00e4r kan man g\u00f6ra s\u00f6kningar via Lucene, p\u00e5 samma s\u00e4tt som i \"Elasticsearch\".<\/p>\n<p>Och vi har skapat en ny produkt - Charts, som ocks\u00e5 \u00e4r tillg\u00e4nglig p\u00e5 \"Atlas\" (Mongo's egna moln). De har en Free Tier \u2013 man kan leka med detta. Charts tyckte jag mycket om \u2013 datavisualisering, mycket intuitiv.<\/p>\n<h3>Ingredienser till Causal consistency<\/h3>\n<p>\nJag har r\u00e4knat till cirka 230 artiklar som har publicerats om detta \u00e4mne \u2013 av Leslie Lamport. Nu kommer jag att \u00e5terge n\u00e5gra delar av dessa material fr\u00e5n mitt minne.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAllt b\u00f6rjade med en artikel av Leslie Lampert som skrevs p\u00e5 1970-talet. Som ni kan se forts\u00e4tter forskningen inom detta \u00e4mne fortfarande. Just nu f\u00e5r Causal consistency nytt intresse i samband med utvecklingen av distribuerade system.<\/p>\n<h3>Begr\u00e4nsningar<\/h3>\n<p>\nVilka begr\u00e4nsningar finns? Detta \u00e4r faktiskt en av de viktigaste punkterna eftersom begr\u00e4nsningarna som st\u00e4lls av produktionssystem skiljer sig kraftigt fr\u00e5n de som finns i akademiska artiklar. Ofta \u00e4r de ganska artificiella.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>F\u00f6r det f\u00f6rsta \u00e4r \"MongoDB\" ett single master, som jag redan har sagt (detta f\u00f6renklar mycket).<\/li>\n<li>Vi anser att systemet b\u00f6r st\u00f6dja omkring 10 000 shards. Vi kan inte fatta arkitektoniska beslut som uppenbart skulle begr\u00e4nsa detta v\u00e4rde.<\/li>\n<li>Vi har en molntj\u00e4nst, men vi anser att anv\u00e4ndare ska ha m\u00f6jligheten att ladda ner en bin\u00e4r och k\u00f6ra den p\u00e5 sin laptop, och allt ska fungera perfekt.<\/li>\n<li>Vi f\u00f6ruts\u00e4tter att det som s\u00e4llan anv\u00e4nds i forskning \u00e4r: externa klienter kan g\u00f6ra vad de vill. \"MongoDB\" \u00e4r open source. S\u00e5ledes kan klienterna vara smarta, elaka \u2013 de kan vilja f\u00f6rst\u00f6ra allt. Vi f\u00f6ruts\u00e4tter att bysantinska fel kan intr\u00e4ffa.<\/li>\n<li>F\u00f6r externa klienter, som befinner sig utanf\u00f6r perimeterna \u2013 en viktig begr\u00e4nsning: om den h\u00e4r funktionen \u00e4r avst\u00e4ngd, b\u00f6r inga prestandaf\u00f6rs\u00e4mringar observeras.<\/li>\n<li>En annan punkt \u2013 \u00f6verhuvudtaget antiakademisk: kompatibilitet mellan tidigare versioner och framtida. Gamla drivrutiner m\u00e5ste st\u00f6dja nya uppdateringar, och databasen m\u00e5ste st\u00f6dja gamla drivrutiner.<\/li>\n<\/ul>\n<p>\nI stort sett st\u00e4ller allt detta upp begr\u00e4nsningar.<\/p>\n<h3>Komponenter av Causal consistency<\/h3>\n<p>\nJag kommer nu att tala om n\u00e5gra av komponenterna. Om man \u00f6verhuvudtaget ser p\u00e5 Causal consistency kan man identifiera block. Vi valde fr\u00e5n arbeten som relaterar till n\u00e5got block: Dependency Tracking, valet av klockor, hur dessa klockor kan synkroniseras och hur vi s\u00e4kerst\u00e4ller s\u00e4kerheten \u2013 detta \u00e4r en ungef\u00e4rlig plan f\u00f6r vad jag kommer att tala om:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Fullst\u00e4ndig sp\u00e5rning av beroenden (Full Dependency Tracking)<\/h3>\n<p>\nVarf\u00f6r beh\u00f6vs det? F\u00f6r att n\u00e4r data replikeras, ska varje post och varje \u00e4ndring av data inneh\u00e5lla information om vilka f\u00f6r\u00e4ndringar den \u00e4r beroende av. Den allra f\u00f6rsta och mest grundl\u00e4ggande f\u00f6r\u00e4ndringen \u00e4r n\u00e4r varje meddelande, som inneh\u00e5ller en post, \u00e4ven inneh\u00e5ller information om tidigare meddelanden:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI det h\u00e4r exemplet representerar numret inom klamrarna \u2013 posternas nummer. Ibland \u00f6verf\u00f6rs dessa poster med v\u00e4rden till och med helt, ibland \u00f6verf\u00f6rs vissa versioner. Po\u00e4ngen \u00e4r att varje \u00e4ndring inneh\u00e5ller information om den f\u00f6reg\u00e5ende (den b\u00e4r tydligt detta i sig).<\/p>\n<p>Varf\u00f6r beslutade vi oss f\u00f6r att inte anv\u00e4nda den metoden (full sp\u00e5rning)? Uppenbart f\u00f6r att denna metod \u00e4r opraktisk: varje f\u00f6r\u00e4ndring i ett socialt n\u00e4tverk beror p\u00e5 alla tidigare f\u00f6r\u00e4ndringar i det sociala n\u00e4tverket, vilket skulle inneb\u00e4ra att man m\u00e5ste skicka, l\u00e5t oss s\u00e4ga, \"Facebook\" eller \"VKontakte\" i varje uppdatering. Det finns dock m\u00e5nga studier om Full Dependency Tracking \u2013 detta f\u00f6re sociala medier, vilket fungerar i vissa situationer.<\/p>\n<h3>Tydlig sp\u00e5rning av beroenden (Explicit Dependency Tracking)<\/h3>\n<p>\nDen f\u00f6ljande metoden \u00e4r mer begr\u00e4nsad. H\u00e4r diskuteras ocks\u00e5 \u00f6verf\u00f6ringen av information, men endast den som \u00e4r tydligt beroende. Vad som beror p\u00e5 vad best\u00e4ms vanligtvis av applikationen. N\u00e4r data replikeras, ges endast svar n\u00e4r tidigare beroenden har uppfyllts, det vill s\u00e4ga n\u00e4r de har visats. Det \u00e4r sj\u00e4lva essensen av hur kausal konsistens fungerar.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen ser att post 5 \u00e4r beroende av poster 1, 2, 3, 4 \u2013 d\u00e4rmed v\u00e4ntar den innan klienten f\u00e5r tillg\u00e5ng till de \u00e4ndringar som gjorts av Penny's access-beslut, n\u00e4r alla tidigare \u00e4ndringar redan har utf\u00f6rts i databasen.<\/p>\n<p>Detta passar oss inte heller, eftersom det fortfarande finns f\u00f6r mycket information, och detta kommer att sakta ner processen. Det finns en annan metod\u2026<\/p>\n<h3>Lamports klocka (Lamport Clock)<\/h3>\n<p>\nDe \u00e4r mycket gamla. Lamport Clock inneb\u00e4r att dessa beroenden sammanfattas i en skalarfunktion, som kallas Lamport Clock.<\/p>\n<p>En skalar funktion \u00e4r ett abstrakt tal. Den kallas ofta f\u00f6r logisk tid. Vid varje h\u00e4ndelse \u00f6kar denna counter. Den counter som processen just nu k\u00e4nner till skickar varje meddelande. Det \u00e4r klart att processerna kan vara desynkroniserade, de kan ha helt olika tider. \u00c4nd\u00e5 balanserar systemet p\u00e5 n\u00e5got s\u00e4tt klockorna genom denna meddelandeutbyte. Vad h\u00e4nder i s\u00e5 fall?<\/p>\n<p>Jag delade den stora shard i tv\u00e5 f\u00f6r att g\u00f6ra det tydligt: V\u00e4nner kan bo p\u00e5 en nod som inneh\u00e5ller en del av samlingen, medan Feed \u2013 helt p\u00e5 en annan nod, som inneh\u00e5ller en del av denna samling. Hur kan de d\u00e5 hamna utanf\u00f6r k\u00f6n? F\u00f6rst s\u00e4ger Feed: \"Replikerad\", och sedan \u2013 V\u00e4nner. Om systemet inte garanterar att Feed inte kommer att visas f\u00f6rr\u00e4n beroenden f\u00f6r V\u00e4nner i samlingen ocks\u00e5 har levererats, s\u00e5 kommer vi precis att f\u00e5 den situation som jag n\u00e4mnde.<\/p>\n<p>Du ser hur den logiska tiden f\u00f6r counter p\u00e5 Feed \u00f6kar:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e4rf\u00f6r \u00e4r huvudegenskapen hos denna Lamport-klocka och kausal konsistens (f\u00f6rklarad genom Lamport-klockan) f\u00f6ljande: om vi har h\u00e4ndelser A och B, och h\u00e4ndelse B beror p\u00e5 h\u00e4ndelse A *, s\u00e5 f\u00f6ljer det att LogicalTime f\u00f6r Event A \u00e4r mindre \u00e4n LogicalTime f\u00f6r Event B.<\/p>\n<p><i>* Ibland s\u00e4gs det ocks\u00e5 att A h\u00e4nde f\u00f6re B, det vill s\u00e4ga A intr\u00e4ffade f\u00f6re B \u2013 detta \u00e4r en relation som delvis ordnar hela m\u00e4ngden av h\u00e4ndelser som har intr\u00e4ffat.<\/i><\/p>\n<p>Detta g\u00e4ller inte \u00e5t andra h\u00e5llet. Det \u00e4r faktiskt en av de st\u00f6rsta nackdelarna med Lamport-klockan \u2013 delvis ordning. Det finns en uppfattning om samtidiga h\u00e4ndelser, det vill s\u00e4ga h\u00e4ndelser d\u00e4r varken (A h\u00e4nde f\u00f6re B) eller (B h\u00e4nde f\u00f6re A). Ett exempel kan vara parallell v\u00e4nskap som Leonard l\u00e4gger till n\u00e5gon annan (inte ens Leonard, utan Sheldon till exempel).<br \/>\nDet \u00e4r just denna egenskap som ofta utnyttjas vid arbete med Lamport-klockor: man ser just p\u00e5 funktionen och drar slutsatsen \u2013 kanske \u00e4r dessa h\u00e4ndelser beroende av varandra. F\u00f6r i en riktning \u00e4r det sant: om LogicalTime A \u00e4r mindre \u00e4n LogicalTime B, s\u00e5 kan B inte h\u00e4nda f\u00f6re A; och om det \u00e4r st\u00f6rre, s\u00e5 kan det vara.<\/p>\n<h3>Vektor klockor (Vector Clock)<\/h3>\n<p>\nDet logiska utvecklingen av Lamport-klockan \u00e4r Vektor klockor. De skiljer sig \u00e5t genom att varje nod som finns h\u00e4r inneh\u00e5ller sina egna, separata klockor, och de \u00f6verf\u00f6rs som en vektor.<br \/>\nI det h\u00e4r fallet ser du att den noll-indexerade vektorn svarar f\u00f6r Feed, medan den f\u00f6rsta indexerade vektorn svarar f\u00f6r Friends (var och en av dessa noder). Och nu kommer de att \u00f6ka: noll-indexen f\u00f6r \"Feed\" \u00f6kar vid skrivning \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVad g\u00f6r vektorur b\u00e4ttre? De g\u00f6r det m\u00f6jligt att f\u00f6rst\u00e5 vilka h\u00e4ndelser som \u00e4r samtidiga och n\u00e4r de sker p\u00e5 olika noder. Detta \u00e4r mycket viktigt f\u00f6r sharding-systemet som \"MongoDB\". Vi valde dock inte detta, \u00e4ven om det \u00e4r en fantastisk sak som fungerar bra och skulle passa oss, antagligen...<\/p>\n<p>Om vi har 10 000 shardar kan vi inte \u00f6verf\u00f6ra 10 000 komponenter, \u00e4ven om vi komprimerar och hittar p\u00e5 andra l\u00f6sningar \u2013 lastern kommer fortfarande att vara m\u00e5nga g\u00e5nger mindre \u00e4n volymen av hela denna vektor. S\u00e5, med tungt hj\u00e4rta och t\u00e4nder, avstod vi fr\u00e5n detta tillv\u00e4gag\u00e5ngss\u00e4tt och gick \u00f6ver till ett annat.<\/p>\n<h3>Spanner TrueTime. Atomur<\/h3>\n<p>\nJag sa att det skulle handla om \"Spanner\". Det \u00e4r en fantastisk grej, verkligen 2000-talet: atomur, GPS-synkronisering.<\/p>\n<p>Vad \u00e4r id\u00e9n? \"Spanner\" \u00e4r ett Google-system som nyligen blev tillg\u00e4ngligt f\u00f6r allm\u00e4nheten (de lade till SQL). Varje transaktion d\u00e4r har en viss tidsst\u00e4mpel. Eftersom tiden \u00e4r synkroniserad* kan varje h\u00e4ndelse tilldelas en specifik tid \u2013 atomuren har v\u00e4ntetid efter vilken en annan tid garanterat \"sker\".<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 genom att helt enkelt skriva till databasen och v\u00e4nta en viss tidsperiod garanteras serialiserbarheten f\u00f6r h\u00e4ndelsen automatiskt. De har den starkaste konsistensmodellen som \u00f6verhuvudtaget kan f\u00f6rest\u00e4llas \u2013 den \u00e4r extern konsistens.<\/p>\n<p>* Detta \u00e4r det grundl\u00e4ggande problemet med Lamports klockor \u2013 de \u00e4r aldrig synkroniserade i distribuerade system. De kan avvika, \u00e4ven med NTP fungerar de fortfarande inte s\u00e4rskilt bra. \"Spanner\" har atomur och synkronisering, verkar vara p\u00e5 mikrosekundsniv\u00e5.<\/p>\n<p>Varf\u00f6r valde vi inte det? Vi f\u00f6ruts\u00e4tter inte att v\u00e5ra anv\u00e4ndare har inbyggda atomur. N\u00e4r de blir inbyggda i varje laptop, med supercool GPS-synkronisering \u2013 d\u00e5 ja\u2026 Men just nu \u00e4r det b\u00e4sta som \u00e4r m\u00f6jligt \u2013 \"Amazon\", basstationer \u2013 f\u00f6r entusiaster\u2026 D\u00e4rf\u00f6r anv\u00e4nde vi andra klockor.<\/p>\n<h3>Hybridklockor (Hybrid Clock)<\/h3>\n<p>\nDet h\u00e4r \u00e4r faktiskt vad som tickar i 'MongoDB' f\u00f6r att s\u00e4kerst\u00e4lla kausal konsistens. Vad \u00e4r de hybridiska? En hybrid \u00e4r ett skalarv\u00e4rde, men det best\u00e5r av tv\u00e5 komponenter:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Den f\u00f6rsta \u00e4r Unix-epoken (hur m\u00e5nga sekunder som har passerat sedan 'b\u00f6rjan av den digitala v\u00e4rlden').<\/li>\n<li>Den andra \u00e4r en viss inkrement, ocks\u00e5 en 32-bitars unsigned int.<\/li>\n<\/ul>\n<p>\nDet \u00e4r faktiskt allt. Det finns en metod: den del som ansvarar f\u00f6r tiden synkroniseras hela tiden med klockan; varje g\u00e5ng en uppdatering g\u00f6rs, synkroniseras den delen med klockan och det visar sig att tiden alltid \u00e4r mer eller mindre korrekt, medan inkrementet g\u00f6r det m\u00f6jligt att s\u00e4rskilja h\u00e4ndelser som intr\u00e4ffade vid samma tidpunkt.<\/p>\n<p>Varf\u00f6r \u00e4r detta viktigt f\u00f6r 'MongoDB'? F\u00f6r det m\u00f6jligg\u00f6r att skapa backup-restaureringar vid specifika tidpunkter, det vill s\u00e4ga h\u00e4ndelsen indexeras med tid. Detta \u00e4r viktigt n\u00e4r vissa h\u00e4ndelser beh\u00f6vs; f\u00f6r databaser \u00e4r h\u00e4ndelser f\u00f6r\u00e4ndringar i databasen som intr\u00e4ffade vid specifika tidsintervall.<\/p>\n<p>Den viktigaste orsaken s\u00e4ger jag endast till er (sn\u00e4lla, s\u00e4g det inte till n\u00e5gon annan)! Vi gjorde det p\u00e5 det h\u00e4r s\u00e4ttet f\u00f6r att s\u00e5 ser ordnade, indexerade data ut i MongoDB OpLog. OpLog \u00e4r en databasstruktur som inneh\u00e5ller alla f\u00f6r\u00e4ndringar i databasen: de hamnar f\u00f6rst i OpLog och till\u00e4mpas sedan p\u00e5 lagringen i de fall det \u00e4r replikerad data eller shard.<\/p>\n<p>Detta var den huvudsakliga anledningen. Det finns ocks\u00e5 praktiska krav p\u00e5 databasutveckling, vilket inneb\u00e4r att det m\u00e5ste vara enkelt \u2013 lite kod, s\u00e5 f\u00e5 saker som m\u00f6jligt som beh\u00f6ver skrivas om och testas. Att v\u00e5ra op-logs visade sig vara indexerade med hybridklockor hj\u00e4lpte mycket och m\u00f6jliggjorde r\u00e4tt val. Det har verkligen l\u00f6nat sig och fungerade p\u00e5 n\u00e5got magiskt s\u00e4tt p\u00e5 den f\u00f6rsta prototypen. Det var riktigt h\u00e4ftigt!<\/p>\n<h3>Klocksynkronisering<\/h3>\n<p>\nDet finns flera s\u00e4tt att synkronisera som beskrivs i den vetenskapliga litteraturen. Jag pratar om synkronisering n\u00e4r vi har tv\u00e5 olika shards. Om det finns ett replikasett s\u00e5 beh\u00f6vs ingen synkronisering: det \u00e4r en \"singel-master\"; vi har en OpLog dit alla f\u00f6r\u00e4ndringar g\u00e5r \u2013 i s\u00e5 fall \u00e4r allt redan sekventiellt ordnat i sj\u00e4lva \"OpLog\". Men om vi har tv\u00e5 olika shards \u00e4r tidssynkronisering viktig. H\u00e4r har vektorklockor hj\u00e4lpt mer! Men vi har inga.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet andra alternativet \u00e4r \"Heartbeats\". Man kan utbyta vissa signaler som sker varje tidsenhet. Men \"Heartbeats\" \u00e4r f\u00f6r l\u00e5ngsamma, vi kan inte s\u00e4kerst\u00e4lla latensen f\u00f6r v\u00e5r klient.<\/p>\n<p>True time \u2013 det \u00e4r sj\u00e4lvklart en fantastisk sak. Men \u00e5 andra sidan, det \u00e4r nog framtiden\u2026 \u00c4ven om man redan kan g\u00f6ra det i \"Atlas\", det finns redan snabba \"amazoniska\" tidssynkroniserare. Men detta kommer inte vara tillg\u00e4ngligt f\u00f6r alla.<\/p>\n<p>Gossiping \u2013 det \u00e4r n\u00e4r alla meddelanden inkluderar tid. Det \u00e4r ungef\u00e4r vad vi anv\u00e4nder. Varje meddelande mellan noder, drivrutiner, routers f\u00f6r datanoder, absolut allt f\u00f6r \"MongoDB\" \u2013 det \u00e4r vissa element, komponenter i databasen som inneh\u00e5ller klockor som tickar. De har \u00f6verallt ett hybridt tidsv\u00e4rde som \u00f6verf\u00f6rs. 64 bitar? Det \u00e4r m\u00f6jligt, det kan g\u00f6ras.<\/p>\n<h3>Hur fungerar allt detta tillsammans?<\/h3>\n<p>\nH\u00e4r \u00f6verv\u00e4ger jag ett replikasett f\u00f6r att g\u00f6ra det lite enklare. Det finns en Primary och en Secondary. Secondary g\u00f6r replikering och \u00e4r inte alltid helt synkroniserad med Primary.<\/p>\n<p>Det sker en ins\u00e4ttning (insert) i \"Primary\" med ett visst tidsv\u00e4rde. Denna ins\u00e4ttning \u00f6kar den interna r\u00e4knaren med 11, om det \u00e4r max. Eller s\u00e5 kommer den att kontrollera tidsv\u00e4rdena och synkronisera enligt klockorna, om tidsv\u00e4rdena \u00e4r h\u00f6gre. Det m\u00f6jligg\u00f6r tidsordning.<\/p>\n<p>Efter att den har gjort en registrering sker en viktig punkt. Klockorna i \"MongoDB\" inkrementeras endast vid registrering i \"OpLog\". Detta \u00e4r h\u00e4ndelsen som f\u00f6r\u00e4ndrar systemets tillst\u00e5nd. I praktiskt taget alla klassiska artiklar betraktas en h\u00e4ndelse som att ett meddelande kommer in i noden: meddelandet kom \u2013 vilket betyder att systemet har \u00e4ndrat sitt tillst\u00e5nd.<\/p>\n<p>Detta beror p\u00e5 att n\u00e4r man unders\u00f6ker kan man inte riktigt f\u00f6rst\u00e5 hur detta meddelande kommer att tolkas. Vi vet med s\u00e4kerhet att om det inte reflekteras i \"Oploggen\", s\u00e5 kommer det inte att tolkas p\u00e5 n\u00e5got s\u00e4tt, och f\u00f6r\u00e4ndringen av systemets tillst\u00e5nd \u00e4r endast en registrering i \"Oploggen\". Detta f\u00f6renklar allt f\u00f6r oss: b\u00e5de modellen f\u00f6renklas och det m\u00f6jligg\u00f6r ordning inom ett enda replikasett, och mycket annat anv\u00e4ndbart.<\/p>\n<p>Det v\u00e4rde som redan \u00e4r registrerat i \"Oploggen\" \u00e5terl\u00e4mnas \u2013 vi vet att detta v\u00e4rde redan ligger i \"Oploggen\", och dess tid \u00e4r 12. Nu, l\u00e5t oss s\u00e4ga, b\u00f6rjar l\u00e4sningen fr\u00e5n en annan nod (Sekund\u00e4r), och den skickar redan afterClusterTime i sj\u00e4lva meddelandet. Den s\u00e4ger: \"Jag beh\u00f6ver allt som h\u00e4nde minst efter 12 eller under klockan tolv\" (se bilden ovan).<\/p>\n<p>Detta kallas f\u00f6r Kausal konsekvent (CAT). Det finns ett begrepp i teorin att detta \u00e4r en viss tidsutsikt som \u00e4r konsekvent i sig sj\u00e4lv. I detta fall kan vi s\u00e4ga att detta \u00e4r systemets tillst\u00e5nd som observerades vid tidpunkten 12.<\/p>\n<p>Just nu finns det inget h\u00e4r, eftersom detta p\u00e5 n\u00e5got s\u00e4tt imiterar situationen n\u00e4r Sekund\u00e4r beh\u00f6ver replikera data fr\u00e5n Prim\u00e4r. Den v\u00e4ntar\u2026 Och h\u00e4r kommer datan \u2013 den \u00e5terl\u00e4mnar dessa v\u00e4rden.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 h\u00e4r fungerar det ungef\u00e4r. N\u00e4stan.<\/p>\n<p>Vad betyder \"n\u00e4stan\"? L\u00e5t oss anta att det finns en viss person som l\u00e4ste och f\u00f6rstod hur allt detta fungerar. F\u00f6rstod att varje g\u00e5ng sker ClusterTime, den uppdaterar de interna logiska klockorna, och sedan \u00f6kar n\u00e4sta registrering med ett. Denna funktion tar 20 rader. Anta att denna person \u00f6verf\u00f6r det maximalt stora 64-bitars numret, minus ett.<\/p>\n<p>Varf\u00f6r \"minus ett\"? F\u00f6r att de interna klockorna kommer att s\u00e4ttas in i detta v\u00e4rde (uppenbarligen det st\u00f6rsta m\u00f6jliga och st\u00f6rre \u00e4n den aktuella tiden), sedan kommer en registrering ske i \"Oploggen\", och klockorna kommer att \u00f6ka med \u00e4nnu ett \u2013 och d\u00e5 kommer det att vara det maximala v\u00e4rdet (d\u00e4r \u00e4r bara ettor, det finns inget mer, unsaint int:s).<\/p>\n<p>Det \u00e4r tydligt att efter detta blir systemet helt otillg\u00e4ngligt f\u00f6r n\u00e5got. Det kan bara avlastas, reng\u00f6ras \u2013 mycket manuellt arbete. Full tillg\u00e4nglighet:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm detta skulle replikeras n\u00e5gon annanstans, skulle hela klustret fallera. En absolut oacceptabel situation som vem som helst snabbt och enkelt kan \u00e5stadkomma! D\u00e4rf\u00f6r betraktade vi denna punkt som en av de viktigaste. Hur kan vi f\u00f6rhindra det?<\/p>\n<h3>V\u00e5r v\u00e4g \u00e4r att signera clusterTime<\/h3>\n<p>\nS\u00e5 det \u00f6verf\u00f6rs i meddelandet (f\u00f6re den bl\u00e5 texten). Men vi b\u00f6rjade ocks\u00e5 generera en signatur (bl\u00e5 text):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSignaturen genereras med en nyckel som lagras inom databasen, inom ett skyddat omr\u00e5de; den genereras och uppdateras (anv\u00e4ndare ser inget av detta). En hash genereras, och varje meddelande signeras vid skapandet och valideras vid mottagandet.<br \/>\nDet v\u00e4cker antagligen fr\u00e5gan hos folk: \"Hur mycket sakta ner allt detta?\" Jag har sagt att det ska fungera snabbt, s\u00e4rskilt utan denna funktion.<\/p>\n<p>Vad betyder det att anv\u00e4nda Causal consistency i detta fall? Det inneb\u00e4r att visa afterClusterTime-parametern. Utan den kommer den helt enkelt att \u00f6verf\u00f6ra v\u00e4rden oavsett. Gossiping har alltid fungerat fr\u00e5n version 3.6.<\/p>\n<p>Om vi l\u00e4mnar konstant signering av signaturer, kommer det att sakta ner systemet \u00e4ven utan funktioner, vilket inte st\u00e4mmer \u00f6verens med v\u00e5ra metoder och krav. Vad gjorde vi?<\/p>\n<h3>G\u00f6r detta snabbt!<\/h3>\n<p>\nEn ganska enkel sak, men en intressant trick \u2013 jag delar med mig, kanske n\u00e5gon finner det intressant.<br \/>\nVi har en hash som lagrar signerade data. All information g\u00e5r genom cachen. Cachen signerar inte specifikt tiden, utan Range. N\u00e4r ett visst v\u00e4rde kommer, genererar vi Range, maskerar de senaste 16 bitarna, och det v\u00e4rdet signerar vi:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGenom att f\u00e5 en s\u00e5dan signatur \u00f6kar vi systemets hastighet (teoretiskt) med 65 tusen g\u00e5nger. Det fungerar utm\u00e4rkt: n\u00e4r vi satte upp experimenten \u2013 tiden minskade verkligen med 10 tusen g\u00e5nger n\u00e4r vi hade sekventiella uppdateringar. Klart att det inte fungerar n\u00e4r de \u00e4r oordnade. Men i de flesta praktiska fall fungerar det. Kombinationen av Range-signaturen tillsammans med signaturen l\u00f6ste s\u00e4kerhetsproblemet.<\/p>\n<h3>Vad har vi l\u00e4rt oss?<\/h3>\n<p>\nLektioner vi dragit fr\u00e5n detta:<\/p>\n<ul>\n<li>Man m\u00e5ste l\u00e4sa material, ber\u00e4ttelser, artiklar, f\u00f6r att vi har mycket intressant. N\u00e4r vi arbetar med en funktion (s\u00e4rskilt nu n\u00e4r vi har genomf\u00f6rt transaktioner osv.) m\u00e5ste vi l\u00e4sa och f\u00f6rst\u00e5. Det tar tid, men det \u00e4r verkligen v\u00e4ldigt nyttigt, eftersom det blir tydligt var vi st\u00e5r. Vi har inte direkt kommit p\u00e5 n\u00e5got nytt \u2013 vi har bara tagit ingredienser.\n<p>Det r\u00e5der \u00f6verhuvudtaget en viss skillnad i t\u00e4nkandet n\u00e4r det handlar om en akademisk konferens (som \"Sigmon\", till exempel) \u2013 d\u00e4r fokuserar alla p\u00e5 nya id\u00e9er. Vad \u00e4r nyheten med v\u00e5r algoritm? H\u00e4r finns det inte mycket nyhet. Nyheten ligger snarare i hur vi blandade ihop befintliga metoder. D\u00e4rf\u00f6r \u00e4r det viktigt att l\u00e4sa klassikerna, fr\u00e5n Lamport.<\/li>\n<li>Inom produktion \u00e4r kraven helt andra. Jag \u00e4r s\u00e4ker p\u00e5 att m\u00e5nga av er inte st\u00e5r inf\u00f6r \"sferiska\" databaser i ett abstrakt vakuum, utan med normala, verkliga saker som har problem med tillg\u00e4nglighet, latens och felmotst\u00e5nd.<\/li>\n<li>Det sista \u00e4r att vi var tvungna att \u00f6verv\u00e4ga olika id\u00e9er och kombinera flera helt olika artiklar till en metod, tillsammans. Id\u00e9n om signering, till exempel, kom \u00f6verhuvudtaget fr\u00e5n en artikel som behandlade Paxos-protokollet, som f\u00f6r icke-byzantinska fel inom auktorisationsprotokollet, f\u00f6r byzantinska \u2013 utanf\u00f6r auktorisationsprotokollet... I stort sett \u00e4r det precis vad vi i slut\u00e4ndan gjorde.\n<p>Det finns absolut ingenting nytt h\u00e4r! Men s\u00e5 snart vi blandade allt detta tillsammans... Det skulle vara som att s\u00e4ga att receptet p\u00e5 Olivier-sallad \u00e4r nonsens, eftersom \u00e4gg, majonn\u00e4s och gurkor redan \u00e4r uppfunna... Det \u00e4r ungef\u00e4r samma historia.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJag avslutar h\u00e4r. Tack!<\/p>\n<h3>Fr\u00e5gor<\/h3>\n<p>\n<b>Fr\u00e5ga fr\u00e5n publiken (nedan \u2013 F):<\/b> \u2013 Tack, Michail, f\u00f6r f\u00f6redraget! Temat om tid \u00e4r intressant. Ni anv\u00e4nder Gossiping. Ni sa att alla har sin egen tid, alla vet sin lokala tid. Jag f\u00f6rstod det som att vi har en drivrutin \u2013 det kan finnas m\u00e5nga kunder med drivrutiner, ocks\u00e5 m\u00e5nga query-planners, och det finns ocks\u00e5 m\u00e5nga shards... Vad h\u00e4nder med systemet om vi pl\u00f6tsligt f\u00e5r en avvikelse: n\u00e5gon best\u00e4mmer sig f\u00f6r att vara en minut f\u00f6re, n\u00e5gon annan \u2013 en minut efter? Var hamnar vi?<\/p>\n<p><b>MT:<\/b> \u2013 Faktiskt en bra fr\u00e5ga! Jag ville just n\u00e4mna sharding. Om jag f\u00f6rst\u00e5r fr\u00e5gan r\u00e4tt, \u00e4r v\u00e5r situation s\u00e5dan att vi har shard 1 och shard 2, och l\u00e4sning sker fr\u00e5n dessa tv\u00e5 shards \u2013 de har olika tidpunkter och interagerar inte med varandra, eftersom den tid de \u00e4r medvetna om \u00e4r olika, s\u00e4rskilt tiden som de har i loggarna.<br \/>\nAnta att shard 1 har gjort en miljon poster, medan shard 2 inte har gjort n\u00e5got. Om en f\u00f6rfr\u00e5gan kommer in till b\u00e4gge shards och den f\u00f6rsta har afterClusterTime som \u00e4r mer \u00e4n en miljon. I en s\u00e5dan situation, som jag har f\u00f6rklarat, kommer shard 2 aldrig att svara.<\/p>\n<p><b>L:<\/b> \u2013 Jag ville veta hur de synkroniserar och v\u00e4ljer en logisk tid.<\/p>\n<p><b>MT:<\/b> \u2013 Det \u00e4r mycket enkelt att synkronisera. N\u00e4r en shard f\u00e5r afterClusterTime och inte hittar n\u00e5gon tid i \"Loggen\" \u2013 initierar den no approved. Det inneb\u00e4r att den manuellt h\u00f6jer sin tid till detta v\u00e4rde. Det betyder att den inte har h\u00e4ndelser som motsvarar denna f\u00f6rfr\u00e5gan. Den skapar denna h\u00e4ndelse konstgjort och blir d\u00e4rmed Causal Consistent.<\/p>\n<p><b>L:<\/b> \u2013 Men om den efter det skulle f\u00e5 flera h\u00e4ndelser, som har f\u00f6rsvunnit i n\u00e4tverket?<\/p>\n<p><b>MT:<\/b> \u2013 Sharding \u00e4r utformat s\u00e5 att de inte kommer att anl\u00e4nda, eftersom det \u00e4r en single master. Om den redan har skrivit, s\u00e5 kommer de inte att anl\u00e4nda, utan de kommer senare. Det kan inte h\u00e4nda att n\u00e5got har fastnat n\u00e5gonstans, sen g\u00f6r den no write, och pl\u00f6tsligt anl\u00e4nder dessa h\u00e4ndelser \u2013 vilket skulle bryta den Causal consistency. N\u00e4r den g\u00f6r no write m\u00e5ste alla komma igen (den kommer att v\u00e4nta p\u00e5 dem).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>L:<\/b> \u2013 Jag har n\u00e5gra fr\u00e5gor ang\u00e5ende k\u00f6er. Causal consistency inneb\u00e4r att det finns en specifik k\u00f6 av \u00e5tg\u00e4rder som m\u00e5ste utf\u00f6ras. Vad h\u00e4nder om en paket f\u00f6rsvinner? L\u00e5t oss s\u00e4ga 10:e, 11:e\u2026 12:e paketet f\u00f6rsvinner, medan alla andra v\u00e4ntar p\u00e5 att det ska utf\u00f6ras. Om pl\u00f6tsligt maskinen kraschar, kan vi inte g\u00f6ra n\u00e5got. Finns det en maximal l\u00e4ngd p\u00e5 k\u00f6n som samlas innan den utf\u00f6rs? Vilken fatal failure intr\u00e4ffar vid f\u00f6rlust av ett enda tillst\u00e5nd? Dessutom, om vi skriver att det finns ett tidigare tillst\u00e5nd, hur ska vi d\u00e5 basera oss p\u00e5 det? Men vi baserade oss inte p\u00e5 det!<\/p>\n<p><b>MT:<\/b> \u2013 Ocks\u00e5 en utm\u00e4rkt fr\u00e5ga! Vad g\u00f6r vi? I MongoDB finns det begreppet kvorumf\u00f6r\u00e4ndringar och kvoruml\u00e4sningar. Under vilka omst\u00e4ndigheter kan ett meddelande f\u00f6rsvinna? N\u00e4r en f\u00f6r\u00e4ndring inte \u00e4r kvorum eller n\u00e4r en l\u00e4sning inte \u00e4r kvorum (det kan ocks\u00e5 vara n\u00e5got skr\u00e4p).<br \/>\nAng\u00e5ende Causal consistency har vi genomf\u00f6rt omfattande experimentell testning, vars resultat visar att n\u00e4r skrivningar och l\u00e4sningar \u00e4r icke-kvorum finns det brott mot Causal consistency. Precis det du s\u00e4ger!<\/p>\n<p>V\u00e5rt r\u00e5d: anv\u00e4nd \u00e5tminstone kvorum-l\u00e4sning vid anv\u00e4ndning av Causal consistency. I s\u00e5 fall kommer inget att g\u00e5 f\u00f6rlorat, \u00e4ven om kvorum-skrivningen f\u00f6rsvinner... Det \u00e4r en ortogonal situation: om anv\u00e4ndaren inte vill att data ska f\u00f6rsvinna, m\u00e5ste kvorum-skrivning anv\u00e4ndas. Causal consistency garanterar inte h\u00e5llbarhet. H\u00e5llbarhet garanteras av replikering och den mekanism som \u00e4r kopplad till replikering.<\/p>\n<p><b>L:<\/b> \u2013 N\u00e4r vi skapar en instans som sk\u00f6ter v\u00e5r sharding (inte master, utan slav), baseras den p\u00e5 maskinens unix-tid eller p\u00e5 \"masterns\" tid; synkroniseras den f\u00f6rsta g\u00e5ngen eller periodiskt?<\/p>\n<p><b>MT:<\/b> \u2013 L\u00e5t mig f\u00f6rtydliga. En shard (dvs. en horisontell partition) har alltid en Primary. I en shard kan det finnas en \"master\" och det kan finnas repliker. Men en shard st\u00f6djer alltid skrivningar, eftersom den m\u00e5ste uppr\u00e4tth\u00e5lla en viss dom\u00e4n (i sharden finns en Primary).<\/p>\n<p><b>L:<\/b> \u2013 S\u00e5 allt beror helt och h\u00e5llet p\u00e5 \"mastern\"? Anv\u00e4nds alltid \"master-tid\"?<\/p>\n<p><b>MT:<\/b> \u2013 Ja. Man kan bildligt s\u00e4ga: klockorna tickar n\u00e4r det g\u00f6rs en skrivning p\u00e5 \"mastern\", i \"OpLog\".<\/p>\n<p><b>L:<\/b> \u2013 Vi har en kund som kopplar upp sig, och han beh\u00f6ver inte veta n\u00e5got om tiden?<\/p>\n<p><b>MT:<\/b> \u2013 Absolut inget beh\u00f6ver han veta! Om vi pratar om hur detta fungerar p\u00e5 klientsidan: f\u00f6r klienten, n\u00e4r han vill anv\u00e4nda Causal consistency, m\u00e5ste han \u00f6ppna en session. Just nu finns allt d\u00e4r: b\u00e5de transaktioner i sessionen och h\u00e4mta r\u00e4ttigheter\u2026 En session \u00e4r en ordning av logiska h\u00e4ndelser som intr\u00e4ffar med klienten.<\/p>\n<p>Om han \u00f6ppnar denna session och s\u00e4ger att han vill ha Causal consistency (om sessionen st\u00f6djer Causal consistency som standard), fungerar allt automatiskt. Drivrutinen kommer att komma ih\u00e5g denna tid och \u00f6ka den n\u00e4r den f\u00e5r ett nytt meddelande. Den kommer att komma ih\u00e5g vilket svar som kom tillbaka fr\u00e5n servern, som \u00e5tergav data. N\u00e4sta beg\u00e4ran kommer att inneh\u00e5lla afterCluster (\"tid st\u00f6rre \u00e4n detta\").<\/p>\n<p>Kunden beh\u00f6ver inte veta n\u00e5got alls! Det \u00e4r helt oklart f\u00f6r dem. Vad g\u00f6r man om man anv\u00e4nder dessa funktioner? F\u00f6r det f\u00f6rsta kan man s\u00e4kert l\u00e4sa fr\u00e5n sekund\u00e4rer: man kan skriva till prim\u00e4r och l\u00e4sa fr\u00e5n geografiskt replikerade sekund\u00e4rer och vara s\u00e4ker p\u00e5 att det fungerar. Dessutom kan sessioner som sparas p\u00e5 prim\u00e4r \u00f6verf\u00f6ras till sekund\u00e4r, dvs. man kan anv\u00e4nda mer \u00e4n en session.<\/p>\n<p><b>L:<\/b> \u2013 Den nya delen av datavetenskap som \u00e4r starkt kopplad till temat eventuella konsekvenser \u00e4r datatyperna CRDT (Conflict-free Replicated Data Types). Har ni \u00f6verv\u00e4gt integrationen av dessa datatyper i databasen och vad kan ni s\u00e4ga om det?<\/p>\n<p><b>MT:<\/b> \u2013 Bra fr\u00e5ga! CRDT \u00e4r meningsfullt f\u00f6r konflikter vid skrivning: i MongoDB \u2013 en enda master.<\/p>\n<p><b>L:<\/b> \u2013 Jag har en fr\u00e5ga fr\u00e5n devops. I den verkliga v\u00e4rlden finns det s\u00e5dana jesuitiska situationer d\u00e4r bysantinsk felaktighet intr\u00e4ffar och illvilliga m\u00e4nniskor inom den skyddade perimetern b\u00f6rjar manipulera protokollet, skickar specialtillverkade paket?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Illvilliga m\u00e4nniskor inom perimetern \u00e4r som en trojansk h\u00e4st! Illvilliga m\u00e4nniskor inom perimetern kan g\u00f6ra m\u00e5nga d\u00e5liga saker.<\/p>\n<p><b>L:<\/b> \u2013 Det \u00e4r uppenbart att l\u00e4mna ett h\u00e5l i servern, om man s\u00e4ger s\u00e5, genom vilket man kan f\u00f6ra in en djurpark med elefanter och permanent krossa hela klustret... Det kommer att ta tid f\u00f6r manuell \u00e5terst\u00e4llning... Det \u00e4r, mildt uttryckt, fel. \u00c5 andra sidan \u00e4r det intressant: f\u00f6rekommer det s\u00e5dana situationer i verkliga livet, d\u00e4r s\u00e5dana interna attacker intr\u00e4ffar?<\/p>\n<p><b>MT:<\/b> \u2013 Eftersom jag s\u00e4llan st\u00f6ter p\u00e5 s\u00e4kerhetsbrott i verkliga livet, kan jag inte s\u00e4ga om de verkligen intr\u00e4ffar. Men n\u00e4r det g\u00e4ller utvecklingsfilosofin s\u00e5 anser vi s\u00e5 h\u00e4r: vi har en gr\u00e4ns som skyddar de som arbetar med s\u00e4kerhet \u2013 det \u00e4r l\u00e5set, muren; och inom perimetern kan man g\u00f6ra vad man vill. Det \u00e4r klart att det finns anv\u00e4ndare med enbart utsiktsr\u00e4ttigheter, och det finns anv\u00e4ndare med r\u00e4tten att radera kataloger.<\/p>\n<p>Beroende p\u00e5 r\u00e4ttigheterna kan den skada som anv\u00e4ndare kan orsaka vara som en mus, eller s\u00e5 kan det vara en elefant. Det \u00e4r klart att en anv\u00e4ndare med fulla r\u00e4ttigheter kan g\u00f6ra vad som helst. En anv\u00e4ndare med begr\u00e4nsade r\u00e4ttigheter kan orsaka avsev\u00e4rt mindre skada. I synnerhet kan han inte krossa systemet.<\/p>\n<p><b>L:<\/b> \u2013 In the secured perimeter, someone is trying to form unexpected protocols for the server, to bring the server down, and if they\u2019re lucky, maybe even the entire cluster\u2026 Is it ever that \u201cgood\u201d?<\/p>\n<p><b>MT:<\/b> \u2013 I have never heard of such things. That it\u2019s possible to take down a server this way is no secret. Taking it down from the inside, being an authorized user who can write something into the message\u2026 In fact, it can\u2019t be done, because it still must be verified. There is a way to disable this authentication for users who do not want it \u2013 that\u2019s their problem; they\u2019ve essentially built walls themselves and could stuff an elephant in there, which would trample\u2026 Generally speaking, you can dress up as a repairman, come in, and pull it out!<\/p>\n<p><b>L:<\/b> \u2013 Thank you for the report. Sergey (Yandex). In Mongo, there is a constant that limits the number of voting members in the Replica Set, and this constant is equal to 7 (seven). Why is this a constant? Why isn\u2019t this some kind of parameter?<\/p>\n<p><b>MT:<\/b> \u2013 We can have Replica Sets with up to 40 nodes. There is always a majority there. I don\u2019t know which version\u2026<\/p>\n<p><b>L:<\/b> \u2013 In a Replica Set, you can run non-voting members, but voting members are limited to a maximum of 7. How do we deal with a shutdown in this case, if our Replica Set is distributed across 3 data centers? One data center can easily go down, and another machine might drop out.<\/p>\n<p><b>MT:<\/b> \u2013 That\u2019s already a bit beyond the scope of the report. It\u2019s a general question. Maybe I can talk about it later.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Causal consistency: fr\u00e5n teori till praktik\" 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=\"Spela 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>Lite reklam \ud83d\ude42<\/h3>\n<p>\nTack f\u00f6r att ni stannar kvar hos oss. Gillar ni v\u00e5ra artiklar? Vill ni se fler intressanta material? St\u00f6d oss genom att g\u00f6ra en best\u00e4llning eller rekommendera oss till era v\u00e4nner, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">moln-VPS f\u00f6r utvecklare fr\u00e5n $4,99<\/a><\/noindex>, <b>en unik motsvarighet till entry-level servrar som vi har skapat f\u00f6r er:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Allt om VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps fr\u00e5n $19 eller hur man korrekt delar en server?<\/a><\/noindex> (alternativ med RAID1 och RAID10 finns tillg\u00e4ngliga, upp till 24 k\u00e4rnor och upp till 40GB DDR4).<\/p>\n<p><b>Dell R730xd \u00e4r tv\u00e5 g\u00e5nger billigare i datacentret Equinix Tier IV i Amsterdam?<\/b> Bara hos oss <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 100TB fr\u00e5n $199<\/a><\/noindex> i Nederl\u00e4nderna! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 fr\u00e5n $99!<\/b><\/b> L\u00e4s om <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Hur man bygger en f\u00f6retagsinfrastruktur med Dell R730xd E5-2650 v4-servrar som kostar 9000 euro f\u00f6r en br\u00e5kdel?<\/a><\/noindex><br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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 Tyulenyev (MongoDB): Causal consistency: from theory to practice | ProHoster","description":"The next HighLoad++ conference will take place on April 6 and 7, 2020, in St. Petersburg. Details and tickets available via the link.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}