{"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\/hr\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sljede\u0107a konferencija HighLoad++ odr\u017eat \u0107e se 6. i 7. travnja 2020. u Sankt Peterburgu. <br \/>\nDetalji i karte <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">na linku<\/a><\/noindex>. HighLoad++ Sibira 2019. Dvorana \u201eKrasnoyarsk\u201c. 25. lipnja, 12:00. Sa\u017eeci i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">prezentacija<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPonekad prakti\u010dni zahtjevi sukobljavaju se s teorijom, gdje nisu uzete u obzir va\u017ene aspekte za komercijalni proizvod. U ovom izvje\u0161\u0107u predstavljen je proces odabira i kombiniranja razli\u010ditih pristupa za izradu komponenti uzrokovne dosljednosti (Causal consistency) na temelju akademskih istra\u017eivanja, uzimaju\u0107i u obzir zahtjeve komercijalnog proizvoda. Slu\u0161atelji \u0107e saznati o postoje\u0107im teorijskim pristupima za logi\u010dke satove, pra\u0107enje ovisnosti, sigurnost sustava, sinkronizaciju satova, i za\u0161to je MongoDB odabrala odre\u0111ena rje\u0161enja.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mihail Tulenev (dalje - MT):<\/b> \u2013 Pri\u010dati \u0107u o uzrokovnoj dosljednosti (Causal consistency) - to je zna\u010dajka na kojoj smo radili u MongoDB-u. Radim u timu za distribuirane sustave, a to smo razvili prije otprilike dvije godine.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nU procesu sam morao upoznati se s velikim brojem akademskih istra\u017eivanja, jer je ta zna\u010dajka dobro prou\u010dena. Ispostavilo se da niti jedan \u010dlanak ne odgovara onome \u0161to je potrebno u produkciji, zbog vrlo specifi\u010dnih zahtjeva koji postoje, vjerojatno, u bilo kojoj produkcijskoj aplikaciji.<\/p>\n<p>Govorit \u0107u o tome kako mi, kao korisnici akademskih istra\u017eivanja, pripremamo ne\u0161to \u0161to mo\u017eemo zatim predstaviti na\u0161im korisnicima kao gotovu jelo, koje je lako i sigurno koristiti.<\/p>\n<h3>Uzrokovna dosljednost (Causal consistency). Odredimo pojmove<\/h3>\n<p>\nZa po\u010detak \u017eelim ukratko re\u0107i \u0161to je to uzrokovna dosljednost. Ima dva lika - Leonard i Penny (serija \u201eTeorija velikog praska\u201c):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPretpostavimo da je Penny u Europi, a Leonard \u017eeli napraviti neku iznena\u0111enje za nju, zabavu. I ne mo\u017ee smisliti ni\u0161ta bolje nego da je izbaci iz prijatelja, po\u0161alje svim prijateljima a\u017euriranje na feed: \u201eHajde da obradujemo Penny!\u201c (ona je u Europi, dok spava, ne vidi sve to i ne mo\u017ee vidjeti jer nije tamo). Na kraju bri\u0161e ovu objavu, uklanja iz \u201eFeed-a\u201c i obnavlja pristup, kako ona ni\u0161ta ne primijeti i da ne do\u0111e do skandala.<br \/>\nSve je to divno, ali pretpostavimo da je sustav distribuiran i da su doga\u0111aji krenuli malo druga\u010dije. Mo\u017ee se dogoditi, na primjer, da je ograni\u010denje pristupa Pennyju nastalo nakon \u0161to je post objavljen, ako doga\u0111aji nisu me\u0111usobno uzrokovani. Ovo je primjer kada je potrebna uzro\u010dna konzistentnost kako bi se izvr\u0161ila poslovna funkcija (u ovom slu\u010daju).<\/p>\n<p>U stvari, to su prili\u010dno netrivijalna svojstva baza podataka \u2013 vrlo malo njih ih podr\u017eava. Pre\u0111imo na modele.<\/p>\n<h3>Modeli konzistentnosti (Consistency Models)<\/h3>\n<p>\n\u0160to je zapravo model konzistentnosti u bazama podataka? To su odre\u0111ene garantije koje distribuirani sustav daje u vezi s tim koje podatke i u kojem redoslijedu klijent mo\u017ee dobiti.<\/p>\n<p>U su\u0161tini, svi modeli konzistentnosti svode se na to koliko je distribuirani sustav sli\u010dan sustavu koji radi, na primjer, na jednom nodu na prijenosnom ra\u010dunalu. I koliko je sustav koji radi na tisu\u0107ama geo-raspore\u0111enih nodova sli\u010dan prijenosnom ra\u010dunalu, u kojem su svi ti atributi u osnovi automatski ispunjeni.<\/p>\n<p>Stoga se modeli konzistentnosti primjenjuju samo na distribuirane sustave. Svi sustavi koji su prethodno postojali i radili na jednom vertikalnom skaliranju nisu imali takve probleme. Tamo je postojao jedan Buffer Cache i sve se uvijek \u010ditalo iz njega.<\/p>\n<h3>Model Jakost (Strong)<\/h3>\n<p>\nPrvi model \u2013 Jakost (ili linija uzlazne sposobnosti, kako je \u010desto nazivaju). To je model konzistentnosti koji jam\u010di da svaka promjena, \u010dim dobije potvrdu da se dogodila, postaje vidljiva svim korisnicima sustava.<\/p>\n<p>To stvara globalni redoslijed svih doga\u0111aja u bazi podataka. To je vrlo sna\u017eno svojstvo konzistentnosti i op\u0107enito je vrlo skupo. Ipak, vrlo se dobro podr\u017eava. Samo je jako skupo i sporo \u2013 rijetko se koristi. Ovo se naziva uzlazna sposobnost.<\/p>\n<p>Tu je jo\u0161 jedno, ja\u010de svojstvo koje se podr\u017eava u \u2018Spanneru\u2019 \u2013 naziva se Vanjska konzistentnost (External Consistency). O tome \u0107emo razgovarati malo kasnije.<\/p>\n<h3>Uzro\u010dna (Causal)<\/h3>\n<p>\nSljede\u0107e je Causal, upravo ono o \u010demu sam govorio. Izme\u0111u Strong i Causal postoji jo\u0161 nekoliko podrazina o kojima ne\u0107u govoriti, ali se sve svode na Causal. To je va\u017ean model jer je najja\u010di od svih modela, najja\u010da konzistencija u prisutnosti mre\u017ee ili particija.<\/p>\n<p>Causals su situacija u kojoj su doga\u0111aji povezani uzro\u010dnoposljedi\u010dnom vezom. Vrlo \u010desto ih do\u017eivljavaju kao Read your on rights s gledi\u0161ta klijenta. Ako je klijent promatrao neke vrijednosti, ne mo\u017ee vidjeti vrijednosti koje su bile u pro\u0161losti. Ve\u0107 po\u010dinje vidjeti prefiksna o\u010ditanja. Sve se svodi na isto.<br \/>\nCausals kao model konzistencije \u2013 parcijalno ure\u0111en doga\u0111aja na serveru, pri \u010demu se doga\u0111aji sa svih klijenata promatraju u istom redoslijedu. U ovom slu\u010daju \u2013 Leonard i Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nTre\u0107i model \u2013 Eventual Consistency. To je ono \u0161to podr\u017eava apsolutno sve distribuirane sustave, minimalni model koji uop\u0107e ima smisla. To zna\u010di sljede\u0107e: kada se odvijaju neke promjene u podacima, one u nekom trenutku postaju konzistentne.<\/p>\n<p>U tom trenutku ona ni\u0161ta ne govori, ina\u010de bi se pretvorila u External Consistency \u2013 bila bi potpuno druga pri\u010da. Ipak, to je vrlo popularan model, najra\u0161ireniji. Po defaultu svi korisnici distribuiranih sustava koriste upravo Eventual Consistency.<\/p>\n<p>\u017delim navesti nekoliko usporednih primjera:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160to ove strelice zna\u010de?<\/p>\n<ul>\n<li><b>Latency.<\/b> S pove\u0107anjem snage konzistencije, ona postaje ve\u0107a iz o\u010ditih razloga: potrebno je napraviti vi\u0161e zapisa, dobiti potvrdu od svih hostova i nodova koji sudjeluju u klasteru da podaci ve\u0107 postoje. Stoga je u Eventual Consistency najbr\u017ei odgovor, jer se obi\u010dno mo\u017ee \u010dak i u memoriju zapisati i to \u0107e biti dovoljno.<\/li>\n<li><b>Availability.<\/b> Ako to shvatimo kao mogu\u0107nost sustava da odgovori u prisutnosti prekida mre\u017ee, particija ili nekih kvarova \u2013 otpornost na kvarove raste smanjenjem modela konzistencije, jer je dovoljno da jedan host opstane i u tom slu\u010daju prikazuje neke podatke. Eventual Consistency uop\u0107e ne jam\u010di ni\u0161ta o podacima \u2013 to mo\u017ee biti sve, \u0161to god.<\/li>\n<li><b>Anomalies.<\/b> Naravno, s time raste i broj anomlija. U modelima Sna\u017ene konzistentnosti skoro da ih ne bi trebalo biti, dok anomlije kod Eventualne konzistentnosti mogu biti bilo kakve. Postavlja se pitanje: za\u0161to ljudi biraju Eventualnu konzistentnost, ako sadr\u017ei anomlije? Odgovor le\u017ei u tome \u0161to se modeli Eventualne konzistentnosti mogu primijeniti, a anomlije postoje, na primjer, u kratkom vremenskom razdoblju; postoji mogu\u0107nost kori\u0161tenja majstora za \u010ditanje i prili\u010dno konzistentnog o\u010ditavanja podataka; \u010desto postoji mogu\u0107nost kori\u0161tenja sna\u017enih modela konzistentnosti. U praksi to funkcionira, a \u010desto je broj anomlija vremenski ograni\u010den.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP teorema<\/h3>\n<p>\nKada vidite re\u010di konzistentnost, dostupnost \u2013 \u0161ta vam pada na pamet? Ta\u010dno \u2013 CAP teorema! \u017delim da razbijem mit... Nije to moja zasluga \u2013 tu je Martin Kleppmann, koji je napisao sjajan \u010dlanak, sjajnu knjigu.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCAP teorema je princip formulisan 2000-ih godina koji ka\u017ee da je dostupnost, konzistentnost, particije: uzmite bilo koja dva, i ne mo\u017eete izabrati tri. To je bio odre\u0111eni princip. Dokazana je kao teorema nekoliko godina kasnije, uradili su to Gilbert i Lynch. Onda je to po\u010delo da se koristi kao mantra \u2013 sistemi su se po\u010deli deliti na CA, CP, AP i tako dalje.<\/p>\n<p>Ova teorema je zapravo dokazana za slede\u0107e slu\u010dajeve... Prvo, dostupnost se nije razmatrala kao kontinuirana vrednost od nule do stotke (0 \u2013 sistem je 'mrtav', 100 \u2013 odgovara brzo; tako smo je navikli posmatrati), ve\u0107 kao osobina algoritma, koja garantuje da prilikom svih izvr\u0161avanja vra\u0107a podatke.<\/p>\n<p>O vremenu odgovora tu nema nijedne re\u010di! Postoji algoritam koji vra\u0107a podatke posle 100 godina \u2013 potpuno odli\u010dan available-algoritam, koji je deo CAP teoreme.<br \/>\nDrugo: teorema je dokazana za promene u vrednostima istog klju\u010da, pri \u010demu su te promene linija resizable. To zna\u010di da se zapravo retko koriste, jer su modeli druge Eventualne konzistentnosti, Sna\u017ene konzistentnosti (mo\u017eda).<\/p>\n<p>Za\u0161to je sve to bitno? Teorema CAP u obliku u kojem je dokazana, prakti\u010dno nije primenljiva, retko se koristi. U teoretskom obliku ona nekako sve ograni\u010dava. Dobija se odre\u0111eni princip koji je intuitivno ta\u010dan, ali na neki na\u010din, uop\u0161te nije dokazan.<\/p>\n<h3>Kauzalna konzistentnost \u2013 najja\u010di model<\/h3>\n<p>\nTrenutno se mo\u017ee posti\u0107i sve tri stvari: Konzistentnost, Dostupnost uz pomo\u0107 Particija. Konkretno, Uzrokovni konzistentnost \u2013 najja\u010di model konzistentnosti koji, unato\u010d prisutnosti Particija (prekida u mre\u017ei), i dalje funkcionira. Zato predstavlja toliko veliki interes, zato smo se njome i bavili.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOna, s jedne strane, olak\u0161ava rad programerima aplikacija. Konkretno, prisutnost velike podr\u0161ke sa strane servera: kada su svi zapisi koji se doga\u0111aju unutar jednog klijenta zajam\u010deno dostavljeni u takvoj sekvenci drugom klijentu. S druge strane, izdr\u017eava particije.<\/p>\n<h3>Unutarnja kuhinja MongoDB<\/h3>\n<p>\nS obzirom na to da je ru\u010dak, selimo se u kuhinju. Pri\u010dat \u0107u o modelu sustava, a konkretno \u2013 \u0161to je MongoDB za one koji prvi put \u010duju za ovu bazu podataka.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (dalje \u2013 \u201eMongoDB\u201d) je distribuirani sustav koji podr\u017eava horizontalno skaliranje, tj. \u0161arding; i unutar svakog shard-a tako\u0111er podr\u017eava redundanciju podataka, tj. replikaciju.<\/p>\n<p>\u0160arding u \u201eMongoDB\u201d (ne-relacijska Baza Podataka) izvr\u0161ava automatsku ravnote\u017eu, tj. svaka kolekcija dokumenata (ili \u201etablica\u201d u terminima relacijskih podataka) se dijeli na komade, a server automatski premje\u0161ta te dijelove izme\u0111u shard-ova.<\/p>\n<p>Query Router, koji raspore\u0111uje upite, za klijenta predstavlja odre\u0111enog klijenta kroz kojeg on radi. Ve\u0107 zna gdje i koje podatke se nalaze, usmjerava sve upite ka pravom shard-u.<\/p>\n<p>Jo\u0161 jedna va\u017ena to\u010dka: MongoDB je single master. Postoji jedan Primary \u2013 on mo\u017ee primati zapise koji podr\u017eavaju klju\u010devima koje sadr\u017ei. Nije mogu\u0107e napraviti Multi-master write.<\/p>\n<p>Objavili smo verziju 4.2 \u2013 dodane su nove zanimljive stvari. Konkretno, integrirali smo Lucene \u2013 pretra\u017eivanje \u2013 to\u010dno izvr\u0161ivog java direktno u \u201eMongo\u201d, i omogu\u0107eno je pretra\u017eivanje putem Lucene-a, sli\u010dno kao u \u201eElasticsearchu\u201d.<\/p>\n<p>I razvili smo novi proizvod \u2013 Charts, koji je tako\u0111er dostupan na \u201eAtlasu\u201d (vlastiti Cloud \u201eMongo\u201d). Imaju Free Tier \u2013 mo\u017eete se igrati s tim. Charts mi se jako svidio \u2013 vizualizacija podataka, vrlo intuitivna.<\/p>\n<h3>Sastojci Uzrokovne konzistentnosti<\/h3>\n<p>\nBrojao sam otprilike 230 \u010dlanaka koji su objavljeni na ovu temu \u2013 od Leslie Lamperta. Sada \u0107u vam donijeti neke dijelove ovih materijala iz svoje memorije.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSve je po\u010delo s \u010dlankom Leslie Lamperta, koji je napisan 1970-ih. Kao \u0161to vidite, istra\u017eivanja na ovu temu i dalje se nastavljaju. Trenutno se Causal consistency suo\u010dava s interesom zbog razvoja distribuiranih sustava.<\/p>\n<h3>Ograni\u010denja<\/h3>\n<p>\nKoja su ograni\u010denja? To je zapravo jedna od glavnih to\u010daka, jer se ograni\u010denja koja postavlaju produkcijski sustavi znatno razlikuju od ograni\u010denja koja postoje u akademskim \u010dlancima. \u010cesto su prili\u010dno umjetna.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Prvo, 'MongoDB' je single master, kao \u0161to sam ve\u0107 spomenuo (\u0161to znatno pojednostavljuje).<\/li>\n<li>Smatramo da sustav treba podr\u017eavati oko 10 tisu\u0107a shardova. Ne mo\u017eemo donijeti arhitektonske odluke koje \u0107e otvoreno ograni\u010diti ovu vrijednost.<\/li>\n<li>Imamo oblak, ali pretpostavljamo da korisnik treba imati mogu\u0107nost preuzimanju binarnih datoteka, pokretanju na svom laptopu, i sve bi trebali uspje\u0161no raditi.<\/li>\n<li>Pretpostavljamo ono \u0161to se rijetko koristi u istra\u017eivanjima: vanjski klijenti mogu raditi \u0161to \u017eele. 'MongoDB' je open-source. Stoga, klijenti mogu biti pametni, zli \u2013 mogu htjeti sru\u0161iti sve. Pretpostavljamo da se mogu dogoditi bizantski failori.<\/li>\n<li>Za vanjske klijente, koji su izvan perimetra \u2013 va\u017eno ograni\u010denje: ako je ova funkcija isklju\u010dena, ne smije do\u0107i do performansnih degradacija.<\/li>\n<li>Jo\u0161 jedna to\u010dka \u2013 potpuno antiakademska: kompatibilnost prethodnih i budu\u0107ih verzija. Stari drajveri trebaju podr\u017eavati nove a\u017euriranja, a baza podataka treba podr\u017eavati stare drajvere.<\/li>\n<\/ul>\n<p>\nUglavnom, sve ovo postavlja ograni\u010denja.<\/p>\n<h3>Komponente Causal consistency<\/h3>\n<p>\nSada \u0107u govoriti o nekim komponentama. Ako uop\u0107e razmatramo Causal consistency, mo\u017eemo izdvojiti blokove. Birali smo iz radova koji se odnose na odre\u0111eni blok: Pra\u0107enje zavisnosti, odabir satova, kako se ti satovi mogu me\u0111usobno sinhronizirati, i kako osiguravamo sigurnost \u2013 to je okvirni plan o \u010demu \u0107u govoriti:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Potpuno pra\u0107enje zavisnosti (Full Dependency Tracking)<\/h3>\n<p>\nZa\u0161to je to potrebno? Kada se podaci repliciraju \u2013 svaki zapis, svaka promjena podataka sadr\u017ei informacije o tome od kojih promjena ovisi. Najprva i naivna promjena je kada svaka poruka koja sadr\u017ei zapis, sadr\u017ei informacije o prethodnim porukama:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nU ovom primjeru broj u viti\u010dastim zagradama \u2013 to su brojevi zapisa. Ponekad se ti zapisi sa vrijednostima prenose \u010dak i u cijelosti, ponekad se prenose neki verzije. Su\u0161tina je da svaka promjena sadr\u017ei informacije o prethodnoj (jasno nosi sve to u sebi).<\/p>\n<p>Za\u0161to smo odlu\u010dili ne koristiti takav pristup (potpuno pra\u0107enje)? O\u010digledno, jer je taj pristup neprakti\u010dan: svaka promjena u dru\u0161tvenoj mre\u017ei ovisi o svim prethodnim promjenama u toj dru\u0161tvenoj mre\u017ei, prenose\u0107i, recimo, \u2018Facebook\u2019 ili \u2018Vkontakte\u2019 u svakom a\u017euriranju. Ipak, postoji mnogo istra\u017eivanja o Full Dependency Tracking \u2013 to su pre-socijalne mre\u017ee, za neke situacije to zaista funkcionira.<\/p>\n<h3>Jasno pra\u0107enje zavisnosti (Explicit Dependency Tracking)<\/h3>\n<p>\nSljede\u0107i \u2013 ograni\u010deniji. Ovdje se tako\u0111er razmatra prijenos informacija, ali samo onih koje su jasno ovisne. \u0160to o \u010demu ovisi, obi\u010dno ve\u0107 odre\u0111uje Aplikacija. Kada se podaci repliciraju, na zahtjev se daju samo odgovori kada su prethodne zavisnosti zadovoljene, to jest kada su prikazane. U tome je su\u0161tina na\u010dina na koji Causal consistency funkcionira.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOna vidi da zapis 5 ovisi o zapisima 1, 2, 3, 4 \u2013 prema tome, ona \u010deka, prije nego \u0161to klijent dobije pristup promjenama koje je donijela odluka pristupa Penny, kada su sve prethodne promjene ve\u0107 pro\u0161le u bazi podataka.<\/p>\n<p>To nas tako\u0111er ne zadovoljava, jer ipak ima previ\u0161e informacija, i to \u0107e usporiti. Postoji drugi pristup...<\/p>\n<h3>Lamportovi satovi (Lamport Clock)<\/h3>\n<p>\nOni su jako stari. Lamport Clock podrazumijeva da se ove zavisnosti svode u skalarnu funkciju koja se naziva Lamport Clock.<\/p>\n<p>Skalarnom funkcijom smatra se odre\u0111eni apstraktni broj. \u010cesto ga nazivaju logi\u010dkim vremenom. Sa svakim doga\u0111ajem, ovaj counter se pove\u0107ava. Counter koji je trenutno poznat procesu \u0161alje svaku poruku. Jasno je da procesi mogu biti desinkronizovani, i da mogu imati potpuno razli\u010dito vreme. Ipak, takvom razmenom poruka sistem nekako balansira svoje sate. \u0160ta se u ovom slu\u010daju de\u0161ava?<\/p>\n<p>Podelio sam taj veliki shard na dva dela, kako bi bilo jasnije: Friends mogu \u017eiveti u jednoj nodi koja sadr\u017ei deo kolekcije, dok Feed mo\u017ee biti u potpuno drugoj nodi koja sadr\u017ei deo te kolekcije. Jasno je kako oni ne mogu stati u red? Prvo \u0107e Feed re\u0107i: \"Replikuo se\", a zatim - Friends. Ako sistem ne obezbe\u0111uje nikakva jamstva da Feed ne\u0107e biti prikazan dok zavisnosti Friends u kolekciji Friends ne budu isporu\u010dene, tada \u0107emo do\u0107i u situaciju o kojoj sam govorio.<\/p>\n<p>Vidite kako logi\u010dko vreme counter-a na Feed-u raste:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDakle, osnovna osobina ovog Lamport Clock-a i Kausalne doslednosti (obja\u0161njene kroz Lamport Clock) je slede\u0107a: ako imamo doga\u0111aje A i B, a doga\u0111aj B zavisi od doga\u0111aja A *, to implicira da je LogicalTime doga\u0111aja A manje od LogicalTime doga\u0111aja B.<\/p>\n<p><i>* Ponekad se ka\u017ee da je A dogodio pre B, \u0161to zna\u010di da se A desilo pre B \u2013 to je odnos koji delimi\u010dno ure\u0111uje celokupnu grupu doga\u0111aja koji su se uop\u0161te dogodili.<\/i><\/p>\n<p>U obrnutom smeru to nije ta\u010dno. Ovo je zapravo jedan od osnovnih nedostataka Lamport Clock-a \u2013 delimi\u010dni redosled. Postoji pojam simultanih doga\u0111aja, \u0161to su doga\u0111aji u kojima ni (A dogodio se pre B), ni (B dogodio se pre A). Primer mo\u017ee biti paralelno dodavanje prijatelja od strane Leonarda nekome drugome (\u010dak ne i od strane Leonarda, ve\u0107 \u0160eldona, na primer).<br \/>\nTo je svojstvo koje se \u010desto koristi prilikom rada sa Lamport-\u010dasovima: gleda se upravo na funkciju i na osnovu toga se donosi zaklju\u010dak \u2013 mo\u017eda su ti doga\u0111aji zavisni. Jer u jednom smeru to je ta\u010dno: ako je LogicalTime A manje od LogicalTime B, tada B ne mo\u017ee biti dogodio pre A; a ako je ve\u0107e, mo\u017eda mo\u017ee.<\/p>\n<h3>Vektorski \u010dasovi (Vector Clock)<\/h3>\n<p>\nLogi\u010dki razvoj Lamport-\u010dasova su Vektorski \u010dasovi. Oni se razlikuju po tome \u0161to svaka noda, koja ovde postoji, sadr\u017ei svoje, odvojene \u010dasove, a ti \u010dasovi se prenose kao vektor.<br \/>\nU ovom slu\u010daju vidite da nulti indeks vektora odgovara za Feed, a prvi indeks vektora za Friends (svaki od ovih \u010dvorova). I oni \u0107e sada rasti: nulti indeks \"Feeda\" raste na 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0160to je bolje kod Vektorskih sati? To \u0161to omogu\u0107uju razumijevanje koja su doga\u0111anja istovremena i kada se doga\u0111aju na razli\u010ditim \u010dvorovima. Ovo je vrlo va\u017eno za sistem shardiranja, kao \u0161to je \"MongoDB\". Me\u0111utim, to nismo izabrali, iako je to divna stvar, odli\u010dno funkcioni\u0161e, i verovatno bi nam odgovaralo\u2026<\/p>\n<p>Ako imamo 10 hiljada shardova, ne mo\u017eemo prenositi 10 hiljada komponenti, \u010dak i ako kompresujemo, izmi\u0161ljamo ne\u0161to drugo \u2013 korisni teret \u0107e i dalje biti nekoliko puta manji od celokupnog ovog vektora. Stoga, s te\u017einom u srcu, odustali smo od ovog pristupa i pre\u0161li na drugi.<\/p>\n<h3>Spanner TrueTime. Atomski sati<\/h3>\n<p>\nRekao sam da \u0107e biti pri\u010de o \"Spanneru\". To je nevjerojatna stvar, pravo XXI vek: atomski sati, GPS-sinhronizacija.<\/p>\n<p>Koja je ideja? \"Spanner\" je Googleov sistem koji je nedavno \u010dak postao dostupan ljudima (priklju\u010dili su mu SQL). Svaka transakcija ima svoj vremenski \u017eig. Budu\u0107i da je vreme sinhronizovano*, svakom doga\u0111aju se mo\u017ee dodeliti odre\u0111eni vremenski trenutak \u2013 atomi\u010dki sati imaju vreme \u010dekanja, nakon \u010dega se garantuje da \"se dogodi\" drugo vreme.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa taj na\u010din, jednostavno bele\u017ee\u0107i u bazu podataka i \u010dekaju\u0107i odre\u0111eni vremenski period, automatski se garantuje serializabilnost doga\u0111aja. Imaju najja\u010di model konzistentnosti koji u principu mo\u017ee postojati \u2013 to je eksternom konzistentno.<\/p>\n<p>* To je glavni problem Lamportovih sati \u2013 nikada nisu sinhronizovani u distribuiranim sistemima. Mogu da se razdvoje, \u010dak i uz NTP ne funkcioni\u0161u ba\u0161 najbolje. \u201eSpanner\u201c ima atomske sate i sinhronizaciju, \u010dini se, do mikrosekundi.<\/p>\n<p>Za\u0161to nismo izabrali? Ne pretpostavljamo da na\u0161i korisnici imaju ugra\u0111ene atomske sate. Kada se pojave, kao ugra\u0111eni u svaku laptop ra\u010dunar, bi\u0107e neka super cool GPS-sinhronizacija \u2013 tada da\u2026 A za sada, najbolje \u0161to je mogu\u0107e \u2013 to su \"Amazon\", bazne stanice \u2013 za fanatike\u2026 Zato smo koristili druge sate.<\/p>\n<h3>Hibridni sati (Hybrid Clock)<\/h3>\n<p>\nTo je zapravo ono \u0161to kuca u 'MongoDB' kada osigurava uzro\u010dnu konzistentnost. U \u010demu su hibridni? Hibrid je skalarni broj, ali se sastoji od dvije komponente:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Prvo \u2013 to je Unixova epoha (koliko sekundi je pro\u0161lo od 'po\u010detka ra\u010dunalnog svijeta').<\/li>\n<li>Drugo \u2013 neki inkrement, tako\u0111er 32-bitni unsigned int.<\/li>\n<\/ul>\n<p>\nTo je zapravo sve. Postoji pristup: dio koji odgovara za vrijeme uvijek se sinkronizira s satovima; svaki put kada se dogodi a\u017euriranje, taj dio se sinkronizira sa satovima i tako se dobije da je vrijeme uvijek vi\u0161e-manje ispravno, dok inkrement omogu\u0107ava razlikovanje doga\u0111aja koji su se dogodili u isti trenutak.<\/p>\n<p>Za\u0161to je to va\u017eno za 'MongoDB'? Zato \u0161to omogu\u0107ava izradu nekih backup vra\u0107anja na odre\u0111eni trenutak vremena, to jest doga\u0111aj se indeksira vremenom. To je va\u017eno kada su potrebni neki doga\u0111aji; za baze podataka doga\u0111aji su promjene u bazi koje su se dogodile u odre\u0111enim vremenskim intervalima.<\/p>\n<p>Najva\u017eniju razlog \u0107u re\u0107i samo vama (molim vas, samo nikome ne govorite)! Uradili smo to jer tako izgledaju ure\u0111eni, indeksirani podaci u MongoDB OpLogu. OpLog je struktura podataka koja sadr\u017ei sve promjene u bazi: prvo dolaze u OpLog, a zatim se primjenjuju na pohranu u slu\u010daju kada su to replicirani podaci ili shard.<\/p>\n<p>To je bio glavni razlog. Ipak postoje i prakti\u010dni zahtjevi za razvoj baze, a to zna\u010di da treba biti jednostavno \u2013 malo koda, \u0161to manje slomljenih stvari koje treba prepisivati i testirati. To \u0161to su na\u0161i oplogi bili indeksirani hibridnim satovima, zna\u010dajno je pomoglo i omogu\u0107ilo ispravan izbor. To se doista isplatilo i na neki na\u010din \u010darobno funkcioniralo, ve\u0107 na prvom prototipu. Bilo je stvarno sjajno!<\/p>\n<h3>Sinkronizacija sati<\/h3>\n<p>\nPostoji nekoliko na\u010dina za sinkronizaciju opisano u nau\u010dnoj literaturi. Govorim o sinkronizaciji kada imamo dva razli\u010dita shard-a. Ako postoji jedan replika-set, tada nije potrebna nikakva sinkronizacija: to je \"single-master\"; imamo OpLog, u koji svi promena ulaze \u2013 u tom slu\u010daju je sve ve\u0107 sekvencijalno pore\u0111ano u samom \"OpLogu\". Ali ako imamo dva razli\u010dita shard-a, ovde je sinkronizacija vremena va\u017ena. Evo, vektorski satovi su mnogo pomogli! Ali mi ih nemamo.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDrugi pristup je \"Heartbeats\". Mogu se razmenjivati neki signali koji se de\u0161avaju svake jedinice vremena. Ali \"Heartbeats\" su previ\u0161e spori, ne mo\u017eemo obezbediti latenciju na\u0161em klijentu.<\/p>\n<p>Pravi vreme \u2013 naravno, divna stvar. Ali, opet, to je verovatno budu\u0107nost... Iako u \"Atlasu\" ve\u0107 mo\u017ee to da se uradi, ve\u0107 postoje brzi \"amazon\u0161ki\" sinhronizatori vremena. Ali to ne\u0107e biti dostupno svima.<\/p>\n<p>Gossiping \u2013 to je kada sve poruke uklju\u010duju vreme. To je otprilike ono \u0161to i koristimo. Svaka poruka izme\u0111u nodova, drajver, ruter data-nodova, apsolutno sve za \"MongoDB\" \u2013 to su neki elementi, sastavni delovi baze podataka, koji sadr\u017ee satove koji te\u010de. Svuda imaju vrednost hibridnog vremena, koja se prenosi. 64 bita? To je mogu\u0107e.<\/p>\n<h3>Kako sve ovo zajedno funkcioni\u0161e?<\/h3>\n<p>\nOvde razmatram jedan replika-set, da bi bilo malo jednostavnije. Ima Primary i Secondary. Secondary obavlja replikaciju i ne uvek je potpuno sinkronizovan sa Primary.<\/p>\n<p>De\u0161ava se umetanje (insert) u \"Primary\" sa odre\u0111enom vremenskom vredno\u0161\u0107u. Ova umetanja pove\u0107ava unutra\u0161nji broja\u010d za 11, ako je to maksimum. Ili \u0107e proveravati vrednosti satova i sinkronizovati se prema satovima, ako su vrednosti satova ve\u0107e. To omogu\u0107ava vremensko pore\u0111enje.<\/p>\n<p>Nakon \u0161to napravi zapis, de\u0161ava se va\u017ean trenutak. Satovi u \"MongoDB\" se inkrementiraju samo u slu\u010daju pisanja u \"Oplog\". To je doga\u0111aj koji menja stanje sistema. U svim klasi\u010dnim \u010dlancima doga\u0111ajem se smatra dolazak poruke u nod: poruka je stigla \u2013 zna\u010di, sistem je promenio svoje stanje.<\/p>\n<p>To je povezano s time da se tijekom istra\u017eivanja ne mo\u017ee potpuno razumjeti kako \u0107e ova poruka biti interpretirana. Sigurno znamo da ako nije odra\u017eena u \"Oplogu\", ne\u0107e se nimalo interpretirati, a promjena stanja sustava je samo zapis u \"Oplogu\". Ovo nam pojednostavljuje stvari: model je pojednostavljen, a omogu\u0107uje i vo\u0111enje ure\u0111ivanja unutar jednog replika skupa, kao i mnoge druge korisne stvari.<\/p>\n<p>Vra\u0107a se vrijednost koja je ve\u0107 zapisana u \"Oplog\" \u2013 znamo da je u \"Oplogu\" ve\u0107 spremljena ta vrijednost, a njezino vrijeme je 12. Sada, recimo, po\u010dinje \u010ditanje s druge \u010dvora (Sekundarni), i on ve\u0107 prenosi afterClusterTime u samoj poruci. Ka\u017ee: \"Trebam sve \u0161to se dogodilo barem nakon 12 ili u vrijeme dvanaest\" (vidi sliku iznad).<\/p>\n<p>To je ono \u0161to se naziva Causal a consistent (CAT). Postoji takav pojam u teoriji, da je to odre\u0111eni trenutak vremena koji je sam po sebi konzistentan. U ovom slu\u010daju mo\u017eemo re\u0107i da je to stanje sustava koje je zabilje\u017eeno u trenutku vremena 12.<\/p>\n<p>Trenutno ovdje jo\u0161 nema ni\u0161ta, jer to donekle imitira situaciju kada je potrebno da Sekundarni replicira podatke s Primarnog. \u010ceka... I evo podaci su stigli \u2013 vra\u0107a te vrijednosti natrag.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOtprilike tako sve i funkcionira. Gotovo.<\/p>\n<p>\u0160to zna\u010di \"gotovo\"? Pretpostavimo da postoji neka osoba koja je pro\u010ditala i razumjela kako to sve funkcionira. Razumjela je da se svaki put doga\u0111a ClusterTime, koji a\u017eurira unutarnje logi\u010dke satove, a zatim sljede\u0107i zapis se pove\u0107ava za jedan. Ova funkcija zauzima 20 redaka. Recimo, ta osoba proslje\u0111uje maksimalni 64-bitni broj, minus jedan.<\/p>\n<p>Za\u0161to \"minus jedan\"? Zato \u0161to \u0107e unutarnji satovi biti umetnuti u tu vrijednost (o\u010dito, to je najve\u0107a mogu\u0107a vrijednost i ve\u0107a od trenutnog vremena), zatim \u0107e se dogoditi zapis u \"Oplog\", a satovi se jo\u0161 jednom inkrementiraju \u2013 tada \u0107e to biti u potpunosti maksimalna vrijednost (tu su svi jedinice, nema gdje dalje, unsaint int\u2019ovi).<\/p>\n<p>Jasno je da nakon toga sustav postaje potpuno nedostupan za bilo \u0161to. Mo\u017ee se samo izvu\u0107i, o\u010distiti \u2013 mnogo ru\u010dnog rada. Potpuna dostupnost:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKada se ovo replicira negdje drugdje, cijeli klaster jednostavno pada. Potpuno neprihvatljiva situacija koju bilo tko mo\u017ee vrlo brzo i lako izazvati! Stoga smo ovo smatrali jednim od najva\u017enijih pitanja. Kako to sprije\u010diti?<\/p>\n<h3>Na\u0161 put je potpisivanje clusterTime<\/h3>\n<p>\nTako se prenosi u poruci (do plavog teksta). No po\u010deli smo i generirati potpis (plavi tekst):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPotpis se generira klju\u010dem koji se \u010duva unutar baze podataka, unutar za\u0161ti\u0107enog perimetra; sam se generira, a\u017eurira (korisnici to ne vide). Generira se hash, a svaka poruka prilikom kreiranja se potpisuje, a prilikom primanja \u2013 validira.<br \/>\nVjerojatno se postavlja pitanje: \"Koliko ovo sve usporava?\" Rekao sam da bi sve trebalo brzo raditi, posebno u odsustvu ove funkcionalnosti.<\/p>\n<p>\u0160to zna\u010di koristiti Causal consistency u ovom slu\u010daju? To pokazuje afterClusterTime parametar. A bez toga \u0107e jednostavno prenositi vrijednosti u svakom slu\u010daju. Gossiping, po\u010dev\u0161i od verzije 3.6, radi uvijek.<\/p>\n<p>Ako ostavimo konstantno generiranje potpisa, to \u0107e usporiti sustav \u010dak i u odsustvu funkcionalnosti, \u0161to nije u skladu s na\u0161im pristupima i zahtjevima. \u0160to smo u\u010dinili?<\/p>\n<h3>U\u010dini to brzo!<\/h3>\n<p>\nPrili\u010dno jednostavna stvar, ali zanimljiv trik \u2013 podijelit \u0107u, mo\u017eda \u0107e nekome biti zanimljivo.<br \/>\nImamo hash u kojem se \u010duvaju potpisani podaci. Svi podaci prolaze kroz predmemoriju. Predmemorija ne potpisuje konkretno vrijeme, nego Range. Kada do\u0111e odre\u0111ena vrijednost, generiramo Range, maskiramo posljednjih 16 bita, i tu vrijednost potpisujemo:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDobivanjem takvog potpisa ubrzavamo sustav (pod uvjetom) 65 tisu\u0107a puta. Odli\u010dno radi: kada smo postavili eksperimente \u2013 vrijeme se stvarno skratilo 10 tisu\u0107a puta tijekom sekvencijalnog a\u017euriranja. Jasno je da kada su nesre\u0111eni, to ne funkcionira. No u ve\u0107ini prakti\u010dnih slu\u010dajeva to radi. Kombinacija potpisa Range zajedno s potpisom omogu\u0107ila je rje\u0161avanje problema sigurnosti.<\/p>\n<h3>Jasno je da svaka usluga nastoji izbje\u0107i zastoje. U na\u0161em slu\u010daju, vjerujemo da su nedavni problemi pomogli da quay.io postane bolji. Za sebe smo izvukli nekoliko klju\u010dnih lekcija koje \u017eelimo podijeliti:<\/h3>\n<p>\nLekcije koje smo iz toga izvukli:<\/p>\n<ul>\n<li>Treba \u010ditati materijale, pri\u010de, \u010dlanke, jer imamo mnogo zanimljivog sadr\u017eaja. Kada radimo na nekoj funkciji (osobito sada kada smo radili na transakcijama itd.), moramo \u010ditati i razumevati. To oduzima vreme, ali je zapravo veoma korisno, jer postaje jasno gde se nalazimo. Nismo smislili ni\u0161ta novo \u2013 samo smo uzeli sastojke.\n<p>Uop\u0161te, prime\u0107uje se odre\u0111ena razlika u razmi\u0161ljanju kada se odr\u017eava akademska konferencija (npr. 'Sigmon') \u2013 svi su fokusirani na nove ideje. Koja je novost na\u0161eg algoritma? Ovde nema neke posebne novosti. Novost se pre sastoji u tome kako smo spojili postoje\u0107e pristupe. Zato prvo \u2013 treba \u010ditati klasike, po\u010dev\u0161i od Lamporta.<\/li>\n<li>U produkciji su potpuno razli\u010diti zahtevi. Siguran sam da se mnogi od vas ne susre\u0107u sa 'sfernim' bazama podataka u apstraktnom vakuumu, ve\u0107 sa normalnim, stvarnim stvarima koje imaju probleme s dostupno\u0161\u0107u, latencijom i otpornosti na gre\u0161ke.<\/li>\n<li>Poslednje \u2013 to je \u0161to smo morali razmotriti razli\u010dite ideje i kombinovati nekoliko potpuno razli\u010ditih \u010dlanaka u jedan pristup, zajedno. Ideja o potpisivanju, na primer, zapravo je do\u0161la iz \u010dlanka koji se bavio Paxos protokolom, koji za ne-vizantijske gre\u0161ke unutar autorizacionog protokola, za vizantijske \u2013 van autorizacionog protokola... U su\u0161tini, to je upravo ono \u0161to smo na kraju i uradili.\n<p>Nove ovde apsolutno nema! Ali \u010dim smo sve to zajedno pome\u0161ali... Isto je kao re\u0107i da je recept za Olivier salatu glupost, jer su jaja, majonez i krastavci ve\u0107 smi\u0161ljeni... To je otprilike ista pri\u010da.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa tome \u0107u zavr\u0161iti. Hvala!<\/p>\n<h3>Pitanja<\/h3>\n<p>\n<b>Pitanje iz publike (dalje \u2013 P):<\/b> \u2013 Hvala, Mihailo, na izlaganju! Tema o vremenu je zanimljiva. Koristite Gossiping. Rekli ste da svako ima svoje vreme, svi znaju svoje lokalno vreme. Shvatio sam da imamo drajver \u2013 klijenata sa drajverima mo\u017ee biti mnogo, query-planner-a tako\u0111e, shard-ova tako\u0111e mnogo... A k \u010demu dolazi sistem, ako iznenada do\u0111e do neslaganja: neko odlu\u010di da je jednu minutu unapred, neko \u2013 jednu minutu unazad? Gde \u0107emo se na\u0107i?<\/p>\n<p><b>MT:<\/b> \u2013 Odli\u010dan je to pitanje! Ba\u0161 sam htio govoriti o shardovima. Ako dobro razumijem pitanje, imamo sljede\u0107u situaciju: postoji shard 1 i shard 2, \u010ditanje se doga\u0111a s ta dva shardova \u2013 imaju razlike, ne komuniciraju me\u0111usobno, jer vrijeme koje oni znaju \u2013 je razli\u010dito, posebno vrijeme koje postoji u opalog.<br \/>\nPretpostavimo da je shard 1 napravio milijun zapisa, shard 2 \u2013 ni\u0161ta, a upit je stigao na ta dva shardova. I prvi ima afterClusterTime ve\u0107i od milijun. U takvoj situaciji, kako sam objasnio, shard 2 nikada ne\u0107e odgovoriti.<\/p>\n<p><b>P:<\/b> \u2013 Htio sam znati kako se sinkroniziraju i odabiru jedno logi\u010dno vrijeme?<\/p>\n<p><b>MT:<\/b> \u2013 Vrlo se jednostavno sinkroniziraju. Shard, kada mu do\u0111e afterClusterTime, i ne nalazi vrijeme u 'Opolagu' \u2013 inicira no approved. To zna\u010di da ru\u010dno podi\u017ee svoje vrijeme na tu vrijednost. To zna\u010di da nema doga\u0111aja koji odgovaraju ovom zahtjevu. On umjetno stvara taj doga\u0111aj i time postaje Causal Consistent.<\/p>\n<p><b>P:<\/b> \u2013 A \u0161to ako mu nakon toga do\u0111u neki doga\u0111aji koji su se negdje izgubili u mre\u017ei?<\/p>\n<p><b>MT:<\/b> \u2013 Shard je tako pode\u0161en da oni ne\u0107e do\u0107i, jer je to single master. Ako je ve\u0107 zapisao, oni vi\u0161e ne mogu do\u0107i, ve\u0107 \u0107e se dogoditi kasnije. Ne mo\u017ee se dogoditi da je negdje ne\u0161to zapelo, zatim \u0107e napraviti no write, a onda ovi doga\u0111aji do\u0111u \u2013 i naru\u0161e Causal consistency. Kada se napravi no write, svi oni moraju do\u0107i dalje (on \u0107e ih pri\u010dekati).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>P:<\/b> \u2013 Imam nekoliko pitanja u vezi s redovima. Causal consistency pretpostavlja da postoji odre\u0111eni red akcija koje treba izvr\u0161iti. \u0160to \u0107e se dogoditi ako nam jedan paket ispadne? Evo, 10., 11... 12. je ispao, a svi ostali \u010dekaju kada \u0107e se izvr\u0161iti. A iznenada nam je stroj umro, ne mo\u017eemo u\u010diniti ni\u0161ta. Postoji li maksimalna duljina reda koja se akumulira prije nego \u0161to se izvr\u0161i? Kakvo se fatalno raskidanje doga\u0111a pri gubitku bilo kojeg jednog stanja? Osim toga, ako zapi\u0161emo da postoji neko prethodno stanje, od njega se moramo na neki na\u010din oslanjati? A nismo se oslonili na njega!<\/p>\n<p><b>MT:<\/b> \u2013 Tako\u0111er odli\u010dno pitanje! \u0160to radimo? U MongoDB-u postoji pojam quorum zapisivanja, quorum \u010ditanja. U kojim slu\u010dajevima poruka mo\u017ee nestati? Kada zapis nije quorum ili kada \u010ditanje nije quorum (tako\u0111er mo\u017ee do\u0107i neki garbage).<br \/>\nU vezi s Causal consistency proveli smo opse\u017eno eksperimentalno istra\u017eivanje, \u010diji je rezultat bio da u slu\u010dajevima kada su zapisivanje i \u010ditanje - nekvorumni, dolazi do kr\u0161enja Causal consistency. To\u010dno to \u0161to govorite!<\/p>\n<p>Na\u0161 savjet: koristiti barem kvorumno \u010ditanje pri kori\u0161tenju Causal consistency. Na taj na\u010din ni\u0161ta se ne\u0107e izgubiti, \u010dak i ako kvorumni zapis nestane... To je ortogonalna situacija: ako korisnik ne \u017eeli da se podaci izgube, treba koristiti kvorumni zapis. Causal consistency ne jam\u010di trajnost (durability). Jamstvo trajnosti osigurava replikacija i mehanizam vezan uz replikaciju.<\/p>\n<p><b>P:<\/b> \u2013 Kada kreiramo instancu koja izvodi sharding (ne master, nego slave), ona se oslanja na unix vrijeme vlastitog stroja ili na vrijeme \"mastera\"; sinkronizira se prvi put ili povremeno?<\/p>\n<p><b>MT:<\/b> \u2013 Sada \u0107u pojasniti. Shard (tj. horizontalna particija) - uvijek ima Primary. A u shardu mo\u017ee biti \"master\" i mogu biti replikati. No, shard uvijek podr\u017eava zapisivanje, jer mora podr\u017eavati odre\u0111enu domenu (u shardu je postavljen Primary).<\/p>\n<p><b>P:<\/b> \u2013 Zna\u010di, sve ovisi isklju\u010divo o \"masteru\"? Uvijek se koristi \"master\" vrijeme?<\/p>\n<p><b>MT:<\/b> \u2013 Da. Mo\u017ee se slikovito re\u0107i: satovi kucaju kada se zapisuje u \"master\", u \"Oplogu\".<\/p>\n<p><b>P:<\/b> \u2013 Imamo klijenta koji se spaja, i njemu nisu potrebne informacije o vremenu?<\/p>\n<p><b>MT:<\/b> \u2013 Uop\u0107e ni\u0161ta ne mora znati! Ako govorimo o tome kako to funkcionira na klijentu: klijent, kada \u017eeli koristiti Causal consistency, treba otvoriti sesiju. Sada je sve tu: i transakcije u sesiji, i preuzimanje prava... Sesija je to\u010dno redoslijed logi\u010dkih doga\u0111aja koji se odvijaju s klijentom.<\/p>\n<p>Ako otvori tu sesiju i ka\u017ee da \u017eeli Causal consistency (ako sesija po defaultu podr\u017eava Causal consistency), sve automatski radi. Driver pamti to vrijeme i pove\u0107ava ga kada dobije novu poruku. Pamti koji je odgovor prethodno vratio server koji je vratio podatke. Sljede\u0107i zahtjev \u0107e sadr\u017eavati afterCluster (\"vrijeme ve\u0107e od ovog\").<\/p>\n<p>Klijent ne mora znati apsolutno ni\u0161ta! To je potpuno neprozirno za njega. Ako ljudi koriste ove funkcionalnosti, \u0161to to omogu\u0107uje? Prvo, mo\u017eete sigurno \u010ditati iz sekundarnih izvora: mo\u017eete pisati u primarni, a \u010ditati iz geografski repliciranih sekundarnih i biti sigurni da to radi. U ovom slu\u010daju, sesije koje su zapisane na primarnom se mogu prenijeti \u010dak i na sekundarni, tj. mo\u017eete koristiti ne jednu nego vi\u0161e sesija.<\/p>\n<p><b>P:<\/b> \u2013 Tema Eventual consistency je usko povezana s novim podru\u010djem ra\u010dunalne znanosti \u2013 tipovima podataka CRDT (Conflict-free Replicated Data Types). Jeste li razmatrali integraciju ovih tipova podataka u bazu i \u0161to mo\u017eete re\u0107i o tome?<\/p>\n<p><b>MT:<\/b> \u2013 Dobro pitanje! CRDT ima smisla za sukobe pri pisanju: u MongoDB \u2013 jedinstveni master.<\/p>\n<p><b>P:<\/b> \u2013 Imam pitanje od devops stru\u010dnjaka. U stvarnom svijetu susre\u0107u se takve iezuitanske situacije, kada se dogodi vizantijski neuspjeh, a zli ljudi unutar za\u0161ti\u0107enog perimetra po\u010dinju kvariti protokol, \u0161alju\u0107i specijalno izra\u0111ene pakete?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Zli ljudi unutar perimetra \u2013 to je kao trojanski konj! Zli ljudi unutar perimetra mogu u\u010diniti puno lo\u0161ih stvari.<\/p>\n<p><b>P:<\/b> \u2013 O\u010digledno je da ostavljati \"rupe\" u serveru, da tako ka\u017eem, kroz koje se mo\u017ee provu\u0107i zoolo\u0161ki vrt slonova i sru\u0161iti cijeli klaster zauvijek... Trebat \u0107e vremena za ru\u010dnu obnovu... To je, blago re\u010deno, pogre\u0161no. S druge strane, zanimljivo je \u0161to: u stvarnom \u017eivotu, u praksi, susre\u0107u se takve situacije kada se zapravo doga\u0111aju sli\u010dni unutarnji napadi?<\/p>\n<p><b>MT:<\/b> \u2013 Budu\u0107i da se rijetko susre\u0107em s sigurnosnim probojem u stvarnom \u017eivotu, ne mogu re\u0107i \u2013 mo\u017eda se doga\u0111aju. No, ako govorimo o developerskoj filozofiji, smatramo ovako: imamo perimetar koji osigurava tim koji se bavi sigurno\u0161\u0107u \u2013 to je brava, zid; a unutar perimetra mo\u017eete raditi \u0161to god \u017eelite. Jasno je da postoje korisnici koji mogu samo gledati, a postoje korisnici koji mogu obrisati direktorij.<\/p>\n<p>Ovisno o pravima, \u0161teta koju korisnici mogu u\u010diniti mo\u017ee biti mi\u0161, a mo\u017ee biti i slon. Jasno je da korisnik s punim pravima mo\u017ee u\u010diniti apsolutno sve. Korisnik s ograni\u010denim pravima mo\u017ee prouzro\u010diti znatno manje \u0161tete. Konkretno, ne mo\u017ee sru\u0161iti sustav.<\/p>\n<p><b>P:<\/b> \u2013 Unutar za\u0161ti\u0107enog perimetra netko je poku\u0161ao stvoriti neo\u010dekivane protokole za server, kako bi ga onesposobio, a ako bude sre\u0107e, mo\u017eda i cijeli klaster... Mo\u017ee li biti toliko \"dobro\"?<\/p>\n<p><b>MT:<\/b> \u2013 Nikad nisam \u010duo za takve stvari. To \u0161to se na taj na\u010din mo\u017ee sru\u0161iti server \u2013 nije tajna. Onemogu\u0107iti ga iznutra, kao autorizirani korisnik, koji mo\u017ee napisati ne\u0161to... U stvarnosti nije mogu\u0107e, jer se svejedno mora verificirati. Postoji mogu\u0107nost isklju\u010divanja te autentifikacije za korisnike koji to ne \u017eele \u2013 to su tada njihovi problemi; grubim rje\u010dnikom, sami su sru\u0161ili zidove i mo\u017eemo staviti slona unutra, koji \u0107e zgaziti... U svakom slu\u010daju, mo\u017ee se obla\u010diti kao radnik za popravak, do\u0107i i izvu\u0107i ga!<\/p>\n<p><b>P:<\/b> \u2013 Hvala na izvje\u0161taju. Sergey (\"Yandex\"). U \"Mongu\" postoji konstanta koja ograni\u010dava broj glasova \u010dlanova u Replica Set-u, i ta konstanta je jednaka 7 (sedam). Za\u0161to je to konstanta? Za\u0161to nije neki parametar?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set mo\u017ee imati i do 40 \u010dvorova. Tamo uvijek postoji ve\u0107ina. Ne znam koja je verzija...<\/p>\n<p><b>P:<\/b> \u2013 U Replica Set-u mo\u017eemo pokretati i neglasa\u010de, ali glasa\u010da \u2013 maksimalno 7. Kako se u tom slu\u010daju nositi s isklju\u010denjima, ako nam je Replica Set raspore\u0111en na 3 data centra? Jedan data centar se mo\u017ee jednostavno isklju\u010diti, a jo\u0161 jedan ure\u0111aj mo\u017ee ispasti.<\/p>\n<p><b>MT:<\/b> \u2013 To je ve\u0107 malo izvan okvira izvje\u0161taja. To je op\u0107e pitanje. Mo\u017eda \u0107u ga mo\u0107i kasnije objasniti.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Uzro\u010dna konzistentnost: od teorije do prakse\" 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=\"Pogledajte 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>Malo reklame \ud83d\ude42<\/h3>\n<p>\nHvala \u0161to ostajete s nama. Svi\u0111a li vam se na\u0161e \u010dlanke? \u017delite li vidjeti vi\u0161e zanimljivih materijala? Podr\u017eite nas narud\u017ebom ili preporu\u010dite prijateljima, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">obla\u010dni VPS za developere od 4,99 $<\/a><\/noindex>, <b>jedinstveni analog entry-level servera koji smo razvili za vas:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Sva istina o VPS-u (KVM) E5-2697 v3 (6 jezgri) 10GB DDR4 480GB SSD 1Gbps od 19 $ ili kako pravilno dijeliti server?<\/a><\/noindex> (dostupne opcije s RAID1 i RAID10, do 24 jezgre i do 40GB DDR4).<\/p>\n<p><b>Dell R730xd je 2 puta jeftiniji u data centaru Equinix Tier IV u Amsterdamu?<\/b> Samo kod nas <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 od 199 $<\/a><\/noindex> u Nizozemskoj! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 $!<\/b><\/b> Pro\u010ditajte o tome <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Kako izgraditi infrastrukturu korporacijske klase koriste\u0107i Dell R730xd E5-2650 v4 servere po cijeni od 9000 eura za sitni\u0161?<\/a><\/noindex><br \/>\n<br \/>Izvor: <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\/hr\/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=\"hr_HR\" \/>\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\/hr\/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++, Mihail Tjulenjev (MongoDB): Uzro\u010dna dosljednost: od teorije do prakse | ProHoster","description":"Sljede\u0107a konferencija HighLoad++ odr\u017eat \u0107e se 6. i 7. travnja 2020. godine u Sankt Peterburgu. Detalje i karte mo\u017eete prona\u0107i na linku.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}