{"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\/hu\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>A k\u00f6vetkez\u0151 HighLoad++ konferenci\u00e1t 2020. \u00e1prilis 6-7-\u00e9n Szentp\u00e9terv\u00e1ron tartj\u00e1k. <br \/>\nR\u00e9szletek \u00e9s jegyek <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">a linken<\/a><\/noindex>. HighLoad++ Szib\u00e9ria 2019. Terem: \u201eKrasznojarszk\u201d. J\u00fanius 25., 12:00. Absztraktok \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">el\u0151ad\u00e1s<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl\u0151fordul, hogy a gyakorlati k\u00f6vetelm\u00e9nyek ellent\u00e9tben \u00e1llnak az elm\u00e9lettel, ahol a kereskedelmi term\u00e9k szempontj\u00e1b\u00f3l fontos szempontok nincsenek figyelembe v\u00e9ve. Ez a prezent\u00e1ci\u00f3 bemutatja a k\u00fcl\u00f6nb\u00f6z\u0151 Causal consistency komponensek l\u00e9trehoz\u00e1si megk\u00f6zel\u00edt\u00e9sek kiv\u00e1laszt\u00e1s\u00e1nak \u00e9s kombin\u00e1l\u00e1s\u00e1nak folyamat\u00e1t a tudom\u00e1nyos kutat\u00e1sok alapj\u00e1n, figyelembe v\u00e9ve a kereskedelmi term\u00e9k ig\u00e9nyeit. A hallgat\u00f3k megismerik a logikai \u00f3r\u00e1k, f\u00fcgg\u0151s\u00e9gi nyomon k\u00f6vet\u00e9s, rendszerbiztons\u00e1g, \u00f3ra szinkroniz\u00e1ci\u00f3 l\u00e9tez\u0151 elm\u00e9leti megk\u00f6zel\u00edt\u00e9seit, \u00e9s hogy mi\u00e9rt d\u00f6nt\u00f6tt a MongoDB az egyes megold\u00e1sok mellett.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mihail Tyulenyev (tov\u00e1bbiakban \u2013 MT):<\/b> \u2013 Besz\u00e9lni fogok a Causal consistency-r\u0151l \u2013 ez egy funkci\u00f3, amelyen dolgoztunk a MongoDB-n\u00e9l. A disztrib\u00faci\u00f3s rendszerek csapat\u00e1ban dolgozom, k\u00f6r\u00fclbel\u00fcl k\u00e9t \u00e9ve k\u00e9sz\u00edtett\u00fck el ezt.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA folyamat sor\u00e1n jelent\u0151s mennyis\u00e9g\u0171 tudom\u00e1nyos kutat\u00e1ssal kellett megismerkedn\u00fcnk, mert ez a funkci\u00f3 el\u00e9g j\u00f3l tanulm\u00e1nyozott. Kider\u00fclt, hogy egyetlen cikk sem illeszkedik az ipari ig\u00e9nyekhez, figyelembe v\u00e9ve a nagyon specifikus k\u00f6vetelm\u00e9nyeket, amelyek val\u00f3sz\u00edn\u0171leg minden gy\u00e1rt\u00e1si alkalmaz\u00e1sban jelen vannak.<\/p>\n<p>Besz\u00e9lni fogok arr\u00f3l, hogyan alak\u00edtjuk \u00e1t a tudom\u00e1nyos kutat\u00e1st olyan form\u00e1ba, amelyet ut\u00e1na bemutathatunk a felhaszn\u00e1l\u00f3inknak, mint egy k\u00e9sz \u00e9telt, amely k\u00e9nyelmesen \u00e9s biztons\u00e1gosan haszn\u00e1lhat\u00f3.<\/p>\n<h3>Ok-okozati \u00f6sszef\u00fcgg\u00e9s (Causal consistency). Hat\u00e1rozzuk meg a fogalmakat<\/h3>\n<p>\nKezdetben \u00e1ltal\u00e1nosan szeretn\u00e9m elmondani, hogy mi is az a Causal consistency. K\u00e9t karakter van \u2013 Leonard \u00e9s Penny (a \u201eNagy Lebowski\u201d sorozatb\u00f3l):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTegy\u00fck fel, hogy Penny Eur\u00f3p\u00e1ban van, \u00e9s Leonard meglepet\u00e9st akar neki szervezni. \u00c9s nem tal\u00e1l jobb \u00f6tletet, mint hogy elt\u00e1vol\u00edtja \u0151t a bar\u00e1tai list\u00e1j\u00e1r\u00f3l, majd k\u00fcld egy friss\u00edt\u00e9st minden bar\u00e1tj\u00e1nak a feedre: \u201e\u00d6r\u00fclj\u00fcnk Penny-nek!\u201d (\u0151 Eur\u00f3p\u00e1ban van, am\u00edg alszik, nem l\u00e1tja ezt, \u00e9s nem is tud r\u00f3la, mert nem ott van). A v\u00e9g\u00e9n t\u00f6rli ezt a bejegyz\u00e9st, elt\u00e1vol\u00edtja a \u201eFeed\u201d-b\u0151l, \u00e9s helyre\u00e1ll\u00edtja a hozz\u00e1f\u00e9r\u00e9st, hogy ne vegye \u00e9szre, \u00e9s ne legyen botr\u00e1ny.<br \/>\nEz mind sz\u00e9p \u00e9s j\u00f3, de tegy\u00fck fel, hogy a rendszer elosztott, \u00e9s az esem\u00e9nyek nem \u00e9ppen \u00fagy alakultak. P\u00e9ld\u00e1ul el\u0151fordulhat, hogy a Penny hozz\u00e1f\u00e9r\u00e9s\u00e9nek korl\u00e1toz\u00e1sa a bejegyz\u00e9s megjelen\u00e9se ut\u00e1n k\u00f6vetkezett be, ha az esem\u00e9nyek k\u00f6z\u00f6tt nincs ok-okozati kapcsolat. Ez l\u00e9nyeg\u00e9ben egy p\u00e9lda arra, amikor a Causal consistency megl\u00e9te sz\u00fcks\u00e9ges egy \u00fczleti funkci\u00f3 teljes\u00edt\u00e9s\u00e9hez (ebben az esetben).<\/p>\n<p>Val\u00f3j\u00e1ban ezek el\u00e9g nem trivi\u00e1lis jellemz\u0151k az adatb\u00e1zisokban \u2013 nagyon kevesen t\u00e1mogatj\u00e1k \u0151ket. T\u00e9rj\u00fcnk \u00e1t a modellekre.<\/p>\n<h3>Konzisztencia modellek (Consistency Models)<\/h3>\n<p>\nMi is az adatb\u00e1zisok konzisztencia modellt? Ezek olyan garanci\u00e1k, amelyeket az elosztott rendszer ny\u00fajt a kliens sz\u00e1m\u00e1ra, hogy milyen adatokat \u00e9s milyen sorrendben kaphat.<\/p>\n<p>Alapvet\u0151en minden konzisztenciamodellek arra vonatkoznak, hogy mennyire hasonl\u00edt az elosztott rendszer egy laptopon, p\u00e9ld\u00e1ul egyetlen nodon m\u0171k\u00f6d\u0151 rendszerhez. \u00c9s hogy mennyire hasonl\u00edt a rendszer, amely ezrekben elosztott 'nodok' k\u00f6z\u00fcl m\u0171k\u00f6dik egy laptophoz, amelyben ezek a tulajdons\u00e1gok elvileg automatikusan megval\u00f3sulnak.<\/p>\n<p>Ez\u00e9rt a konzisztenciamodellek csak az elosztott rendszerekre vonatkoznak. Minden olyan rendszer, amely kor\u00e1bban l\u00e9tezett \u00e9s egyetlen f\u00fcgg\u0151leges sk\u00e1l\u00e1z\u00e1son m\u0171k\u00f6d\u00f6tt, nem tapasztalt ilyen probl\u00e9m\u00e1kat. Ott volt egy Buffer Cache, \u00e9s abb\u00f3l mindig kiolvast\u00e1k az adatokat.<\/p>\n<h3>Strong modell<\/h3>\n<p>\nAz els\u0151 modell a Strong (vagy vonallegel\u0151s\u00e9g, ahogyan gyakran nevezik) modell. Ez egy olyan konzisztencia modell, amely garant\u00e1lja, hogy minden v\u00e1ltoz\u00e1s, amint megkapja a meger\u0151s\u00edt\u00e9st arr\u00f3l, hogy megt\u00f6rt\u00e9nt, minden felhaszn\u00e1l\u00f3 sz\u00e1m\u00e1ra l\u00e1that\u00f3v\u00e1 v\u00e1lik.<\/p>\n<p>Ez l\u00e9trehozza az esem\u00e9nyek glob\u00e1lis sorrendj\u00e9t az adatb\u00e1zisban. Ez egy nagyon er\u0151s konzisztenci\u00e1j\u00fa tulajdons\u00e1g, \u00e9s val\u00f3j\u00e1ban nagyon dr\u00e1ga. Ennek ellen\u00e9re j\u00f3l t\u00e1mogatott. Csak nagyon dr\u00e1ga \u00e9s lass\u00fa \u2013 ez\u00e9rt ritk\u00e1n haszn\u00e1lj\u00e1k. Ezt nevezik vonallegel\u0151s\u00e9gnek.<\/p>\n<p>Van m\u00e9g egy, a 'Spanner'-ben t\u00e1mogatott er\u0151sebb tulajdons\u00e1g \u2013 ezt nevezik External Consistency-nek. Err\u0151l kicsit k\u00e9s\u0151bb besz\u00e9l\u00fcnk.<\/p>\n<h3>Causal<\/h3>\n<p>\nA k\u00f6vetkez\u0151 a Causal, amir\u0151l besz\u00e9ltem. A Strong \u00e9s a Causal k\u00f6z\u00f6tt vannak m\u00e9g alacsonyabb szintek, amikr\u0151l nem besz\u00e9lek, de mindezek a Causal-hoz vezetnek. Ez egy fontos modell, mert ez a leger\u0151sebb az \u00f6sszes modell k\u00f6z\u00fcl, \u00e9s a legnagyobb konzisztenci\u00e1t biztos\u00edt h\u00e1l\u00f3zatok vagy part\u00edci\u00f3k eset\u00e9n.<\/p>\n<p>A Causals konkr\u00e9tan az a helyzet, amikor az esem\u00e9nyek ok-okozati \u00f6sszef\u00fcgg\u00e9sben \u00e1llnak egym\u00e1ssal. Gyakran \u00fagy tekintenek r\u00e1juk, mint Read your on rights a kliens szempontj\u00e1b\u00f3l. Ha a kliens \u00e9szlelte az \u00e9rt\u00e9keket, nem l\u00e1thatja a m\u00faltbeli \u00e9rt\u00e9keket. M\u00e1r elkezdheti l\u00e1tni a prefix olvas\u00e1sokat. Mindez ugyanoda vezet.<br \/>\nA Causals mint a konzisztencia modellje \u2013 r\u00e9szleges esem\u00e9nyrend a szerveren, ahol az esem\u00e9nyeket minden \u00fcgyf\u00e9l ugyanabban a sorrendben \u00e9szleli. Ebben az esetben \u2013 Leonard \u00e9s Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nA harmadik modell az Eventual Consistency. Ez az, ami minden elosztott rendszert t\u00e1mogat, a legkisebb modell, ami egy\u00e1ltal\u00e1n \u00e9rtelmet nyer. Ez azt jelenti, hogy amikor a adatokban v\u00e1ltoz\u00e1sok t\u00f6rt\u00e9nnek, azok egy id\u0151pontban konzisztens\u00e9 v\u00e1lnak.<\/p>\n<p>Ebben a pillanatban semmit nem mond, k\u00fcl\u00f6nben External Consistency-ra v\u00e1ltozna \u2013 eg\u00e9szen m\u00e1s t\u00f6rt\u00e9net lenne. M\u00e9gis, ez egy nagyon n\u00e9pszer\u0171 modell, a legelterjedtebb. Alap\u00e9rtelmez\u00e9s szerint az elosztott rendszerek \u00f6sszes felhaszn\u00e1l\u00f3ja az Eventual Consistency-t alkalmazza.<\/p>\n<p>Szeretn\u00e9k n\u00e9h\u00e1ny \u00f6sszehasonl\u00edt\u00f3 p\u00e9ld\u00e1t hozni:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMit jelentenek ezek a nyilak?<\/p>\n<ul>\n<li><b>K\u00e9sleltet\u00e9s.<\/b> A konzisztencia erej\u00e9nek n\u00f6vel\u00e9s\u00e9vel nyilv\u00e1nval\u00f3 okokb\u00f3l n\u0151: t\u00f6bb bejegyz\u00e9st kell v\u00e9grehajtani, \u00e9s meger\u0151s\u00edt\u00e9st kell kapni az \u00f6sszes hostt\u00f3l \u00e9s node-t\u00f3l, amelyek r\u00e9szt vesznek a klaszterben, hogy az adatok ott vannak. Ez\u00e9rt az Eventual Consistency a leggyorsabb v\u00e1lasz, mert \u00e1ltal\u00e1ban m\u00e9g a mem\u00f3ri\u00e1ba is el lehet k\u00f6telezni, \u00e9s ez alapvet\u0151en elegend\u0151 lesz.<\/li>\n<li><b>El\u00e9rhet\u0151s\u00e9g.<\/b> Ha azt \u00e9rtj\u00fck alatta, hogy a rendszer k\u00e9pes v\u00e1laszolni h\u00e1l\u00f3zati megszakad\u00e1sok, part\u00edci\u00f3k vagy egy\u00e9b hib\u00e1k eset\u00e9n \u2013 a hibat\u0171r\u0151s\u00e9g n\u0151 a konzisztencia modellek cs\u00f6kkent\u00e9s\u00e9vel, mivel el\u00e9g, ha egy host m\u0171k\u00f6dik \u00e9s adatokkal szolg\u00e1l. Az Eventual Consistency a v\u00e9gs\u0151kig semmit nem garant\u00e1l az adatokr\u00f3l \u2013 ez lehet b\u00e1rmi.<\/li>\n<li><b>Anom\u00e1li\u00e1k.<\/b> Ez persze, a anom\u00e1li\u00e1k sz\u00e1ma n\u00f6vekszik. A Strong Consistency eset\u00e9n gyakorlatilag nem lenne szabad, hogy l\u00e9tezzenek, m\u00edg az Eventual Consistency eset\u00e9n b\u00e1rmilyenek lehetnek. Felmer\u00fcl a k\u00e9rd\u00e9s: mi\u00e9rt v\u00e1lasztj\u00e1k az emberek az Eventual Consistency-t, ha az anom\u00e1li\u00e1kat is tartalmaz? A v\u00e1lasz az, hogy az Eventual Consistency modellek alkalmazhat\u00f3ak, \u00e9s az anom\u00e1li\u00e1k p\u00e9ld\u00e1ul csak r\u00f6vid id\u0151szakra l\u00e9teznek; van lehet\u0151s\u00e9g olvasni a mestert \u00e9s viszonylag konzisztens adatokat olvasni; gyakran van lehet\u0151s\u00e9g az er\u0151s konzisztencia modellek haszn\u00e1lat\u00e1ra. Gyakorlatilag ez m\u0171k\u00f6dik, \u00e9s sokszor az anom\u00e1li\u00e1k id\u0151ben korl\u00e1tozottak.<\/li>\n<\/ul>\n<p><\/p>\n<h3>CAP t\u00e9tel<\/h3>\n<p>\nAmikor a consistency \u00e9s availability szavakat hallja, mi jut esz\u00e9be? Helyes, a CAP t\u00e9tel! Most szeretn\u00e9m eloszlatni a m\u00edtoszt... Ez nem \u00e9n vagyok \u2013 van egy Martin Kleppmann, aki \u00edrt egy csod\u00e1s cikket, csod\u00e1s k\u00f6nyvet.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA CAP t\u00e9tel egy elv, amit az 2000-es \u00e9vekben fogalmaztak meg, miszerint a Consistency, Availability \u00e9s Partitions k\u00f6z\u00fcl b\u00e1rmely kett\u0151t v\u00e1laszthatunk, de a h\u00e1rmat nem. Ez egy bizonyos elv volt. N\u00e9h\u00e1ny \u00e9vvel k\u00e9s\u0151bb t\u00e9tell\u00e9 bizony\u00edtott\u00e1k Gillbert \u00e9s Lynch. Ezt k\u00f6vet\u0151en mantr\u00e1v\u00e1 v\u00e1lt \u2013 a rendszereket CA, CP, AP stb. kateg\u00f3ri\u00e1kra osztott\u00e1k.<\/p>\n<p>Ez a t\u00e9tel val\u00f3j\u00e1ban az al\u00e1bbi esetekben lett bizony\u00edtva... El\u0151sz\u00f6r is, az Availability-t nem folyamatos \u00e9rt\u00e9kk\u00e9nt vizsg\u00e1lt\u00e1k a null\u00e1t\u00f3l a sz\u00e1zig (0 \u2013 a rendszer \u201ehalott\u201d, 100 \u2013 gyorsan v\u00e1laszol; \u00edgy szoktuk n\u00e9zni), hanem mint algoritmus egy tulajdons\u00e1g\u00e1t, amely garant\u00e1lja, hogy minden v\u00e9grehajt\u00e1sakor visszaadja az adatokat.<\/p>\n<p>A v\u00e1laszid\u0151r\u0151l egy sz\u00f3 sem esik! Van egy algoritmus, amely 100 \u00e9v m\u00falva adja vissza az adatokat \u2013 egy teljesen kiv\u00e1l\u00f3, el\u00e9rhet\u0151 algoritmus, amely a CAP t\u00e9tel r\u00e9sze.<br \/>\nM\u00e1sodszor: a t\u00e9telt egy \u00e9s ugyanazon kulcs \u00e9rt\u00e9keinek v\u00e1ltoz\u00e1saira bizony\u00edtott\u00e1k, mik\u00f6zben ezek a v\u00e1ltoz\u00e1sok resizable vonalak. Ez azt jelenti, hogy gyakorlatilag soha nem haszn\u00e1lj\u00e1k \u0151ket, mert m\u00e1s modellek vannak, mint az Eventual Consistency, Strong Consistency (lehets\u00e9ges).<\/p>\n<p>Mire is van ez az eg\u00e9sz? Arra, hogy a CAP t\u00e9tel abban a form\u00e1ban, ahogy bizony\u00edtott\u00e1k, gyakorlatilag nem alkalmazhat\u00f3, ritk\u00e1n haszn\u00e1lj\u00e1k. Elm\u00e9leti form\u00e1j\u00e1ban valamilyen m\u00f3don minden korl\u00e1toz. Egy bizonyos elvet kapunk, amely intuit\u00edven igaz, de val\u00f3j\u00e1ban nem bizony\u00edtott.<\/p>\n<h3>Causal consistency \u2013 a legszil\u00e1rdabb modell<\/h3>\n<p>\nAmi most zajlik \u2013 mindh\u00e1rom dolgot megkaphatjuk: a konzisztenci\u00e1t, az el\u00e9rhet\u0151s\u00e9get a part\u00edci\u00f3kon kereszt\u00fcl. K\u00fcl\u00f6n\u00f6sen a kauz\u00e1lis konzisztencia \u2013 a leger\u0151sebb konzisztencia modell, amely m\u00e9g part\u00edci\u00f3k (h\u00e1l\u00f3zati megszak\u00edt\u00e1sok) eset\u00e9n is m\u0171k\u00f6dik. Ez\u00e9rt van olyan nagy \u00e9rdekl\u0151d\u00e9s ir\u00e1nta, \u00e9s ez\u00e9rt foglalkoztunk vele.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl\u0151sz\u00f6r is, egyszer\u0171s\u00edti a fejleszt\u0151k munk\u00e1j\u00e1t. K\u00fcl\u00f6n\u00f6sen az\u00e9rt, mert jelent\u0151s szerver t\u00e1mogat\u00e1ssal b\u00edr: amikor az egy \u00fcgyf\u00e9l \u00e1ltal v\u00e9grehajtott \u00f6sszes bejegyz\u00e9s garant\u00e1ltan ugyanabban a sorrendben \u00e9rkezik meg egy m\u00e1sik \u00fcgyf\u00e9lhez. M\u00e1sodszor, k\u00e9pes elviselni a part\u00edci\u00f3kat.<\/p>\n<h3>A MongoDB bels\u0151 m\u0171k\u00f6d\u00e9se<\/h3>\n<p>\nEml\u00e9kezve arra, hogy eb\u00e9did\u0151 van, \u00e1tvonulunk a konyh\u00e1ba. Besz\u00e9lek a rendszer modellj\u00e9r\u0151l, nevezetesen arr\u00f3l, hogy mi is a MongoDB azok sz\u00e1m\u00e1ra, akik el\u0151sz\u00f6r hallanak err\u0151l az adatb\u00e1zisr\u00f3l.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA MongoDB (a tov\u00e1bbiakban: \u201eMongoDB\u201d) egy elosztott rendszer, amely t\u00e1mogatja a v\u00edzszintes sk\u00e1l\u00e1z\u00f3d\u00e1st, azaz a shardol\u00e1st; \u00e9s minden shardon bel\u00fcl is t\u00e1mogatja az adat redundanci\u00e1t, azaz a replik\u00e1ci\u00f3t.<\/p>\n<p>A shardol\u00e1s a \u201eMongoDB\u201d-ben (nem rel\u00e1ci\u00f3s adatb\u00e1zis) automatikus egyens\u00falyoz\u00e1st v\u00e9gez, teh\u00e1t minden dokumentumgy\u0171jtem\u00e9ny (vagy \u201et\u00e1bla\u201d rel\u00e1ci\u00f3s adatok terminol\u00f3gi\u00e1j\u00e1ban) darabokra van osztva, \u00e9s a szerver automatikusan mozgatja \u0151ket a shardok k\u00f6z\u00f6tt.<\/p>\n<p>A k\u00e9r\u00e9sir\u00e1ny\u00edt\u00f3, amely az \u00fcgyf\u00e9l k\u00e9r\u00e9seit elosztja, egy bizonyos \u00fcgyf\u00e9l sz\u00e1m\u00e1ra egy olyan kliens, amin kereszt\u00fcl dolgozik. \u0150 m\u00e1r tudja, hol \u00e9s milyen adatok tal\u00e1lhat\u00f3k, \u00e9s ir\u00e1ny\u00edtja az \u00f6sszes k\u00e9r\u00e9st a megfelel\u0151 shardra.<\/p>\n<p>M\u00e9g egy fontos pont: a MongoDB egyetlen mester. Van egy primary \u2013 \u0151 tud bejegyz\u00e9seket fogadni, t\u00e1mogat\u00f3 kulcsokkal, amiket tartalmaz. Nem lehet multi-master \u00edr\u00e1st csin\u00e1lni.<\/p>\n<p>Kiadtuk a 4.2-es verzi\u00f3t \u2013 itt \u00faj \u00e9rdekes dolgok jelentek meg. K\u00fcl\u00f6n\u00f6sen beillesztett\u00fck a Lucene-t \u2013 keres\u00e9st \u2013 val\u00f3di executable java k\u00f6zvetlen\u00fcl a \u201eMongo\u201d-ba, \u00e9s ott lehet\u0151s\u00e9g ny\u00edlt keres\u00e9si m\u0171veletek v\u00e9grehajt\u00e1s\u00e1ra Lucene-nel, mint az \u201eElastic\u201d-ban.<\/p>\n<p>\u00c9s l\u00e9trehoztunk egy \u00faj term\u00e9ket \u2013 Charts, ez is el\u00e9rhet\u0151 az \u201eAtlas\u201d-on (a Mongo saj\u00e1t felh\u0151szolg\u00e1ltat\u00e1sa). Van egy ingyenes szint \u2013 lehet j\u00e1tszadozni vele. A Charts nagyon tetszett \u2013 adatok vizualiz\u00e1l\u00e1sa, intuit\u00edv.<\/p>\n<h3>A kauz\u00e1lis konzisztencia \u00f6sszetev\u0151i<\/h3>\n<p>\nK\u00f6r\u00fclbel\u00fcl 230 cikket sz\u00e1moltam, amelyek ebben a t\u00e9m\u00e1ban lettek publik\u00e1lva \u2013 Leslie Lampert\u0151l. Most pedig elmondok nektek n\u00e9h\u00e1ny r\u00e9szletet ezekb\u0151l az anyagokb\u00f3l az eml\u00e9keimb\u0151l.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMinden a Leslie Lampert \u00e1ltal \u00edrt cikkel kezd\u0151d\u00f6tt, amely az 1970-es \u00e9vekben k\u00e9sz\u00fclt. Ahogy l\u00e1that\u00f3, a t\u00e9ma m\u00e9g mindig kutat\u00e1s t\u00e1rgy\u00e1t k\u00e9pezi. Jelenleg a Causal consistency ir\u00e1nt \u00e9rdekl\u0151d\u00e9s mutatkozik a elosztott rendszerek fejl\u0151d\u00e9se miatt.<\/p>\n<h3>Korl\u00e1toz\u00e1sok<\/h3>\n<p>\nMilyenek a korl\u00e1tok? Ez val\u00f3j\u00e1ban az egyik legfontosabb szempont, mert a produkci\u00f3s rendszerek \u00e1ltal t\u00e1masztott korl\u00e1toz\u00e1sok jelent\u0151sen elt\u00e9rnek azokt\u00f3l, amelyek az akad\u00e9miai cikkekben tal\u00e1lhat\u00f3k. Gyakran el\u00e9g mesters\u00e9gesek.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>El\u0151sz\u00f6r is, a 'MongoDB' egy single master, ahogy m\u00e1r eml\u00edtettem (ez jelent\u0151sen egyszer\u0171s\u00edti a helyzetet).<\/li>\n<li>Azt gondoljuk, hogy a rendszernek k\u00f6r\u00fclbel\u00fcl 10 ezer shardot kell t\u00e1mogatnia. Nem hozhatunk olyan architektur\u00e1lis d\u00f6nt\u00e9seket, amelyek egy\u00e9rtelm\u0171en korl\u00e1tozz\u00e1k ezt az \u00e9rt\u00e9ket.<\/li>\n<li>Van felh\u0151nk, de azt felt\u00e9telezz\u00fck, hogy az embereknek lehet\u0151s\u00e9get kell biztos\u00edtani, amikor let\u00f6ltik a bin\u00e1rist, elind\u00edtj\u00e1k a laptopjukon, \u00e9s minden t\u00f6k\u00e9letesen m\u0171k\u00f6dik.<\/li>\n<li>Felt\u00e9telezz\u00fck, hogy a kutat\u00e1s sor\u00e1n ritk\u00e1n haszn\u00e1lt: a k\u00fcls\u0151 \u00fcgyfelek b\u00e1rmit megtehetnek. A 'MongoDB' ny\u00edlt forr\u00e1sk\u00f3d\u00fa. Ennek megfelel\u0151en az \u00fcgyfelek lehetnek nagyon okosak, ak\u00e1r gonoszak \u2013 mindent el akarnak rontani. Felt\u00e9telezz\u00fck, hogy biz\u00e1nci hib\u00e1k el\u0151fordulhatnak.<\/li>\n<li>A k\u00fcls\u0151 \u00fcgyfelek sz\u00e1m\u00e1ra, akik a peremen k\u00edv\u00fcl helyezkednek el \u2013 fontos korl\u00e1toz\u00e1s: ha ez a funkci\u00f3 ki van kapcsolva, akkor nem kell teljes\u00edtm\u00e9nycs\u00f6kken\u00e9st tapasztalni.<\/li>\n<li>M\u00e9g egy szempont \u2013 s\u0151t, kifejezetten antikademikus: a kor\u00e1bbi \u00e9s j\u00f6v\u0151beli verzi\u00f3k kompatibilit\u00e1sa. A r\u00e9gi illeszt\u0151programoknak t\u00e1mogatnia kell az \u00faj friss\u00edt\u00e9seket, \u00e9s az adatb\u00e1zisnak t\u00e1mogatnia kell a r\u00e9gi illeszt\u0151programokat.<\/li>\n<\/ul>\n<p>\n\u00d6sszess\u00e9g\u00e9ben mindez korl\u00e1toz\u00e1sokat r\u00f3 ki.<\/p>\n<h3>A Causal consistency komponensei<\/h3>\n<p>\nMost n\u00e9h\u00e1ny komponensr\u0151l fogok besz\u00e9lni. Ha \u00e1ltal\u00e1ban a Causal consistency-t n\u00e9zz\u00fck, blokkokat lehet kiemelni. Olyan munk\u00e1kb\u00f3l v\u00e1logattunk, amelyek egy adott blokkhoz kapcsol\u00f3dnak: Dependency Tracking, \u00f3rajelek kiv\u00e1laszt\u00e1sa, hogyan lehet ezeket az \u00f3r\u00e1kat szinkroniz\u00e1lni egym\u00e1ssal, \u00e9s hogyan biztos\u00edtjuk a biztons\u00e1got \u2013 ez egy \u00f6sszefoglal\u00f3 terv arr\u00f3l, amir\u0151l besz\u00e9lni fogok:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Teljes f\u00fcgg\u0151s\u00e9gi nyomk\u00f6vet\u00e9s (Full Dependency Tracking)<\/h3>\n<p>\nMi\u00e9rt van sz\u00fcks\u00e9g r\u00e1? Az\u00e9rt, hogy amikor az adatok replik\u00e1l\u00f3dnak, minden egyes bejegyz\u00e9s, minden adatv\u00e1ltoz\u00e1s tartalmazza az inform\u00e1ci\u00f3t arr\u00f3l, hogy milyen v\u00e1ltoz\u00e1sokt\u00f3l f\u00fcgg. Az els\u0151 \u00e9s legegyszer\u0171bb v\u00e1ltoz\u00e1s az, amikor minden \u00fczenet, amely tartalmaz egy bejegyz\u00e9st, tartalmazza az el\u0151z\u0151 \u00fczenetek inform\u00e1ci\u00f3j\u00e1t:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEbben a p\u00e9ld\u00e1ban a kapcsos z\u00e1r\u00f3jelek k\u00f6z\u00f6tti sz\u00e1mok a bejegyz\u00e9sek azonos\u00edt\u00f3i. N\u00e9ha ezeket a bejegyz\u00e9seket \u00e9rt\u00e9kekkel egy\u00fctt teljesen \u00e1tadj\u00e1k, n\u00e9ha bizonyos verzi\u00f3kat adnak \u00e1t. A l\u00e9nyeg az, hogy minden v\u00e1ltoz\u00e1s tartalmazza az el\u0151z\u0151r\u0151l sz\u00f3l\u00f3 inform\u00e1ci\u00f3t (ny\u00edltan hordozza azt).<\/p>\n<p>Mi\u00e9rt d\u00f6nt\u00f6tt\u00fcnk \u00fagy, hogy nem haszn\u00e1lunk ilyen megk\u00f6zel\u00edt\u00e9st (teljes nyomk\u00f6vet\u00e9s)? Nyilv\u00e1nval\u00f3an az\u00e9rt, mert ez a megk\u00f6zel\u00edt\u00e9s nem praktikus: b\u00e1rmely v\u00e1ltoz\u00e1s a k\u00f6z\u00f6ss\u00e9gi h\u00e1l\u00f3n f\u00fcgg minden kor\u00e1bbi v\u00e1ltoz\u00e1st\u00f3l ezen a k\u00f6z\u00f6ss\u00e9gi h\u00e1l\u00f3n, mondjuk \u201eFacebook\u201d vagy \u201eVkontakte\u201d minden friss\u00edt\u00e9sben. Ennek ellen\u00e9re sz\u00e1mos kutat\u00e1s l\u00e9tezik a Full Dependency Tracking tekintet\u00e9ben \u2013 ez a t\u00e1rsadalmi h\u00e1l\u00f3zatok el\u0151tt l\u00e9tezett, bizonyos helyzetekben ez t\u00e9nyleg m\u0171k\u00f6dik.<\/p>\n<h3>Kifejezett f\u00fcgg\u0151s\u00e9g nyomk\u00f6vet\u00e9s (Explicit Dependency Tracking)<\/h3>\n<p>\nA k\u00f6vetkez\u0151 egy korl\u00e1tozottabb megk\u00f6zel\u00edt\u00e9s. Itt is inform\u00e1ci\u00f3k \u00e1tad\u00e1s\u00e1r\u00f3l van sz\u00f3, de csak arr\u00f3l, ami ny\u00edltan f\u00fcgg. Az, hogy mi f\u00fcgg mit\u0151l, \u00e1ltal\u00e1ban az Alkalmaz\u00e1s hat\u00e1rozza meg. Amikor az adatok replik\u00e1l\u00f3dnak, a k\u00e9r\u00e9sek sor\u00e1n csak azok a v\u00e1laszok jelennek meg, amelyekn\u00e9l az el\u0151z\u0151 f\u00fcgg\u0151s\u00e9gek teljes\u00fcltek, azaz meg lettek mutatva. Ez a l\u00e9nyege annak, hogyan m\u0171k\u00f6dik a Causal consistency.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e1tja, hogy az 5-\u00f6s bejegyz\u00e9s a 1-es, 2-es, 3-as \u00e9s 4-es bejegyz\u00e9sekt\u0151l f\u00fcgg \u2013 ennek megfelel\u0151en v\u00e1r, miel\u0151tt a kliens hozz\u00e1f\u00e9rne az access Pennys \u00e1ltal v\u00e9grehajtott v\u00e1ltoztat\u00e1sokhoz, amikor minden kor\u00e1bbi v\u00e1ltoz\u00e1s m\u00e1r \u00e1tment az adatb\u00e1zison.<\/p>\n<p>Ez sem elfogadhat\u00f3 sz\u00e1munkra, mert \u00edgy is t\u00fal sok inform\u00e1ci\u00f3 van, \u00e9s ez lass\u00edtani fog. Van egy m\u00e1sik megk\u00f6zel\u00edt\u00e9s...<\/p>\n<h3>Lamport \u00f3ra (Lamport Clock)<\/h3>\n<p>\nEzek nagyon r\u00e9giek. A Lamport Clock azt jelenti, hogy ezek a f\u00fcgg\u0151s\u00e9gek egy skal\u00e1ris funkci\u00f3ba t\u00f6m\u00f6r\u00fclnek, amit Lamport Clock-nak neveznek.<\/p>\n<p>A skal\u00e1ris f\u00fcggv\u00e9ny egy absztrakt sz\u00e1m. Gyakran logikai id\u0151nek nevezik. Minden esem\u00e9nyn\u00e9l ez a sz\u00e1ml\u00e1l\u00f3 n\u00f6vekszik. Az a sz\u00e1ml\u00e1l\u00f3, amelyet a folyamat jelenleg ismer, minden \u00fczenetet elk\u00fcld. Nyilv\u00e1nval\u00f3, hogy a folyamatok deszinkroniz\u00e1l\u00f3dhatnak, lehet teljesen elt\u00e9r\u0151 id\u0151z\u00edt\u00e9s\u00fck. Ennek ellen\u00e9re \u00edgy \u00fczeneteket v\u00e1ltva a rendszer valahogy egyens\u00falyozza az \u00f3r\u00e1kat. Mi t\u00f6rt\u00e9nik ebben az esetben?<\/p>\n<p>K\u00e9t r\u00e9szre osztottam azt a nagy shardot, hogy vil\u00e1gos legyen: a Friends ak\u00e1r egy noden is \u00e9lhet, amely egy gy\u0171jtem\u00e9ny darabj\u00e1t tartalmazza, m\u00edg a Feed \u2013 egy teljesen m\u00e1s noden, amely szint\u00e9n egy darabot tartalmaz ebb\u0151l a gy\u0171jtem\u00e9nyb\u0151l. Hogyan ker\u00fclhetnek ki a sorb\u00f3l? El\u0151sz\u00f6r a Feed azt mondja: \u201eReplik\u00e1lva lett\u201d, majd a Friends. Ha a rendszer nem garant\u00e1l semmit, hogy a Feed nem jelenik meg, am\u00edg a Friends gy\u0171jtem\u00e9ny f\u00fcgg\u0151s\u00e9gei szint\u00e9n nem ker\u00fcltek \u00e1tad\u00e1sra, akkor pontosan egy olyan helyzet \u00e1ll el\u0151, amir\u0151l besz\u00e9ltem.<\/p>\n<p>L\u00e1tja, hogyan n\u00f6vekszik logikailag a sz\u00e1ml\u00e1l\u00f3 ideje a Feed-en:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cdgy a Lamport-\u00f3ra \u00e9s a Kausal konzisztenzia (Lamport-\u00f3r\u00e1n kereszt\u00fcl elmagyar\u00e1zva) f\u0151 jellemz\u0151je a k\u00f6vetkez\u0151: ha van egy A \u00e9s B esem\u00e9ny\u00fcnk, \u00e9s a B esem\u00e9ny f\u00fcgg az A esem\u00e9nyt\u0151l *, akkor ebb\u0151l k\u00f6vetkezik, hogy az A esem\u00e9ny LogikaiIdeje kisebb, mint a B esem\u00e9ny LogikaiIdeje.<\/p>\n<p><i>* N\u00e9ha azt is mondj\u00e1k, hogy A megel\u0151zte B-t, azaz A kor\u00e1bban t\u00f6rt\u00e9nt, ez egy olyan viszony, amely r\u00e9szben rendezett\u00e9 teszi az \u00f6sszes esem\u00e9nyt, amely valaha is megt\u00f6rt\u00e9nt.<\/i><\/p>\n<p>A ford\u00edtott ir\u00e1nyban nem igaz. Ez val\u00f3j\u00e1ban a Lamport-\u00f3ra egyik f\u0151 h\u00e1tr\u00e1nya \u2013 a r\u00e9szleges sorrend. L\u00e9tezik a p\u00e1rhuzamos esem\u00e9nyek fogalma, azaz az esem\u00e9nyek, amelyek eset\u00e9ben sem (A megel\u0151zte B-t), sem (A ut\u00e1na t\u00f6rt\u00e9nt B el\u0151tt) nem \u00e1ll meg. Egy p\u00e9lda lehet Leonard bar\u00e1tk\u00e9nt val\u00f3 p\u00e1rhuzamos hozz\u00e1ad\u00e1sa valakihez (m\u00e9g csak nem is Leonard, hanem p\u00e9ld\u00e1ul Sheldon).<br \/>\nEz a tulajdons\u00e1g az, amelyet gyakran haszn\u00e1lnak a Lamport-\u00f3r\u00e1k munk\u00e1ja sor\u00e1n: a f\u00fcggv\u00e9nyre n\u00e9znek, \u00e9s ebb\u0151l k\u00f6vetkeztetnek \u2013 lehet, hogy ezek az esem\u00e9nyek f\u00fcggnek egym\u00e1st\u00f3l. Mert egy ir\u00e1nyban ez igaz: ha A LogikaiIdeje kisebb, mint B LogikaiIdeje, akkor B nem megel\u0151zheti A-t; ha pedig nagyobb, akkor lehet, hogy megel\u0151zheti.<\/p>\n<h3>Vektoros \u00f3r\u00e1k (Vector Clock)<\/h3>\n<p>\nA Lamport-\u00f3r\u00e1k logikai fejl\u0151d\u00e9se a Vektoros \u00f3r\u00e1k. Az az elt\u00e9r\u00e9s, hogy minden node, amely itt van, tartalmaz saj\u00e1t, k\u00fcl\u00f6n \u00f3r\u00e1kat, \u00e9s ezeket vektor form\u00e1j\u00e1ban tov\u00e1bb\u00edtj\u00e1k.<br \/>\nEbben az esetben l\u00e1tja, hogy a vektor nulla indexe a Feed-\u00e9rt felel, m\u00edg az els\u0151 index a Friends-\u00e9rt (mindk\u00e9t nod eset\u00e9ben). Most pedig ezek n\u00f6vekedni fognak: a \u201eFeed\u201d nulla indexe 1, 2, 3-ra n\u0151.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMi\u00e9rt jobbak a Vektoras \u00f3r\u00e1k? Az\u00e9rt, mert lehet\u0151v\u00e9 teszik, hogy meg\u00e9rts\u00fck, mely esem\u00e9nyek t\u00f6rt\u00e9nnek egyid\u0151ben \u00e9s mikor zajlanak le a k\u00fcl\u00f6nb\u00f6z\u0151 nodokon. Ez nagyon fontos a shardol\u00e1si rendszer sz\u00e1m\u00e1ra, mint p\u00e9ld\u00e1ul a \u201eMongoDB\u201d. Azonban ezt nem v\u00e1lasztottuk, b\u00e1r szuper dolog, csod\u00e1latosan m\u0171k\u00f6dik, val\u00f3sz\u00edn\u0171leg nek\u00fcnk is megfelelne...<\/p>\n<p>Ha 10 ezer shardunk van, nem tudunk 10 ezer komponenst \u00e1tadni, m\u00e9g ha t\u00f6m\u00f6r\u00edtj\u00fck is, vagy valami m\u00e1st kital\u00e1lunk \u2013 akkor is a hasznos teher t\u00f6red\u00e9ke lesz a teljes vektor mennyis\u00e9g\u00e9nek. Ez\u00e9rt, sz\u00edvemre \u00e9s fogaimra tapasztva, lemondtunk err\u0151l a megk\u00f6zel\u00edt\u00e9sr\u0151l, \u00e9s m\u00e1sra t\u00e9rt\u00fcnk \u00e1t.<\/p>\n<h3>Spanner TrueTime. Atom\u00f3r\u00e1k<\/h3>\n<p>\nMondtam, hogy a \u201eSpannerr\u0151l\u201d fogok mes\u00e9lni. Ez egy men\u0151 dolog, igazi XXI. sz\u00e1zad: atom\u00f3r\u00e1k, GPS-szinkroniz\u00e1ci\u00f3.<\/p>\n<p>Mi az \u00f6tlet? A \u201eSpanner\u201d egy Google rendszer, ami nemr\u00e9giben el\u00e9rhet\u0151v\u00e9 v\u00e1lt az emberek sz\u00e1m\u00e1ra (SQL-t adtak hozz\u00e1). Minden tranzakci\u00f3nak van egy timestamp-je. Mivel az id\u0151 szinkroniz\u00e1lt*, minden esem\u00e9nyhez hozz\u00e1rendelhet\u0151 egy meghat\u00e1rozott id\u0151 \u2013 az atom\u00f3r\u00e1k bizonyos v\u00e1rakoz\u00e1si id\u0151vel rendelkeznek, amely ut\u00e1n garant\u00e1ltan \u201efakad\u201d m\u00e1r egy m\u00e1sik id\u0151.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cdgy, egyszer\u0171en a DB-be \u00edr\u00e1s \u00e9s egy bizonyos v\u00e1rakoz\u00e1si id\u0151 eltelt\u00e9vel automatikusan garant\u00e1lt a rendezhet\u0151s\u00e9g (Serializability) az esem\u00e9nyekn\u00e9l. Ennek a leger\u0151sebb konzisztencia-modellje van, amelyet elvileg elk\u00e9pzelhet\u00fcnk \u2013 ez az external consistency.<\/p>\n<p>* Ez a Lambert \u00f3r\u00e1kkal kapcsolatos f\u0151 probl\u00e9ma \u2013 sosem szinkroniz\u00e1ltak elosztott rendszerekben. Megtarthatj\u00e1k a k\u00fcl\u00f6nbs\u00e9get, m\u00e9g ha NTP is van, akkor sem m\u0171k\u00f6dnek t\u00fal j\u00f3l. A \u201eSpanner\u201d atom\u00f3r\u00e1kkal \u00e9s szinkroniz\u00e1ci\u00f3val rendelkezik, \u00fagy t\u0171nik, mikro-szekundumokkal.<\/p>\n<p>Mi\u00e9rt nem v\u00e1lasztottuk? Nem sz\u00e1m\u00edtunk arra, hogy a felhaszn\u00e1l\u00f3inknak be\u00e9p\u00edtett atom\u00f3r\u00e1i lenn\u00e9nek. Amikor azok megjelennek, be\u00e9p\u00edtve minden laptopba, lesz valami szuper GPS-szinkroniz\u00e1ci\u00f3 \u2013 akkor igen\u2026 De addig a legjobb, amit lehet, az az \u201eAmazon\u201d, Base Stations \u2013 a fanatik\u00e1k sz\u00e1m\u00e1ra\u2026 Ez\u00e9rt m\u00e1s \u00f3r\u00e1kat haszn\u00e1ltunk.<\/p>\n<h3>Hibrid \u00f3r\u00e1k (Hybrid Clock)<\/h3>\n<p>\nEz l\u00e9nyeg\u00e9ben az, ami a 'MongoDB'-ben m\u0171k\u00f6dik a kauz\u00e1lis konzisztencia biztos\u00edt\u00e1s\u00e1n\u00e1l. Miben hibrid? A hibrid egy skal\u00e1ris \u00e9rt\u00e9k, de k\u00e9t komponensb\u0151l \u00e1ll:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Az els\u0151 a unix id\u0151sz\u00e1m\u00edt\u00e1s (mennyi m\u00e1sodperc telt el a 'sz\u00e1m\u00edt\u00f3g\u00e9pes vil\u00e1g kezdet\u00e9t\u0151l').<\/li>\n<li>A m\u00e1sodik egy bizonyos inkrement, szint\u00e9n 32-bites unsigned int.<\/li>\n<\/ul>\n<p>\nEz tulajdonk\u00e9ppen minden. L\u00e9tezik egy megk\u00f6zel\u00edt\u00e9s: az id\u0151\u00e9rt felel\u0151s r\u00e9sz folyamatosan szinkroniz\u00e1lva van az \u00f3r\u00e1kkal; mindig, amikor friss\u00edt\u00e9s t\u00f6rt\u00e9nik, ez a r\u00e9sz szinkroniz\u00e1lva van az \u00f3r\u00e1kkal, \u00edgy az id\u0151 mindig nagyj\u00e1b\u00f3l helyes, m\u00edg az inkrement lehet\u0151v\u00e9 teszi az esem\u00e9nyek megk\u00fcl\u00f6nb\u00f6ztet\u00e9s\u00e9t, amelyek ugyanabban az id\u0151pontban t\u00f6rt\u00e9ntek.<\/p>\n<p>Mi\u00e9rt fontos ez a 'MongoDB'-nek? Mert lehet\u0151v\u00e9 teszi bizonyos id\u0151pontra vonatkoz\u00f3 biztons\u00e1gi ment\u00e9sek \u00e9s vissza\u00e1ll\u00edt\u00e1sok v\u00e9grehajt\u00e1s\u00e1t, teh\u00e1t az esem\u00e9nyeket id\u0151 alapj\u00e1n index\u00e1lj\u00e1k. Ez k\u00fcl\u00f6n\u00f6sen fontos, amikor bizonyos esem\u00e9nyek sz\u00fcks\u00e9gesek; az adatb\u00e1zisok eset\u00e9ben az esem\u00e9nyek azok a v\u00e1ltoz\u00e1sok, amelyek az adatb\u00e1zisban bizonyos id\u0151intervallumokban t\u00f6rt\u00e9ntek.<\/p>\n<p>A legfontosabb okr\u00f3l csak nektek fogok besz\u00e9lni (k\u00e9rlek, ezt senkinek ne mondj\u00e1tok el)! \u00cdgy csin\u00e1ltuk, mert a rendezett, indexelt adatok ilyen form\u00e1ban jelennek meg a MongoDB OpLog-ban. Az OpLog egy olyan adatstrukt\u00fara, amely tartalmazza az \u00f6sszes v\u00e1ltoz\u00e1st az adatb\u00e1zisban: el\u0151sz\u00f6r az OpLog-ba ker\u00fclnek, majd azt\u00e1n alkalmazva lesznek a t\u00e1rol\u00f3ra, ha ez egy replik\u00e1lt adat vagy shard.<\/p>\n<p>Ez volt a f\u0151 ok. Azonban praktikus k\u00f6vetelm\u00e9nyek is l\u00e9teznek az adatb\u00e1zis fejleszt\u00e9s\u00e9n\u00e9l, ami azt jelenti, hogy egyszer\u0171nek kell lennie \u2013 min\u00e9l kevesebb k\u00f3d, \u00e9s a lehet\u0151 legkevesebb t\u00f6r\u00f6tt dolog, amit \u00fajra kell \u00edrni \u00e9s tesztelni. Az, hogy az op logjaink hibrid \u00f3r\u00e1k \u00e1ltal index\u00e1ltak, nagyon seg\u00edtett, \u00e9s lehet\u0151v\u00e9 tette a helyes v\u00e1laszt\u00e1s meghozatal\u00e1t. Ez val\u00f3ban meg\u00e9rte, \u00e9s valahogy var\u00e1zslatosan m\u0171k\u00f6d\u00f6tt, m\u00e1r az els\u0151 protot\u00edpuson is. Nagyon men\u0151 volt!<\/p>\n<h3>\u00d3r\u00e1k szinkroniz\u00e1l\u00e1sa<\/h3>\n<p>\nT\u00f6bbf\u00e9le szinkroniz\u00e1l\u00e1si m\u00f3dszer l\u00e9tezik, amelyek a tudom\u00e1nyos irodalomban szerepelnek. A szinkroniz\u00e1l\u00e1s alatt azt \u00e9rtem, amikor k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 shardunk van. Ha van egy replikak\u00e9szlet \u2013 akkor nincs sz\u00fcks\u00e9g szinkroniz\u00e1l\u00e1sra: ez egy \u00bbsingle-master\u00ab; van egy OpLog, ahova minden m\u00f3dos\u00edt\u00e1s beker\u00fcl \u2013 ebben az esetben minden m\u00e1r sorozatosan rendezett az \u00bbOpLogban\u00ab. De ha k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 shardunk van, akkor az id\u0151 szinkroniz\u00e1ci\u00f3ja fontos. Itt a vektormutat\u00f3k sokat seg\u00edtenek! De nek\u00fcnk nincs ilyen.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA m\u00e1sodik lehet\u0151s\u00e9g a \u00bbHeartbeats\u00ab (sz\u00edvver\u00e9sek). Lehet jeleket cser\u00e9lni, amelyek egy bizonyos id\u0151k\u00f6z\u00f6nk\u00e9nt t\u00f6rt\u00e9nnek. De a \u00bbHeartbeats\u00ab t\u00fal lass\u00faak, nem tudunk latenci\u00e1t biztos\u00edtani az \u00fcgyfel\u00fcnknek.<\/p>\n<p>A val\u00f3di id\u0151 \u2013 term\u00e9szetesen, csod\u00e1latos dolog. De, megint csak, ez tal\u00e1n a j\u00f6v\u0151... B\u00e1r az \u00bbAtlasban\u00ab m\u00e1r lehet ilyet csin\u00e1lni, m\u00e1r l\u00e9teznek gyors \u00bbamazonos\u00ab id\u0151szinkroniz\u00e1l\u00f3k. De ez nem lesz mindenki sz\u00e1m\u00e1ra el\u00e9rhet\u0151.<\/p>\n<p>A Gossiping \u2013 az amikor minden \u00fczenet tartalmazza az id\u0151t. Ez k\u00f6r\u00fclbel\u00fcl az, amit haszn\u00e1lunk. Minden \u00fczenet a csom\u00f3pontok k\u00f6z\u00f6tt, a meghajt\u00f3, az adatcsom\u00f3pontok routerei, abszol\u00fat minden a \u00bbMongoDB\u00ab-ben \u2013 ezek valamilyen elemek, az adatb\u00e1zis komponensei, amelyek tartalmazz\u00e1k az id\u0151m\u00e9r\u0151ket, amelyek folynak. Mindenhol van hibrid id\u0151\u00e9rt\u00e9k, ez \u00e1tad\u00f3dik. 64 bit? Ez lehet\u0151v\u00e9 teszi, ez m\u0171k\u00f6dhet.<\/p>\n<h3>Hogyan m\u0171k\u00f6dik ez egy\u00fctt?<\/h3>\n<p>\nItt egy replikak\u00e9szletet vizsg\u00e1lok, hogy egy kicsit egyszer\u0171bb legyen. Van egy Primary \u00e9s egy Secondary. A Secondary replik\u00e1l \u00e9s nem mindig teljesen szinkroniz\u00e1lt a Primaryval.<\/p>\n<p>A \u00bbPrimaryban\u00ab t\u00f6rt\u00e9nik egy besz\u00far\u00e1s (insert) valamilyen id\u0151\u00e9rt\u00e9kkel. Ez a besz\u00far\u00e1s 11-re n\u00f6veli a bels\u0151 sz\u00e1ml\u00e1l\u00f3t, ha ez a maximum. Vagy ellen\u0151rzi az id\u0151\u00e9rt\u00e9keket \u00e9s az id\u0151 szerint szinkroniz\u00e1l\u00f3dik, ha az id\u0151\u00e9rt\u00e9kek nagyobbak. Ez lehet\u0151v\u00e9 teszi az id\u0151beli rendez\u00e9st.<\/p>\n<p>Miut\u00e1n v\u00e9grehajtotta a feljegyz\u00e9st, egy fontos pillanat k\u00f6vetkezik. Az \u00f3r\u00e1k a \u00bbMongoDB\u00ab-ben csak akkor emelkednek, ha a \u00bbOplog\u00ab-ba t\u00f6rt\u00e9nik feljegyz\u00e9s. Ez az az esem\u00e9ny, amely megv\u00e1ltoztatja a rendszer \u00e1llapot\u00e1t. Minden klasszikus cikkben esem\u00e9nynek sz\u00e1m\u00edt az \u00fczenet \u00e9rkez\u00e9se a csom\u00f3pontba: ha az \u00fczenet meg\u00e9rkezett \u2013 akkor a rendszer megv\u00e1ltoztatta az \u00e1llapot\u00e1t.<\/p>\n<p>Ez az\u00e9rt van, mert a kutat\u00e1s sor\u00e1n nem lehet teljesen meg\u00e9rteni, hogyan fogj\u00e1k \u00e9rtelmezni ezt az \u00fczenetet. Pontosan tudjuk, hogy ha nem t\u00fckr\u00f6z\u0151dik az \u00abOpLog\u00bb-ban, akkor semmilyen m\u00f3don nem lesz \u00e9rtelmezve, \u00e9s a rendszer \u00e1llapot\u00e1nak megv\u00e1ltoztat\u00e1sa csak az \u00abOpLog\u00bb-ban val\u00f3 bejegyz\u00e9st jelenti. Ez mindent leegyszer\u0171s\u00edt nek\u00fcnk: a modelt is egyszer\u0171s\u00edti, \u00e9s lehet\u0151v\u00e9 teszi a rendez\u00e9st egy replika-csoport keretein bel\u00fcl, \u00e9s sok m\u00e1s hasznos dolgot.<\/p>\n<p>Visszat\u00e9r a m\u00e1r az \u00abOpLog\u00bb-ban r\u00f6gz\u00edtett \u00e9rt\u00e9k \u2013 tudjuk, hogy az \u00abOpLog\u00bb-ban m\u00e1r megtal\u00e1lhat\u00f3 ez az \u00e9rt\u00e9k, \u00e9s az ideje \u2013 12. Most mondjuk, hogy egy m\u00e1sik node (Secondary) elkezdi az olvas\u00e1st, \u00e9s \u0151 m\u00e1r az afterClusterTime-ot tov\u00e1bb\u00edtja az \u00fczenetben. Azt mondja: \u201eSz\u00fcks\u00e9gem van mindenre, ami legal\u00e1bb 12 ut\u00e1n vagy \u00e9ppen 12-kor t\u00f6rt\u00e9nt\u201d (l\u00e1sd a fenti \u00e1br\u00e1t).<\/p>\n<p>Ez az, amit Causal a consistent (CAT)-nak h\u00edvnak. Van egy olyan fogalom az elm\u00e9letben, hogy ez egy id\u0151beli szelet, amely \u00f6nmag\u00e1ban konzisztens. Itt elmondhat\u00f3, hogy ez a rendszer \u00e1llapota, amely 12 \u00f3ra pillanat\u00e1ban figyelhet\u0151 meg.<\/p>\n<p>Jelenleg semmi sincs itt, mert ez szimul\u00e1lja azt a helyzetet, amikor a Secondary-nak a Primary-r\u00f3l kell replik\u00e1lnia az adatokat. V\u00e1r\u2026 \u00c9s most meg\u00e9rkeztek az adatok \u2013 visszaadja ezeket az \u00e9rt\u00e9keket.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nH\u00e1t, nagyj\u00e1b\u00f3l \u00edgy m\u0171k\u00f6dik minden. Szinte.<\/p>\n<p>Mit jelent az, hogy \u201eszinte\u201d? Tegy\u00fck fel, hogy van egy ember, aki elolvasta \u00e9s meg\u00e9rtette, hogyan m\u0171k\u00f6dik ez az eg\u00e9sz. Meg\u00e9rtette, hogy minden alkalommal, amikor ClusterTime t\u00f6rt\u00e9nik, friss\u00edti a bels\u0151 logikai \u00f3r\u00e1kat, \u00e9s azt\u00e1n a k\u00f6vetkez\u0151 bejegyz\u00e9s eggyel n\u00f6vel azokat. Ez a funkci\u00f3 20 sort foglal mag\u00e1ban. Tegy\u00fck fel, hogy ez az ember \u00e1tadja a lehet\u0151 legnagyobb 64 bites sz\u00e1mot, eggyel cs\u00f6kkentve.<\/p>\n<p>Mi\u00e9rt \u201eeggyel cs\u00f6kkentve\u201d? Mert a bels\u0151 \u00f3r\u00e1k ezt az \u00e9rt\u00e9ket fogj\u00e1k csatolni (nyilv\u00e1nval\u00f3an ez a legnagyobb lehets\u00e9ges \u00e9s nagyobb a jelenlegi id\u0151n\u00e9l), majd bejegyz\u00e9s t\u00f6rt\u00e9nik az \u00abOpLog\u00bb-ban, \u00e9s az \u00f3r\u00e1k \u00fajabb eggyel n\u00f6vekednek \u2013 \u00e9s m\u00e1r teljesen maxim\u00e1lis \u00e9rt\u00e9k lesz (ott csak egyesek vannak, tov\u00e1bb nem lehet, unsaint int-ek).<\/p>\n<p>Nyilv\u00e1nval\u00f3, hogy ezut\u00e1n a rendszer teljesen el\u00e9rhetetlenn\u00e9 v\u00e1lik mindenre. Csak ki lehet \u00fcr\u00edteni, tiszt\u00edtani \u2013 sok manu\u00e1lis munka. Teljes el\u00e9rhet\u0151s\u00e9g:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAmennyiben ez m\u00e1s helyekre is replik\u00e1l\u00f3dik, az eg\u00e9sz klaszter egyszer\u0171en le\u00e1ll. Teljesen elfogadhatatlan szitu\u00e1ci\u00f3, amelyet b\u00e1rki nagyon gyorsan \u00e9s egyszer\u0171en l\u00e9trehozhat! Ez\u00e9rt ezt a pontot a legfontosabbak k\u00f6z\u00f6tt kezelt\u00fck. Hogyan tudjuk megakad\u00e1lyozni?<\/p>\n<h3>Az utunk \u2013 a clusterTime al\u00e1\u00edr\u00e1sa<\/h3>\n<p>\n\u00cdgy ker\u00fcl \u00e1t a \u00fczenetbe (a k\u00e9k sz\u00f6veg el\u0151tt). De elkezdt\u00fcnk gener\u00e1lni egy al\u00e1\u00edr\u00e1st is (k\u00e9k sz\u00f6veg):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAz al\u00e1\u00edr\u00e1s egy kulccsal gener\u00e1l\u00f3dik, amely az adatb\u00e1zison bel\u00fcl, a v\u00e9dett peremeken t\u00e1rol\u00f3dik; maga gener\u00e1l\u00f3dik, friss\u00fcl (ezt a felhaszn\u00e1l\u00f3k nem l\u00e1tj\u00e1k). Gener\u00e1l\u00f3dik egy hash, \u00e9s minden \u00fczenet l\u00e9trehoz\u00e1sakor al\u00e1\u00edr\u00e1sra ker\u00fcl, m\u00edg fogad\u00e1skor \u00e9rv\u00e9nyes\u00edtj\u00fck.<br \/>\nVal\u00f3sz\u00edn\u0171leg sok emberben felmer\u00fcl a k\u00e9rd\u00e9s: \"Mennyire lass\u00edtja ezt az eg\u00e9szet?\" \u00c9n azt mondtam, hogy gyorsan kell m\u0171k\u00f6dnie, k\u00fcl\u00f6n\u00f6sen ennek a funkci\u00f3nak a hi\u00e1ny\u00e1ban.<\/p>\n<p>Mit jelent a Causal consistency haszn\u00e1lata ebben az esetben? Az afterClusterTime param\u00e9ter megjelen\u00edt\u00e9se. En\u00e9lk\u00fcl az \u00e9rt\u00e9keket mindenk\u00e9ppen tov\u00e1bb\u00edtja. A Gossiping a 3.6-os verzi\u00f3t\u00f3l mindig m\u0171k\u00f6dik.<\/p>\n<p>Ha folyamatosan gener\u00e1ljuk az al\u00e1\u00edr\u00e1sokat, akkor az lass\u00edtani fogja a rendszert, m\u00e9g a funkci\u00f3 hi\u00e1ny\u00e1ban is, ami nem felel meg a megk\u00f6zel\u00edt\u00e9seinknek \u00e9s k\u00f6vetelm\u00e9nyeinknek. Mit tett\u00fcnk?<\/p>\n<h3>Tedd ezt gyorsan!<\/h3>\n<p>\nMeglehet\u0151sen egyszer\u0171 dolog, de az \u00f6tlet \u00e9rdekes \u2013 megosztom, h\u00e1tha valakinek \u00e9rdekes lesz.<br \/>\nVan egy hash, amely az al\u00e1\u00edrt adatokat t\u00e1rolja. Minden adat a cache-en kereszt\u00fcl megy. A cache nem konkr\u00e9t id\u0151t, hanem Range-t \u00edr al\u00e1. Amikor egy bizonyos \u00e9rt\u00e9k \u00e9rkezik, gener\u00e1lunk egy Range-t, elfedj\u00fck az utols\u00f3 16 bitet, \u00e9s ezt az \u00e9rt\u00e9ket \u00edrjuk al\u00e1:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEgy ilyen al\u00e1\u00edr\u00e1s megszerz\u00e9s\u00e9vel a rendszert (j\u00f3 \u00e9rtelemben) 65 ezer alkalommal gyors\u00edtjuk. Kiv\u00e1l\u00f3an m\u0171k\u00f6dik: amikor elv\u00e9gezt\u00fck a k\u00eds\u00e9rleteket \u2013 val\u00f3ban 10 ezer alkalommal cs\u00f6kkent a folyamatos friss\u00edt\u00e9s ideje. Nyilv\u00e1nval\u00f3, hogy amikor azok sz\u00e9tsz\u00f3rtak, ez nem m\u0171k\u00f6dik. De a legt\u00f6bb gyakorlati esetben ez m\u0171k\u00f6dik. A Range al\u00e1\u00edr\u00e1s \u00e9s az al\u00e1\u00edr\u00e1s kombin\u00e1ci\u00f3ja megoldotta a biztons\u00e1gi probl\u00e9m\u00e1t.<\/p>\n<h3>Mit tanultunk?<\/h3>\n<p>\nA leck\u00e9k, amelyeket ebb\u0151l levontunk:<\/p>\n<ul>\n<li>Olvasni kell a anyagokat, t\u00f6rt\u00e9neteket, cikkeket, mert sok \u00e9rdekes dolog van sz\u00e1munkra. Amikor egy \u00faj funkci\u00f3n dolgozunk (k\u00fcl\u00f6n\u00f6sen most, amikor tranzakci\u00f3kat hajtottunk v\u00e9gre stb.), fontos elolvasni \u00e9s meg\u00e9rteni. Ez id\u0151t vesz ig\u00e9nybe, de val\u00f3j\u00e1ban nagyon hasznos, mert vil\u00e1goss\u00e1 v\u00e1lik, hol tartunk. \u00dagy t\u0171nik, hogy nem tal\u00e1ltunk ki semmi \u00fajat - csup\u00e1n \u00f6sszegy\u0171jt\u00f6tt\u00fck az \u00f6sszes hozz\u00e1val\u00f3t.\n<p>Alapvet\u0151en \u00e9szlelhet\u0151 egyfajta k\u00fcl\u00f6nbs\u00e9g a gondolkod\u00e1sban, amikor egy akad\u00e9miai konferencia van (p\u00e9ld\u00e1ul a 'Sigmon') - ott mindenki az \u00faj \u00f6tletekre f\u00f3kusz\u00e1l. Mi az algoritmusunk \u00fajdons\u00e1ga? Itt igaz\u00e1b\u00f3l nem tal\u00e1lhat\u00f3 nagy \u00fajdons\u00e1g. Az \u00fajdons\u00e1g ink\u00e1bb abban rejlik, ahogyan \u00f6sszeolvasztottuk a megl\u00e9v\u0151 megk\u00f6zel\u00edt\u00e9seket. Ez\u00e9rt az els\u0151 l\u00e9p\u00e9s - olvasni a klasszikusokat, kezdve Lamportt\u00f3l.<\/li>\n<li>A produkci\u00f3s k\u00f6rnyezetben teljesen m\u00e1s k\u00f6vetelm\u00e9nyek vannak. Biztos vagyok benne, hogy sokan nem 'sf\u00e9rikus' adatb\u00e1zisokkal tal\u00e1lkoznak egy absztrakt v\u00e1kuumban, hanem norm\u00e1lis, val\u00f3s dolgokkal, amelyeknek vannak probl\u00e9m\u00e1ik a rendelkez\u00e9sre \u00e1ll\u00e1s, k\u00e9sleltet\u00e9s \u00e9s hibat\u0171r\u00e9s ter\u00e9n.<\/li>\n<li>Az utols\u00f3 dolog, ami az, hogy k\u00fcl\u00f6nb\u00f6z\u0151 \u00f6tleteket kellett megfontolnunk \u00e9s t\u00f6bb k\u00fcl\u00f6nb\u00f6z\u0151 cikket kellett egyes\u00edten\u00fcnk egy m\u00f3dszerr\u00e9. Az \u00f6tlet a digit\u00e1lis al\u00e1\u00edr\u00e1sr\u00f3l p\u00e9ld\u00e1ul egy cikkb\u0151l sz\u00e1rmazik, amely a Paxos-protokollt vizsg\u00e1lta, amely a nem biz\u00e1nci hib\u00e1k sz\u00e1m\u00e1ra az autoriz\u00e1ci\u00f3s protokollon bel\u00fcl, a biz\u00e1nciak sz\u00e1m\u00e1ra pedig az autoriz\u00e1ci\u00f3s protokollon k\u00edv\u00fcl\u2026 Olyan lett, amit v\u00e9g\u00fcl is megcsin\u00e1ltunk.\n<p>Itt abszol\u00fat semmi \u00faj nincs! De amikor mindezt egy\u00fctt \u00f6sszekevert\u00fck\u2026 Olyan, mintha azt mondan\u00e1nk, hogy az Olivier sal\u00e1ta receptje nonszensz, mert a toj\u00e1sokat, majon\u00e9zt \u00e9s ubork\u00e1t m\u00e1r feltal\u00e1lt\u00e1k\u2026 Ez k\u00f6r\u00fclbel\u00fcl ugyanez a t\u00f6rt\u00e9net.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEzzel befejezem. K\u00f6sz\u00f6n\u00f6m!<\/p>\n<h3>K\u00e9rd\u00e9sek<\/h3>\n<p>\n<b>K\u00e9rd\u00e9s a k\u00f6z\u00f6ns\u00e9gt\u0151l (a tov\u00e1bbiakban: K):<\/b> \u2013 K\u00f6sz\u00f6n\u00f6m, Mihail a besz\u00e1mol\u00f3\u00e9rt! Az id\u0151vel kapcsolatos t\u00e9ma \u00e9rdekes. \u00d6n\u00f6k Gossiping-et haszn\u00e1lnak. Azt mondt\u00e1k, hogy mindenkinek megvan a saj\u00e1t ideje, mindenki tudja a helyi idej\u00e9t. J\u00f3l \u00e9rtettem, hogy van egy illeszt\u0151program - sok \u00fcgyf\u00e9l lehet sok illeszt\u0151programmal, sok lek\u00e9rdez\u00e9si tervez\u0151 is, sok shard is\u2026 Mi t\u00f6rt\u00e9nik a rendszerrel, ha hirtelen elt\u00e9r\u00e9s l\u00e9p fel: valaki azt hiszi, hogy egy perccel el\u0151r\u00e9bb van, valaki - egy perccel h\u00e1tr\u00e1bb? Hol fogunk tal\u00e1lkozni?<\/p>\n<p><b>MT:<\/b> \u2013 Val\u00f3ban kiv\u00e1l\u00f3 k\u00e9rd\u00e9s! \u00c9ppen a shardokr\u00f3l szerettem volna besz\u00e9lni. Ha j\u00f3l \u00e9rtem a k\u00e9rd\u00e9st, az a helyzet, hogy van egy 1-es shard \u00e9s egy 2-es shard, az olvas\u00e1s ezekr\u0151l a shardokr\u00f3l t\u00f6rt\u00e9nik \u2013 elt\u00e9r\u00e9sek vannak, nem l\u00e9pnek kapcsolatba egym\u00e1ssal, mert az id\u0151, amit tudnak \u2013 k\u00fcl\u00f6nb\u00f6z\u0151, k\u00fcl\u00f6n\u00f6sen az id\u0151, ami az oplogjaikban l\u00e9tezik.<br \/>\nTegy\u00fck fel, hogy az 1-es shard egymilli\u00f3 bejegyz\u00e9st k\u00e9sz\u00edtett, a 2-es shard \u2013 egyet sem, \u00e9s a k\u00e9r\u00e9s mindk\u00e9t shardhoz meg\u00e9rkezett. Az els\u0151 shardnak van afterClusterTime \u00e9rt\u00e9ke, ami meghaladja az egymilli\u00f3t. Ilyen helyzetben, ahogy magyar\u00e1ztam, a 2-es shard soha nem fog v\u00e1laszolni.<\/p>\n<p><b>K:<\/b> \u2013 Azt szerettem volna megtudni, hogyan szinkroniz\u00e1lj\u00e1k \u0151ket \u00e9s v\u00e1lasztanak egy logikai id\u0151t?<\/p>\n<p><b>MT:<\/b> \u2013 Nagyon egyszer\u0171en szinkroniz\u00e1lj\u00e1k. A shard, amikor megkapja az afterClusterTime \u00e9rt\u00e9ket, \u00e9s nem tal\u00e1l id\u0151t az \u201eOplog\u201d-ban \u2013 kezdem\u00e9nyez egy no approved m\u0171veletet. Teh\u00e1t manu\u00e1lisan felemeli az id\u0151\u00e9rt\u00e9k\u00e9t erre az \u00e9rt\u00e9kre. Ez azt jelenti, hogy nincsenek esem\u00e9nyek, amelyek megfelelnek ennek a k\u00e9r\u00e9snek. Mesters\u00e9gesen l\u00e9trehoz egy esem\u00e9nyt, \u00e9s \u00edgy Causal Consistent lesz.<\/p>\n<p><b>K:<\/b> \u2013 \u00c9s mi van, ha azt k\u00f6vet\u0151en m\u00e9g j\u00f6nnek hozz\u00e1 olyan esem\u00e9nyek, amelyek a h\u00e1l\u00f3zaton valahol elvesztek?<\/p>\n<p><b>MT:<\/b> \u2013 A shard \u00fagy van fel\u00e9p\u00edtve, hogy ezek m\u00e1r nem fognak meg\u00e9rkezni, mivel ez egy single master rendszer. Ha m\u00e1r r\u00f6gz\u00edtette, akkor ezek m\u00e1r nem fognak visszaj\u00f6nni, hanem csak k\u00e9s\u0151bb. Nem t\u00f6rt\u00e9nhet meg, hogy valahol valami beragadt, majd \u0151 no write m\u0171veletet hajt v\u00e9gre, \u00e9s azt\u00e1n ezek az esem\u00e9nyek j\u00f6nnek \u2013 \u00e9s ezzel megs\u00e9rtett\u00fck a Causal consistency-t. Amikor no write-ot v\u00e9gez, minden esem\u00e9nynek meg kell \u00e9rkeznie tov\u00e1bb (\u0151 v\u00e1rni fog r\u00e1juk).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>K:<\/b> \u2013 Van n\u00e9h\u00e1ny k\u00e9rd\u00e9sem a sorokkal kapcsolatban. A Causal consistency azt felt\u00e9telezi, hogy van egy bizonyos cselekv\u00e9ssorozat, amit el kell v\u00e9gezni. Mi t\u00f6rt\u00e9nik, ha egy csomag elt\u0171nik? Az j\u00f6tt a 10-es, 11-es... a 12-es elt\u0171nt, \u00e9s mindenki v\u00e1r arra, hogy az v\u00e9grehajt\u00f3djon. \u00c9s hirtelen megmondta a g\u00e9p, hogy v\u00e9ge, semmit sem tudunk tenni. Van egy maxim\u00e1lis hossza a sorozatnak, ami felhalmoz\u00f3dik, miel\u0151tt v\u00e9grehajtan\u00e1k? Milyen v\u00e9gzetes hiba t\u00f6rt\u00e9nik, ha b\u00e1rmelyik \u00e1llapot elveszik? R\u00e1ad\u00e1sul, ha r\u00f6gz\u00edtj\u00fck, hogy van egy kor\u00e1bbi \u00e1llapot, akkor abb\u00f3l kell valahogyan kiindulnunk? De abb\u00f3l nem tudunk kiindulni!<\/p>\n<p><b>MT:<\/b> \u2013 Szint\u00e9n nagyszer\u0171 k\u00e9rd\u00e9s! Mit csin\u00e1lunk? A MongoDB-ben l\u00e9tezik a kv\u00f3rumszer\u0171 \u00edr\u00e1sok \u00e9s olvas\u00e1sok fogalma. Milyen esetekben t\u0171nhet el egy \u00fczenet? Amikor a r\u00f6gz\u00edt\u00e9s nem kv\u00f3rumszer\u0171, vagy amikor az olvas\u00e1s nem kv\u00f3rumszer\u0171 (valamif\u00e9le hullad\u00e9k is \u00e9rkezhet).<br \/>\nA Causal consistency-vel kapcsolatosan egy jelent\u0151s k\u00eds\u00e9rleti ellen\u0151rz\u00e9st hajtottunk v\u00e9gre, amelynek eredm\u00e9nyek\u00e9nt meg\u00e1llap\u00edtottuk, hogy nem quorum-os \u00edr\u00e1s \u00e9s olvas\u00e1s eset\u00e9n megs\u00e9rt\u00e9s l\u00e9p fel a Causal consistency-ben. Pontosan azt mondja, amit \u00d6n is \u00e1ll\u00edt!<\/p>\n<p>Tan\u00e1csunk: haszn\u00e1ljon legal\u00e1bb quorum-os olvas\u00e1st a Causal consistency alkalmaz\u00e1sa sor\u00e1n. \u00cdgy semmi sem fog elveszni, m\u00e9g akkor sem, ha a quorum-os \u00edr\u00e1s elt\u0171nik... Ez ortogon\u00e1lis helyzet: ha a felhaszn\u00e1l\u00f3 nem akarja, hogy adatokat vesz\u00edtsen, quorum-os \u00edr\u00e1st kell haszn\u00e1lnia. A Causal consistency nem garant\u00e1lja a tart\u00f3ss\u00e1got. A tart\u00f3ss\u00e1g garanci\u00e1j\u00e1t a replik\u00e1ci\u00f3 \u00e9s a replik\u00e1ci\u00f3val kapcsolatos mechanizmusok ny\u00fajtj\u00e1k.<\/p>\n<p><b>K:<\/b> \u2013 Amikor l\u00e9trehozunk egy p\u00e9ld\u00e1nyt, amelynek shardingot v\u00e9gz\u00fcnk (nem master, hanem slave), az saj\u00e1t g\u00e9pe unix idej\u00e9re t\u00e1maszkodik, vagy a \u201emester\u201d idej\u00e9re; szinkroniz\u00e1l\u00f3dik el\u0151sz\u00f6r vagy id\u0151szakosan?<\/p>\n<p><b>MT:<\/b> \u2013 Most tiszt\u00e1zom. A shard (azaz a horizont\u00e1lis part\u00edci\u00f3) mindig tartalmaz egy Primary-t. A shardban lehet \u201emester\u201d \u00e9s lehetnek replik\u00e1k. De a shard mindig t\u00e1mogatja az \u00edr\u00e1st, mert egy bizonyos dom\u00e9nt kell t\u00e1mogatnia (a shardban tal\u00e1lhat\u00f3 a Primary).<\/p>\n<p><b>K:<\/b> \u2013 Teh\u00e1t minden a \u201emester\u201d-t\u0151l f\u00fcgg? Mindig a \u201emester\u201d-id\u0151 van haszn\u00e1latban?<\/p>\n<p><b>MT:<\/b> \u2013 Igen. K\u00e9pzelhet\u0151, hogy az \u00f3r\u00e1k akkor ketyegnek, amikor \u00edr\u00e1s t\u00f6rt\u00e9nik a \u201emester\u201d-n\u00e9l, az \u201eOpLog\u201d-ban.<\/p>\n<p><b>K:<\/b> \u2013 Van egy \u00fcgyfel\u00fcnk, aki csatlakozik, \u00e9s neki semmit sem kell tudnia az id\u0151r\u0151l?<\/p>\n<p><b>MT:<\/b> \u2013 Val\u00f3ban semmit sem kell tudnia! Ha arr\u00f3l besz\u00e9l\u00fcnk, hogy ez az \u00fcgyf\u00e9ln\u00e9l hogyan m\u0171k\u00f6dik: az \u00fcgyf\u00e9lnek, amikor a Causal consistency-t szeretn\u00e9 haszn\u00e1lni, meg kell nyitnia egy munkamenetet. Most ott van minden: tranzakci\u00f3k a munkamenetben, \u00e9s jogok visszanyer\u00e9se... A munkamenet a klienssel t\u00f6rt\u00e9n\u0151 logikai esem\u00e9nyek rendezett sorrendje.<\/p>\n<p>Ha megnyitja ezt a munkamenetet \u00e9s azt mondja, hogy szeretn\u00e9 a Causal consistency-t (ha a munkamenet alap\u00e9rtelmez\u00e9s szerint t\u00e1mogatja a Causal consistency-t), minden automatikusan m\u0171k\u00f6dik. A vez\u00e9rl\u0151 megjegyzi ezt az id\u0151t, \u00e9s n\u00f6veli, amikor \u00faj \u00fczenetet kap. Eml\u00e9kezik arra, hogy milyen v\u00e1laszt adott meg a kor\u00e1bbi szerver, amely az adatokat visszak\u00fcldte. A k\u00f6vetkez\u0151 k\u00e9r\u00e9s tartalmazni fogja az afterCluster-t (\u201eid\u0151 minden felett\u201d eset\u00e9n).<\/p>\n<p>A kliensnek nincs sz\u00fcks\u00e9ge pontosan semmire tudnia! Ez teljesen \u00e1tl\u00e1thatatlan sz\u00e1m\u00e1ra. Ha az emberek haszn\u00e1lj\u00e1k ezeket a funkci\u00f3kat, mit lehet tenni? El\u0151sz\u00f6r is, biztons\u00e1gosan olvashat\u00f3k a m\u00e1sodlagos adatok: lehet \u00edrni az els\u0151dlegesre, m\u00edg a f\u00f6ldrajzilag replika m\u00e1sodlagosokr\u00f3l olvasunk, \u00e9s biztosak lehet\u00fcnk benne, hogy ez m\u0171k\u00f6dik. Emellett a m\u00e1sodlagosra \u00e1t lehet vinni az els\u0151dlegesen r\u00f6gz\u00edtett munkameneteket, teh\u00e1t nem egyetlen munkamenetet, hanem t\u00f6bbet is haszn\u00e1lhatunk.<\/p>\n<p><b>K:<\/b> \u2013 Az Eventual consistency t\u00e9m\u00e1ja szorosan \u00f6sszef\u00fcgg az \u00faj Compute science r\u00e9ssel \u2013 az CRDT (Conflict-free Replicated Data Types) adatszerkezetekkel. Fontolgatt\u00e1tok ezeknek az adatszerkezeteknek az integr\u00e1l\u00e1s\u00e1t az adatb\u00e1zisba, \u00e9s mit tudtok err\u0151l mondani?<\/p>\n<p><b>MT:<\/b> \u2013 J\u00f3 k\u00e9rd\u00e9s! A CRDT-nek van \u00e9rtelme az \u00edr\u00e1sbeli konfliktusok kezel\u00e9s\u00e9re: a MongoDB eset\u00e9ben \u2013 egyetlen mester.<\/p>\n<p><b>K:<\/b> \u2013 Van egy k\u00e9rd\u00e9sem a DevOps szakemberekt\u0151l. A val\u00f3s vil\u00e1gban el\u0151fordulnak olyan helyzetek, amikor biz\u00e1nci hib\u00e1k l\u00e9pnek fel, \u00e9s rossz emberek a v\u00e9dett peremen bel\u00fcl hozz\u00e1f\u00e9rnek a protokollhoz, \u00e9s speci\u00e1lisan elk\u00e9sz\u00edtett csomagokat k\u00fcldenek?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Rossz emberek a perimen bel\u00fcl \u2013 olyan, mint egy tr\u00f3jai fal\u00f3! A peremen bel\u00fcli rossz emberek sok rossz dolgot tehetnek.<\/p>\n<p><b>K:<\/b> \u2013 Nyilv\u00e1nval\u00f3, hogy a szerverben, durv\u00e1n sz\u00f3lva, hagyni egy r\u00e9st, amelyen kereszt\u00fcl elef\u00e1ntokat lehet beszuszakolni \u00e9s v\u00e9glegesen megsemmis\u00edteni az eg\u00e9sz klasztert\u2026 Id\u0151be telik a k\u00e9zi helyre\u00e1ll\u00edt\u00e1s\u2026 Ez enyh\u00e9n sz\u00f3lva is helytelen. M\u00e1sr\u00e9szt az a k\u00e9rd\u00e9s \u00e9rdekes, hogy a val\u00f3 \u00e9letben el\u0151fordulnak-e valaha hasonl\u00f3 bels\u0151 t\u00e1mad\u00e1sok?<\/p>\n<p><b>MT:<\/b> \u2013 Mivel ritk\u00e1n tal\u00e1lkozom biztons\u00e1gi r\u00e9szekkel a val\u00f3 \u00e9letben, nem tudom mondani \u2013 lehet, hogy el\u0151fordulnak. De ha a fejleszt\u0151i filoz\u00f3fi\u00e1r\u00f3l besz\u00e9l\u00fcnk, \u00fagy gondoljuk, hogy van egy perem\u00fcnk, amely biztos\u00edtja a biztons\u00e1g\u00e9rt felel\u0151s embereket \u2013 ez a z\u00e1r, a fal; a perem belsej\u00e9ben viszont b\u00e1rmit meg lehet csin\u00e1lni. Nyilv\u00e1nval\u00f3, hogy vannak felhaszn\u00e1l\u00f3k, akik csak megtekinthetik az adatokat, \u00e9s vannak, akik lehet\u0151s\u00e9get kapnak a visszavon\u00e1sra.<\/p>\n<p>A jogokt\u00f3l f\u00fcgg\u0151en a felhaszn\u00e1l\u00f3k \u00e1ltal okozott k\u00e1r lehet eg\u00e9rrel vagy ak\u00e1r elef\u00e1nthoz hasonl\u00f3. Egy\u00e9rtelm\u0171, hogy a teljes jogokkal rendelkez\u0151 felhaszn\u00e1l\u00f3 b\u00e1rmit megtehet. A sz\u0171k jogokkal rendelkez\u0151 felhaszn\u00e1l\u00f3 viszont jelent\u0151sen kevesebbet \u00e1rthat. K\u00fcl\u00f6n\u00f6sen nem tudja lebontani a rendszert.<\/p>\n<p><b>K:<\/b> \u2013 A v\u00e9dett ter\u00fcleten valaki v\u00e1ratlan protokollokat pr\u00f3b\u00e1l kialak\u00edtani a szerverhez, hogy a szervert akassza fel, \u00e9s ha szerencs\u00e9je van, akkor az eg\u00e9sz klasztert is... Lehet ez ennyire \"j\u00f3\"?<\/p>\n<p><b>MT:<\/b> \u2013 Eddig m\u00e9g sosem hallottam ilyen dolgokr\u00f3l. Az, hogy \u00edgy le lehet terhelni egy szervert \u2013 nem titok. Bel\u00fcl, a protokollon kereszt\u00fcl, bejelentkezett felhaszn\u00e1l\u00f3k\u00e9nt, aki \u00edr\u00e1st tud elhelyezni egy \u00fczenetben... Val\u00f3j\u00e1ban nem lehet, mert mindenk\u00e9ppen \u00e9rv\u00e9nyes\u00edteni fogj\u00e1k. Van lehet\u0151s\u00e9g kikapcsolni ezt az azonos\u00edt\u00e1st azok sz\u00e1m\u00e1ra, akik nem akarj\u00e1k \u2013 na, ez m\u00e1r az \u0151 probl\u00e9m\u00e1juk; durv\u00e1n fogalmazva, \u0151k maguk rombolt\u00e1k le a falakat, \u00e9s lehet bepassz\u00edrozni oda egy elef\u00e1ntot, ami azt\u00e1n eltapossa... Egy\u00e9bk\u00e9nt, be lehet \u00f6lt\u00f6zni karbantart\u00f3nak, \u00e9s bej\u00f6nni, hogy kivegy\u00fck!<\/p>\n<p><b>K:<\/b> \u2013 K\u00f6sz\u00f6n\u00f6m a prezent\u00e1ci\u00f3t. Szergely (\"Yandex\"). A \"Mong\u00f3ban\" van egy konstans, amely korl\u00e1tozza a szavaz\u00e1sra jogosult tagok sz\u00e1m\u00e1t a Replica Set-ben, \u00e9s ez a konstans 7 (h\u00e9t). Mi\u00e9rt ez a konstans? Mi\u00e9rt nem valami param\u00e9ter?<\/p>\n<p><b>MT:<\/b> \u2013 A Replica Set-\u00fcnk lehet ak\u00e1r 40 csom\u00f3pont is. Ott mindig megvan a t\u00f6bbs\u00e9g. Nem tudom, hogy melyik verzi\u00f3...<\/p>\n<p><b>K:<\/b> \u2013 A Replica Set-ben nem szavaz\u00f3 tagokat is lehet ind\u00edtani, de a szavaz\u00f3k maximum 7. Hogyan tudjuk ebben az esetben elviselni a le\u00e1ll\u00e1st, ha a Replica Set h\u00e1rom adatk\u00f6zpont k\u00f6z\u00f6tt van? Az egyik adatk\u00f6zpont sim\u00e1n le tud \u00e1llni, \u00e9s egy m\u00e1sik g\u00e9p is kieshet.<\/p>\n<p><b>MT:<\/b> \u2013 Ez m\u00e1r kicsit t\u00fal van a prezent\u00e1ci\u00f3n. Ez egy \u00e1ltal\u00e1nos k\u00e9rd\u00e9s. Tal\u00e1n k\u00e9s\u0151bb elmondhatom.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mihail Tyulenyev (MongoDB): Causal consistency: elm\u00e9letb\u0151l a gyakorlatba\" 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=\"Vide\u00f3 lej\u00e1tsz\u00e1sa\" 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>Egy kis rekl\u00e1m \ud83d\ude42<\/h3>\n<p>\nK\u00f6sz\u00f6nj\u00fck, hogy vel\u00fcnk maradt\u00e1l. Tetszenek a cikkeink? Szeretn\u00e9l t\u00f6bb \u00e9rdekes anyagot l\u00e1tni? T\u00e1mogass minket, \u00e9s rendel\u00e9s lead\u00e1s\u00e1val vagy ismer\u0151s\u00f6knek aj\u00e1nl\u00e1ssal seg\u00edts nek\u00fcnk. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">Felh\u0151alap\u00fa VPS fejleszt\u0151knek 4,99 doll\u00e1rt\u00f3l<\/a><\/noindex>, <b>Egyed\u00fcl\u00e1ll\u00f3 alternat\u00edv\u00e1ja az entry-level szervereknek, amelyet \u00d6nnek tal\u00e1ltunk ki:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Minden igazs\u00e1g a VPS (KVM) E5-2697 v3 (6 mag) 10GB DDR4 480GB SSD 1Gbps \u00e1ron 19 doll\u00e1rt\u00f3l, vagy hogyan oszd fel helyesen a szervert?<\/a><\/noindex> (el\u00e9rhet\u0151k RAID1 \u00e9s RAID10 opci\u00f3k, ak\u00e1r 24 magig \u00e9s 40GB DDR4-ig).<\/p>\n<p><b>Dell R730xd k\u00e9tszer olcs\u00f3bban a Tier IV Equinix adatk\u00f6zpontban Amszterdamban?<\/b> Csak n\u00e1lunk <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 199 doll\u00e1rt\u00f3l<\/a><\/noindex> Hollandi\u00e1ban! <b>Dell R420 \u2014 2x E5-2430 2.2GHz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 99 doll\u00e1rt\u00f3l!<\/b><\/b> Olvasd el ezt <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Hogyan \u00e9p\u00edts\u00fcnk v\u00e1llalati szint\u0171 infrastrukt\u00far\u00e1t Dell R730xd E5-2650 v4 szerverekkel, amelyek k\u00f6lts\u00e9ge 9000 eur\u00f3ban van megszabva?<\/a><\/noindex><br \/>\n<br \/>Forr\u00e1s: <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\/hu\/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=\"hu_HU\" \/>\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\/hu\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-10T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:37+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47HighLoad++, Mihail Tyulenev (MongoDB): Okozati konzisztencia: a gyakorlatt\u00f3l a gyakorlathoz | ProHoster","description":"A k\u00f6vetkez\u0151 HighLoad++ konferencia 2020. \u00e1prilis 6-7-\u00e9n ker\u00fcl megrendez\u00e9sre Szentp\u00e9terv\u00e1ron. R\u00e9szletek \u00e9s jegyek az linken.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}