{"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\/cs\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Dal\u0161\u00ed konference HighLoad++ se uskute\u010dn\u00ed 6. a 7. dubna 2020 v Petrohrad\u011b. <br \/>\nPodrobnosti a vstupenky <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">na odkazu<\/a><\/noindex>. HighLoad++ Sibi\u0159 2019. S\u00e1l \u201eKrasnojarsk\u201c. 25. \u010dervna, 12:00. Teze a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">prezentace<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u011bkdy se praktick\u00e9 po\u017eadavky dost\u00e1vaj\u00ed do konfliktu s teori\u00ed, kde nejsou zohledn\u011bny d\u016fle\u017eit\u00e9 aspekty obchodn\u00edho produktu. V t\u00e9to p\u0159edn\u00e1\u0161ce je p\u0159edstaven proces v\u00fdb\u011bru a kombinov\u00e1n\u00ed r\u016fzn\u00fdch p\u0159\u00edstup\u016f k vytv\u00e1\u0159en\u00ed komponent Causal consistency na z\u00e1klad\u011b akademick\u00e9ho v\u00fdzkumu s ohledem na po\u017eadavky obchodn\u00edho produktu. Poslucha\u010di se dozv\u011bd\u00ed o existuj\u00edc\u00edch teoretick\u00fdch p\u0159\u00edstupech k logick\u00fdm hodin\u00e1m, sledov\u00e1n\u00ed z\u00e1vislost\u00ed, bezpe\u010dnosti syst\u00e9m\u016f, synchronizaci hodin a pro\u010d se MongoDB rozhodly pro ta \u010di ona \u0159e\u0161en\u00ed.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenev (d\u00e1le \u2013 MT):<\/b> \u2013 Budu hovo\u0159it o Causal consistency \u2013 funkci, na kter\u00e9 jsme pracovali v MongoDB. Pracuji ve skupin\u011b distribuovan\u00fdch syst\u00e9m\u016f, vytvo\u0159ili jsme ji asi p\u0159ed dv\u011bma lety.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nB\u011bhem procesu jsem se musel sezn\u00e1mit s velk\u00fdm mno\u017estv\u00edm akademick\u00e9ho v\u00fdzkumu, proto\u017ee tato funkce je dost dob\u0159e prozkoum\u00e1na. Uk\u00e1zalo se, \u017ee \u017e\u00e1dn\u00fd \u010dl\u00e1nek se nevejde do toho, co je pot\u0159eba v produkci, datab\u00e1z\u00edch, s ohledem na velmi specifick\u00e9 po\u017eadavky, kter\u00e9 asi existuj\u00ed v jak\u00fdchkoli produk\u010dn\u00edch aplikac\u00edch.<\/p>\n<p>Budu hovo\u0159it o tom, jak my, jako\u017eto spot\u0159ebitel\u00e9 akademick\u00e9ho v\u00fdzkumu, p\u0159ipravujeme n\u011bco takov\u00e9ho, co pot\u00e9 m\u016f\u017eeme p\u0159edlo\u017eit na\u0161im u\u017eivatel\u016fm jako hotov\u00e9 j\u00eddlo, kter\u00e9 je pohodln\u00e9 a bezpe\u010dn\u00e9 pou\u017e\u00edvat.<\/p>\n<h3>P\u0159\u00ed\u010dinn\u00e1 konzistence (Causal consistency). Definujeme pojmy<\/h3>\n<p>\nNejprve chci v obecnosti \u0159\u00edci, co vlastn\u011b Causal consistency je. Existuj\u00ed dv\u011b postavy \u2013 Leonard a Penny (seri\u00e1l \u201eTeorie velk\u00e9ho t\u0159esku\u201c):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u0159edstavme si, \u017ee je Penny v Evrop\u011b a Leonard j\u00ed chce ud\u011blat n\u011bjak\u00e9 p\u0159ekvapen\u00ed, p\u00e1rty. A on nic lep\u0161\u00edho nevymysl\u00ed, ne\u017e ji vymazat ze seznamu p\u0159\u00e1tel, poslat v\u0161em p\u0159\u00e1tel\u016fm aktualizaci na feed: \u201ePoj\u010fme pot\u011b\u0161it Penny!\u201c (ona je v Evrop\u011b, zat\u00edmco sp\u00ed, nevid\u00ed to a nem\u016f\u017ee to vid\u011bt, proto\u017ee tam nen\u00ed). Nakonec ten p\u0159\u00edsp\u011bvek odstran\u00ed, sma\u017ee z \u201eFidu\u201c a obnov\u00ed p\u0159\u00edstup, aby si ni\u010deho nev\u0161imla a nedo\u0161lo k n\u011bjak\u00e9mu skand\u00e1lu.<br \/>\nTo je v\u0161echno skv\u011bl\u00e9, ale p\u0159edpokl\u00e1dejme, \u017ee syst\u00e9m je distribuovan\u00fd a ud\u00e1losti se vyvinuly trochu jinak. M\u016f\u017ee se nap\u0159\u00edklad st\u00e1t, \u017ee omezen\u00ed p\u0159\u00edstupu Penny nastalo po zve\u0159ejn\u011bn\u00ed tohoto p\u0159\u00edsp\u011bvku, pokud nejsou ud\u00e1losti vz\u00e1jemn\u011b p\u0159\u00ed\u010dinn\u011b spojeny. V podstat\u011b jde o p\u0159\u00edklad situace, kdy je vy\u017eadov\u00e1na kauz\u00e1ln\u00ed konzistence pro spln\u011bn\u00ed podnikov\u00e9 funkce (v tomto p\u0159\u00edpad\u011b).<\/p>\n<p>Ve skute\u010dnosti jsou to pom\u011brn\u011b netrivi\u00e1ln\u00ed vlastnosti datab\u00e1ze \u2013 jen velmi m\u00e1lo z nich je podporov\u00e1no. P\u0159ejd\u011bme k model\u016fm.<\/p>\n<h3>Modely konzistence (Consistency Models)<\/h3>\n<p>\nCo je vlastn\u011b model konzistence v datab\u00e1z\u00edch? Jsou to ur\u010dit\u00e9 z\u00e1ruky, kter\u00e9 distribuovan\u00fd syst\u00e9m poskytuje ohledn\u011b toho, jak\u00e1 data a v jak\u00e9m po\u0159ad\u00ed m\u016f\u017ee klient obdr\u017eet.<\/p>\n<p>V z\u00e1sad\u011b v\u0161echny modely konzistence se zjednodu\u0161uj\u00ed na to, jak moc se distribuovan\u00fd syst\u00e9m podob\u00e1 syst\u00e9mu, kter\u00fd pracuje nap\u0159\u00edklad na jednom uzlu na notebooku. A jak moc se syst\u00e9m, kter\u00fd funguje na tis\u00edc\u00edch geo-distribuovan\u00fdch 'uzlech', podob\u00e1 notebooku, ve kter\u00e9m jsou v\u0161echny tyto vlastnosti pln\u011b automaticky spln\u011bny.<\/p>\n<p>Proto se modely konzistence uplat\u0148uj\u00ed pouze na distribuovan\u00e9 syst\u00e9my. V\u0161echny syst\u00e9my, kter\u00e9 existovaly d\u0159\u00edve a pracovaly na jednom vertik\u00e1ln\u00edm \u0161k\u00e1lov\u00e1n\u00ed, takov\u00e9 probl\u00e9my nem\u011bly. M\u011bli tam jeden Buffer Cache, ze kter\u00e9ho se v\u0161e v\u017edy na\u010d\u00edtalo.<\/p>\n<h3>Model Strong<\/h3>\n<p>\nPrvn\u00ed model \u2013 to je Strong (nebo \u010dasto naz\u00fdvan\u00fd rise ability). Je to model konzistence, kter\u00fd zaru\u010duje, \u017ee ka\u017ed\u00e1 zm\u011bna, jakmile dojde k potvrzen\u00ed, \u017ee se uskute\u010dnila, je viditeln\u00e1 v\u0161em u\u017eivatel\u016fm syst\u00e9mu.<\/p>\n<p>T\u00edm se vytv\u00e1\u0159\u00ed glob\u00e1ln\u00ed po\u0159ad\u00ed v\u0161ech ud\u00e1lost\u00ed v datab\u00e1zi. Je to velmi siln\u00e9 vlastnost konzistence a je tak\u00e9 velmi n\u00e1kladn\u00e9. P\u0159esto je velmi dob\u0159e podporov\u00e1no. Je to prost\u011b velmi drah\u00e9 a pomal\u00e9 \u2013 pou\u017e\u00edv\u00e1 se jen z\u0159\u00eddka. Naz\u00fdv\u00e1 se rise ability.<\/p>\n<p>Existuje je\u0161t\u011b jedna siln\u011bj\u0161\u00ed vlastnost, kter\u00e1 je podporov\u00e1na ve 'Spanneru' \u2013 naz\u00fdv\u00e1 se extern\u00ed konzistence. O tom si pov\u00edme pozd\u011bji.<\/p>\n<h3>Causal<\/h3>\n<p>\nN\u00e1sleduj\u00edc\u00ed je Causal, p\u0159esn\u011b to, o \u010dem jsem mluvil. Mezi Strong a Causal existuje je\u0161t\u011b n\u011bkolik pod\u00farovn\u00ed, o kter\u00fdch nebudu mluvit, ale v\u0161echny se t\u00fdkaj\u00ed Causal. To je d\u016fle\u017eit\u00fd model, proto\u017ee je nejsiln\u011bj\u0161\u00ed ze v\u0161ech model\u016f, s nejv\u011bt\u0161\u00ed konzistenc\u00ed p\u0159i existenci s\u00edt\u011b nebo odd\u011blen\u00ed.<\/p>\n<p>Causals je situace, kdy jsou ud\u00e1losti spojeny p\u0159\u00ed\u010dinnou souvislost\u00ed. Velmi \u010dasto je lid\u00e9 vn\u00edmaj\u00ed jako Read your on rights z pohledu klienta. Pokud klient sledoval n\u011bjak\u00e9 hodnoty, nem\u016f\u017ee vid\u011bt hodnoty, kter\u00e9 byly v minulosti. U\u017e za\u010d\u00edn\u00e1 vid\u011bt prefixn\u00ed \u010dten\u00ed. To v\u0161e se t\u00fdk\u00e1 jednoho a toho sam\u00e9ho.<br \/>\nCausals jako model konzistence - \u010d\u00e1ste\u010dn\u00e9 uspo\u0159\u00e1d\u00e1n\u00ed ud\u00e1lost\u00ed na serveru, kdy jsou ud\u00e1losti ze v\u0161ech klient\u016f pozorov\u00e1ny ve stejn\u00e9m po\u0159ad\u00ed. V tomto p\u0159\u00edpad\u011b - Leonard a Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nT\u0159et\u00ed model je Eventual Consistency. To je to, co podporuj\u00ed naprosto v\u0161echny distribuovan\u00e9 syst\u00e9my, nejmen\u0161\u00ed model, kter\u00fd m\u00e1 v\u016fbec smysl. Znamen\u00e1 to n\u00e1sleduj\u00edc\u00ed: kdy\u017e dojde k n\u011bjak\u00fdm zm\u011bn\u00e1m v datech, v ur\u010dit\u00e9m okam\u017eiku se stanou konzistentn\u00edmi.<\/p>\n<p>V takov\u00e9m okam\u017eiku nic ne\u0159\u00edk\u00e1, jinak by se to prom\u011bnilo na External Consistency - byla by to \u00fapln\u011b jin\u00e1 historie. Nicm\u00e9n\u011b, to je velmi popul\u00e1rn\u00ed model, nejroz\u0161\u00ed\u0159en\u011bj\u0161\u00ed. Ve v\u00fdchoz\u00edm nastaven\u00ed v\u0161echny u\u017eivatelsk\u00e9 distribuovan\u00e9 syst\u00e9my pou\u017e\u00edvaj\u00ed pr\u00e1v\u011b Eventual Consistency.<\/p>\n<p>Chci p\u0159in\u00e9st n\u011bkolik srovn\u00e1vac\u00edch p\u0159\u00edklad\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCo tyto \u0161ipky znamenaj\u00ed?<\/p>\n<ul>\n<li><b>Latence.<\/b> Se zvy\u0161uj\u00edc\u00ed se silou konzistence se zvy\u0161uje z\u0159ejm\u00fdm zp\u016fsobem: je pot\u0159eba prov\u00e9st v\u00edce z\u00e1pis\u016f, z\u00edskat potvrzen\u00ed od v\u0161ech hostitel\u016f a uzl\u016f, kter\u00e9 se \u00fa\u010dastn\u00ed v clusteru, \u017ee data tam ji\u017e jsou. Odpov\u011b\u010f v p\u0159\u00edpad\u011b Eventual Consistency je nejrychlej\u0161\u00ed, proto\u017ee tam se obvykle d\u00e1 commitnout i do pam\u011bti a to bude v z\u00e1sad\u011b dosta\u010duj\u00edc\u00ed.<\/li>\n<li><b>Dostupnost.<\/b> Pokud to ch\u00e1peme jako schopnost syst\u00e9mu odpov\u011bd\u011bt p\u0159i v\u00fdpadc\u00edch s\u00edt\u011b, odd\u011blen\u00edch nebo n\u011bjak\u00fdch selh\u00e1n\u00edch - odolnost proti chyb\u00e1m nar\u016fst\u00e1 s poklesem modelu konzistence, proto\u017ee sta\u010d\u00ed, aby jeden hostitel \u017eil a vyd\u00e1val n\u011bjak\u00e1 data. Eventual Consistency v\u016fbec nic nezaru\u010duje ohledn\u011b dat - m\u016f\u017ee to b\u00fdt cokoliv.<\/li>\n<li><b>Anomalie.<\/b> Samoz\u0159ejm\u011b se zvy\u0161uje po\u010det anom\u00e1li\u00ed. P\u0159i Strong Consistency by v\u016fbec nem\u011bly existovat, zat\u00edmco u Eventual Consistency mohou b\u00fdt jak\u00e9koli. Vznik\u00e1 ot\u00e1zka: pro\u010d lid\u00e9 vol\u00ed Eventual Consistency, i kdy\u017e obsahuje anom\u00e1lie? Odpov\u011b\u010f je, \u017ee modely Eventual Consistency jsou pou\u017eiteln\u00e9 a anom\u00e1lie se vyskytuj\u00ed nap\u0159\u00edklad jen na kr\u00e1tkou dobu; existuje mo\u017enost pou\u017e\u00edvat master pro \u010dten\u00ed a v\u00edce m\u00e9n\u011b \u010d\u00edst konzistentn\u00ed data; \u010dasto je mo\u017enost pou\u017e\u00edvat siln\u00e9 modely konzistence. Prakticky to funguje a \u010dasto je po\u010det anom\u00e1li\u00ed \u010dasov\u011b omezen.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP teorema<\/h3>\n<p>\nKdy\u017e vid\u00edte slova konzistence, dostupnost \u2013 co v\u00e1m p\u0159ijde na mysl? Spr\u00e1vn\u011b \u2013 CAP teorema! Chci te\u010f rozpt\u00fdlit m\u00fdtus\u2026 To nejsem j\u00e1 \u2013 to je Martin Kleppmann, kter\u00fd napsal skv\u011bl\u00fd \u010dl\u00e1nek, skv\u011blou knihu.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCAP teorema je princip, kter\u00fd byl formulov\u00e1n v 2000. letech, \u017ee Consistency, Availability, Partitions: vezm\u011bte jak\u00e9koli dva, a nelze zvolit t\u0159i. To byl ur\u010dit\u00fd princip. Byl prok\u00e1z\u00e1n jako teorema o n\u011bkolik let pozd\u011bji, ud\u011blali to Gilbert a Lynch. Pot\u00e9 se to za\u010dalo pou\u017e\u00edvat jako mantra \u2013 syst\u00e9my se za\u010daly d\u011blit na CA, CP, AP a tak d\u00e1le.<\/p>\n<p>Tato teorema byla prok\u00e1z\u00e1na ve skute\u010dnosti pro tyto p\u0159\u00edpady\u2026 Za prv\u00e9, dostupnost byla pova\u017eov\u00e1na nikoli jako kontinu\u00e1ln\u00ed hodnota od nuly do sta (0 \u2013 syst\u00e9m \"mrtv\u00fd\", 100 \u2013 odpov\u00edd\u00e1 rychle; tomu jsme si navykli \u0159\u00edkat), ale jako vlastnost algoritmu, kter\u00e1 zaru\u010duje, \u017ee p\u0159i v\u0161ech jeho exekuc\u00edch vrac\u00ed data.<\/p>\n<p>O \u010dase odpov\u011bdi tam nen\u00ed ani slovo! Existuje algoritmus, kter\u00fd vrac\u00ed data za 100 let \u2013 naprosto skv\u011bl\u00fd dostupn\u00fd algoritmus, kter\u00fd je sou\u010d\u00e1st\u00ed teoremy CAP.<br \/>\nZa druh\u00e9: teorema byla prokazov\u00e1na pro zm\u011bny hodnot jednoho a t\u00e9ho\u017e kl\u00ed\u010de, p\u0159i\u010dem\u017e tyto zm\u011bny jsou resizable linie. To znamen\u00e1, \u017ee se ve skute\u010dnosti prakticky nepou\u017e\u00edvaj\u00ed, proto\u017ee modely jsou jin\u00e9, Eventual Consistency, Strong Consistency (mo\u017en\u00e1).<\/p>\n<p>O co jde? O to, \u017ee CAP teorema v tom tvaru, v jak\u00e9m byla prok\u00e1z\u00e1na, je prakticky nepou\u017eiteln\u00e1, m\u00e1lo se pou\u017e\u00edv\u00e1. V teoretick\u00e9 form\u011b n\u011bjak\u00fdm zp\u016fsobem v\u0161e omezuje. Vznik\u00e1 ur\u010dit\u00fd princip, kter\u00fd je intuitivn\u011b pravdiv\u00fd, ale vlastn\u011b nen\u00ed nijak prok\u00e1z\u00e1n.<\/p>\n<h3>Causal consistency \u2013 nejsiln\u011bj\u0161\u00ed model<\/h3>\n<p>\nCo se te\u010f d\u011bje \u2013 je mo\u017en\u00e9 z\u00edskat v\u0161echny t\u0159i v\u011bci: Konzistenci, Dostupnost pomoc\u00ed Rozd\u011blen\u00ed. Zvl\u00e1\u0161\u0165 Kauz\u00e1ln\u00ed konzistence \u2013 nejv\u00edce siln\u00fd model konzistence, kter\u00fd i p\u0159i existenci Rozd\u011blen\u00ed (v\u00fdpadk\u016f v s\u00edti) st\u00e1le funguje. Proto m\u00e1 tak velk\u00fd z\u00e1jem, proto se j\u00ed tak\u00e9 v\u011bnujeme.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZa prv\u00e9, zjednodu\u0161uje pr\u00e1ci v\u00fdvoj\u00e1\u0159\u016f aplikac\u00ed. Zvl\u00e1\u0161\u0165, kdy\u017e existuje velk\u00e1 podpora ze serveru: kdy\u017e v\u0161echna data, kter\u00e1 p\u0159ich\u00e1zej\u00ed od jednoho klienta, p\u0159ich\u00e1zej\u00ed na druh\u00e9ho klienta zaru\u010den\u011b v tomto po\u0159ad\u00ed. Za druh\u00e9, odol\u00e1v\u00e1 rozd\u011blen\u00edm.<\/p>\n<h3>Intern\u00ed kuchyn\u011b MongoDB<\/h3>\n<p>\nPam\u011btn\u00ed na to, \u017ee m\u00e1me ob\u011bd, p\u0159esouv\u00e1me se do kuchyn\u011b. Pov\u011bd\u00ed v\u00e1m o modelu syst\u00e9mu, konkr\u00e9tn\u011b \u2013 co to MongoDB je pro ty, kdo o t\u00e9to datab\u00e1zi sly\u0161\u00ed poprv\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (d\u00e1le \u201eMongoDB\u201c) je distribuovan\u00fd syst\u00e9m, kter\u00fd podporuje horizont\u00e1ln\u00ed \u0161k\u00e1lov\u00e1n\u00ed, tedy shardov\u00e1n\u00ed; a uvnit\u0159 ka\u017ed\u00e9ho shardu tak\u00e9 podporuje redundanci dat, tedy replikaci.<\/p>\n<p>Shardov\u00e1n\u00ed v \u201eMongoDB\u201c (nerela\u010dn\u00ed DB) prov\u00e1d\u00ed automatick\u00e9 vyv\u00e1\u017een\u00ed, tedy ka\u017ed\u00e1 kolekce dokument\u016f (nebo \u201etabulka\u201c v terminologii rela\u010dn\u00edch dat) se rozd\u011bl\u00ed na kusy, a server je automaticky p\u0159emis\u0165uje mezi shardy.<\/p>\n<p>Dotazovac\u00ed router, kter\u00fd distribuuje dotazy, je pro klienta jak\u00fdmsi klientem, p\u0159es kter\u00fd pracuje. U\u017e v\u00ed, kde a jak\u00e1 data se nach\u00e1zej\u00ed, a sm\u011bruje v\u0161echny dotazy na spr\u00e1vn\u00fd shard.<\/p>\n<p>Dal\u0161\u00ed d\u016fle\u017eit\u00fd bod: MongoDB je jedin\u00fd master. Existuje jeden prim\u00e1rn\u00ed \u2013 m\u016f\u017ee p\u0159ij\u00edmat z\u00e1znamy, kter\u00e9 podporuj\u00ed kl\u00ed\u010de, kter\u00e9 s\u00e1m obsahuje. Nen\u00ed mo\u017en\u00e9 prov\u00e1d\u011bt Multi-master z\u00e1pis.<\/p>\n<p>Uvedli jsme verzi 4.2 \u2013 objevily se nov\u00e9 zaj\u00edmav\u00e9 funkce. Zvl\u00e1\u0161\u0165 jsme integrovali Lucene \u2013 vyhled\u00e1v\u00e1n\u00ed \u2013 konkr\u00e9tn\u011b spustitelnou java p\u0159\u00edmo v \u201eMongo\u201c, a nyn\u00ed je mo\u017en\u00e9 prov\u00e1d\u011bt vyhled\u00e1v\u00e1n\u00ed p\u0159es Lucene, stejn\u011b jako v \u201eElastiku\u201c.<\/p>\n<p>A tak\u00e9 jsme vytvo\u0159ili nov\u00fd produkt \u2013 Charts, je tak\u00e9 dostupn\u00fd na \u201eAtlase\u201c (vlastn\u00ed Cloud \u201eMongo\u201c). Maj\u00ed Free Tier \u2013 m\u016f\u017eete si s t\u00edm vyhr\u00e1t. Charts se mi velmi l\u00edbil \u2013 vizualizace dat, velmi intuitivn\u00ed.<\/p>\n<h3>Ingredience Kauz\u00e1ln\u00ed konzistence<\/h3>\n<p>\nSpo\u010d\u00edtal jsem p\u0159ibli\u017en\u011b 230 \u010dl\u00e1nk\u016f, kter\u00e9 byly na toto t\u00e9ma publikov\u00e1ny \u2013 od Leslie Lamperta. Te\u010f v\u00e1m z pam\u011bti p\u0159ednesu n\u011bkter\u00e9 \u010d\u00e1sti t\u011bchto materi\u00e1l\u016f.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161echno za\u010dalo s \u010dl\u00e1nkem Lesley Lampertov\u00e9, kter\u00fd byl naps\u00e1n v 70. letech. Jak vid\u00edte, v\u00fdzkum v t\u00e9to oblasti pokra\u010duje i dnes. Nyn\u00ed m\u00e1 kauz\u00e1ln\u00ed konzistence z\u00e1jem kv\u016fli rozvoji distribuovan\u00fdch syst\u00e9m\u016f.<\/p>\n<h3>Omezen\u00ed<\/h3>\n<p>\nJak\u00e1 jsou omezen\u00ed? To je skute\u010dn\u011b jeden z hlavn\u00edch bod\u016f, proto\u017ee omezen\u00ed, kter\u00e1 kladou produk\u010dn\u00ed syst\u00e9my, se z\u00e1sadn\u011b li\u0161\u00ed od omezen\u00ed uveden\u00fdch v akademick\u00fdch \u010dl\u00e1nc\u00edch. \u010casto jsou dost um\u011bl\u00e1.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Za prv\u00e9, \"MongoDB\" je single master, jak jsem ji\u017e \u0159ekl (to to zna\u010dn\u011b zjednodu\u0161uje).<\/li>\n<li>Domn\u00edv\u00e1me se, \u017ee syst\u00e9m by m\u011bl podporovat p\u0159ibli\u017en\u011b 10 tis\u00edc shard\u016f. Nem\u016f\u017eeme p\u0159ij\u00edmat \u017e\u00e1dn\u00e1 architektonick\u00e1 rozhodnut\u00ed, kter\u00e1 by toto \u010d\u00edslo zjevn\u011b omezovala.<\/li>\n<li>M\u00e1me cloud, ale p\u0159edpokl\u00e1d\u00e1me, \u017ee u\u017eivatel by m\u011bl m\u00edt mo\u017enost st\u00e1hnout si bin\u00e1rn\u00ed soubor, spustit jej na sv\u00e9m notebooku a v\u0161echno by m\u011blo fungovat skv\u011ble.<\/li>\n<li>P\u0159edpokl\u00e1d\u00e1me, \u017ee v oblasti v\u00fdzkumu se z\u0159\u00eddka pou\u017e\u00edv\u00e1: extern\u00ed klienti mohou d\u011blat, co cht\u011bj\u00ed. \"MongoDB\" je open source. Odpov\u00eddaj\u00edc\u00edm zp\u016fsobem, klienti mohou b\u00fdt chyt\u0159\u00ed, zl\u00ed - mohou cht\u00edt v\u0161echno zni\u010dit. P\u0159edpokl\u00e1d\u00e1me, \u017ee mohou nastat byzantsk\u00e9 chyby.<\/li>\n<li>Pro extern\u00ed klienty, kte\u0159\u00ed jsou mimo perimetr \u2013 d\u016fle\u017eit\u00e9 omezen\u00ed: pokud je tato funkce vypnuta, nem\u011blo by doch\u00e1zet k \u017e\u00e1dn\u00e9mu zhor\u0161en\u00ed v\u00fdkonu.<\/li>\n<li>Dal\u0161\u00ed bod \u2013 v\u016fbec antikademick\u00fd: kompatibilita p\u0159edchoz\u00edch verz\u00ed a budouc\u00edch. Star\u00e9 ovlada\u010de by m\u011bly podporovat nov\u00e9 aktualizace a datab\u00e1ze by m\u011bla podporovat star\u00e9 ovlada\u010de.<\/li>\n<\/ul>\n<p>\nCelkov\u011b to v\u0161e klade omezen\u00ed.<\/p>\n<h3>Komponenty kauz\u00e1ln\u00ed konzistence<\/h3>\n<p>\nNyn\u00ed v\u00e1m pov\u00edm o n\u011bkter\u00fdch komponent\u00e1ch. Pokud zva\u017eujeme kauz\u00e1ln\u00ed konzistenci jako celek, m\u016f\u017eeme vy\u010dlenit bloky. Vybrali jsme z prac\u00ed, kter\u00e9 pat\u0159\u00ed k n\u011bjak\u00e9mu bloku: Sledov\u00e1n\u00ed z\u00e1vislost\u00ed, v\u00fdb\u011br hodin, jak tyto hodiny synchronizovat a jak zaji\u0161\u0165ujeme bezpe\u010dnost \u2013 to je p\u0159ibli\u017en\u00fd pl\u00e1n toho, o \u010dem budu mluvit:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00dapln\u00e9 sledov\u00e1n\u00ed z\u00e1vislost\u00ed (Full Dependency Tracking)<\/h3>\n<p>\nPro\u010d je to pot\u0159eba? Aby byla p\u0159i replikaci dat ka\u017ed\u00e1 z\u00e1znam a ka\u017ed\u00e1 zm\u011bna dat dopln\u011bna informac\u00ed o tom, na jak\u00e9 zm\u011bny se odkazuje. Nejprimitivn\u011bj\u0161\u00ed a nejjednodu\u0161\u0161\u00ed zm\u011bna je, kdy\u017e ka\u017ed\u00e1 zpr\u00e1va obsahuj\u00edc\u00ed z\u00e1znam, nese informace o p\u0159edchoz\u00edch zpr\u00e1v\u00e1ch:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tomto p\u0159\u00edkladu je \u010d\u00edslo v z\u00e1vork\u00e1ch \u010d\u00edsly z\u00e1znam\u016f. N\u011bkdy jsou tyto z\u00e1znamy se hodnotami p\u0159ed\u00e1v\u00e1ny \u00fapln\u011b, n\u011bkdy se p\u0159ed\u00e1vaj\u00ed ur\u010dit\u00e9 verze. Podstatou je, \u017ee ka\u017ed\u00e1 zm\u011bna obsahuje informace o p\u0159edchoz\u00edm (to v\u0161e v\u00fdslovn\u011b nese).<\/p>\n<p>Pro\u010d jsme se rozhodli takov\u00fd p\u0159\u00edstup (kompletn\u00ed sledov\u00e1n\u00ed) nepou\u017e\u00edvat? Je z\u0159ejm\u00e9, \u017ee tento p\u0159\u00edstup je nepraktick\u00fd: jak\u00e1koliv zm\u011bna v soci\u00e1ln\u00ed s\u00edti z\u00e1vis\u00ed na v\u0161ech p\u0159edchoz\u00edch zm\u011bn\u00e1ch v t\u00e9to soci\u00e1ln\u00ed s\u00edti, nap\u0159\u00edklad p\u0159ed\u00e1v\u00e1 \u201eFacebook\u201c nebo \u201eVkontakte\u201c v ka\u017ed\u00e9 aktualizaci. Nicm\u00e9n\u011b existuje mnoho v\u00fdzkum\u016f o Full Dependency Tracking \u2013 to jsou pre-soci\u00e1ln\u00ed s\u00edt\u011b, pro ur\u010dit\u00e9 situace to opravdu funguje.<\/p>\n<h3>Jasn\u00e9 sledov\u00e1n\u00ed z\u00e1vislost\u00ed (Explicit Dependency Tracking)<\/h3>\n<p>\nN\u00e1sleduj\u00edc\u00ed \u2013 omezen\u011bj\u0161\u00ed. Zde se tak\u00e9 zkoum\u00e1 p\u0159enos informac\u00ed, ale pouze t\u011bch, kter\u00e9 jsou v\u00fdslovn\u011b z\u00e1visl\u00e9. To, co na \u010dem z\u00e1vis\u00ed, obvykle ur\u010duje ji\u017e aplikace. Kdy\u017e se data replikuj\u00ed, p\u0159i dotazu se vyd\u00e1vaj\u00ed pouze odpov\u011bdi, kdy\u017e byly spln\u011bny p\u0159edchoz\u00ed z\u00e1vislosti, tedy zobrazeny. V tom spo\u010d\u00edv\u00e1 zp\u016fsob, jak\u00fdm funguje kauz\u00e1ln\u00ed konzistence.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVid\u00ed, \u017ee z\u00e1znam 5 z\u00e1vis\u00ed na z\u00e1znamech 1, 2, 3, 4 \u2013 odpov\u00eddaj\u00edc\u00edm zp\u016fsobem \u010dek\u00e1, ne\u017e klient z\u00edsk\u00e1 p\u0159\u00edstup ke zm\u011bn\u00e1m, kter\u00e9 byly provedeny rozhodnut\u00edm p\u0159\u00edstupu Penny, kdy\u017e u\u017e v\u0161echna p\u0159edchoz\u00ed zm\u011bna byla zpracov\u00e1na v datab\u00e1zi.<\/p>\n<p>To n\u00e1m tak\u00e9 nevyhovuje, proto\u017ee st\u00e1le je p\u0159\u00edli\u0161 mnoho informac\u00ed, a to by zpomalovalo. Existuje jin\u00fd p\u0159\u00edstup...<\/p>\n<h3>Lamportovy hodiny (Lamport Clock)<\/h3>\n<p>\nJsou velmi star\u00e9. Lamport Clock znamen\u00e1, \u017ee tyto z\u00e1vislosti se skl\u00e1daj\u00ed do skal\u00e1rn\u00ed funkce, kter\u00e1 se naz\u00fdv\u00e1 Lamport Clock.<\/p>\n<p>Skal\u00e1rn\u00ed funkce je abstraktn\u00ed \u010d\u00edslo. \u010casto se mu \u0159\u00edk\u00e1 logick\u00fd \u010das. P\u0159i ka\u017ed\u00e9 ud\u00e1losti se tento counter zvy\u0161uje. Counter, kter\u00fd je moment\u00e1ln\u011b zn\u00e1m procesu, pos\u00edl\u00e1 ka\u017edou zpr\u00e1vu. Je jasn\u00e9, \u017ee procesy mohou b\u00fdt rozhozen\u00e9, mohou m\u00edt \u00fapln\u011b odli\u0161n\u00fd \u010das. P\u0159esto touto v\u00fdm\u011bnou zpr\u00e1v syst\u00e9m n\u011bjak\u00fdm zp\u016fsobem synchronizuje hodiny. Co se v tomto p\u0159\u00edpad\u011b d\u011bje?<\/p>\n<p>Rozd\u011blil jsem ten velk\u00fd shard na polovinu, aby to bylo jasn\u00e9: Friends mohou \u017e\u00edt v jedn\u00e9 nod\u011b, kter\u00e1 obsahuje \u010d\u00e1st kolekce, zat\u00edmco Feed \u2013 v jin\u00e9m nod\u011b, kter\u00e1 obsahuje tak\u00e9 \u010d\u00e1st t\u00e9to kolekce. Je jasn\u00e9, jak se mohou dostat mimo frontu? Nejprve Feed \u0159ekne: \u201eByl replikov\u00e1n\u201c, a pot\u00e9 \u2013 Friends. Pokud syst\u00e9m nezaji\u0161\u0165uje n\u011bjak\u00e9 z\u00e1ruky, \u017ee Feed nebude zobrazen, dokud z\u00e1vislosti Friends v kolekci Friends tak\u00e9 nebudou doru\u010deny, pak se dost\u00e1v\u00e1me do situace, o kter\u00e9 jsem mluvil.<\/p>\n<p>Vid\u00edte, jak se logick\u00fd \u010das counteru na Feedu zvy\u0161uje:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHlavn\u00ed vlastnost tohoto Lamport Clock a Causal consistency (vysv\u011btlen\u00e9 pomoc\u00ed Lamport Clock) spo\u010d\u00edv\u00e1 v tom, \u017ee pokud m\u00e1me ud\u00e1losti A a B, a ud\u00e1lost B z\u00e1vis\u00ed na ud\u00e1losti A *, pak z toho plyne, \u017ee LogicalTime ud\u00e1losti A je men\u0161\u00ed ne\u017e LogicalTime ud\u00e1losti B.<\/p>\n<p><i>* N\u011bkdy se tak\u00e9 \u0159\u00edk\u00e1, \u017ee A se stalo p\u0159ed B, tedy A nastalo d\u0159\u00edve ne\u017e B \u2013 je to vztah, kter\u00fd \u010d\u00e1ste\u010dn\u011b uspo\u0159\u00e1d\u00e1v\u00e1 cel\u00e9 mno\u017estv\u00ed ud\u00e1lost\u00ed, kter\u00e9 se v\u016fbec staly.<\/i><\/p>\n<p>Opa\u010dn\u011b to neplat\u00ed. To je vlastn\u011b jeden z hlavn\u00edch nedostatk\u016f Lamport Clock \u2013 \u010d\u00e1ste\u010dn\u00fd po\u0159\u00e1dek. Existuje pojem soub\u011b\u017en\u00fdch ud\u00e1lost\u00ed, co\u017e jsou ud\u00e1losti, kde ani (A se stalo p\u0159ed B), ani (A se stalo po B) neplat\u00ed. P\u0159\u00edkladem m\u016f\u017ee b\u00fdt paraleln\u00ed p\u0159id\u00e1n\u00ed Leonardem do p\u0159\u00e1tel n\u011bkoho jin\u00e9ho (dokonce ne Leonardem, ale Sheldonem, nap\u0159\u00edklad).<br \/>\nTo je vlastnost, kterou se \u010dasto zab\u00fdvaj\u00ed p\u0159i pr\u00e1ci s Lamportov\u00fdmi hodinami: sleduj\u00ed se p\u0159esn\u011b funkce a z toho se usuzuje \u2013 mo\u017en\u00e1, \u017ee tyto ud\u00e1losti jsou z\u00e1visl\u00e9. Proto\u017ee jedn\u00edm sm\u011brem to plat\u00ed: pokud LogicalTime A je men\u0161\u00ed ne\u017e LogicalTime B, pak B nem\u016f\u017ee nastat p\u0159ed A; a pokud je v\u011bt\u0161\u00ed, tak to mo\u017en\u00e1 m\u016f\u017ee.<\/p>\n<h3>Vektorov\u00e9 hodiny (Vector Clock)<\/h3>\n<p>\nLogick\u00fd v\u00fdvoj hodin L\u00e1mporta \u2013 jsou to Vektorov\u00e9 hodiny. Ty se li\u0161\u00ed t\u00edm, \u017ee ka\u017ed\u00fd nod, kter\u00fd zde existuje, obsahuje sv\u00e9 vlastn\u00ed, odd\u011blen\u00e9 hodiny, kter\u00e9 se p\u0159ed\u00e1vaj\u00ed jako vektor.<br \/>\nV tomto p\u0159\u00edpad\u011b vid\u00edte, \u017ee nulov\u00fd index vektoru odpov\u00edd\u00e1 Feed, zat\u00edmco prvn\u00ed index vektoru p\u0159edstavuje Friends (ka\u017ed\u00fd z t\u011bchto uzl\u016f). A te\u010f se budou zvy\u0161ovat: nulov\u00fd index 'Feed' se zvy\u0161uje p\u0159i z\u00e1pisu \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPro\u010d jsou vektorov\u00e9 hodiny lep\u0161\u00ed? Umo\u017e\u0148uj\u00ed pochopit, kter\u00e9 ud\u00e1losti prob\u00edhaj\u00ed sou\u010dasn\u011b a kdy se odehr\u00e1vaj\u00ed na r\u016fzn\u00fdch uzlech. To je velmi d\u016fle\u017eit\u00e9 pro syst\u00e9m shardov\u00e1n\u00ed, jako je 'MongoDB'. Ale my jsme to nevybrali, a\u010dkoliv je to skv\u011bl\u00e1 v\u011bc, \u00fa\u017easn\u011b funguje a pravd\u011bpodobn\u011b by se n\u00e1m hodila\u2026<\/p>\n<p>Pokud m\u00e1me 10 tis\u00edc shard\u016f, nem\u016f\u017eeme p\u0159en\u00e1\u0161et 10 tis\u00edc komponent, ani\u017e bychom je zkomprimovali, nebo vymysleli n\u011bco jin\u00e9ho \u2013 stejn\u011b bude u\u017eite\u010dn\u00e1 nosnost mnohem men\u0161\u00ed ne\u017e objem cel\u00e9ho tohoto vektoru. Proto jsme se se sk\u0159\u00edpaj\u00edc\u00edmi zuby a srdcem rozhodli od tohoto p\u0159\u00edstupu odstoupit a p\u0159e\u0161li k jin\u00e9mu.<\/p>\n<h3>Spanner TrueTime. Atomov\u00e9 hodiny.<\/h3>\n<p>\n\u0158\u00edkal jsem, \u017ee bude \u0159e\u010d o 'Spanneru'. To je \u00fa\u017easn\u00e1 v\u011bc, p\u0159\u00edmo XXI. stolet\u00ed: atomov\u00e9 hodiny, GPS synchronizace.<\/p>\n<p>Jak\u00fd je koncept? 'Spanner' je syst\u00e9m od Google, kter\u00fd se ned\u00e1vno stal dostupn\u00fdm i pro lidi (p\u0159idali k n\u011bmu SQL). Ka\u017ed\u00e1 transakce m\u00e1 sv\u016fj \u010dasov\u00fd \u00fadaj. Jeliko\u017e je \u010das synchronizov\u00e1n*, ka\u017ed\u00e9 ud\u00e1losti lze p\u0159id\u011blit ur\u010dit\u00fd \u010das \u2013 atomov\u00e9 hodiny maj\u00ed dobu \u010dek\u00e1n\u00ed, po kter\u00e9 u\u017e garantovan\u011b 'nast\u00e1v\u00e1' jin\u00fd \u010das.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00edmto zp\u016fsobem, kdy\u017e prost\u011b zapisujete do DB a \u010dek\u00e1te ur\u010dit\u00e9 \u010dasov\u00e9 obdob\u00ed, se automaticky zaru\u010duje serializovatelnost ud\u00e1losti. Maj\u00ed nejstronger\u0161\u00ed model konzistence, kter\u00fd si v\u016fbec lze p\u0159edstavit \u2013 je to extern\u00ed konzistence.<\/p>\n<p>* To je hlavn\u00ed probl\u00e9m Lamportov\u00fdch hodin \u2013 nikdy nejsou synchronizov\u00e1ny v distribuovan\u00fdch syst\u00e9mech. Mohou se rozch\u00e1zet, i kdy\u017e je NTP, stejn\u011b nefunguj\u00ed p\u0159\u00edli\u0161 dob\u0159e. 'Spanner' m\u00e1 atomov\u00e9 hodiny a synchronizaci, zd\u00e1 se, na mikrosekundy.<\/p>\n<p>Pro\u010d jsme nevybrali? Nep\u0159edpokl\u00e1d\u00e1me, \u017ee na\u0161i u\u017eivatel\u00e9 maj\u00ed integrovan\u00e9 atomov\u00e9 hodiny. Kdy\u017e se objev\u00ed, p\u0159i\u010dem\u017e budou integrovan\u00e9 do ka\u017ed\u00e9ho laptopu, bude n\u011bjak\u00e1 super skv\u011bl\u00e1 GPS synchronizace \u2013 pak ano\u2026 A zat\u00edm nejlep\u0161\u00ed, co je mo\u017en\u00e9, je 'Amazon', z\u00e1kladnov\u00e9 stanice \u2013 pro fanatiky\u2026 Proto jsme pou\u017eili jin\u00e9 hodiny.<\/p>\n<h3>Hybridn\u00ed hodiny (Hybrid Clock)<\/h3>\n<p>\nTo je vlastn\u011b to, co tik\u00e1 v \u201eMongoDB\u201c p\u0159i zaji\u0161t\u011bn\u00ed kauz\u00e1ln\u00ed konzistence. V \u010dem jsou hybridn\u00ed? Hybrid je skal\u00e1rn\u00ed hodnota, ale skl\u00e1d\u00e1 se ze dvou komponent\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Prvn\u00ed \u2013 je to unixov\u00e1 epocha (kolik sekund uplynulo od \u201eza\u010d\u00e1tku po\u010d\u00edta\u010dov\u00e9ho sv\u011bta\u201c).<\/li>\n<li>Druh\u00e9 \u2013 n\u011bjak\u00fd inkrement, tak\u00e9 32bitov\u00fd unsigned int.<\/li>\n<\/ul>\n<p>\nTo je vlastn\u011b v\u0161e. Existuje takov\u00fd p\u0159\u00edstup: \u010d\u00e1st, kter\u00e1 odpov\u00edd\u00e1 za \u010das, se neust\u00e1le synchronizuje s hodinami; poka\u017ed\u00e9, kdy\u017e dojde k aktualizaci, tato \u010d\u00e1st se synchronizuje s hodinami, tak\u017ee \u010das je v\u017edy v\u00edce \u010di m\u00e9n\u011b spr\u00e1vn\u00fd, a inkrement umo\u017e\u0148uje rozli\u0161ovat mezi ud\u00e1lostmi, kter\u00e9 se staly ve stejn\u00e9m okam\u017eiku.<\/p>\n<p>Pro\u010d je to d\u016fle\u017eit\u00e9 pro \u201eMongoDB\u201c? Proto\u017ee to umo\u017e\u0148uje prov\u00e1d\u011bt n\u011bjak\u00e9 z\u00e1lohov\u00e1n\u00ed a obnoven\u00ed k ur\u010dit\u00e9mu okam\u017eiku, tedy ud\u00e1lost se indexuje \u010dasem. To je d\u016fle\u017eit\u00e9, kdy\u017e jsou pot\u0159eba n\u011bkter\u00e9 ud\u00e1losti; pro DB jsou ud\u00e1losti zm\u011bny v DB, kter\u00e9 se staly v ur\u010dit\u00fdch \u010dasov\u00fdch intervalech.<\/p>\n<p>Nejd\u016fle\u017eit\u011bj\u0161\u00ed d\u016fvod v\u00e1m \u0159eknu jen v\u00e1m (pros\u00edm, nikomu to ne\u0159\u00edkejte)! Ud\u011blali jsme to tak, proto\u017ee takto vypadaj\u00ed uspo\u0159\u00e1dan\u00e1, indexovan\u00e1 data v MongoDB OpLog. OpLog je datov\u00e1 struktura, kter\u00e1 obsahuje v\u0161echny zm\u011bny v datab\u00e1zi: nejprve se dostanou do OpLog a pot\u00e9 se ji\u017e aplikuj\u00ed na Storage, kdy\u017e se jedn\u00e1 o replikovan\u00e1 data nebo shard.<\/p>\n<p>To byl hlavn\u00ed d\u016fvod. Existuj\u00ed tak\u00e9 praktick\u00e9 po\u017eadavky na v\u00fdvoj datab\u00e1ze, a to znamen\u00e1, \u017ee to mus\u00ed b\u00fdt jednoduch\u00e9 \u2013 co nejm\u00e9n\u011b k\u00f3du a co nejm\u00e9n\u011b rozbit\u00fdch v\u011bc\u00ed, kter\u00e9 je t\u0159eba p\u0159episovat a testovat. To, \u017ee m\u00e1me op-logy indexov\u00e1ny hybridn\u00edmi hodinami, n\u00e1m hodn\u011b pomohlo a umo\u017enilo n\u00e1m ud\u011blat spr\u00e1vnou volbu. Opravu se to osv\u011bd\u010dilo a n\u011bjak kouzeln\u011b to fungovalo na prvn\u00edm prototypu. Bylo to opravdu \u00fa\u017easn\u00e9!<\/p>\n<h3>Synchronizace hodin<\/h3>\n<p>\nExistuje n\u011bkolik zp\u016fsob\u016f synchronizace, kter\u00e9 jsou pops\u00e1ny v v\u011bdeck\u00e9 literatu\u0159e. Mluv\u00edm o synchronizaci, kdy\u017e m\u00e1me dva r\u016fzn\u00e9 shard. Pokud m\u00e1me replika\u010dn\u00ed set \u2013 tam \u017e\u00e1dn\u00e1 synchronizace nen\u00ed pot\u0159eba: je to \u201esingle-master\u201c; m\u00e1me OpLog, do kter\u00e9ho v\u0161echna zm\u011bna putuje \u2013 v tomto p\u0159\u00edpad\u011b je v\u0161e u\u017e sekven\u010dn\u011b se\u0159azeno v samotn\u00e9m \u201eOpLogu\u201c. Ale pokud m\u00e1me dva r\u016fzn\u00e9 shardy, tady je synchronizace \u010dasu d\u016fle\u017eit\u00e1. Tady n\u00e1m v\u00edce pomohly vektorov\u00e9 hodiny! Ale ty nem\u00e1me.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDruh\u00fd vhodn\u00fd zp\u016fsob je \u201eHeartbeats\u201c. M\u016f\u017eeme si mezi sebou vym\u011b\u0148ovat ur\u010dit\u00e9 sign\u00e1ly, kter\u00e9 prob\u00edhaj\u00ed ka\u017edou jednotku \u010dasu. Ale \u201eHeartbeats\u201c jsou p\u0159\u00edli\u0161 pomal\u00e9, nem\u016f\u017eeme zaru\u010dit latenci na\u0161im klient\u016fm.<\/p>\n<p>Prav\u00fd \u010das \u2013 samoz\u0159ejm\u011b, skv\u011bl\u00e1 v\u011bc. Ale op\u011bt, to je pravd\u011bpodobn\u011b budoucnost\u2026 A\u010dkoli v \u201eAtlasu\u201c to u\u017e lze ud\u011blat, existuj\u00ed u\u017e rychl\u00e9 \u201eamazonick\u00e9\u201c synchroniz\u00e1tory \u010dasu. Ale to nebude dostupn\u00e9 pro v\u0161echny.<\/p>\n<p>Gossiping \u2013 je to kdy\u017e v\u0161echny zpr\u00e1vy zahrnuj\u00ed \u010das. To je zhruba to, co pou\u017e\u00edv\u00e1me. Ka\u017ed\u00e1 zpr\u00e1va mezi uzly, driverem, routerem datov\u00fdch uzl\u016f, naprosto v\u0161e pro \u201eMongoDB\u201c \u2013 to jsou n\u011bjak\u00e9 prvky, komponenty datab\u00e1ze, kter\u00e9 obsahuj\u00ed hodiny, kter\u00e9 b\u011b\u017e\u00ed. V\u0161ude maj\u00ed hodnotu hybridn\u00edho \u010dasu, ta se p\u0159ed\u00e1v\u00e1. 64 bit\u016f? To umo\u017e\u0148uje, to je mo\u017en\u00e9.<\/p>\n<h3>Jak to v\u0161echno funguje dohromady?<\/h3>\n<p>\nTady zva\u017euju jeden replika\u010dn\u00ed set, aby to bylo o n\u011bco jednodu\u0161\u0161\u00ed. Je zde Primary a Secondary. Secondary prov\u00e1d\u00ed replikaci a nen\u00ed v\u017edy zcela synchronizov\u00e1n s Primary.<\/p>\n<p>Doch\u00e1z\u00ed k vlo\u017een\u00ed (insert) do \u201ePrimary\u201c s ur\u010dit\u00fdm \u010dasov\u00fdm \u00fadajem. Tento insert zvy\u0161uje vnit\u0159n\u00ed \u010d\u00edta\u010d o 11, pokud je to maxim\u00e1ln\u00ed. Nebo zkontroluje hodnoty hodin a synchronizuje se podle hodin, pokud jsou hodnoty hodin v\u011bt\u0161\u00ed. To umo\u017e\u0148uje se\u0159adit podle \u010dasu.<\/p>\n<p>Po tom, co provede z\u00e1pis, nast\u00e1v\u00e1 d\u016fle\u017eit\u00fd moment. Hodiny v \u201eMongoDB\u201c se inkrementuj\u00ed pouze v p\u0159\u00edpad\u011b z\u00e1pisu do \u201eOpLog\u201c. To je ud\u00e1lost, kter\u00e1 m\u011bn\u00ed stav syst\u00e9mu. Ve v\u0161ech klasick\u00fdch \u010dl\u00e1nc\u00edch je ud\u00e1lost\u00ed pova\u017eov\u00e1n p\u0159\u00edjem zpr\u00e1vy do uzlu: zpr\u00e1va p\u0159i\u0161la \u2013 znamen\u00e1 to, \u017ee syst\u00e9m zm\u011bnil sv\u016fj stav.<\/p>\n<p>To je d\u00e1no t\u00edm, \u017ee p\u0159i zkoum\u00e1n\u00ed nen\u00ed zcela jasn\u00e9, jak bude tato zpr\u00e1va interpretov\u00e1na. P\u0159esn\u011b v\u00edme, \u017ee pokud nen\u00ed odra\u017eena v \u201eOplogu\u201c, nebude nijak interpretov\u00e1na, a zm\u011bna stavu syst\u00e9mu je pouze z\u00e1znam v \u201eOplogu\u201c. To v\u0161echno n\u00e1m usnad\u0148uje: model je zjednodu\u0161en\u00fd, co\u017e umo\u017e\u0148uje uspo\u0159\u00e1d\u00e1n\u00ed v r\u00e1mci jednoho replikov\u00e9ho souboru, a mnoho dal\u0161\u00edch u\u017eite\u010dn\u00fdch v\u011bc\u00ed.<\/p>\n<p>Vrac\u00ed se hodnota, kter\u00e1 ji\u017e byla zaznamen\u00e1na v \u201eOplogu\u201c \u2013 v\u00edme, \u017ee v \u201eOplogu\u201c tato hodnota ji\u017e existuje a jej\u00ed \u010das je 12. Nyn\u00ed, \u0159ekn\u011bme, \u017ee \u010dten\u00ed za\u010d\u00edn\u00e1 z jin\u00e9ho uzlu (Secondary) a on p\u0159ed\u00e1v\u00e1 ji\u017e afterClusterTime ve zpr\u00e1v\u011b. \u0158\u00edk\u00e1: \u201ePot\u0159ebuji v\u0161echno, co se stalo alespo\u0148 po 12 nebo v dob\u011b dvan\u00e1cti\u201c (viz obr\u00e1zek v\u00fd\u0161e).<\/p>\n<p>To, \u010demu se \u0159\u00edk\u00e1 Causal a consistent (CAT). Existuje takov\u00fd pojem v teorii, \u017ee to je jak\u00e1si pr\u016f\u0159ez \u010dasu, kter\u00fd je konzistentn\u00ed s\u00e1m o sob\u011b. V tomto p\u0159\u00edpad\u011b lze \u0159\u00edci, \u017ee se jedn\u00e1 o stav syst\u00e9mu, kter\u00fd byl pozorov\u00e1n v okam\u017eiku \u010dasu 12.<\/p>\n<p>Te\u010f zde zat\u00edm nic nen\u00ed, proto\u017ee to jakoby imituje situaci, kdy je t\u0159eba, aby Secondary replikoval data z Primary. \u010cek\u00e1\u2026 A te\u010f data p\u0159i\u0161la \u2013 vrac\u00ed zp\u011bt tyto hodnoty.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTakto zhruba v\u0161e funguje. T\u00e9m\u011b\u0159.<\/p>\n<p>Co znamen\u00e1 \u201et\u00e9m\u011b\u0159\u201c? P\u0159edstavme si, \u017ee je n\u011bjak\u00fd \u010dlov\u011bk, kter\u00fd p\u0159e\u010detl a pochopil, jak to v\u0161e funguje. Pochopil, \u017ee se p\u0159i ka\u017ed\u00e9m z\u00e1znamu aktualizuje ClusterTime, intern\u00ed logick\u00e9 hodiny a pak dal\u0161\u00ed z\u00e1znam zvy\u0161uje o jedno. Tato funkce zab\u00edr\u00e1 20 \u0159\u00e1dk\u016f. P\u0159edpokl\u00e1dejme, \u017ee tento \u010dlov\u011bk p\u0159ed\u00e1v\u00e1 maxim\u00e1ln\u00ed 64-bitov\u00e9 \u010d\u00edslo, minus jedna.<\/p>\n<p>Pro\u010d \u201eminus jedna\u201c? Proto\u017ee intern\u00ed hodiny se vlo\u017e\u00ed do t\u00e9to hodnoty (zjevn\u011b se jedn\u00e1 o nejv\u011bt\u0161\u00ed mo\u017en\u00e9 a v\u011bt\u0161\u00ed ne\u017e aktu\u00e1ln\u00ed \u010das), pak dojde k z\u00e1znamu v \u201eOplogu\u201c a hodiny se inkrementuj\u00ed je\u0161t\u011b o jedno \u2013 a bude ji\u017e maxim\u00e1ln\u00ed hodnota (tam jsou prost\u011b v\u0161echny jedni\u010dky, d\u00e1l nen\u00ed kam, unsaint int\u2019y).<\/p>\n<p>Je jasn\u00e9, \u017ee po tom se syst\u00e9m st\u00e1v\u00e1 absolutn\u011b nedostupn\u00fdm pro cokoliv. M\u016f\u017ee b\u00fdt pouze vyexportov\u00e1n, vy\u010di\u0161t\u011bn \u2013 hodn\u011b ru\u010dn\u00ed pr\u00e1ce. Celkov\u00e1 dostupnost:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA pokud se to replikovalo i n\u011bkam jinam, cel\u00fd cluster se prost\u011b zhrout\u00ed. Naprosto nep\u0159ijateln\u00e1 situace, kterou m\u016f\u017ee kdokoliv velmi rychle a snadno zorganizovat! Proto jsme tento aspekt pova\u017eovali za jeden z nejd\u016fle\u017eit\u011bj\u0161\u00edch. Jak tomu p\u0159edej\u00edt?<\/p>\n<h3>Na\u0161\u00ed cestou je podepisovat clusterTime<\/h3>\n<p>\nTak se to p\u0159ed\u00e1v\u00e1 v zpr\u00e1v\u011b (do modr\u00e9ho textu). Ale za\u010dali jsme tak\u00e9 generovat podpis (modr\u00fd text):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodpis se generuje kl\u00ed\u010dem, kter\u00fd je ulo\u017een v datab\u00e1zi, uvnit\u0159 chr\u00e1n\u011bn\u00e9ho perimetru; generuje se s\u00e1m, aktualizuje (u\u017eivatel\u00e9 to nevid\u00ed). Generuje se hash a ka\u017ed\u00e1 zpr\u00e1va p\u0159i vytvo\u0159en\u00ed se podepisuje a p\u0159i p\u0159ijet\u00ed se validuje.<br \/>\nMo\u017en\u00e1 se lidem objevuje ot\u00e1zka: \"Jak moc to v\u0161echno zpomaluje?\" \u0158\u00edkal jsem, \u017ee to mus\u00ed fungovat rychle, zvl\u00e1\u0161t\u011b p\u0159i absenci t\u00e9to funkce.<\/p>\n<p>Co to znamen\u00e1 pou\u017e\u00edvat Causal consistency v tomto p\u0159\u00edpad\u011b? Znamen\u00e1 to ukazovat parametr afterClusterTime. Bez toho by to prost\u011b p\u0159ed\u00e1valo hodnoty za jak\u00fdchkoliv okolnost\u00ed. Gossiping, po\u010d\u00ednaje verz\u00ed 3.6, funguje v\u017edy.<\/p>\n<p>Pokud bychom nechali neust\u00e1l\u00e9 generov\u00e1n\u00ed podpis\u016f, zpomalilo by to syst\u00e9m i p\u0159i absenci funkce, co\u017e neodpov\u00edd\u00e1 na\u0161im p\u0159\u00edstup\u016fm a po\u017eadavk\u016fm. A co jsme ud\u011blali?<\/p>\n<h3>D\u011blej to rychle!<\/h3>\n<p>\nDocela jednoduch\u00e1 v\u011bc, ale zaj\u00edmav\u00fd trik \u2013 pod\u011bl\u00edm se, t\u0159eba to n\u011bkoho zaujme.<br \/>\nM\u00e1me hash, ve kter\u00e9m jsou ulo\u017eena podepsan\u00e1 data. V\u0161echna data proch\u00e1zej\u00ed p\u0159es cache. Cache nepodepisuje konkr\u00e9tn\u011b \u010das, ale Range. Kdy\u017e p\u0159ijde ur\u010dit\u00e1 hodnota, generujeme Range, maskujeme posledn\u00edch 16 bit\u016f, a tuto hodnotu podpisujeme:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZ\u00edsk\u00e1n\u00edm takov\u00e9ho podpisu urychlujeme syst\u00e9m (podm\u00edn\u011bn\u011b) 65 000kr\u00e1t. Skv\u011ble to funguje: kdy\u017e jsme provedli experimenty \u2013 doba se skute\u010dn\u011b zkr\u00e1tila 10 000kr\u00e1t, kdy\u017e m\u00e1me sekven\u010dn\u00ed aktualizaci. Je jasn\u00e9, \u017ee kdy\u017e je to chaotick\u00e9, nefunguje to. Ale ve v\u011bt\u0161in\u011b praktick\u00fdch p\u0159\u00edpad\u016f to funguje. Kombinace podpisu Range spolu s podpisem umo\u017enila vy\u0159e\u0161it probl\u00e9m bezpe\u010dnosti.<\/p>\n<h3>Co jsme se nau\u010dili?<\/h3>\n<p>\nLekce, kter\u00e9 jsme si z toho odnesli:<\/p>\n<ul>\n<li>Je pot\u0159eba \u010d\u00edst materi\u00e1ly, p\u0159\u00edb\u011bhy, \u010dl\u00e1nky, proto\u017ee toho m\u00e1me hodn\u011b zaj\u00edmav\u00e9ho. Kdy\u017e pracujeme na n\u011bjak\u00e9 funkci (zvl\u00e1\u0161\u0165 nyn\u00ed, kdy\u017e jsme d\u011blali transakce atd.), mus\u00edme \u010d\u00edst a rozum\u011bt. Zabere to \u010das, ale je to skute\u010dn\u011b velmi u\u017eite\u010dn\u00e9, proto\u017ee t\u00edm z\u00edsk\u00e1me p\u0159ehled o tom, kde se nach\u00e1z\u00edme. Nic nov\u00e9ho jsme vlastn\u011b nevymysleli \u2013 jen jsme vzali ingredience.\n<p>Obecn\u011b se pozoruje ur\u010dit\u00fd rozd\u00edl v my\u0161len\u00ed, kdy\u017e se kon\u00e1 akademick\u00e1 konference (nap\u0159\u00edklad \u201eSigmon\u201c) \u2013 tam se v\u0161ichni soust\u0159ed\u00ed na nov\u00e9 my\u0161lenky. V \u010dem je novost na\u0161eho algoritmu? Zde nen\u00ed \u017e\u00e1dn\u00e1 z\u00e1sadn\u00ed novost. Novost sp\u00ed\u0161e spo\u010d\u00edv\u00e1 v tom, jak jsme zkombinovali r\u016fzn\u00e9 existuj\u00edc\u00ed p\u0159\u00edstupy. Proto je nejprve pot\u0159eba \u010d\u00edst klasiky, po\u010d\u00ednaje Lampartem.<\/li>\n<li>V produkci jsou zcela jin\u00e9 po\u017eadavky. Jsem si jist\u00fd, \u017ee mnoz\u00ed z v\u00e1s se nesetk\u00e1vaj\u00ed s \u201esf\u00e9rick\u00fdmi\u201c datab\u00e1zemi v abstraktn\u00edm vakuu, ale s norm\u00e1ln\u00edmi, re\u00e1ln\u00fdmi v\u011bcmi, kter\u00e9 maj\u00ed probl\u00e9my s dostupnost\u00ed, latenc\u00ed a odolnost\u00ed v\u016f\u010di v\u00fdpadk\u016fm.<\/li>\n<li>Nakonec jsme museli zv\u00e1\u017eit r\u016fzn\u00e9 my\u0161lenky a zkombinovat n\u011bkolik zcela r\u016fzn\u00fdch \u010dl\u00e1nk\u016f do jednoho p\u0159\u00edstupu dohromady. My\u0161lenka o podepisov\u00e1n\u00ed nap\u0159\u00edklad poch\u00e1z\u00ed z \u010dl\u00e1nku, kter\u00fd zkoumal Paxos protokol, kter\u00fd byl ur\u010den pro nevyz\u00fdvav\u00e9 selh\u00e1n\u00ed uvnit\u0159 autoriza\u010dn\u00edho protokolu, pro byzantsk\u00e9 \u2013 za hranic\u00ed autoriza\u010dn\u00edho protokolu... Obecn\u011b to je p\u0159esn\u011b to, co jsme nakonec ud\u011blali.\n<p>Nic nov\u00e9ho zde rozhodn\u011b nen\u00ed! Ale jakmile jsme to v\u0161echno sm\u00edchali... Je tak\u00e9 jako \u0159\u00edci, \u017ee recept na sal\u00e1t Olivier je nesmysl, proto\u017ee vejce, majon\u00e9za a okurky ji\u017e byly vymy\u0161leny... To je zhruba podobn\u00fd p\u0159\u00edb\u011bh.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00edmto kon\u010d\u00edm. D\u011bkuji!<\/p>\n<h3>Ot\u00e1zky<\/h3>\n<p>\n<b>Ot\u00e1zka z publika (d\u00e1le \u2013 O):<\/b> \u2013 D\u011bkuji, Michale, za prezentaci! T\u00e9ma o \u010dase je zaj\u00edmav\u00e9. Pou\u017e\u00edv\u00e1te Gossiping. \u0158\u00edkali jste, \u017ee ka\u017ed\u00fd m\u00e1 sv\u016fj \u010das, v\u0161ichni znaj\u00ed sv\u016fj lok\u00e1ln\u00ed \u010das. Pochopil jsem to tak, \u017ee m\u00e1me driver \u2013 m\u016f\u017ee jich b\u00fdt hodn\u011b, query pl\u00e1nova\u010d\u016f tak\u00e9, shard\u016f tak\u00e9 mnoho\u2026 A kam se syst\u00e9m dostane, pokud n\u00e1m n\u00e1hle vznikne rozpor: n\u011bkdo se rozhodne, \u017ee je o minutu nap\u0159ed, n\u011bkdo \u2013 o minutu pozadu? Kde se ocitneme?<\/p>\n<p><b>MT:<\/b> \u2013 To je skute\u010dn\u011b skv\u011bl\u00e1 ot\u00e1zka! Cht\u011bl jsem pr\u00e1v\u011b mluvit o shardech. Pokud spr\u00e1vn\u011b ch\u00e1pu ot\u00e1zku, m\u00e1me takovou situaci: existuje shard 1 a shard 2, \u010dten\u00ed prob\u00edh\u00e1 z t\u011bchto dvou shard\u016f \u2013 maj\u00ed nesrovnalosti, proto\u017ee spolu nekomunikuj\u00ed, proto\u017ee \u010das, kter\u00fd znaj\u00ed, je odli\u0161n\u00fd, zejm\u00e9na \u010das, kter\u00fd maj\u00ed ve oplogech.<br \/>\nP\u0159edstavme si, \u017ee shard 1 vytvo\u0159il milion z\u00e1pis\u016f, shard 2 \u2013 v\u016fbec nic, a dotaz p\u0159i\u0161el na dva shardy. A prvn\u00ed m\u00e1 afterClusterTime vy\u0161\u0161\u00ed ne\u017e milion. V takov\u00e9 situaci, jak jsem vysv\u011btlil, shard 2 nikdy neodpov\u00ed.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 Cht\u011bl jsem se zeptat, jak se synchronizuj\u00ed a vyberou jedno logick\u00e9 \u010dasov\u00e9 raz\u00edtko?<\/p>\n<p><b>MT:<\/b> \u2013 Synchronizuj\u00ed se velmi jednodu\u0161e. Shard, kdy\u017e k n\u011bmu p\u0159ijde afterClusterTime a on nenajde \u010das v \u201aOplogu\u2018 \u2013 iniciuje no approved. To znamen\u00e1, \u017ee ru\u010dn\u011b zvedne sv\u016fj \u010das na tuto hodnotu. To znamen\u00e1, \u017ee nem\u00e1 ud\u00e1losti, kter\u00e9 by odpov\u00eddaly t\u00e9to \u017e\u00e1dosti. Um\u011ble vytv\u00e1\u0159\u00ed tuto ud\u00e1lost a t\u00edm se st\u00e1v\u00e1 Causal Consistent.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 A pokud k n\u011bmu po tom je\u0161t\u011b p\u0159ijdou n\u011bjak\u00e9 ud\u00e1losti, kter\u00e9 se n\u011bkde v s\u00edti ztratily?<\/p>\n<p><b>MT:<\/b> \u2013 Shard je navr\u017een tak, \u017ee u\u017e nep\u0159ijdou, proto\u017ee je to single master. Pokud u\u017e zapsal, nep\u0159ijdou u\u017e, ale budou pozd\u011bji. Nem\u016f\u017ee se st\u00e1t, \u017ee n\u011bco n\u011bkde uv\u00edzlo, pak ud\u011bl\u00e1 no write, a tyto ud\u00e1losti p\u0159i\u0161ly \u2013 a naru\u0161ila se tak Causal consistency. Kdy\u017e ud\u011bl\u00e1 no write, v\u0161echny by m\u011bly p\u0159ijet d\u00e1l (po\u010dkaj\u00ed na n\u011b).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>Ot\u00e1zka:<\/b> \u2013 M\u00e1m n\u011bkolik ot\u00e1zek ohledn\u011b front. Causal consistency p\u0159edpokl\u00e1d\u00e1, \u017ee existuje ur\u010dit\u00e1 fronta akc\u00ed, kter\u00e9 se maj\u00ed prov\u00e9st. Co se stane, kdy\u017e n\u00e1m jeden paket zmiz\u00ed? P\u0159i\u0161el 10., 11... 12. zmizel, a v\u0161echny ostatn\u00ed \u010dekaj\u00ed, a\u017e se vykon\u00e1. A najednou stroj um\u0159el, nem\u016f\u017eeme nic d\u011blat. Existuje maxim\u00e1ln\u00ed d\u00e9lka fronty, kter\u00e1 se hromad\u00ed, ne\u017e se vykon\u00e1? Jak\u00e9 fat\u00e1ln\u00ed selh\u00e1n\u00ed nastane p\u0159i ztr\u00e1t\u011b jak\u00e9hokoli jednoho stavu? Zvl\u00e1\u0161\u0165, pokud zapisujeme, \u017ee existuje n\u011bjak\u00fd p\u0159edchoz\u00ed stav, od kter\u00e9ho se mus\u00edme odrazit? A od n\u011bj jsme se neodrazili!<\/p>\n<p><b>MT:<\/b> \u2013 Tak\u00e9 skv\u011bl\u00e1 ot\u00e1zka! Co d\u011bl\u00e1me? V MongoDB existuje pojem kv\u00f3rumov\u00fdch z\u00e1pis\u016f, kv\u00f3rumov\u00e9ho \u010dten\u00ed. V jak\u00fdch p\u0159\u00edpadech m\u016f\u017ee zpr\u00e1va zmizet? Kdy\u017e je z\u00e1pis nekv\u00f3rumov\u00fd nebo kdy\u017e je \u010dten\u00ed nekv\u00f3rumov\u00e9 (tak\u00e9 m\u016f\u017ee p\u0159ist\u00e1t n\u011bjak\u00fd garbage).<br \/>\nCo se t\u00fd\u010de kauz\u00e1ln\u00ed konzistence, provedli jsme rozs\u00e1hl\u00e9 experiment\u00e1ln\u00ed testov\u00e1n\u00ed, jeho\u017e v\u00fdsledkem bylo, \u017ee v p\u0159\u00edpad\u011b, kdy jsou z\u00e1znamy a \u010dten\u00ed - nekvorumov\u00e9, doch\u00e1z\u00ed k poru\u0161en\u00ed kauz\u00e1ln\u00ed konzistence. P\u0159esn\u011b to, co \u0159\u00edk\u00e1te!<\/p>\n<p>Na\u0161e rada: pou\u017e\u00edvejte alespo\u0148 kvorumov\u00e9 \u010dten\u00ed p\u0159i pou\u017eit\u00ed kauz\u00e1ln\u00ed konzistence. V takov\u00e9m p\u0159\u00edpad\u011b nic nezmiz\u00ed, i kdy\u017e kvorumov\u00fd z\u00e1pis zmiz\u00ed... To je ortogon\u00e1ln\u00ed situace: pokud si u\u017eivatel nep\u0159eje, aby data zmizela, m\u011bl by pou\u017e\u00edt kvorumov\u00fd z\u00e1pis. Kauz\u00e1ln\u00ed konzistence negarantuje trvanlivost. Z\u00e1ruku trvanlivosti poskytuje replikace a stroj\u00edrenstv\u00ed spojen\u00e9 s replikac\u00ed.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 Kdy\u017e vytv\u00e1\u0159\u00edme instanci, kter\u00e1 prov\u00e1d\u00ed shardov\u00e1n\u00ed (ne master, ale slave), spoleh\u00e1 se na unixov\u00fd \u010das vlastn\u00ed ma\u0161iny nebo na \u010das \"mastera\"; synchronizuje se poprv\u00e9 nebo pravideln\u011b?<\/p>\n<p><b>MT:<\/b> \u2013 Te\u010f to objasn\u00edm. Shard (tj. horizont\u00e1ln\u00ed partition) \u2013 tam je v\u017edy Primary. A ve shardu m\u016f\u017ee b\u00fdt \"master\" a mohou b\u00fdt repliky. Ale shard v\u017edy podporuje z\u00e1pis, proto\u017ee mus\u00ed podporovat ur\u010ditou dom\u00e9nu (v shardu je Primary).<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 Tak\u017ee v\u0161echno z\u00e1vis\u00ed \u010dist\u011b na \"masteru\"? V\u017edy se pou\u017e\u00edv\u00e1 \u010das \"mastera\"?<\/p>\n<p><b>MT:<\/b> \u2013 Ano. M\u016f\u017eeme obrazn\u011b \u0159\u00edct: hodiny tikaj\u00ed, kdy\u017e doch\u00e1z\u00ed k z\u00e1pisu do \"mastera\", do \"Oplogu\".<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 M\u00e1me klienta, kter\u00fd se p\u0159ipojuje, a nemus\u00ed v\u011bd\u011bt o \u010dase nic?<\/p>\n<p><b>MT:<\/b> \u2013 Opravdu nemus\u00ed v\u011bd\u011bt nic! Pokud jde o to, jak to funguje na klientovi: klient, kdy\u017e chce pou\u017e\u00edvat kauz\u00e1ln\u00ed konzistenci, mus\u00ed otev\u0159\u00edt relaci. Te\u010f tam je v\u0161echno: transakce v relaci a retrieve a rights... Relace je uspo\u0159\u00e1d\u00e1n\u00ed logick\u00fdch ud\u00e1lost\u00ed, kter\u00e9 se d\u011bj\u00ed s klientem.<\/p>\n<p>Pokud tuto relaci otev\u0159e a \u0159ekne, \u017ee chce kauz\u00e1ln\u00ed konzistenci (pokud relace podle defaultu podporuje kauz\u00e1ln\u00ed konzistenci), v\u0161echno automaticky funguje. Ovlada\u010d si pamatuje tento \u010das a zvy\u0161uje ho, kdy\u017e dost\u00e1v\u00e1 novou zpr\u00e1vu. Pamatuje si, jakou odpov\u011b\u010f vr\u00e1tilo p\u0159edchoz\u00ed vol\u00e1n\u00ed ze serveru, kter\u00e9 vr\u00e1tilo data. Dal\u0161\u00ed \u017e\u00e1dost bude obsahovat afterCluster (\"\u010das v\u011bt\u0161\u00ed ne\u017e toto\").<\/p>\n<p>Z\u00e1kazn\u00edk nemus\u00ed v\u011bd\u011bt naprosto nic! Je to pro n\u011bj zcela nepr\u016fhledn\u00e9. Co lid\u00e9 pou\u017e\u00edvaj\u00ed tyto funkce, co to umo\u017e\u0148uje? Za prv\u00e9, je mo\u017en\u00e9 bezpe\u010dn\u011b \u010d\u00edst ze sekund\u00e1rn\u00edch server\u016f: je mo\u017en\u00e9 zapisovat na prim\u00e1rn\u00ed a \u010d\u00edst z geograficky replikovan\u00fdch sekund\u00e1rn\u00edch a m\u00edt jistotu, \u017ee to funguje. P\u0159itom sezen\u00ed, kter\u00e1 byla zapsan\u00e1 na prim\u00e1rn\u00ed, lze p\u0159en\u00e9st dokonce i na sekund\u00e1rn\u00ed, tj. lze pou\u017e\u00edvat nejen jedno sezen\u00ed, ale n\u011bkolik.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 T\u00e9ma Eventual consistency je siln\u011b spjat\u00e9 s novou oblast\u00ed v\u00fdpo\u010detn\u00ed v\u011bdy \u2013 typy dat CRDT (Conflict-free Replicated Data Types). Zva\u017eovali jste integraci t\u011bchto typ\u016f dat do datab\u00e1ze a co o tom m\u016f\u017eete \u0159\u00edci?<\/p>\n<p><b>MT:<\/b> \u2013 Dobr\u00fd dotaz! CRDT d\u00e1v\u00e1 smysl pro konflikty p\u0159i z\u00e1pisu: v MongoDB \u2013 jedin\u00fd master.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 M\u00e1m ot\u00e1zku od devops. V re\u00e1ln\u00e9m sv\u011bt\u011b se objevuj\u00ed takov\u00e9 jezuitsk\u00e9 situace, kdy doch\u00e1z\u00ed k byzantsk\u00e9mu selh\u00e1n\u00ed, a zl\u00ed lid\u00e9 uvnit\u0159 chr\u00e1n\u011bn\u00e9ho perimetru za\u010d\u00ednaj\u00ed zasahovat do protokolu, pos\u00edlat speci\u00e1ln\u011b crafted pakety?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Zl\u00ed lid\u00e9 uvnit\u0159 perimetru \u2013 to je jako Trojan! Zl\u00ed lid\u00e9 uvnit\u0159 perimetru mohou ud\u011blat spoustu \u0161patn\u00fdch v\u011bc\u00ed.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 Je jasn\u00e9, \u017ee nech\u00e1vat v serveru, zjednodu\u0161en\u011b \u0159e\u010deno, otvor, skrze kter\u00fd se m\u016f\u017ee prot\u00e1hnout zoo slon\u016f a nav\u017edy zruinovat cel\u00fd klastr\u2026 Obnovov\u00e1n\u00ed bude vy\u017eadovat \u010das\u2026 To je, m\u00edrn\u011b \u0159e\u010deno, \u0161patn\u011b. Na druhou stranu je zaj\u00edmav\u00e9: v re\u00e1ln\u00e9m \u017eivot\u011b, v praxi, se setk\u00e1v\u00e1te s takov\u00fdmi situacemi, kdy doch\u00e1z\u00ed k podobn\u00fdm intern\u00edm \u00fatok\u016fm?<\/p>\n<p><b>MT:<\/b> \u2013 Proto\u017ee se s bezpe\u010dnostn\u00edmi poru\u0161en\u00edmi v re\u00e1ln\u00e9m \u017eivot\u011b p\u0159\u00edli\u0161 \u010dasto nesetk\u00e1v\u00e1m, nemohu \u0159\u00edci \u2013 mo\u017en\u00e1 se i vyskytuj\u00ed. Ale pokud mluv\u00edme o developersk\u00e9 filosofii, tak to vid\u00edme takto: m\u00e1me perimetr, kter\u00fd zaji\u0161\u0165uje lidi, kte\u0159\u00ed se zab\u00fdvaj\u00ed bezpe\u010dnost\u00ed \u2013 to je z\u00e1mek, ze\u010f; a uvnit\u0159 perimetru lze d\u011blat cokoliv. Je jasn\u00e9, \u017ee jsou u\u017eivatel\u00e9, kte\u0159\u00ed mohou jenom sledovat, a jsou u\u017eivatel\u00e9 s mo\u017enost\u00ed smazat adres\u00e1\u0159.<\/p>\n<p>V z\u00e1vislosti na pr\u00e1vech m\u016f\u017ee b\u00fdt \u0161koda, kterou u\u017eivatel\u00e9 mohou zp\u016fsobit, my\u0161\u00ed, ale tak\u00e9 slonem. Je jasn\u00e9, \u017ee u\u017eivatel s pln\u00fdmi pr\u00e1vy m\u016f\u017ee ud\u011blat cokoliv. U\u017eivatel s omezen\u00fdmi pr\u00e1vy m\u016f\u017ee zp\u016fsobit mnohem men\u0161\u00ed \u0161kodu. Zejm\u00e9na nem\u016f\u017ee syst\u00e9m rozb\u00edt.<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 V chr\u00e1n\u011bn\u00e9m perimetru se n\u011bkdo sna\u017e\u00ed vytvo\u0159it ne\u010dekan\u00e9 protokoly pro server, aby ho vy\u0159adil z provozu, a pokud bude m\u00edt \u0161t\u011bst\u00ed, tak i cel\u00fd klastr\u2026 M\u016f\u017ee b\u00fdt tohle a\u017e tak \u201edobr\u00e9\u201c?<\/p>\n<p><b>MT:<\/b> \u2013 Nikdy jsem o takov\u00fdch v\u011bcech nesly\u0161el. To, \u017ee se takhle d\u00e1 server zhavarovat \u2013 to nen\u00ed tajemstv\u00ed. Zkonit ho zevnit\u0159, kdy\u017e jsem z protokolu, jako autorizovan\u00fd u\u017eivatel, kter\u00fd m\u016f\u017ee do zpr\u00e1vy napsat n\u011bco takov\u00e9ho\u2026 Ve skute\u010dnosti to nen\u00ed mo\u017en\u00e9, proto\u017ee se to stejn\u011b ov\u011b\u0159uje. Existuje mo\u017enost vypnout tuto autentifikaci pro u\u017eivatele, kte\u0159\u00ed necht\u011bj\u00ed \u2013 to u\u017e je pak jejich probl\u00e9m; v podstat\u011b si sami zbo\u0159ili zdi a m\u016f\u017eou tam str\u010dit slona, kter\u00fd to rozma\u010dk\u00e1\u2026 A vlastn\u011b se m\u016f\u017eu obl\u00e9knout jako oprav\u00e1\u0159, p\u0159ij\u00edt a vyt\u00e1hnout to!<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 D\u011bkuji za prezentaci. Sergej (\"Yandex\"). V MongoDB existuje konstanta, kter\u00e1 omezuje po\u010det hlasuj\u00edc\u00edch \u010dlen\u016f v Replica Setu, a ta konstanta je rovna 7 (sedmi). Pro\u010d je to konstanta? Pro\u010d to nen\u00ed n\u011bjak\u00fd parametr?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set m\u016f\u017ee m\u00edt i 40 uzl\u016f. Tam je v\u017edy v\u011bt\u0161ina. Nev\u00edm, kter\u00e1 verze ...<\/p>\n<p><b>Ot\u00e1zka:<\/b> \u2013 V Replica Setu m\u016f\u017eete spou\u0161t\u011bt nehlasuj\u00edc\u00ed \u010dleny, ale hlasuj\u00edc\u00edch je maxim\u00e1ln\u011b 7. Jak se v tomto p\u0159\u00edpad\u011b vyrovnat s v\u00fdpadkem, pokud m\u00e1me Replica Set rozlo\u017een\u00fd na 3 datov\u00e1 centra? Jedno datov\u00e9 centrum se m\u016f\u017ee snadno vypnout a dal\u0161\u00ed stroj m\u016f\u017ee vypadnout.<\/p>\n<p><b>MT:<\/b> \u2013 To u\u017e je trochu za hranicemi prezentace. To je obecn\u00e1 ot\u00e1zka. Mo\u017en\u00e1 ji m\u016f\u017eu pozd\u011bji vysv\u011btlit.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michail Tjulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi\" 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=\"P\u0159ehr\u00e1t 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>Mal\u00e1 reklama \ud83d\ude42<\/h3>\n<p>\nD\u011bkujeme, \u017ee s n\u00e1mi z\u016fst\u00e1v\u00e1te. L\u00edb\u00ed se v\u00e1m na\u0161e \u010dl\u00e1nky? Chcete vid\u011bt v\u00edce zaj\u00edmav\u00fdch materi\u00e1l\u016f? Podpo\u0159te n\u00e1s objedn\u00e1vkou nebo doporu\u010den\u00edm zn\u00e1m\u00fdm, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloudov\u00e9 VPS pro v\u00fdvoj\u00e1\u0159e od 4,99 $<\/a><\/noindex>, <b>unik\u00e1tn\u00ed alternativa entry-level server\u016f, kterou jsme pro v\u00e1s vymysleli:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">V\u0161echny pravdy o VPS (KVM) E5-2697 v3 (6 jader) 10GB DDR4 480GB SSD 1Gbps od 19 $ nebo jak spr\u00e1vn\u011b rozd\u011blit server?<\/a><\/noindex> (k dispozici varianty s RAID1 a RAID10, a\u017e 24 jader a a\u017e 40GB DDR4).<\/p>\n<p><b>Dell R730xd je dvakr\u00e1t levn\u011bj\u0161\u00ed v datov\u00e9m centru Equinix Tier IV v Amsterdamu?<\/b> Jen u n\u00e1s <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> v Nizozemsku! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 $!<\/b><\/b> \u010ct\u011bte o tom <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Jak postavit infrastrukturu podnikov\u00e9 t\u0159\u00eddy s pou\u017eit\u00edm server\u016f Dell R730xd E5-2650 v4 v hodnot\u011b 9000 eur za pakatel?<\/a><\/noindex><br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/487638\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435. HighLoad++ Siberia 2019. \u0417\u0430\u043b \u00ab\u041a\u0440\u0430\u0441\u043d\u043e\u044f\u0440\u0441\u043a\u00bb. 25 \u0438\u044e\u043d\u044f, 12:00. \u0422\u0435\u0437\u0438\u0441\u044b \u0438 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u0411\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0442 \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439, \u0433\u0434\u0435 \u043d\u0435 \u0443\u0447\u0442\u0435\u043d\u044b \u0432\u0430\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430 \u0430\u0441\u043f\u0435\u043a\u0442\u044b. \u0412 \u044d\u0442\u043e\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-56365","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f HighLoad++ \u043f\u0440\u043e\u0439\u0434\u0435\u0442 6 \u0438 7 \u0430\u043f\u0440\u0435\u043b\u044f 2020 \u0433\u043e\u0434\u0430 \u0432 \u0421\u0430\u043d\u043a\u0442-\u041f\u0435\u0442\u0435\u0440\u0431\u0443\u0440\u0433\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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++, Michail Tulen\u011bv (MongoDB): Kauz\u00e1ln\u00ed konzistence: od teorie k praxi | ProHoster","description":"Dal\u0161\u00ed konference HighLoad++ se uskute\u010dn\u00ed 6. a 7. dubna 2020 v Petrohradu. Podrobnosti a vstupenky na odkazu.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}