{"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\/sk\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Nasleduj\u00faca konferencia HighLoad++ sa uskuto\u010dn\u00ed 6. a 7. apr\u00edla 2020 v Petrohrade. <br \/>\nPodrobnosti a vstupenky <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">na odkaze<\/a><\/noindex>. HighLoad++ Siberia 2019. S\u00e1la \u201eKrasnojarsk\u201c. 25. j\u00fana, 12:00. T\u00e9my a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">prezent\u00e1cia<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNiekedy praktick\u00e9 po\u017eiadavky konfliktuj\u00fa s te\u00f3riou, kde nie s\u00fa zoh\u013eadnen\u00e9 d\u00f4le\u017eit\u00e9 aspekty pre komer\u010dn\u00fd produkt. V tejto predn\u00e1\u0161ke je predstaven\u00fd proces v\u00fdberu a kombinovania r\u00f4znych pr\u00edstupov k vytvoreniu komponentov kauz\u00e1lnej konzistencie na z\u00e1klade akademick\u00fdch v\u00fdskumov v s\u00falade s po\u017eiadavkami komer\u010dn\u00e9ho produktu. Posluch\u00e1\u010di sa dozvedia o existuj\u00facich teoretick\u00fdch pr\u00edstupoch k logick\u00fdm hodin\u00e1m, sledovaniu z\u00e1vislost\u00ed, bezpe\u010dnosti syst\u00e9mu, synchroniz\u00e1cii hod\u00edn a pre\u010do sa MongoDB rozhodlo pre konkr\u00e9tne rie\u0161enia.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Michal Tule\u0148 (\u010falej \u2013 M.T.):<\/b> \u2013 Budem rozpr\u00e1va\u0165 o kauzalnej konzistencii \u2013 je to funkcia, na ktorej sme pracovali v MongoDB. Pracujem v skupine distribuovan\u00fdch syst\u00e9mov, robili sme ju pribli\u017ene pred dvoma rokmi.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo\u010das tohto procesu bolo nutn\u00e9 obozn\u00e1mi\u0165 sa s ve\u013ek\u00fdm mno\u017estvom akademick\u00e9ho v\u00fdskumu, preto\u017ee t\u00e1to funkcia je pomerne dobre presk\u00faman\u00e1. Zistilo sa, \u017ee \u017eiadny \u010dl\u00e1nok nezodpoved\u00e1 tomu, \u010do je potrebn\u00e9 v produkcii, datab\u00e1ze vzh\u013eadom na ve\u013emi \u0161pecifick\u00e9 po\u017eiadavky, ktor\u00e9 s\u00fa pravdepodobne v ka\u017edej aplik\u00e1cii v produkcii.<\/p>\n<p>Budem rozpr\u00e1va\u0165 o tom, ako my, ako spotrebitelia akademick\u00e9ho v\u00fdskumu, pripravujeme nie\u010do, \u010do m\u00f4\u017eeme nesk\u00f4r predlo\u017ei\u0165 na\u0161im pou\u017e\u00edvate\u013eom ako hotov\u00e9 jedlo, ktor\u00e9 je pohodln\u00e9 a bezpe\u010dn\u00e9 na pou\u017e\u00edvanie.<\/p>\n<h3>Kauz\u00e1lna konzistencia (Causal consistency). Definujme si pojmy.<\/h3>\n<p>\nNa za\u010diatok chcem v obecn\u00fdch \u010drt\u00e1ch poveda\u0165, \u010do je to kauz\u00e1lna konzistencia. S\u00fa dvaja protagonisti \u2013 Leonard a Penny (seri\u00e1l \u201eTe\u00f3ria ve\u013ek\u00e9ho tresku\u201c):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPredpokladajme, \u017ee Penny je v Eur\u00f3pe a Leonard chce pre \u0148u pripravi\u0165 nejak\u00e9 prekvapenie, p\u00e1rty. A ni\u010d lep\u0161ieho ho nenapadne, ne\u017e ju vyhodi\u0165 zo zoznamu priate\u013eov, posla\u0165 v\u0161etk\u00fdm priate\u013eom aktualiz\u00e1ciu na feed: \u201ePo\u010fme pote\u0161i\u0165 Penny!\u201c (ona je v Eur\u00f3pe, zatia\u013e \u010do sp\u00ed, nevid\u00ed to v\u0161etko a nem\u00f4\u017ee to vidie\u0165, preto\u017ee tam nie je). Na konci tento pr\u00edspevok vyma\u017ee, vyma\u017ee z \u201eFidov\u201c a obnov\u00ed pr\u00edstup, aby si ni\u010d nev\u0161imla a neboli \u017eiadne \u0161kand\u00e1ly.<br \/>\nTo je v\u0161etko skvel\u00e9, ale po\u010fme predpoklada\u0165, \u017ee syst\u00e9m je distribuovan\u00fd a udalosti sa nevyv\u00edjaj\u00fa \u00faplne pod\u013ea pl\u00e1nu. M\u00f4\u017ee sa napr\u00edklad sta\u0165, \u017ee obmedzenie pr\u00edstupu Penny nastalo a\u017e po publikovan\u00ed tohto pr\u00edspevku, ak udalosti nie s\u00fa navz\u00e1jom pr\u00ed\u010dinno-n\u00e1sledkov\u00e9. Toto je pr\u00edklad situ\u00e1cie, kedy je na dosiahnutie obchodnej funkcie (v tomto pr\u00edpade) potrebn\u00e1 pr\u00ed\u010dinn\u00e1 konzistencia.<\/p>\n<p>V skuto\u010dnosti ide o dos\u0165 netrivi\u00e1lne vlastnosti datab\u00e1z \u2013 ve\u013emi m\u00e1lo z nich ich podporuje. Prejdime na modely.<\/p>\n<h3>Modely konzistencie (Consistency Models)<\/h3>\n<p>\n\u010co vlastne znamen\u00e1 model konzistencie v datab\u00e1zach? Ide o ur\u010dit\u00e9 z\u00e1ruky, ktor\u00e9 distribuovan\u00fd syst\u00e9m poskytuje oh\u013eadom toho, ak\u00e9 d\u00e1ta a v akom porad\u00ed m\u00f4\u017ee klient z\u00edska\u0165.<\/p>\n<p>V podstate v\u0161etky modely konzistencie sa zni\u017euj\u00fa na to, ako ve\u013emi je distribuovan\u00fd syst\u00e9m podobn\u00fd syst\u00e9mu, ktor\u00fd napr\u00edklad be\u017e\u00ed na jednom uzle na notebooku. A to, do akej miery je syst\u00e9m, ktor\u00fd be\u017e\u00ed na tis\u00edcoch geograficky rozlo\u017een\u00fdch uzlov, podobn\u00fd notebooku, v ktorom s\u00fa v\u0161etky tieto vlastnosti vo v\u0161eobecnosti automaticky splnen\u00e9.<\/p>\n<p>Preto sa modely konzistencie aplikuj\u00fa iba na distribuovan\u00e9 syst\u00e9my. V\u0161etky syst\u00e9my, ktor\u00e9 existovali predt\u00fdm a fungovali na jednom vertik\u00e1lnom \u0161k\u00e1lovan\u00ed, tak\u00e9to probl\u00e9my nemali. Existovala tam jedna vyrovn\u00e1vacia pam\u00e4\u0165 (Buffer Cache) a z nej sa v\u017edy \u010d\u00edtalo.<\/p>\n<h3>Model Strong<\/h3>\n<p>\nVlastne, najprv vznikol model Strong (alebo rise ability, ako sa \u010dasto naz\u00fdva). Je to model konzistencie, ktor\u00fd zaru\u010duje, \u017ee ka\u017ed\u00e1 zmena, akon\u00e1hle sa potvrd\u00ed jej vykonanie, je vidite\u013en\u00e1 v\u0161etk\u00fdm pou\u017e\u00edvate\u013eom syst\u00e9mu.<\/p>\n<p>To vytv\u00e1ra glob\u00e1lny poriadok v\u0161etk\u00fdch udalost\u00ed v datab\u00e1ze. Ide o ve\u013emi siln\u00fa vlastnos\u0165 konzistencie a je ve\u013emi n\u00e1kladn\u00e1. Napriek tomu je ve\u013emi dobre podporovan\u00e1. Je to prosto ve\u013emi drah\u00e9 a pomal\u00e9 \u2013 pou\u017e\u00edvaj\u00fa sa to len zriedka. Naz\u00fdva sa to rise ability.<\/p>\n<p>Existuje e\u0161te jedna, silnej\u0161ia vlastnos\u0165, ktor\u00e1 je podporovan\u00e1 v 'Spanner' \u2013 naz\u00fdva sa External Consistency. O nej si povieme nesk\u00f4r.<\/p>\n<h3>Causal<\/h3>\n<p>\nNasleduj\u00face je Causal, presne to, o \u010dom som hovoril. Medzi Strong a Causal existuje nieko\u013eko \u010fal\u0161\u00edch pod\u00farovn\u00ed, o ktor\u00fdch nebudem hovori\u0165, ale v\u0161etky sa zlu\u010duj\u00fa do Causal. Je to d\u00f4le\u017eit\u00fd model, preto\u017ee je to najsilnej\u0161\u00ed zo v\u0161etk\u00fdch modelov, s najvy\u0161\u0161ou konzistenciou pri existencii siete alebo rozdelen\u00ed.<\/p>\n<p>Causals s\u00fa vlastne situ\u00e1cia, v ktorej s\u00fa udalosti prepojen\u00e9 pr\u00ed\u010dinnou s\u00favislos\u0165ou. \u010casto sa vn\u00edmaj\u00fa ako Read your on rights z poh\u013eadu klienta. Ak klient sledoval ur\u010dit\u00e9 hodnoty, nem\u00f4\u017ee vidie\u0165 hodnoty, ktor\u00e9 boli v minulosti. U\u017e za\u010d\u00edna vidie\u0165 pref\u00edxov\u00e9 \u010d\u00edtania. To v\u0161etko sa t\u00fdka toho ist\u00e9ho.<br \/>\nCausals ako model konzistencie \u2013 \u010diasto\u010dn\u00e9 usporiadanie udalost\u00ed na serveri, pri ktorom s\u00fa udalosti zo v\u0161etk\u00fdch klientov pozorovan\u00e9 v tej istej postupnosti. V tomto pr\u00edpade \u2013 Leonard a Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nTret\u00ed model \u2013 to je Eventual Consistency. To je nie\u010do, \u010do podporuje absol\u00fatne v\u0161etky distribuovan\u00e9 syst\u00e9my, minim\u00e1lny model, ktor\u00fd v\u00f4bec m\u00e1 zmysel. Znamen\u00e1 to nasleduj\u00face: ke\u010f sa uskuto\u010dnia nejak\u00e9 zmeny v d\u00e1tach, v nejakom momente sa stan\u00fa konzistentn\u00fdmi.<\/p>\n<p>V takom momente to ni\u010d nehovor\u00ed, inak by sa to premenilo na External Consistency \u2013 bola by to \u00faplne in\u00e1 hist\u00f3ria. Napriek tomu je to ve\u013emi popul\u00e1rny model, najroz\u0161\u00edrenej\u0161\u00ed. Pod\u013ea predvolen\u00e9ho nastavenia v\u0161etci pou\u017e\u00edvatelia distribuovan\u00fdch syst\u00e9mov pou\u017e\u00edvaj\u00fa pr\u00e1ve Eventual Consistency.<\/p>\n<p>Chcem uvies\u0165 nieko\u013eko porovn\u00e1vac\u00edch pr\u00edkladov:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010co tieto \u0161\u00edpky znamenaj\u00fa?<\/p>\n<ul>\n<li><b>Latencia.<\/b> Pri zvy\u0161ovan\u00ed sily konzistencie sa zvy\u0161uje aj latencia z jasn\u00fdch d\u00f4vodov: je potrebn\u00e9 vykona\u0165 viac z\u00e1znamov, z\u00edska\u0165 potvrdenie od v\u0161etk\u00fdch hostite\u013eov a uzlov, ktor\u00e9 sa podie\u013eaj\u00fa na klastri, \u017ee \u00fadaje tam u\u017e s\u00fa. Preto v Eventual Consistency je najr\u00fdchlej\u0161ia odpove\u010f, preto\u017ee tam spravidla mo\u017eno aj v pam\u00e4ti komitn\u00fa\u0165 a to bude v z\u00e1sade sta\u010di\u0165.<\/li>\n<li><b>Dostupnos\u0165.<\/b> Ak to ch\u00e1peme ako schopnos\u0165 syst\u00e9mu odpoveda\u0165 pri rozpojeniach siete, rozdeleniach alebo nejak\u00fdch zlyhaniach \u2013 odolnos\u0165 vo\u010di zlyhaniam sa zvy\u0161uje pri zni\u017eovan\u00ed modelu konzistencie, preto\u017ee n\u00e1m sta\u010d\u00ed, aby jeden hostite\u013e fungoval a poskytoval nejak\u00e9 \u00fadaje. Eventual Consistency nezaru\u010duje ni\u010d, \u010do sa t\u00fdka \u00fadajov \u2013 m\u00f4\u017ee to by\u0165 \u010doko\u013evek.<\/li>\n<li><b>Anom\u00e1lie.<\/b> Samozrejme sa zvy\u0161uje aj po\u010det anom\u00e1li\u00ed. V pr\u00edpade Strong Consistency by ich v\u00f4bec nemalo by\u0165, zatia\u013e \u010do Eventual Consistency m\u00f4\u017ee obsahova\u0165 ak\u00e9ko\u013evek anom\u00e1lie. Ot\u00e1zka znie: pre\u010do si \u013eudia vyberaj\u00fa Eventual Consistency, ke\u010f obsahuje anom\u00e1lie? Odpove\u010f spo\u010d\u00edva v tom, \u017ee modely Eventual Consistency s\u00fa pou\u017eite\u013en\u00e9 a anom\u00e1lie existuj\u00fa iba na ve\u013emi kr\u00e1tku dobu; je mo\u017en\u00e9 pou\u017e\u00edva\u0165 master na \u010d\u00edtanie a viac-menej \u010d\u00edta\u0165 konzistentn\u00e9 \u00fadaje; \u010dasto existuje mo\u017enos\u0165 pou\u017ei\u0165 siln\u00e9 modely konzistencie. Prakticky to funguje, a \u010dasto je po\u010det anom\u00e1li\u00ed \u010dasovo obmedzen\u00fd.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Teorema CAP<\/h3>\n<p>\nKe\u010f vid\u00edte slov\u00e1 konzistencia, dostupnos\u0165 \u2013 \u010do v\u00e1m napadne? Spr\u00e1vne \u2013 te\u00f3ria CAP! Chcem teraz rozpt\u00fdli\u0165 m\u00fdtus\u2026 Nie som to ja \u2013 je to Martin Kleppmann, ktor\u00fd nap\u00edsal skvel\u00fd \u010dl\u00e1nok, skvel\u00fa knihu.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeorema CAP je princip, ktor\u00fd bol formulovan\u00fd v 2000-tych rokoch a hovor\u00ed, \u017ee Konzistencia, Dostupnos\u0165, Partitioning: vezmite si dve, a nie je mo\u017en\u00e9 vybra\u0165 tri. Bol to ist\u00fd princ\u00edp. Bol ako teorema dok\u00e1zan\u00fd o nieko\u013eko rokov nesk\u00f4r Gilbertom a Lynchom. Potom sa to za\u010dalo pou\u017e\u00edva\u0165 ako mantra \u2013 syst\u00e9my sa za\u010dali deli\u0165 na CA, CP, AP a podobne.<\/p>\n<p>T\u00e1to teorema bola naozaj dok\u00e1zan\u00e1 pre tak\u00e9to pr\u00edpady\u2026 Po prv\u00e9, dostupnos\u0165 nebola posudzovan\u00e1 ako hodnota od 0 do 100 (0 \u2013 syst\u00e9m je 'm\u0155tvy', 100 \u2013 reaguje r\u00fdchlo; takto sme na to zvyknut\u00ed pozera\u0165), ale ako vlastnos\u0165 algoritmu, ktor\u00e1 zaru\u010duje, \u017ee pri v\u0161etk\u00fdch jeho vykonaniach vracia d\u00e1ta.<\/p>\n<p>O \u010dase odpovede tam vlastne nie je ani slovo! Existuje algoritmus, ktor\u00fd vracia \u00fadaje po 100 rokoch \u2013 \u00faplne vynikaj\u00faci dostupn\u00fd algoritmus, ktor\u00fd je s\u00fa\u010das\u0165ou te\u00f3rie CAP.<br \/>\nPo druh\u00e9: teorema bola dok\u00e1zan\u00e1 pre zmeny hodn\u00f4t jedn\u00e9ho a toho ist\u00e9ho k\u013e\u00fa\u010da, pri\u010dom tieto zmeny s\u00fa l\u00edniou resizable. To znamen\u00e1, \u017ee sa v skuto\u010dnosti prakticky nepou\u017e\u00edvaj\u00fa, preto\u017ee existuj\u00fa in\u00e9 modely Eventual Consistency, Strong Consistency (mo\u017eno).<\/p>\n<p>O \u010do ide? O to, \u017ee teorema CAP v tej forme, v akej bola dok\u00e1zan\u00e1, je prakticky neaplikovate\u013en\u00e1, zriedka pou\u017e\u00edvan\u00e1. V teoretickej forme obmedzuje sp\u00f4sobom, ktor\u00fd je intuit\u00edvne pravdiv\u00fd, ale v skuto\u010dnosti nie je dok\u00e1zan\u00fd.<\/p>\n<h3>Causal consistency \u2013 najsilnej\u0161\u00ed model<\/h3>\n<p>\nTo, \u010do sa teraz deje \u2013 m\u00f4\u017eete z\u00edska\u0165 v\u0161etky tri veci: konzistenciu, dostupnos\u0165 pomocou partition. Zvl\u00e1\u0161\u0165 kauz\u00e1lna konzistencia \u2013 je najsilnej\u0161\u00ed model konzistencie, ktor\u00fd za pr\u00edtomnosti partition (v\u00fdpadkov v sieti) st\u00e1le funguje. Preto predstavuje tak\u00fd ve\u013ek\u00fd z\u00e1ujem, a preto sme sa \u0148ou zaoberali.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo prv\u00e9, zjednodu\u0161uje pr\u00e1cu v\u00fdvoj\u00e1rov aplik\u00e1ci\u00ed. Zvl\u00e1\u0161\u0165 pr\u00edtomnos\u0165 ve\u013ekej podpory zo strany servera: ke\u010f v\u0161etky z\u00e1znamy, ktor\u00e9 sa dej\u00fa v r\u00e1mci jedn\u00e9ho klienta, s\u00fa zaru\u010den\u00e9, \u017ee pr\u00eddu v takom porad\u00ed na inom klientovi. Po druh\u00e9, zvl\u00e1da partition.<\/p>\n<h3>Intern\u00e9 z\u00e1le\u017eitosti MongoDB<\/h3>\n<p>\nPam\u00e4taj\u00fac na to, \u017ee m\u00e1me obedy, pres\u00favame sa do kuchyne. Povedal by som v\u00e1m o modeli syst\u00e9mu, teda \u2013 \u010do je MongoDB pre t\u00fdch, ktor\u00ed o tejto datab\u00e1ze po\u010duj\u00fa prv\u00fdkr\u00e1t.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie 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++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (\u010falej \u2013 \u201eMongoDB\u201c) je distribuovan\u00fd syst\u00e9m, ktor\u00fd podporuje horizont\u00e1lne \u0161k\u00e1lovanie, teda shardovanie; a v r\u00e1mci ka\u017ed\u00e9ho shardu tie\u017e podporuje redundanciu d\u00e1t, teda replik\u00e1ciu.<\/p>\n<p>Shardovanie v \u201eMongoDB\u201c (nerelacion\u00e1lna datab\u00e1za) vykon\u00e1va automatick\u00e9 vyv\u00e1\u017eenie, teda ka\u017ed\u00e1 kolekcia dokumentov (alebo \u201etabu\u013ea\u201c v term\u00ednoch rela\u010dn\u00fdch d\u00e1t) sa del\u00ed na kusy a server ich automaticky pres\u00fava medzi shardami.<\/p>\n<p>Dotazovac\u00ed router, ktor\u00fd distribuuje dopyty, je pre klienta ur\u010dit\u00fdm klientom, prostredn\u00edctvom ktor\u00e9ho pracuje. U\u017e vie, kde a ak\u00e9 d\u00e1ta sa nach\u00e1dzaj\u00fa a smeruje v\u0161etky dopyty k spr\u00e1vnemu shardu.<\/p>\n<p>E\u0161te jeden d\u00f4le\u017eit\u00fd bod: MongoDB je single master. Existuje jeden prim\u00e1rny \u2013 m\u00f4\u017ee spracov\u00e1va\u0165 z\u00e1znamy, ktor\u00e9 podporuj\u00fa k\u013e\u00fa\u010de, ktor\u00e9 obsahuje. Nie je mo\u017en\u00e9 vykon\u00e1va\u0165 zap\u00edsanie z viacer\u00fdch masterov.<\/p>\n<p>Urobili sme vydanie 4.2 \u2013 objavili sa tam nov\u00e9 zauj\u00edmav\u00e9 veci. Zvl\u00e1\u0161\u0165 sme integrovali Lucene \u2013 vyh\u013ead\u00e1vanie \u2013 priamo vykonate\u013en\u00e9 Java vo \u201eMongu\u201c, a je teraz mo\u017en\u00e9 vykon\u00e1va\u0165 vyh\u013ead\u00e1vanie prostredn\u00edctvom Lucene, ako v \u201eElastiku\u201c.<\/p>\n<p>A vytvorili sme nov\u00fd produkt \u2013 Grafy, ktor\u00fd je tie\u017e dostupn\u00fd na \u201eAtlase\u201c (vlastn\u00fd cloud \u201eMongo\u201c). Maj\u00fa bezplatn\u00fa verziu \u2013 m\u00f4\u017eete si s t\u00fdm pohra\u0165. Grafy sa mi ve\u013emi p\u00e1\u010dili \u2013 vizualiz\u00e1cia d\u00e1t, ve\u013emi intuit\u00edvna.<\/p>\n<h3>Zlo\u017eky kauz\u00e1lnej konzistencie<\/h3>\n<p>\nSpo\u010d\u00edtal som asi 230 \u010dl\u00e1nkov, ktor\u00e9 boli na t\u00fato t\u00e9mu publikovan\u00e9 \u2013 od Leslie Lampert. Teraz v\u00e1m z mojej pam\u00e4te prinesiem niektor\u00e9 \u010dasti t\u00fdchto materi\u00e1lov.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161etko sa to za\u010dalo \u010dl\u00e1nkom Leslie Lampertovej, ktor\u00fd bol nap\u00edsan\u00fd v 70. rokoch. Ako vid\u00edte, aj dnes sa pokra\u010duje v nejak\u00fdch v\u00fdskumoch na t\u00fato t\u00e9mu. Moment\u00e1lne Causal consistency za\u017e\u00edva z\u00e1ujem v s\u00favislosti s rozvojom distribuovan\u00fdch syst\u00e9mov.<\/p>\n<h3>Obmedzenia<\/h3>\n<p>\nAk\u00e9 obmedzenia existuj\u00fa? To je skuto\u010dne jeden z hlavn\u00fdch bodov, preto\u017ee obmedzenia, ktor\u00e9 ukladaj\u00fa produk\u010dn\u00e9 syst\u00e9my, sa v\u00fdrazne l\u00ed\u0161ia od obmedzen\u00ed, ktor\u00e9 existuj\u00fa v akademick\u00fdch \u010dl\u00e1nkoch. \u010casto s\u00fa dos\u0165 umel\u00e9.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Po prv\u00e9, \u201eMongoDB\u201c je single master, ako som u\u017e povedal (to zna\u010dne zjednodu\u0161uje).<\/li>\n<li>Pova\u017eujeme, \u017ee syst\u00e9m by mal podporova\u0165 pribli\u017ene 10 000 shardov. Nem\u00f4\u017eeme prija\u0165 \u017eiadne architektonick\u00e9 rozhodnutia, ktor\u00e9 by toto \u010d\u00edslo jasne obmedzovali.<\/li>\n<li>M\u00e1me cloud, ale predpoklad\u00e1me, \u017ee u\u017e\u00edvate\u013e by mal ma\u0165 mo\u017enos\u0165, ke\u010f si stiahne binary, spusti\u0165 to na svojom laptope a v\u0161etko by malo fungova\u0165 bez probl\u00e9mov.<\/li>\n<li>Predpoklad\u00e1me, \u017ee v oblasti v\u00fdskumu sa zriedka pou\u017e\u00edva: extern\u00ed klienti m\u00f4\u017eu robi\u0165 \u010doko\u013evek. \u201eMongoDB\u201c je open source. Zodpovedaj\u00face, klienti m\u00f4\u017eu by\u0165 tak\u00ed inteligentn\u00ed, zl\u00ed \u2013 m\u00f4\u017eu chcie\u0165 v\u0161etko zni\u010di\u0165. Predpoklad\u00e1me, \u017ee sa m\u00f4\u017eu vyskytn\u00fa\u0165 byzantsk\u00e9 failory.<\/li>\n<li>Pre extern\u00fdch klientov, ktor\u00ed s\u00fa mimo perimetra \u2013 d\u00f4le\u017eit\u00e9 obmedzenie: ak je t\u00e1to funkcia vypnut\u00e1, nemalo by doch\u00e1dza\u0165 k \u017eiadnemu zhor\u0161eniu v\u00fdkonu.<\/li>\n<li>\u010eal\u0161\u00ed aspekt \u2013 naozaj antiakademick\u00fd: kompatibilita predch\u00e1dzaj\u00facich verzi\u00ed a bud\u00facich. Star\u00e9 ovl\u00e1da\u010de by mali podporova\u0165 nov\u00e9 aktualiz\u00e1cie a datab\u00e1za by mala podporova\u0165 star\u00e9 ovl\u00e1da\u010de.<\/li>\n<\/ul>\n<p>\nCelkovo to v\u0161etko kladie obmedzenia.<\/p>\n<h3>Komponenty Causal consistency<\/h3>\n<p>\nTeraz poviem nie\u010do o niektor\u00fdch komponentoch. Ak sa pozrieme na Causal consistency, m\u00f4\u017eeme vy\u010dleni\u0165 bloky. Vyberali sme z pr\u00e1c, ktor\u00e9 sa t\u00fdkaj\u00fa nejakej \u010dasti: Sledovanie z\u00e1vislost\u00ed, v\u00fdber hod\u00edn, ako sa tieto hodiny m\u00f4\u017eu synchronizova\u0165 navz\u00e1jom, a ako zabezpe\u010dujeme bezpe\u010dnos\u0165 \u2013 to je pribli\u017ene pl\u00e1n toho, o \u010dom budem hovori\u0165:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00dapln\u00e9 sledovanie z\u00e1vislost\u00ed (Full Dependency Tracking)<\/h3>\n<p>\nPre\u010do je to potrebn\u00e9? Aby, ke\u010f sa replikuj\u00fa \u00fadaje \u2013 ka\u017ed\u00fd z\u00e1znam, ka\u017ed\u00e1 zmena \u00fadajov obsahovala inform\u00e1cie o tom, od ktor\u00fdch zmien z\u00e1vis\u00ed. Najprv a naivnej\u0161ia zmena \u2013 to je, ke\u010f ka\u017ed\u00e1 spr\u00e1va, ktor\u00e1 obsahuje z\u00e1znam, obsahuje inform\u00e1cie o predch\u00e1dzaj\u00facich spr\u00e1vach:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV tomto pr\u00edklade \u010d\u00edslo v zlo\u017een\u00fdch z\u00e1tvork\u00e1ch \u2013 to s\u00fa \u010d\u00edsla z\u00e1znamov. Niekedy sa tieto z\u00e1znamy so hodnotami pren\u00e1\u0161aj\u00fa dokonca cel\u00e9, niekedy sa pren\u00e1\u0161aj\u00fa nejak\u00e9 verzie. Zmysel spo\u010d\u00edva v tom, \u017ee ka\u017ed\u00e1 zmena obsahuje inform\u00e1cie o predch\u00e1dzaj\u00facom (v\u00fdslovne to v\u0161etko nesie v sebe).<\/p>\n<p>Pre\u010do sme sa rozhodli nepou\u017e\u00edva\u0165 tak\u00fdto pr\u00edstup (\u00fapln\u00e9 sledovanie)? O\u010dividne preto, lebo tento pr\u00edstup je nepraktick\u00fd: ak\u00e1ko\u013evek zmena v soci\u00e1lnej sieti z\u00e1vis\u00ed od v\u0161etk\u00fdch predch\u00e1dzaj\u00facich zmien v tejto soci\u00e1lnej sieti, pren\u00e1\u0161aj\u00fac, povedzme, \u201eFacebook\u201c alebo \u201eVkontakte\u201c v ka\u017edej aktualiz\u00e1cii. Napriek tomu existuje mno\u017estvo v\u00fdskumov konkr\u00e9tne o Full Dependency Tracking \u2013 to s\u00fa pred-soci\u00e1lne siete, pre niektor\u00e9 situ\u00e1cie to naozaj funguje.<\/p>\n<h3>Explicitn\u00e9 sledovanie z\u00e1vislost\u00ed (Explicit Dependency Tracking)<\/h3>\n<p>\n\u010eal\u0161\u00ed \u2013 obmedzenej\u0161\u00ed. Tu sa tie\u017e zva\u017euje prenos inform\u00e1ci\u00ed, ale iba t\u00fdch, ktor\u00e9 s\u00fa v\u00fdslovne z\u00e1visl\u00e9. To, \u010do od \u010doho z\u00e1vis\u00ed, zvy\u010dajne ur\u010duje u\u017e aplik\u00e1cia. Pri replik\u00e1cii \u00fadajov sa pri \u017eiadosti vyd\u00e1vaj\u00fa iba odpovede, ke\u010f boli splnen\u00e9 predch\u00e1dzaj\u00face z\u00e1vislosti, teda zobrazen\u00e9. V tom spo\u010d\u00edva podstata toho, ako funguje kauz\u00e1lna konzistencia.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie 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 od z\u00e1znamov 1, 2, 3, 4 \u2013 teda \u010dak\u00e1, k\u00fdm klient z\u00edska pr\u00edstup k zmen\u00e1m, ktor\u00e9 urobil pr\u00edkazom pr\u00edstupu Penny, ke\u010f u\u017e v\u0161etky predch\u00e1dzaj\u00face zmeny pre\u0161li v datab\u00e1ze.<\/p>\n<p>To n\u00e1s tie\u017e nevyhovuje, preto\u017ee inform\u00e1ci\u00ed je st\u00e1le pr\u00edli\u0161 ve\u013ea a to bude spoma\u013eova\u0165. Existuje in\u00fd pr\u00edstup\u2026<\/p>\n<h3>Lamportove hodiny (Lamport Clock)<\/h3>\n<p>\nS\u00fa ve\u013emi star\u00e9. Lamport Clock predpoklad\u00e1, \u017ee tieto z\u00e1vislosti sa zlu\u010duj\u00fa do skal\u00e1rnej funkcie, ktor\u00e1 sa naz\u00fdva Lamport Clock.<\/p>\n<p>Skal\u00e1rna funkcia je ur\u010dit\u00e9 abstraktn\u00e9 \u010d\u00edslo. \u010casto sa ozna\u010duje ako logick\u00fd \u010das. Pri ka\u017edom udalosti sa tento counter zvy\u0161uje. Counter, ktor\u00fd je moment\u00e1lne zn\u00e1my procesu, posiela ka\u017ed\u00fa spr\u00e1vu. Je jasn\u00e9, \u017ee procesy m\u00f4\u017eu by\u0165 rozosynchronizovan\u00e9, m\u00f4\u017eu ma\u0165 \u00faplne r\u00f4zny \u010das. Napriek tomu takouto v\u00fdmenou spr\u00e1v syst\u00e9m nejak\u00fdm sp\u00f4sobom vyrovn\u00e1va hodiny. \u010co sa v takom pr\u00edpade deje?<\/p>\n<p>Rozdelil som t\u00fa ve\u013ek\u00fa shard na dve \u010dasti, aby to bolo jasnej\u0161ie: Friends m\u00f4\u017eu \u017ei\u0165 v jednom node, ktor\u00fd obsahuje \u010das\u0165 kolekcie, zatia\u013e \u010do Feed \u2013 v \u00faplne inom node, ktor\u00fd obsahuje \u010das\u0165 tejto kolekcie. Ako sa m\u00f4\u017eu dosta\u0165 mimo fronty? Najprv Feed povie: \u201eReplikovan\u00fd\u201c, a potom \u2013 Friends. Ak syst\u00e9m neposkytuje \u017eiadne z\u00e1ruky, \u017ee Feed nebude zobrazen\u00fd, k\u00fdm z\u00e1vislosti Friends v kolekcii Friends nebud\u00fa tie\u017e doru\u010den\u00e9, potom presne vznikne situ\u00e1cia, ktor\u00fa som spomenul.<\/p>\n<p>Vid\u00edte, ako logicky rastie \u010das counter na Feede:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHlavn\u00e9 vlastnosti tohto Lamport Clock a Causal consistency (vysvetlen\u00e9ho cez Lamport Clock) spo\u010d\u00edvaj\u00fa v nasledovnom: ak m\u00e1me udalosti A a B, a udalos\u0165 B z\u00e1vis\u00ed od udalosti A *, potom z toho vypl\u00fdva, \u017ee LogicalTime udalosti A je men\u0161\u00ed ako LogicalTime udalosti B.<\/p>\n<p><i>* Niekedy sa tie\u017e hovor\u00ed, \u017ee A happened before B, teda A sa stalo pred B \u2013 to je ak\u00fdsi vz\u0165ah, ktor\u00fd \u010diasto\u010dne usporad\u00fava cel\u00e9 mno\u017estvo udalost\u00ed, ktor\u00e9 sa v\u00f4bec stali.<\/i><\/p>\n<p>opak nie je pravdiv\u00fd. V skuto\u010dnosti je to jeden z hlavn\u00fdch nedostatkov Lamport Clock \u2013 \u010diasto\u010dn\u00e9 usporiadanie. Existuje pojem s\u00fa\u010dasn\u00fdch udalost\u00ed, teda udalost\u00ed, pri ktor\u00fdch ani (A happened before B), ani (B happened before A). Pr\u00edkladom m\u00f4\u017ee by\u0165 paraleln\u00e9 prid\u00e1vanie Leonarda medzi priate\u013eov niekoho in\u00e9ho (hoci nie Leonardom, ale napr\u00edklad Sheldonem).<br \/>\nA to je vlastnos\u0165, ktor\u00fa \u010dasto vyu\u017e\u00edvaj\u00fa pri pr\u00e1ci s Lamportov\u00fdmi hodinami: sleduj\u00fa pr\u00e1ve funkciu a z toho vyvodzuj\u00fa \u2013 mo\u017eno s\u00fa tieto udalosti z\u00e1visl\u00e9. Preto\u017ee v jednom smere je to pravda: ak je LogicalTime A men\u0161\u00ed ako LogicalTime B, potom B nem\u00f4\u017ee happened before A; a ak je v\u00e4\u010d\u0161\u00ed, tak mo\u017eno m\u00f4\u017ee.<\/p>\n<h3>Vektory hodiny (Vector Clock)<\/h3>\n<p>\nLogick\u00fd rozvoj Lamportov\u00fdch hod\u00edn \u2013 to s\u00fa Vektorov\u00e9 hodiny. Rozli\u0161uj\u00fa sa t\u00fdm, \u017ee ka\u017ed\u00fd node, ktor\u00fd tu je, obsahuje svoje, samostatn\u00e9 hodiny, a tie s\u00fa pren\u00e1\u0161an\u00e9 ako vektor.<br \/>\nV tomto pr\u00edpade vid\u00edte, \u017ee nulov\u00fd index vektora zodpoved\u00e1 feedu a prv\u00fd index vektora priate\u013eom (ka\u017ed\u00fd z t\u00fdchto uzlov). A teraz sa bud\u00fa zvy\u0161ova\u0165: nulov\u00fd index \u201efeedu\u201c sa zvy\u0161uje pri z\u00e1pise \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u010c\u00edm s\u00fa vektorov\u00e9 hodiny lep\u0161ie? T\u00fdm, \u017ee umo\u017e\u0148uj\u00fa zisti\u0165, ak\u00e9 udalosti s\u00fa\u010dasne prebiehaj\u00fa a kedy sa dej\u00fa na r\u00f4znych uzloch. To je ve\u013emi d\u00f4le\u017eit\u00e9 pre syst\u00e9m shardovania, ako je \u201eMongoDB\u201c. Av\u0161ak, toto sme nevybrali, aj ke\u010f je to skvel\u00e1 vec a funguje to v\u00fdborne, asi by n\u00e1m to vyhovovalo...<\/p>\n<p>Ak m\u00e1me 10 000 shardov, nem\u00f4\u017eeme pren\u00e1\u0161a\u0165 10 000 komponentov, aj ke\u010f ich komprimujeme alebo vym\u00fd\u0161\u013eame nie\u010do in\u00e9 \u2013 aj tak bude u\u017eito\u010dn\u00e9 za\u0165a\u017eenie nieko\u013ekon\u00e1sobne men\u0161ie ako objem cel\u00e9ho tohto vektora. Preto sme, s \u0165a\u017ek\u00fdm srdcom, odmietli tento pr\u00edstup a pre\u0161li sme k in\u00e9mu.<\/p>\n<h3>Spanner TrueTime. At\u00f3mov\u00e9 hodiny<\/h3>\n<p>\nHovoril som, \u017ee bude re\u010d o \u201eSpanneri\u201c. Je to skvel\u00e1 vec, priamo 21. storo\u010die: at\u00f3mov\u00e9 hodiny, GPS-synchroniz\u00e1cia.<\/p>\n<p>Ak\u00e1 je idea? \u201eSpanner\u201c je syst\u00e9m od Googlu, ktor\u00fd ned\u00e1vno spr\u00edstupnili aj \u013eu\u010fom (pridali k nemu SQL). Ka\u017ed\u00e1 transakcia tam m\u00e1 ur\u010dit\u00fd \u010dasov\u00fd odtla\u010dok. Ke\u010f\u017ee je \u010das synchronizovan\u00fd*, ka\u017ed\u00e9mu udalosti je mo\u017en\u00e9 priradi\u0165 ur\u010dit\u00fd \u010das \u2013 at\u00f3mov\u00e9 hodiny maj\u00fa \u010das \u010dakania, po ktorom ur\u010dite \u201enastane\u201c u\u017e in\u00fd \u010das.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00fdmto sp\u00f4sobom, jednoducho zapisovan\u00edm do DB a o\u010dak\u00e1van\u00edm nejak\u00e9ho \u010dasov\u00e9ho obdobia, je automaticky zaru\u010den\u00e1 serializovate\u013enos\u0165 udalosti. Maj\u00fa najsilnej\u0161\u00ed model konzistencie, ktor\u00fd je vlastne mo\u017en\u00e9 predstavi\u0165 \u2013 je to extern\u00e1 konzistencia.<\/p>\n<p>* To je hlavn\u00fd probl\u00e9m Lamportov\u00fdch hod\u00edn \u2013 nikdy nie s\u00fa synchronizovan\u00e9 na distribuovan\u00fdch syst\u00e9moch. M\u00f4\u017eu sa rozch\u00e1dza\u0165, aj ke\u010f je k dispoz\u00edcii NTP, a st\u00e1le nefunguj\u00fa ve\u013emi dobre. \u201eSpanner\u201c m\u00e1 at\u00f3mov\u00e9 hodiny a synchroniz\u00e1ciu, zd\u00e1 sa, na mikrosekundy.<\/p>\n<p>Pre\u010do sme nevybrali? Predpoklad\u00e1me, \u017ee na\u0161i pou\u017e\u00edvatelia nemaj\u00fa zabudovan\u00e9 at\u00f3mov\u00e9 hodiny. Ke\u010f sa objavia, a bud\u00fa zabudovan\u00e9 do ka\u017ed\u00e9ho notebooku, bude nejak\u00e1 super skvel\u00e1 GPS-synchroniz\u00e1cia \u2013 vtedy \u00e1no\u2026 Ale zatia\u013e to najlep\u0161ie, \u010do je mo\u017en\u00e9 \u2013 s\u00fa \u201eAmazon\u201c, z\u00e1klad\u0148ov\u00e9 stanice \u2013 pre fanatikov\u2026 Preto sme pou\u017eili in\u00e9 hodiny.<\/p>\n<h3>Hybridn\u00e9 hodiny (Hybrid Clock)<\/h3>\n<p>\nToto je vlastne to, \u010do tik\u00e1 v \u201eMongoDB\u201c pri zabezpe\u010den\u00ed kauz\u00e1lnej konzistencie. \u010c\u00edm s\u00fa hybridn\u00e9? Hybrid je skal\u00e1rna hodnota, ale pozost\u00e1va z dvoch komponentov:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Prv\u00e1 je unixov\u00e1 epocha (ko\u013eko sek\u00fand uplynulo od \u201eza\u010diatku po\u010d\u00edta\u010dov\u00e9ho sveta\u201c).<\/li>\n<li>Druh\u00e1 je ur\u010dit\u00fd inkrement, tie\u017e 32-bitov\u00fd unsigned int.<\/li>\n<\/ul>\n<p>\nTo je vlastne v\u0161etko. Existuje tak\u00fd pr\u00edstup: \u010das\u0165, ktor\u00e1 zodpoved\u00e1 za \u010das, sa neust\u00e1le synchronizuje s hodinami; zaka\u017ed\u00fdm, ke\u010f d\u00f4jde k aktualiz\u00e1cii, t\u00e1to \u010das\u0165 sa synchronizuje s hodinami a dost\u00e1va sa k tomu, \u017ee \u010das je v\u017edy viac-menej spr\u00e1vny, zatia\u013e \u010do inkrement umo\u017e\u0148uje rozl\u00ed\u0161i\u0165 udalosti, ktor\u00e9 sa stali v rovnakom okamihu.<\/p>\n<p>Pre\u010do je to d\u00f4le\u017eit\u00e9 pre \u201eMongoDB\u201c? Preto\u017ee to umo\u017e\u0148uje robi\u0165 z\u00e1lohovania a obnovy k ur\u010dit\u00fdm \u010dasov\u00fdm okamihom, teda udalos\u0165 je indexovan\u00e1 \u010dasom. Je to d\u00f4le\u017eit\u00e9, ke\u010f s\u00fa potrebn\u00e9 niektor\u00e9 udalosti; pre datab\u00e1zy s\u00fa udalosti zmeny v datab\u00e1ze, ktor\u00e9 sa stali v ur\u010dit\u00fdch \u010dasov\u00fdch intervaloch.<\/p>\n<p>Najd\u00f4le\u017eitej\u0161\u00ed d\u00f4vod v\u00e1m poviem iba v\u00e1m (pros\u00edm, len to nikomu nehovorte)! Urobili sme to tak, preto\u017ee takto vyzeraj\u00fa usporiadan\u00e9, indexovan\u00e9 d\u00e1ta v MongoDB OpLog. OpLog je d\u00e1tov\u00e1 \u0161trukt\u00fara, ktor\u00e1 obsahuje v\u0161etky zmeny v datab\u00e1ze: najprv sa dostan\u00fa do OpLog a potom sa aplikuj\u00fa do vlastn\u00e9ho \u00falo\u017eiska v pr\u00edpade, \u017ee ide o replikovan\u00e9 d\u00e1ta alebo shard.<\/p>\n<p>Toto bola hlavn\u00e1 pr\u00ed\u010dina. Existuj\u00fa aj praktick\u00e9 po\u017eiadavky na v\u00fdvoj datab\u00e1zy, \u010do znamen\u00e1, \u017ee to mus\u00ed by\u0165 jednoduch\u00e9 - m\u00e1lo k\u00f3du, \u010do najmenej pokazen\u00fdch vec\u00ed, ktor\u00e9 treba prepisova\u0165 a testova\u0165. To, \u017ee na\u0161e oplogi boli indexovan\u00e9 hybridn\u00fdmi hodinami, ve\u013emi pomohlo a umo\u017enilo spr\u00e1vny v\u00fdber. Naozaj to ospravedlnilo seba a akosi \u010darovne to fungovalo na prvom prototype. Bolo to ve\u013emi skvel\u00e9!<\/p>\n<h3>Synchroniz\u00e1cia hod\u00edn<\/h3>\n<p>\nExistuje nieko\u013eko sp\u00f4sobov synchroniz\u00e1cie, ktor\u00e9 s\u00fa op\u00edsan\u00e9 v odbornej literat\u00fare. Hovor\u00edm o synchroniz\u00e1cii, ke\u010f m\u00e1me dva r\u00f4zne shardy. Ak existuje jeden replica-set, synchroniz\u00e1cia nie je potrebn\u00e1: je to \"single-master\"; m\u00e1me OpLog, do ktor\u00e9ho sa v\u0161etky zmeny ulo\u017eia \u2013 v tomto pr\u00edpade je v\u0161etko u\u017e sekven\u010dne usporiadan\u00e9 v samotnom \"OpLogu\". Ale ak m\u00e1me dva r\u00f4zne shardy, tu je synchroniz\u00e1cia \u010dasu d\u00f4le\u017eit\u00e1. Tu n\u00e1m viac pomohli vektorov\u00e9 hodiny! Ale nem\u00e1me ich.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDruh\u00e1 mo\u017enos\u0165 s\u00fa \"Heartbeats\". M\u00f4\u017eeme si vymie\u0148a\u0165 ur\u010dit\u00e9 sign\u00e1ly, ktor\u00e9 prebiehaj\u00fa ka\u017ed\u00fa jednotku \u010dasu. Ale \"Heartbeats\" s\u00fa pr\u00edli\u0161 pomal\u00e9, nem\u00f4\u017eeme zabezpe\u010di\u0165 latenciu pre na\u0161ich z\u00e1kazn\u00edkov.<\/p>\n<p>True time \u2013 samozrejme, je to skvel\u00e1 vec. Ale, op\u00e4\u0165, to je pravdepodobne bud\u00facnos\u0165\u2026 Aj ke\u010f v \"Atlase\" u\u017e lze dosiahnu\u0165, u\u017e existuj\u00fa r\u00fdchle \"amazonick\u00e9\" synchroniz\u00e1tory \u010dasu. Ale to nebude dostupn\u00e9 pre v\u0161etk\u00fdch.<\/p>\n<p>Gossiping \u2013 to je vtedy, ke\u010f v\u0161etky spr\u00e1vy zah\u0155\u0148aj\u00fa \u010das. Je to pribli\u017ene to, \u010do pou\u017e\u00edvame. Ka\u017ed\u00e1 spr\u00e1va medzi uzlami, ovl\u00e1da\u010d, router d\u00e1tov\u00fdch uzlov, \u00faplne v\u0161etko pre \"MongoDB\" \u2013 to s\u00fa ak\u00e9si komponenty datab\u00e1zy, ktor\u00e9 obsahuj\u00fa hodiny, ktor\u00e9 plyn\u00fa. V\u0161ade maj\u00fa hodnotu hybridn\u00e9ho \u010dasu, t\u00e1to hodnota sa pren\u00e1\u0161a. 64 bitov? To umo\u017e\u0148uje, to je mo\u017en\u00e9.<\/p>\n<h3>Ako to v\u0161etko spolupracuje?<\/h3>\n<p>\nTu zva\u017eujem jeden replica-set, aby to bolo o nie\u010do jednoduch\u0161ie. Existuje Primary a Secondary. Secondary rob\u00ed replik\u00e1ciu a nie v\u017edy je \u00faplne synchronizovan\u00fd s Primary.<\/p>\n<p>Prebieha vlo\u017eenie (insert) do \"Primary\" s ur\u010ditou hodnotou \u010dasu. Tento insert zvy\u0161uje vn\u00fatorn\u00fd \u010d\u00edta\u010d o 11, ak je to maxim\u00e1lne. Alebo skontroluje hodnoty hod\u00edn a synchronizuje sa pod\u013ea hod\u00edn, ak s\u00fa hodnoty hod\u00edn v\u00e4\u010d\u0161ie. To umo\u017e\u0148uje usporiada\u0165 pod\u013ea \u010dasu.<\/p>\n<p>Po tom, \u010do sa vykon\u00e1 z\u00e1pis, nast\u00e1va d\u00f4le\u017eit\u00fd okamih. Hodiny v \"MongoDB\" s\u00fa inkrementovan\u00e9 iba v pr\u00edpade z\u00e1pisu do \"OpLogu\". To je udalos\u0165, ktor\u00e1 men\u00ed stav syst\u00e9mu. V\u0161etky klasick\u00e9 \u010dl\u00e1nky pova\u017euj\u00fa udalos\u0165 za pr\u00edchod spr\u00e1vy do uzla: spr\u00e1va pri\u0161la \u2013 to znamen\u00e1, \u017ee syst\u00e9m zmenil svoj stav.<\/p>\n<p>To je sp\u00f4soben\u00e9 t\u00fdm, \u017ee pri sk\u00faman\u00ed nie je \u00faplne jasn\u00e9, ako bude t\u00e1to spr\u00e1va interpretovan\u00e1. Presne vieme, \u017ee ak nie je odrazom v \"Oploge\", tak nebude interpretovan\u00e1 v\u00f4bec, a zmenou stavu syst\u00e9mu je len z\u00e1znam v \"Oplogu\". To n\u00e1m v\u0161etko u\u013eah\u010duje: a model zjednodu\u0161uje, a umo\u017e\u0148uje poriadok v r\u00e1mci jedn\u00e9ho replika-setu, a ve\u013ea \u010fal\u0161\u00edch u\u017eito\u010dn\u00fdch vec\u00ed.<\/p>\n<p>Vracia sa hodnota, ktor\u00e1 je u\u017e zaznamenan\u00e1 v \"Oplogu\" \u2013 vieme, \u017ee v \"Oplogu\" u\u017e je t\u00e1to hodnota a jej \u010das \u2013 12. Teraz, povedzme, za\u010d\u00edna \u010d\u00edtanie z in\u00e9ho uzla (Secondary), a on u\u017e posiela afterClusterTime v samotnej spr\u00e1ve. Hovor\u00ed: \u201ePotrebujem v\u0161etko, \u010do sa stalo aspo\u0148 po 12 alebo po\u010das dvan\u00e1stej\u201c (pozri obr\u00e1zok vy\u0161\u0161ie).<\/p>\n<p>Toto sa naz\u00fdva Causal and consistent (CAT). Existuje tak\u00fd pojem v te\u00f3rii, \u017ee to je ur\u010dit\u00fd priese\u010dn\u00edk \u010dasu, ktor\u00fd je s\u00e1m o sebe konzistentn\u00fd. V tomto pr\u00edpade m\u00f4\u017eeme poveda\u0165, \u017ee je to stav syst\u00e9mu, ktor\u00fd bol pozorovan\u00fd v \u010dase 12.<\/p>\n<p>Teraz tu zatia\u013e ni\u010d nie je, preto\u017ee to akoby imituje situ\u00e1ciu, ke\u010f je potrebn\u00e9, aby Secondary replikoval d\u00e1ta z Primary. \u010cak\u00e1... A u\u017e prich\u00e1dzaj\u00fa d\u00e1ta \u2013 vracia nasp\u00e4\u0165 tieto hodnoty.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTakto to asi v\u0161etko funguje. Takmer.<\/p>\n<p>\u010co znamen\u00e1 \u201etakmer\u201c? Predpokladajme, \u017ee existuje ur\u010dit\u00fd \u010dlovek, ktor\u00fd pre\u010d\u00edtal a pochopil, ako to cel\u00e9 funguje. Pochopil, \u017ee ka\u017ed\u00fdkr\u00e1t nast\u00e1va ClusterTime, aktualizuje intern\u00e9 logick\u00e9 hodiny a potom nasleduj\u00faci z\u00e1znam sa zvy\u0161uje o jednotku. T\u00e1to funkcia zaber\u00e1 20 riadkov. Predpokladajme, \u017ee tento \u010dlovek posiela maxim\u00e1lne ve\u013ek\u00e9 64-bitov\u00e9 \u010d\u00edslo, m\u00ednus jedna.<\/p>\n<p>Pre\u010do \u201em\u00ednus jedna\u201c? Preto\u017ee intern\u00e9 hodiny sa dosadia do tejto hodnoty (zjavne je to najv\u00e4\u010d\u0161ia mo\u017en\u00e1 a v\u00e4\u010d\u0161ia ako aktu\u00e1lny \u010das), potom nastane z\u00e1znam v \"Oplogu\" a hodiny sa inkrementuj\u00fa e\u0161te o jednu \u2013 a u\u017e to bude celkov\u00e9 maxim\u00e1lne hodnotenie (tam s\u00fa jednoducho v\u0161etky jedni\u010dky, \u010falej to u\u017e neexistuje, unsaint int'y).<\/p>\n<p>Jasn\u00e9 je, \u017ee po tomto je syst\u00e9m \u00faplne nedostupn\u00fd na \u010doko\u013evek. M\u00f4\u017ee sa iba vyexpedova\u0165, vy\u010disti\u0165 \u2013 ve\u013ea manu\u00e1lnej pr\u00e1ce. \u00dapln\u00e1 dostupnos\u0165:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAk to bude replikovan\u00e9 niekam inam, cel\u00fd klaster sa jednoducho zlo\u017e\u00ed. \u00daplne neprijate\u013en\u00e1 situ\u00e1cia, ktor\u00fa m\u00f4\u017ee ktoko\u013evek ve\u013emi r\u00fdchlo a jednoducho zorganizova\u0165! Preto sme tento aspekt pova\u017eovali za jeden z najd\u00f4le\u017eitej\u0161\u00edch. Ako to zabr\u00e1ni\u0165?<\/p>\n<h3>Na\u0161a cesta \u2013 podpisova\u0165 clusterTime<\/h3>\n<p>\nTakto sa to pren\u00e1\u0161a v spr\u00e1ve (do modr\u00e9ho textu). Ale za\u010dali sme tie\u017e generova\u0165 podpis (modr\u00fd text):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPodpis sa generuje k\u013e\u00fa\u010dom, ktor\u00fd je ulo\u017een\u00fd vo vn\u00fatri datab\u00e1zy, vo vn\u00fatri chr\u00e1nen\u00e9ho perimetra; s\u00e1m sa generuje, aktualizuje (u\u017e\u00edvatelia to ni\u010d nevidia). Generuje sa hash a ka\u017ed\u00e1 spr\u00e1va pri vytvoren\u00ed sa podpisuje a pri prijat\u00ed sa validuje.<br \/>\nMo\u017eno sa u \u013eud\u00ed objav\u00ed ot\u00e1zka: \u201eAko ve\u013emi to v\u0161etko spoma\u013euje?\u201c Hovoril som, \u017ee by to malo fungova\u0165 r\u00fdchlo, najm\u00e4 bez tejto funkcie.<\/p>\n<p>\u010co to znamen\u00e1 pou\u017e\u00edva\u0165 Causal consistency v tomto pr\u00edpade? To znamen\u00e1 ukazova\u0165 parameter afterClusterTime. Bez toho jednoducho bude pren\u00e1\u0161a\u0165 hodnoty za ka\u017ed\u00fdch okolnost\u00ed. Gossiping, po\u010dn\u00fac verziou 3.6, funguje v\u017edy.<\/p>\n<p>Ak ponech\u00e1me neust\u00e1le generovanie podpisov, spomal\u00ed to syst\u00e9m aj bez funkcie, \u010do nezodpoved\u00e1 na\u0161im pr\u00edstupom a po\u017eiadavk\u00e1m. A \u010do sme urobili?<\/p>\n<h3>Rob to r\u00fdchlo!<\/h3>\n<p>\nDos\u0165 jednoduch\u00e1 vec, ale zauj\u00edmav\u00fd trik \u2013 zdie\u013eam, mo\u017eno to niekoho zaujme.<br \/>\nM\u00e1me hash, v ktorom s\u00fa ulo\u017een\u00e9 podp\u00edsan\u00e9 d\u00e1ta. V\u0161etky d\u00e1ta prech\u00e1dzaj\u00fa cez cache. Cache nepodpisuje konkr\u00e9tne \u010das, ale rozsah. Ke\u010f pr\u00edde nejak\u00e1 hodnota, generujeme rozsah, zamaskujeme posledn\u00fdch 16 bitov, a t\u00fato hodnotu podpisujeme:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZ\u00edskan\u00edm tak\u00e9ho podpisu zr\u00fdchlime syst\u00e9m (podmienene) 65 tis\u00edc kr\u00e1t. Funguje to skvele: ke\u010f sme vykonali experimenty \u2013 naozaj sa \u010das pri sekven\u010dnej aktualiz\u00e1cii skr\u00e1til na 10 tis\u00edc kr\u00e1t. Je jasn\u00e9, \u017ee ke\u010f s\u00fa hodnoty roztr\u00fasen\u00e9, tak to nefunguje. Ale vo v\u00e4\u010d\u0161ine praktick\u00fdch pr\u00edpadov to funguje. Kombin\u00e1cia podpisu rozsahu spolu s podpisom umo\u017enila vyrie\u0161i\u0165 probl\u00e9m bezpe\u010dnosti.<\/p>\n<h3>\u010co sme sa nau\u010dili?<\/h3>\n<p>\nLekcie, ktor\u00e9 sme z toho vyvodili:<\/p>\n<ul>\n<li>Je potrebn\u00e9 \u010d\u00edta\u0165 materi\u00e1ly, pr\u00edbehy a \u010dl\u00e1nky, preto\u017ee m\u00e1me ve\u013ea zauj\u00edmav\u00e9ho obsahu. Ke\u010f pracujeme na nejak\u00fdch funkci\u00e1ch (najm\u00e4 teraz, ke\u010f sme sa zaoberali transakciami a pod.), mus\u00edme \u010d\u00edta\u0165 a rozumie\u0165. To si vy\u017eaduje \u010das, ale je to naozaj ve\u013emi u\u017eito\u010dn\u00e9, preto\u017ee sa st\u00e1va jasn\u00fdm, kde sa nach\u00e1dzame. Ni\u010d nov\u00e9 sme vlastne nevymysleli \u2013 len sme zobrali pr\u00edsady.\n<p>Vo v\u0161eobecnosti pozorujeme ur\u010dit\u00fd rozdiel v myslen\u00ed, ke\u010f ide o akademick\u00fa konferenciu (napr. \u201eSigmon\u201c) \u2013 tam v\u0161etci s\u00fastredia sa na nov\u00e9 n\u00e1pady. Ak\u00e1 je novos\u0165 n\u00e1\u0161ho algoritmu? Tu nie je \u017eiadna z\u00e1sadn\u00e1 novos\u0165. Novos\u0165 spo\u010d\u00edva sk\u00f4r v tom, ako sme skombinovali existuj\u00face pr\u00edstupy. Preto prv\u00e9 - treba \u010d\u00edta\u0165 klasikou, po\u010dn\u00fac Lamportom.<\/li>\n<li>V produk\u010dnom prostred\u00ed s\u00fa \u00faplne in\u00e9 po\u017eiadavky. Som si ist\u00fd, \u017ee mnoh\u00ed z v\u00e1s sa nestret\u00e1vaj\u00fa s \u201asf\u00e9rick\u00fdmi\u2018 datab\u00e1zami v abstraktnom v\u00e1kuu, ale s norm\u00e1lnymi, re\u00e1lnymi vecami, ktor\u00e9 maj\u00fa probl\u00e9my s dostupnos\u0165ou, latenciou a odolnos\u0165ou vo\u010di chyb\u00e1m.<\/li>\n<li>Posledn\u00e1 vec je t\u00e1, \u017ee sme museli zv\u00e1\u017ei\u0165 r\u00f4zne n\u00e1pady a skombinova\u0165 nieko\u013eko \u00faplne r\u00f4znych \u010dl\u00e1nkov do jedn\u00e9ho pr\u00edstupu. N\u00e1pad o podpisovan\u00ed, napr\u00edklad, pri\u0161iel z \u010dl\u00e1nku, ktor\u00fd sa zaoberal Paxos protokolom, ktor\u00fd je ur\u010den\u00fd pre nevezi\u00e1nske zlyhania v r\u00e1mci autoriza\u010dn\u00e9ho protokolu, pre vezi\u00e1nske \u2013 mimo autoriza\u010dn\u00e9ho protokolu\u2026 V podstate presne to sme nakoniec urobili.\n<p>Absol\u00fatne ni\u010d nov\u00e9 tu nie je! Ale akon\u00e1hle sme to v\u0161etko skombinovali\u2026 Je to ako poveda\u0165, \u017ee recept na Olivier \u0161al\u00e1t je nezmysel, preto\u017ee vajcia, majon\u00e9z a uhorky u\u017e vymysleli\u2026 To je pribli\u017ene t\u00e1 ist\u00e1 hist\u00f3ria.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa tomto zakon\u010d\u00edm. \u010eakujem!<\/p>\n<h3>Ot\u00e1zky<\/h3>\n<p>\n<b>Ot\u00e1zka z publika (\u010falej \u2013 O):<\/b> \u2013 \u010eakujem, Michail, za prezent\u00e1ciu! T\u00e9ma o \u010dase je zauj\u00edmav\u00e1. Pou\u017e\u00edvate Gossiping. Povedali ste, \u017ee ka\u017ed\u00fd m\u00e1 svoj \u010das, v\u0161etci poznaj\u00fa svoje lok\u00e1lne \u010dasov\u00e9 p\u00e1smo. Pochopil som to tak, \u017ee m\u00e1me ovl\u00e1da\u010d - klientov m\u00f4\u017ee by\u0165 ve\u013ea, pl\u00e1nova\u010dov dotazov tie\u017e, shardov tie\u017e ve\u013ea\u2026 A kam sa syst\u00e9m dostane, ak zrazu d\u00f4jde k rozporu: niekto sa rozhodne, \u017ee je o min\u00fatu napred, niekto \u2013 o min\u00fatu pozadu? Kde sa ocitneme?<\/p>\n<p><b>MT:<\/b> \u2013 To je naozaj skvel\u00e1 ot\u00e1zka! Pr\u00e1ve som chcel poveda\u0165 o shardoch. Ak to spr\u00e1vne ch\u00e1pem, m\u00e1me tak\u00fa situ\u00e1ciu: je shard 1 a shard 2, \u010d\u00edtanie prebieha z t\u00fdchto dvoch shardov \u2013 s\u00fa medzi sebou odli\u0161n\u00e9, nezap\u00e1jaj\u00fa sa vz\u00e1jomne, preto\u017ee \u010das, ktor\u00fd poznaj\u00fa, je in\u00fd, najm\u00e4 \u010das, ktor\u00fd existuje v oplogoch.<br \/>\nPredpokladajme, \u017ee shard 1 vytvoril mili\u00f3n z\u00e1znamov, shard 2 \u2013 v\u00f4bec ni\u010d, a dopyt pri\u0161iel na oba shardy. A prv\u00fd m\u00e1 afterClusterTime viac ako mili\u00f3n. V takejto situ\u00e1cii, ako som vysvetlil, shard 2 nikdy neodpovie.<\/p>\n<p><b>A:<\/b> \u2013 Chcel som sa op\u00fdta\u0165, ako sa synchronizuj\u00fa a vyber\u00fa jedno logick\u00e9 \u010das?<\/p>\n<p><b>MT:<\/b> \u2013 Synchronizuj\u00fa sa ve\u013emi jednoducho. Shard, ke\u010f k nemu pr\u00edde afterClusterTime a nen\u00e1jde \u010das v \u201eoploge\u201c, iniciuje no approved. To znamen\u00e1, \u017ee manu\u00e1lne zvy\u0161uje svoj \u010das na t\u00fato hodnotu. To znamen\u00e1, \u017ee nem\u00e1 \u017eiadne udalosti, ktor\u00e9 by odpovedali tejto po\u017eiadavke. Umelo vytvor\u00ed t\u00fato udalos\u0165 a t\u00fdm sa st\u00e1va Causal Consistent.<\/p>\n<p><b>A:<\/b> \u2013 A \u010do ak k nemu po tomto e\u0161te pr\u00eddu nejak\u00e9 udalosti, ktor\u00e9 sa niekde v sieti stratili?<\/p>\n<p><b>MT:<\/b> \u2013 Shard je nastaven\u00fd tak, \u017ee u\u017e nepr\u00eddu, preto\u017ee ide o single master. Ak u\u017e zaregistroval, u\u017e nepr\u00eddu, ale pr\u00eddu nesk\u00f4r. Nem\u00f4\u017ee sa sta\u0165, \u017ee sa niekde nie\u010do zaseklo, potom urob\u00ed no write, a potom tieto udalosti pri\u0161li \u2013 a naru\u0161ila sa Causal consistency. Ke\u010f vykon\u00e1 no write, v\u0161etky musia pr\u00eds\u0165 \u010falej (po\u010dk\u00e1 si na ne).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie k praxi\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>A:<\/b> \u2013 M\u00e1m nieko\u013eko ot\u00e1zok oh\u013eadom front. Causal consistency predpoklad\u00e1, \u017ee existuje ur\u010dit\u00e1 fronta akci\u00ed, ktor\u00e9 je potrebn\u00e9 vykona\u0165. \u010co sa stane, ak n\u00e1m jeden paket zmizne? Takto i\u0161iel 10., 11\u2026 12. zmizol, a v\u0161etky ostatn\u00e9 \u010dakaj\u00fa, kedy sa to vykon\u00e1. A zrazu n\u00e1m stroj umrel, nem\u00f4\u017eeme ni\u010d spravi\u0165. Existuje maxim\u00e1lna d\u013a\u017eka fronty, ktor\u00e1 sa hromad\u00ed, sk\u00f4r ako sa vykon\u00e1? Ak\u00fd fat\u00e1lny zlyhanie sa m\u00f4\u017ee sta\u0165 pri strate ktorejko\u013evek jednej polo\u017eky? O to viac, ak zapisujeme, \u017ee existuje nejak\u00fd predo\u0161l\u00fd stav, mali by sme sa od neho nejako odrazi\u0165? Ale od neho sme sa neodrazili!<\/p>\n<p><b>MT:<\/b> \u2013 To je tie\u017e n\u00e1dhern\u00e1 ot\u00e1zka! \u010co rob\u00edme? V MongoDB existuje pojem kv\u00f3rumov\u00fdch z\u00e1znamov, kv\u00f3rumov\u00e9ho \u010d\u00edtania. V ak\u00fdch pr\u00edpadoch m\u00f4\u017ee spr\u00e1va zmizn\u00fa\u0165? Ke\u010f z\u00e1pis nie je kv\u00f3rumov\u00fd alebo ke\u010f \u010d\u00edtanie nie je kv\u00f3rumov\u00e9 (m\u00f4\u017ee sa tam tie\u017e objavi\u0165 nejak\u00fd garbage).<br \/>\nV s\u00favislosti s kauz\u00e1lnou konzistenciou sme vykonali rozsiahle experiment\u00e1lne testovanie, ktor\u00e9ho v\u00fdsledkom je, \u017ee v pr\u00edpade, ke\u010f z\u00e1pisy a \u010d\u00edtania s\u00fa nekvorumov\u00e9, doch\u00e1dza k poru\u0161eniu kauz\u00e1lnej konzistencie. Presne to, \u010do hovor\u00edte!<\/p>\n<p>Na\u0161a rada: pou\u017e\u00edva\u0165 aspo\u0148 kvorumov\u00e9 \u010d\u00edtanie pri pou\u017eit\u00ed kauz\u00e1lnej konzistencie. V takom pr\u00edpade sa ni\u010d nestrat\u00ed, aj ke\u010f kvorumov\u00fd z\u00e1pis zmizne... Ide o ortogon\u00e1lnu situ\u00e1ciu: ak pou\u017e\u00edvate\u013e nechce, aby sa str\u00e1cali d\u00e1ta, mal by pou\u017e\u00edva\u0165 kvorumov\u00fd z\u00e1pis. Kauz\u00e1lna konzistencia nezaru\u010duje trv\u00e1cnos\u0165. Z\u00e1ruku trv\u00e1cnosti poskytuje replik\u00e1cia a mechanizmy s \u0148ou spojen\u00e9.<\/p>\n<p><b>A:<\/b> \u2013 Ke\u010f vytv\u00e1rame in\u0161tanciu, ktor\u00e1 vykon\u00e1va shardovanie (nie master, ale slave), opiera sa o unixov\u00fd \u010das vlastn\u00e9ho stroja alebo o \u010das \"mastera\"; synchronizuje sa po prv\u00fd raz alebo pravidelne?<\/p>\n<p><b>MT:<\/b> \u2013 Teraz to objasn\u00edm. Shard (t.j. horizont\u00e1lna partition) m\u00e1 v\u017edy prim\u00e1rny uzol. A v sharde m\u00f4\u017ee by\u0165 \"master\" a m\u00f4\u017eu by\u0165 repliky. Ale shard v\u017edy podporuje z\u00e1pis, preto\u017ee mus\u00ed podporova\u0165 ur\u010dit\u00fa dom\u00e9nu (v sharde je prim\u00e1rny uzol).<\/p>\n<p><b>A:<\/b> \u2013 Tak\u017ee v\u0161etko z\u00e1vis\u00ed v\u00fdhradne od \"mastera\"? V\u017edy sa pou\u017e\u00edva \"masterovo\" \u010dasovanie?<\/p>\n<p><b>MT:<\/b> \u2013 \u00c1no. M\u00f4\u017eeme to obrazne poveda\u0165: hodiny tikaj\u00fa, ke\u010f doch\u00e1dza k z\u00e1pisu do \"mastera\", do \"OpLogu\".<\/p>\n<p><b>A:<\/b> \u2013 M\u00e1me klienta, ktor\u00fd sa prip\u00e1ja, a nem\u00e1 potrebova\u0165 ni\u010d vedie\u0165 o \u010dase?<\/p>\n<p><b>MT:<\/b> \u2013 V\u00f4bec ni\u010d nemus\u00ed vedie\u0165! Ak hovor\u00edme o tom, ako to funguje na klientovi: ke\u010f chce klient vyu\u017e\u00edva\u0165 kauz\u00e1lnu konzistenciu, mus\u00ed otvori\u0165 rel\u00e1ciu. Teraz tam je v\u0161etko: aj transakcie v rel\u00e1cii, aj obdr\u017eanie pr\u00e1v... Rel\u00e1cia je usporiadanie logick\u00fdch udalost\u00ed, ktor\u00e9 sa dej\u00fa s klientom.<\/p>\n<p>Ak otvor\u00ed t\u00fato rel\u00e1ciu a povie, \u017ee chce kauz\u00e1lnu konzistenciu (ak rel\u00e1cia predvolene podporuje kauz\u00e1lnu konzistenciu), v\u0161etko automaticky funguje. Ovl\u00e1da\u010d si pam\u00e4t\u00e1 tento \u010das a zvy\u0161uje ho, ke\u010f prijme nov\u00fa spr\u00e1vu. Pam\u00e4t\u00e1 si, ak\u00fa odpove\u010f vr\u00e1tilo predch\u00e1dzaj\u00face volanie zo servera, ktor\u00fd vr\u00e1til \u00fadaje. Nasleduj\u00faci po\u017eiadavok bude obsahova\u0165 afterCluster (\"\u010das v\u00e4\u010d\u0161\u00ed ako tento\").<\/p>\n<p>Z\u00e1kazn\u00edk nemus\u00ed vedie\u0165 v\u00f4bec ni\u010d! Je to pre neho \u00faplne neprieh\u013eadn\u00e9. Ak \u013eudia pou\u017e\u00edvaj\u00fa tieto funkcie, \u010do to umo\u017e\u0148uje? Po prv\u00e9, m\u00f4\u017eu bezpe\u010dne \u010d\u00edta\u0165 sekund\u00e1rne datab\u00e1zy: m\u00f4\u017eu zapisova\u0165 na prim\u00e1r, zatia\u013e \u010do \u010d\u00edtaj\u00fa z geograficky replikovan\u00fdch sekund\u00e1rnych datab\u00e1z a m\u00f4\u017eu si by\u0165 ist\u00ed, \u017ee to funguje. Pritom rel\u00e1cie, ktor\u00e9 boli zaznamenan\u00e9 na prim\u00e1rnych datab\u00e1zach, je mo\u017en\u00e9 pren\u00e1\u0161a\u0165 aj na sekund\u00e1rne, teda je mo\u017en\u00e9 pou\u017e\u00edva\u0165 nie jednu rel\u00e1ciu, ale nieko\u013eko.<\/p>\n<p><b>A:<\/b> \u2013 S t\u00e9mou Eventual consistency \u00fazko s\u00favis\u00ed nov\u00e1 oblas\u0165 po\u010d\u00edta\u010dovej vedy \u2013 typy d\u00e1t CRDT (Conflict-free Replicated Data Types). Zva\u017eovali ste integr\u00e1ciu t\u00fdchto typov d\u00e1t do datab\u00e1zy a \u010do o tom m\u00f4\u017eete poveda\u0165?<\/p>\n<p><b>MT:<\/b> \u2013 Dobr\u00fd ot\u00e1zka! CRDT m\u00e1 zmysel pri konfliktoch pri z\u00e1pise: v MongoDB je to single master.<\/p>\n<p><b>A:<\/b> \u2013 M\u00e1m ot\u00e1zku od DevOps. V re\u00e1lnom svete sa vyskytuj\u00fa tak\u00e9 jezuitsk\u00e9 situ\u00e1cie, ke\u010f nast\u00e1va byzantsk\u00fd Failure a zl\u00ed \u013eudia vn\u00fatri chr\u00e1nen\u00e9ho perimetra za\u010d\u00ednaj\u00fa zasahova\u0165 do protokolu, \u0161peci\u00e1lne pripravova\u0165 pakety?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie 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 \u013eudia vn\u00fatri perimetra s\u00fa ako trojsk\u00fd k\u00f4\u0148! Zl\u00ed \u013eudia vn\u00fatri perimetra m\u00f4\u017eu sp\u00f4sobi\u0165 ve\u013ea zl\u00fdch vec\u00ed.<\/p>\n<p><b>A:<\/b> \u2013 Je jasn\u00e9, \u017ee necha\u0165 v serveri, akoby bola dierka, cez ktor\u00fa by sa dal pretiahnu\u0165 zoologick\u00fd park slonov a zr\u00fati\u0165 cel\u00fd klaster nav\u017edy... Obnovovanie ru\u010dne potrv\u00e1 nejak\u00fd \u010das... To je, mierne povedan\u00e9, nespr\u00e1vne. Na druhej strane, zauj\u00edmav\u00e9 je to: v re\u00e1lnom \u017eivote, v praxi sa vyskytuj\u00fa tak\u00e9 situ\u00e1cie, ke\u010f sa skuto\u010dne tak\u00e9 interne \u00fatoky odohr\u00e1vaj\u00fa?<\/p>\n<p><b>MT:<\/b> \u2013 Preto\u017ee sa s bezpe\u010dnostn\u00fdmi priestupkami v re\u00e1lnom \u017eivote \u010dasto nestret\u00e1vam, nem\u00f4\u017eem poveda\u0165 \u2013 mo\u017eno sa aj vyskytuj\u00fa. Ale ak hovor\u00edme o v\u00fdvojovej filozofii, pova\u017eujeme to takto: m\u00e1me perimetr, ktor\u00fd zabezpe\u010duje chlapcov, ktor\u00ed robia bezpe\u010dnos\u0165 \u2013 to je z\u00e1mok, m\u00far; a vn\u00fatri perimetra sa d\u00e1 robi\u0165 \u010doko\u013evek. Je jasn\u00e9, \u017ee s\u00fa pou\u017e\u00edvatelia, ktor\u00ed m\u00f4\u017eu len sledova\u0165, a s\u00fa pou\u017e\u00edvatelia, ktor\u00ed m\u00f4\u017eu zmaza\u0165 adres\u00e1r.<\/p>\n<p>V z\u00e1vislosti od pr\u00e1v m\u00e1 pou\u017e\u00edvate\u013e mo\u017eno sp\u00f4sobova\u0165 \u0161kody my\u0161ou, alebo mo\u017eno aj slonom. Je jasn\u00e9, \u017ee pou\u017e\u00edvate\u013e s pln\u00fdmi pr\u00e1vami m\u00f4\u017ee robi\u0165 \u010doko\u013evek. Pou\u017e\u00edvate\u013e s obmedzen\u00fdmi pr\u00e1vami m\u00f4\u017ee sp\u00f4sobi\u0165 podstatne menej \u0161k\u00f4d. Konkr\u00e9tne nem\u00f4\u017ee rozbi\u0165 syst\u00e9m.<\/p>\n<p><b>A:<\/b> \u2013 V zabezpe\u010denom perimetri niekto za\u010dal formova\u0165 ne\u010dakan\u00e9 protokoly pre server, aby ho dostal do kr\u00edzovej situ\u00e1cie a ak sa podar\u00ed, tak aj cel\u00fd klaster... M\u00f4\u017ee to by\u0165 a\u017e 'pr\u00edli\u0161 dobr\u00e9'?<\/p>\n<p><b>MT:<\/b> \u2013 Nikdy som o tak\u00fdchto veciach nepo\u010dul. Nie je tajomstvom, \u017ee to, \u010do sp\u00f4sobuje p\u00e1d servera, je mo\u017en\u00e9. Sp\u00f4sobi\u0165 p\u00e1d zvn\u00fatra, ke\u010f je niekto prihl\u00e1sen\u00fd a m\u00f4\u017ee nie\u010do zap\u00edsa\u0165 do spr\u00e1vy... V skuto\u010dnosti to nie je mo\u017en\u00e9, preto\u017ee sa to aj tak over\u00ed. Je tu mo\u017enos\u0165 deaktivova\u0165 toto overovanie pre pou\u017e\u00edvate\u013eov, ktor\u00ed to nechc\u00fa \u2013 to u\u017e s\u00fa ich probl\u00e9my; hrubo povedan\u00e9, sami rozbili m\u00fary a m\u00f4\u017eu tam narazi\u0165 slona, ktor\u00fd v\u0161etko rozdrv\u00ed... A vlastne, mo\u017eno sa obliec\u0165 ako oprav\u00e1r, pr\u00eds\u0165 a vytiahnu\u0165 to!<\/p>\n<p><b>A:<\/b> \u2013 \u010eakujem za prezent\u00e1ciu. Sergej (\"Yandex\"). V \"Mongi\" je kon\u0161tanta, ktor\u00e1 obmedzuje po\u010det hlasuj\u00facich \u010dlenov v Replica Set'e a t\u00e1to kon\u0161tanta je rovn\u00e1 7 (sedem). Pre\u010do je to kon\u0161tanta? Pre\u010do to nie je nejak\u00fd parameter?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set m\u00f4\u017ee ma\u0165 aj 40 uzlov. Tam je v\u017edy v\u00e4\u010d\u0161ina. Neviem, ak\u00e1 verzia...<\/p>\n<p><b>A:<\/b> \u2013 V Replica Set'e je mo\u017en\u00e9 sp\u00fa\u0161\u0165a\u0165 aj nehlasuj\u00facich \u010dlenov, ale hlasuj\u00facich \u2013 maxim\u00e1lne 7. Ako sa v tomto pr\u00edpade vyrovna\u0165 s vypnut\u00edm, ak m\u00e1me Replica Set rozdelen\u00fd na 3 d\u00e1tov\u00e9 centr\u00e1? Jedno d\u00e1tov\u00e9 centrum sa m\u00f4\u017ee jednoducho vypn\u00fa\u0165 a \u010fal\u0161\u00ed stroj sa m\u00f4\u017ee odpoji\u0165.<\/p>\n<p><b>MT:<\/b> \u2013 To u\u017e je trochu mimo prezent\u00e1cie. Je to v\u0161eobecn\u00e1 ot\u00e1zka. Mo\u017eno ju m\u00f4\u017eem nesk\u00f4r vysvetli\u0165.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Michal Tule\u0148 (MongoDB): Kauz\u00e1lna konzistencia: od te\u00f3rie 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=\"Prehrajte 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>Trochu reklamy \ud83d\ude42<\/h3>\n<p>\n\u010eakujeme, \u017ee ost\u00e1vate s nami. P\u00e1\u010dia sa v\u00e1m na\u0161e \u010dl\u00e1nky? Chcete vidie\u0165 viac zauj\u00edmav\u00fdch materi\u00e1lov? Podporte n\u00e1s, vytvoren\u00edm objedn\u00e1vky alebo odpor\u00fa\u010dan\u00edm zn\u00e1mym, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS pre v\u00fdvoj\u00e1rov od 4,99 dol\u00e1rov<\/a><\/noindex>, <b>unik\u00e1tny ekvivalent entry-level serverov, ktor\u00fd sme pre v\u00e1s vytvorili:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Cel\u00e1 pravda o VPS (KVM) E5-2697 v3 (6 jadier) 10GB DDR4 480GB SSD 1Gbps od 19 dol\u00e1rov alebo ako spr\u00e1vne rozdeli\u0165 server?<\/a><\/noindex> (k dispoz\u00edcii varianty s RAID1 a RAID10, a\u017e 24 jadier a a\u017e 40GB DDR4).<\/p>\n<p><b>Dell R730xd je dvakr\u00e1t lacnej\u0161\u00ed v d\u00e1tovom centre Equinix Tier IV v Amsterdame?<\/b> Len 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 dol\u00e1rov<\/a><\/noindex> v Holandsku! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 od 99 dol\u00e1rov!<\/b><\/b> Pre\u010d\u00edtajte si o tom <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Ako vybudova\u0165 infra\u0161trukt\u00faru korpor\u00e1tneho typu s pou\u017eit\u00edm serverov Dell R730xd E5-2650 v4 s cenou 9000 eur za zlomok ceny?<\/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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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 Tjuleniev (MongoDB): Causal consistency: od te\u00f3rie k praxi | ProHoster","description":"\u010eal\u0161ia konferencia HighLoad++ sa uskuto\u010dn\u00ed 6. a 7. apr\u00edla 2020 v Petrohrade. Podrobnosti a vstupenky n\u00e1jdete na odkaze.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}