{"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\/sq\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","title":{"rendered":"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Konferenca e ardhshme HighLoad++ do t\u00eb mbahet m\u00eb 6 dhe 7 prill 2020 n\u00eb Sh\u00ebn Petersburg. <br \/>\nDetajet dhe biletat <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">n\u00eb lidhje<\/a><\/noindex>. HighLoad++ Siberia 2019. Salla \"Krasnoyarsk\". 25 qershor, 12:00. Thesaret dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.highload.ru\/siberia\/2019\/abstracts\/5253\">prezantimi<\/a><\/noindex>.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/cded9c5434d670db7295aadf5da0a9f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNdonj\u00ebher\u00eb k\u00ebrkesat praktike bien n\u00eb kontradikt\u00eb me teorin\u00eb, ku aspekte t\u00eb r\u00ebnd\u00ebsishme p\u00ebr nj\u00eb produkt komercial nuk kan\u00eb qen\u00eb t\u00eb marr\u00eb parasysh. N\u00eb k\u00ebt\u00eb referat paraqitet procesi i zgjedhjes dhe kombinimit t\u00eb qasjeve t\u00eb ndryshme p\u00ebr t\u00eb krijuar komponent\u00eb Causal consistency n\u00eb baz\u00eb t\u00eb k\u00ebrkimeve akademike n\u00eb p\u00ebrputhje me k\u00ebrkesat e produktit komercial. D\u00ebgjuesit do t\u00eb m\u00ebsojn\u00eb p\u00ebr qasjet teorike ekzistuese ndaj logical clocks, ndjekjes s\u00eb var\u00ebsive, siguris\u00eb s\u00eb sistemit, sinkronizimit t\u00eb or\u00ebs dhe pse MongoDB zgjodhi zgjidhje t\u00eb caktuara.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenev (m\u00eb tutje \u2013 MT):<\/b> \u2013 Un\u00eb do t\u00eb flas p\u00ebr Causal consistency \u2013 \u00ebsht\u00eb nj\u00eb ve\u00e7ori mbi t\u00eb cil\u00ebn ne kemi punuar n\u00eb MongoDB. Punoj n\u00eb grupin e sistemeve t\u00eb shp\u00ebrndara, e kemi zhvilluar rreth dy vjet m\u00eb par\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/b8d0a5b64e715f53b033fa8c398e2eb4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb proces, duhet t\u00eb njihem me nj\u00eb num\u00ebr t\u00eb madh t\u00eb K\u00ebrkimeve akademike, sepse kjo ve\u00e7ori \u00ebsht\u00eb studiuar mjaft mir\u00eb. Doli se asnj\u00eb artikull nuk i p\u00ebrmbush k\u00ebrkesat p\u00ebr prodhim, p\u00ebr shkak t\u00eb k\u00ebrkesave shum\u00eb specifike q\u00eb ndoshta ka n\u00eb \u00e7do aplikacion n\u00eb prodhim.<\/p>\n<p>Un\u00eb do t\u00eb flas p\u00ebr m\u00ebnyr\u00ebn se si ne, si konsumator\u00eb t\u00eb K\u00ebrkimeve akademike, p\u00ebrgatisim di\u00e7ka t\u00eb till\u00eb, t\u00eb cil\u00ebn ne mund ta ofrojm\u00eb si nj\u00eb pjat\u00eb t\u00eb gatshme, me t\u00eb cil\u00ebn \u00ebsht\u00eb e leht\u00eb dhe e sigurt t\u00eb punohet.<\/p>\n<h3>Konsistenca e arsyeshme (Causal consistency). Le t\u00eb sqarojm\u00eb konceptet<\/h3>\n<p>\nP\u00ebr fillim, dua t\u00eb flas n\u00eb terma t\u00eb p\u00ebrgjithsh\u00ebm p\u00ebr \u00e7far\u00eb \u00ebsht\u00eb Causal consistency. Ka dy personazhe \u2013 Leonard dhe Penny (seriali \"Teoria e Big Bangut\"):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/ee0835b604ae5d5d6c0fa1bc369e6b18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSupozoni se Penny \u00ebsht\u00eb n\u00eb Evrop\u00eb, nd\u00ebrsa Leonard d\u00ebshiron t'i b\u00ebj\u00eb nj\u00eb befasi, nj\u00eb fest\u00eb. Dhe ai nuk mendon asgj\u00eb m\u00eb t\u00eb mir\u00eb se t\u00eb heq\u00eb nga lista e miqve, t\u00eb d\u00ebrgoj\u00eb nj\u00eb azhurnim t\u00eb t\u00eb gjith\u00eb miqve n\u00eb feed: \"Le t\u00eb befasojm\u00eb Penny-n!\" (ajo \u00ebsht\u00eb n\u00eb Evrop\u00eb, duke fjetur, nuk e sheh asgj\u00eb dhe nuk mund ta shoh\u00eb, sepse nuk \u00ebsht\u00eb aty). N\u00eb fund, ai fshin k\u00ebt\u00eb postim, e fshin nga \"Feed\" dhe rivendos aksesin, q\u00eb ajo t\u00eb mos e v\u00ebrej\u00eb dhe t\u00eb mos ndodhi ndonj\u00eb skandal.<br \/>\nKjo \u00ebsht\u00eb e shk\u00eblqyer, por le t\u00eb supozojm\u00eb se sistemi \u00ebsht\u00eb i shp\u00ebrndar\u00eb dhe ngjarjet nuk shkuan si\u00e7 duhet. Mund t\u00eb ndodh\u00eb, p\u00ebr shembull, q\u00eb kufizimi i aksesit t\u00eb ndodh\u00eb pas publikimit t\u00eb k\u00ebtij posti, n\u00ebse ngjarjet nuk jan\u00eb t\u00eb lidhura me nj\u00ebra-tjetr\u00ebn n\u00eb lidhje shkak-pasoj\u00eb. N\u00eb fakt, ky \u00ebsht\u00eb nj\u00eb shembull se si \u00ebsht\u00eb e nevojshme q\u00eb t\u00eb ket\u00eb Konsistenc\u00eb Shkak\u00ebsore p\u00ebr t\u00eb p\u00ebrmbushur nj\u00eb funksion biznesi (n\u00eb k\u00ebt\u00eb rast).<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, k\u00ebto jan\u00eb pron\u00ebsi mjaft jokonvencionale t\u00eb bazave t\u00eb t\u00eb dh\u00ebnave \u2013 shum\u00eb pak prej tyre i mb\u00ebshtesin ato. Le t\u00eb kalojm\u00eb te modelet.<\/p>\n<h3>Modelet e Konsistenc\u00ebs (Consistency Models)<\/h3>\n<p>\n\u00c7far\u00eb \u00ebsht\u00eb model konsistence n\u00eb bazat e t\u00eb dh\u00ebnave? K\u00ebto jan\u00eb disa garanci q\u00eb sistemi i shp\u00ebrndar\u00eb jep rreth asaj se cilat t\u00eb dh\u00ebna dhe n\u00eb cil\u00ebn radh\u00eb mund t\u00eb marr\u00eb klienti.<\/p>\n<p>N\u00eb parim, t\u00eb gjitha modelet e konsistenc\u00ebs jan\u00eb p\u00ebrmbledhje n\u00eb at\u00eb mas\u00eb sa sistemi i shp\u00ebrndar\u00eb p\u00ebrputhet me nj\u00eb sistem q\u00eb operon, p\u00ebr shembull, n\u00eb nj\u00eb nod t\u00eb vet\u00ebm n\u00eb laptop. Dhe sa m\u00eb shum\u00eb q\u00eb nj\u00eb sistem q\u00eb funksionon n\u00eb mij\u00ebra 'Nod\u00eb' t\u00eb shp\u00ebrndara t\u00eb ngjaj\u00eb me laptopin, n\u00eb t\u00eb cilin t\u00eb gjitha k\u00ebto pron\u00ebsi p\u00ebrmbushen n\u00eb m\u00ebnyr\u00eb automatike.<\/p>\n<p>Prandaj, modelet e konsistenc\u00ebs aplikohen vet\u00ebm p\u00ebr sistemet e shp\u00ebrndara. T\u00eb gjitha sistemet q\u00eb kan\u00eb ekzistuar m\u00eb par\u00eb dhe kan\u00eb funksionuar me nj\u00eb shkall\u00ebzim t\u00eb vertikalizuar, nuk kan\u00eb hasur n\u00eb k\u00ebto probleme. Aty kishte nj\u00eb Buffer Cache, dhe nga ai gjithmon\u00eb \u00ebsht\u00eb lexuar.<\/p>\n<h3>Modeli i Fort\u00eb<\/h3>\n<p>\nN\u00eb fakt, modeli i par\u00eb \u00ebsht\u00eb modeli i Fort\u00eb (ose linja e rritjes, si\u00e7 quhet shpesh). Ky \u00ebsht\u00eb nj\u00eb model konsistence q\u00eb garanton se \u00e7do ndryshim, sapo merr konfirmimin se ka ndodhur, b\u00ebhet i duksh\u00ebm p\u00ebr t\u00eb gjith\u00eb p\u00ebrdoruesit e sistemit.<\/p>\n<p>Kjo krijon nj\u00eb rend global t\u00eb t\u00eb gjitha ngjarjeve n\u00eb DB. Ky \u00ebsht\u00eb nj\u00eb pron\u00ebsi shum\u00eb e fort\u00eb e konsistenc\u00ebs, dhe \u00ebsht\u00eb gjithashtu shum\u00eb e shtrenjt\u00eb. Megjithat\u00eb, ajo mb\u00ebshtetet shum\u00eb mir\u00eb. Thjesht \u00ebsht\u00eb shum\u00eb e shtrenjt\u00eb dhe e ngadalt\u00eb \u2013 prandaj p\u00ebrdoret rrall\u00eb. Kjo quhet rritje.<\/p>\n<p>Ka nj\u00eb pron\u00ebsi tjet\u00ebr, m\u00eb t\u00eb fort\u00eb, q\u00eb mb\u00ebshtetet n\u00eb 'Spanner' \u2013 quhet Konsistenca Eksterne. Do t\u00eb flasim p\u00ebr t\u00eb m\u00eb von\u00eb.<\/p>\n<h3>Konsistente Shkak\u00ebsore<\/h3>\n<p>\nT\u00eb ardhshme \u00ebsht\u00eb Causal, pik\u00ebrisht ajo p\u00ebr t\u00eb cil\u00ebn po flisja. Nd\u00ebrmjet Strong dhe Causal ekzistojn\u00eb disa n\u00ebnnivelesh t\u00eb tjera, p\u00ebr t\u00eb cilat nuk do t\u00eb flas, por gjith\u00e7ka p\u00ebrfundon n\u00eb Causal. Ky \u00ebsht\u00eb nj\u00eb model i r\u00ebnd\u00ebsish\u00ebm, sepse \u00ebsht\u00eb modeli m\u00eb i fort\u00eb nga t\u00eb gjitha modelet, koherenca m\u00eb e fort\u00eb n\u00eb pranin\u00eb e rrjetit ose ndarjeve.<\/p>\n<p>Causals jan\u00eb situata n\u00eb t\u00eb cilat ngjarjet jan\u00eb t\u00eb lidhura me nj\u00ebra-tjetr\u00ebn p\u00ebr shkak t\u00eb shkakut. Shpesh perceptohen si Read your on rights nga k\u00ebndv\u00ebshtrimi i klientit. N\u00ebse klienti ka v\u00ebrejtur disa vlera, ai nuk mund t\u00eb shoh\u00eb vlerat q\u00eb ishin n\u00eb t\u00eb kaluar\u00ebn. Ai tashm\u00eb fillon t\u00eb shoh\u00eb leximet prefikse. T\u00eb gjith\u00eb ata p\u00ebrfundojn\u00eb n\u00eb t\u00eb nj\u00ebjt\u00ebn gj\u00eb.<br \/>\nCausals si model koherenc\u00eb jan\u00eb nje renditje e pjesshme e ngjarjeve n\u00eb server, ku ngjarjet nga t\u00eb gjith\u00eb klient\u00ebt v\u00ebrehen n\u00eb t\u00eb nj\u00ebjt\u00ebn renditje. N\u00eb k\u00ebt\u00eb rast \u2013 Leonard dhe Penny.<\/p>\n<h3>Eventual<\/h3>\n<p>\nModeli i tret\u00eb \u00ebsht\u00eb Eventual Consistency. Ky \u00ebsht\u00eb modeli q\u00eb mb\u00ebshtetet nga t\u00eb gjitha sistemet e shp\u00ebrndara, model minimal q\u00eb ka ndonj\u00eb kuptim. Ai n\u00ebnkupton se: kur ndodhin disa ndryshime n\u00eb t\u00eb dh\u00ebna, ato n\u00eb nj\u00eb moment b\u00ebhen koherente.<\/p>\n<p>N\u00eb at\u00eb moment, ai nuk thot\u00eb asgj\u00eb, p\u00ebrndryshe do t\u00eb kthehej n\u00eb External Consistency \u2013 do t\u00eb ishte nj\u00eb histori krejt tjet\u00ebr. Megjithat\u00eb, ky \u00ebsht\u00eb nj\u00eb model shum\u00eb popullor, modeli m\u00eb i p\u00ebrhapur. N\u00eb parazgjedhje, t\u00eb gjith\u00eb p\u00ebrdoruesit e sistemeve t\u00eb shp\u00ebrndara p\u00ebrdorin pik\u00ebrisht Eventual Consistency.<\/p>\n<p>Dua t\u00eb jap disa shembuj krahasues:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/c23e59b30d96de6ec456aaa76c67ad61.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7far\u00eb do t\u00eb thon\u00eb k\u00ebto shigjeta?<\/p>\n<ul>\n<li><b>Latency.<\/b> Me rritjen e forc\u00ebs s\u00eb koherenc\u00ebs, ajo b\u00ebhet m\u00eb e madhe p\u00ebr arsye t\u00eb qarta: nevojitet t\u00eb b\u00ebhen m\u00eb shum\u00eb shkronja, t\u00eb marrim konfirmimin nga t\u00eb gjith\u00eb hostet dhe nodet q\u00eb marrin pjes\u00eb n\u00eb klaster, q\u00eb t\u00eb dh\u00ebnat t\u00eb ekzistojn\u00eb atje. Si pasoj\u00eb, n\u00eb Eventual Consistency p\u00ebrgjigja m\u00eb e shpejt\u00eb, sepse zakonisht mund t\u00eb komitet n\u00eb memory dhe kjo do t\u00eb ishte mjaft e mjaftueshme.<\/li>\n<li><b>Availability.<\/b> N\u00ebse e kuptojm\u00eb k\u00ebt\u00eb si mund\u00ebsi t\u00eb sistemit p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb prani t\u00eb nd\u00ebrprerjeve t\u00eb rrjetit, ndarjeve, ose ndonj\u00eb d\u00ebshtimi \u2013 q\u00ebndrueshm\u00ebria rritet me zvog\u00eblimin e modelit t\u00eb koherenc\u00ebs, p\u00ebr shkak se na mjafton q\u00eb nj\u00eb host t\u00eb jet\u00eb aktiv dhe t\u00eb ofroj\u00eb disa t\u00eb dh\u00ebna. Eventual Consistency n\u00eb fakt nuk garanton asgj\u00eb n\u00eb lidhje me t\u00eb dh\u00ebnat \u2013 mund t\u00eb jet\u00eb gjith\u00e7ka.<\/li>\n<li><b>Anomalies.<\/b> Natyrisht, numri i anomali-ve rritet. N\u00eb Strong Consistency, ato n\u00eb t\u00eb v\u00ebrtet\u00eb nuk duhet t\u00eb ekzistojn\u00eb, nd\u00ebrsa n\u00eb Eventual Consistency ato mund t\u00eb jen\u00eb \u00e7far\u00ebdo. Kjo ngre pyetjen: pse njer\u00ebzit zgjedhin Eventual Consistency, n\u00ebse ajo p\u00ebrmban anomali? P\u00ebrgjigja q\u00ebndron n\u00eb faktin se modelet e Eventual Consistency jan\u00eb t\u00eb aplikueshme, dhe anomali ekzistojn\u00eb, p\u00ebr shembull, p\u00ebr nj\u00eb periudhe t\u00eb shkurt\u00ebr kohore; ka mund\u00ebsin\u00eb t\u00eb p\u00ebrdor\u00ebsh master p\u00ebr t\u00eb lexuar dhe p\u00ebr t\u00eb lexuar t\u00eb dh\u00ebna relativisht konsistente; shpesh ka mund\u00ebsi t\u00eb p\u00ebrdor\u00ebsh modele t\u00eb forta konsistence. N\u00eb praktik\u00eb, kjo funksionon, dhe zakonisht numri i anomali-ve \u00ebsht\u00eb i kufizuar n\u00eb koh\u00eb.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Teorema CAP<\/h3>\n<p>\nKur ju shihni fjal\u00ebt konsistenc\u00eb, disponueshm\u00ebri \u2013 \u00e7far\u00eb ju vjen n\u00eb mend? E drejta \u2013 teorema CAP! Un\u00eb tani dua t\u00eb shp\u00ebrthej mitin\u2026 Nuk jam un\u00eb \u2013 \u00ebsht\u00eb Martin Kleppmann, i cili shkroi nj\u00eb artikull t\u00eb shk\u00eblqyer, nj\u00eb lib\u00ebr t\u00eb shk\u00eblqyer.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/02a9b84585218c4e85afd65f7e88aa26.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeorema CAP \u00ebsht\u00eb nj\u00eb parim i formuluar n\u00eb vitet 2000, q\u00eb thot\u00eb se Konsistenca, Disponueshm\u00ebria, Ndarjet: merrni \u00e7do dy, dhe nuk mund t\u00eb zgjidhni tre. Ky ishte nj\u00eb parim i caktuar. Ai u provua si nj\u00eb teorem disa vite m\u00eb von\u00eb, nga Gilbert dhe Lynch. Pastaj kjo filloi t\u00eb p\u00ebrdorej si nj\u00eb mantr\u00eb \u2013 sistemi filluan t\u00eb ndahen n\u00eb CA, CP, AP dhe k\u00ebshtu me radh\u00eb.<\/p>\n<p>Kjo teorem\u00eb u provua n\u00eb t\u00eb v\u00ebrtet\u00eb p\u00ebr k\u00ebto raste\u2026 S\u00eb pari, Disponueshm\u00ebria nuk u shqyrtua si nj\u00eb vler\u00eb e pand\u00ebrprer\u00eb nga zero deri n\u00eb nj\u00ebqind (0 \u2013 sistemi \u2018i vdekur\u2019, 100 \u2013 p\u00ebrgjigjet shpejt; k\u00ebshtu e kemi zakonisht), por si nj\u00eb pron\u00eb e algoritmit q\u00eb garanton se n\u00eb t\u00eb gjitha ekzekutimet e tij kthehet t\u00eb dh\u00ebna.<\/p>\n<p>P\u00ebr koh\u00ebn e p\u00ebrgjigjes atje nuk ka asnj\u00eb fjal\u00eb! Ka nj\u00eb algorit\u00ebm q\u00eb kthen t\u00eb dh\u00ebna pas 100 vjet\u00ebsh \u2013 nj\u00eb algorit\u00ebm perfekt t\u00eb disponuesh\u00ebm, q\u00eb \u00ebsht\u00eb pjes\u00eb e teorem\u00ebs CAP.<br \/>\nE dyta: teorema u provua p\u00ebr ndryshime n\u00eb vlerat e t\u00eb nj\u00ebjtit \u00e7el\u00ebs, p\u00ebrve\u00e7 se k\u00ebto ndryshime ishin nj\u00eb linj\u00eb t\u00eb rip\u00ebrshtatshme. Kjo do t\u00eb thot\u00eb se ato n\u00eb t\u00eb v\u00ebrtet\u00eb nuk p\u00ebrdoren shum\u00eb, p\u00ebr shkak se modelet e tjera jan\u00eb Eventual Consistency, Strong Consistency (ndoshta).<\/p>\n<p>P\u00ebr \u00e7far\u00eb \u00ebsht\u00eb e gjitha kjo? P\u00ebr faktin se teorema CAP, n\u00eb form\u00ebn n\u00eb t\u00eb cil\u00ebn \u00ebsht\u00eb provuar, \u00ebsht\u00eb praktikisht e paprakteshme, ndodhet rrall\u00eb n\u00eb p\u00ebrdorim. N\u00eb form\u00ebn teorike ajo n\u00eb nj\u00ebfar\u00eb m\u00ebnyre kufizon gjith\u00e7ka. K\u00ebshtu del nj\u00eb parim q\u00eb \u00ebsht\u00eb intuitivisht i sakt\u00eb, por nuk \u00ebsht\u00eb, n\u00eb p\u00ebrgjith\u00ebsi, provuar.<\/p>\n<h3>Konsistenca shkak\u00ebsore \u2013 modeli m\u00eb i fort\u00eb<\/h3>\n<p>\nAjo q\u00eb po ndodh tani \u00ebsht\u00eb se mund t\u00eb merrni tre gj\u00ebra: Konsistenc\u00eb, Disponueshm\u00ebri, q\u00eb mund t\u00eb arrihen p\u00ebrmes Particioneve. N\u00eb ve\u00e7anti, konsistenca shkak\u00ebsore \u2013 modeli m\u00eb i fort\u00eb i konsistenc\u00ebs, i cili megjithat\u00eb funksionon n\u00eb prani t\u00eb Particioneve (ndarjeve n\u00eb rrjet). Prandaj, ajo p\u00ebrfaq\u00ebson nj\u00eb interes kaq t\u00eb madh dhe prandaj merremi me t\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/c4320294320261858a6d22faa97b9e23.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00eb pari, ajo thjeshton pun\u00ebn e zhvilluesve t\u00eb aplikacioneve. N\u00eb ve\u00e7anti, ekzistenca e nj\u00eb mb\u00ebshtetje t\u00eb madhe nga serveri: kur t\u00eb gjitha regjistrimet q\u00eb ndodhin brenda nj\u00eb klienti, garantohen se do t\u00eb arrijn\u00eb n\u00eb at\u00eb rend t\u00eb nj\u00ebjt\u00eb n\u00eb nj\u00eb klient tjet\u00ebr. S\u00eb dyti, ajo p\u00ebrballon ndarjet.<\/p>\n<h3>Kuzhina e brendshme e MongoDB<\/h3>\n<p>\nDuke mbajtur parasysh se \u00ebsht\u00eb drek\u00eb, ne po kalojm\u00eb n\u00eb kuzhin\u00eb. Do t\u00eb flas p\u00ebr modelin e sistemit, pra \u2013 \u00e7far\u00eb \u00ebsht\u00eb MongoDB p\u00ebr ata q\u00eb d\u00ebgjojn\u00eb p\u00ebr k\u00ebt\u00eb baz\u00eb t\u00eb dh\u00ebnash p\u00ebr her\u00eb t\u00eb par\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/a1784442ff1c44403b5347f4f43a1197.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/a1f9bcb4daebb43e4fc848a5f5f07c60.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMongoDB (m\u00eb tej \u2013 \"MongoDB\") \u00ebsht\u00eb nj\u00eb sistem i shp\u00ebrndar\u00eb, i cili mb\u00ebshtet shkall\u00ebzimin horizontal, dmth sharding; dhe brenda \u00e7do shardi, gjithashtu mb\u00ebshtet redundant\u00ebsin e t\u00eb dh\u00ebnave, pra replikimin.<\/p>\n<p>Shardimi n\u00eb \"MongoDB\" (jo nj\u00eb DB relationale) kryen balancimin automatik, dometh\u00ebn\u00eb \u00e7do koleksion dokumentesh (ose \"tabel\" n\u00eb terminologjin\u00eb e t\u00eb dh\u00ebnave relationale) ndahet n\u00eb copa, dhe serveri automatikisht i l\u00ebviz ato midis shardeve.<\/p>\n<p>Query Router, i cili shp\u00ebrndan k\u00ebrkesat, p\u00ebr klientin \u00ebsht\u00eb nj\u00eb lloj klienti, p\u00ebrmes t\u00eb cilit ai punon. Ai tashm\u00eb e di se ku dhe cilat t\u00eb dh\u00ebna ndodhen, dhe drejton t\u00eb gjitha k\u00ebrkesat n\u00eb shardin e duhur.<\/p>\n<p>Nj\u00eb aspekt tjet\u00ebr i r\u00ebnd\u00ebsish\u00ebm: MongoDB \u00ebsht\u00eb nj\u00eb master i vet\u00ebm. Ka nj\u00eb Primar \u2013 ai mund t\u00eb marr\u00eb regjistrimet q\u00eb mb\u00ebshtesin ato \u00e7el\u00ebsa q\u00eb ai ka n\u00eb vetvete. Nuk mund t\u00eb b\u00ebhet shkrim shum\u00eb-master.<\/p>\n<p>Ne l\u00ebshuam versionin 4.2 \u2013 aty jan\u00eb shfaqur gj\u00ebra t\u00eb reja interesante. N\u00eb ve\u00e7anti, vendos\u00ebm Lucene \u2013 k\u00ebrkimin \u2013 pik\u00ebrisht java ekzekutues direkt n\u00eb \"Mongo\", dhe tani \u00ebsht\u00eb e mundur t\u00eb b\u00ebhet k\u00ebrkimi p\u00ebrmes Lucene, ashtu si n\u00eb \"Elasticsearch\".<\/p>\n<p>Dhe b\u00ebm\u00eb nj\u00eb produkt t\u00eb ri \u2013 Charts, ai \u00ebsht\u00eb gjithashtu i disponuesh\u00ebm n\u00eb \"Atlas\" (Cloud-i yn\u00eb \"Mongo\"). Ata kan\u00eb nj\u00eb Tier Falas \u2013 mund t\u00eb luani me k\u00ebt\u00eb. Charts m\u00eb p\u00eblqeu shum\u00eb \u2013 vizualizimi i t\u00eb dh\u00ebnave, shum\u00eb intuitiv.<\/p>\n<h3>P\u00ebrb\u00ebr\u00ebsit e konsistenc\u00ebs shkak\u00ebsore<\/h3>\n<p>\nKam num\u00ebruar rreth 230 artikuj, q\u00eb jan\u00eb publikuar mbi k\u00ebt\u00eb tem\u00eb \u2013 nga Leslie Lamport. Tani, nga kujtesa ime, do t'ju sjell disa pjes\u00eb t\u00eb k\u00ebtyre materialeve.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE gjith\u00eb\u00e7ka filloi me nj\u00eb artikull t\u00eb Leslie Lampert, i shkruar n\u00eb vitet 1970. Si\u00e7 e shihni, ende vazhdojn\u00eb disa k\u00ebrkime mbi k\u00ebt\u00eb tem\u00eb. Tani, konsistenca shkaku ka t\u00ebrhequr interesin e zhvillimit t\u00eb sistemeve t\u00eb shp\u00ebrndara.<\/p>\n<h3>Kufizimet<\/h3>\n<p>\n\u00c7far\u00eb kufizimesh ekzistojn\u00eb? N\u00eb t\u00eb v\u00ebrtet\u00eb, kjo \u00ebsht\u00eb nj\u00eb nga \u00e7\u00ebshtjet kryesore, sepse kufizimet q\u00eb vendosin sistemet e prodhimit ndahen shum\u00eb nga ato kufizime q\u00eb ekzistojn\u00eb n\u00eb artikujt akademik\u00eb. Shpesh ato jan\u00eb mjaft artificiale.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/9583ba9ff870e4ddc7aad4ba4c59ecc1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>S\u00eb pari, 'MongoDB' \u00ebsht\u00eb nj\u00eb master i vet\u00ebm, si\u00e7 e thash\u00eb m\u00eb par\u00eb (kjo e thjeshton shum\u00eb).<\/li>\n<li>Ne besojm\u00eb se sistemi duhet t\u00eb mb\u00ebshtes\u00eb af\u00ebrsisht 10,000 sharde. Nuk mund t\u00eb marrim vendime arkitektonike q\u00eb do t\u00eb kufizonin qart\u00eb k\u00ebt\u00eb vler\u00eb.<\/li>\n<li>Kemi nj\u00eb mjegull, por supozojm\u00eb se nj\u00eb person duhet t\u00eb ket\u00eb mund\u00ebsin\u00eb q\u00eb kur t\u00eb shkarkon binary, ta ekzekutoj\u00eb n\u00eb laptopin e tij dhe gjith\u00e7ka t\u00eb funksionoj\u00eb mir\u00eb.<\/li>\n<li>Ne supozojm\u00eb at\u00eb q\u00eb n\u00eb k\u00ebrkim p\u00ebrdoret rrall\u00eb: klient\u00ebt e jasht\u00ebm mund t\u00eb b\u00ebjn\u00eb \u00e7far\u00ebdo. 'MongoDB' \u00ebsht\u00eb open source. Prandaj, klient\u00ebt mund t\u00eb jen\u00eb kaq t\u00eb zgjuar, t\u00eb lig, \u2013 mund t\u00eb duan t\u00eb thyejn\u00eb gjith\u00e7ka. Ne supozojm\u00eb se mund t\u00eb ndodhin defekte bizantine.<\/li>\n<li>P\u00ebr klient\u00ebt e jasht\u00ebm, q\u00eb jan\u00eb jasht\u00eb perimetrit \u2013 nj\u00eb kufizim i r\u00ebnd\u00ebsish\u00ebm: n\u00ebse kjo ve\u00e7ori \u00ebsht\u00eb e \u00e7aktivizuar, nuk duhet t\u00eb ket\u00eb asnj\u00eb degradim t\u00eb performanc\u00ebs.<\/li>\n<li>Nj\u00eb tjet\u00ebr \u00e7\u00ebshtje \u2013 krejt\u00ebsisht antiakademike: p\u00ebrputhshm\u00ebria e versioneve t\u00eb m\u00ebparshme dhe ato t\u00eb ardhshme. Shqer\u00ebzuesit e vjet\u00ebr duhet t\u00eb p\u00ebrballojn\u00eb p\u00ebrdit\u00ebsimet e reja, dhe DB duhet t\u00eb mb\u00ebshtes\u00eb shqer\u00ebzuesit e vjet\u00ebr.<\/li>\n<\/ul>\n<p>\nN\u00eb p\u00ebrgjith\u00ebsi, gjith\u00eb kjo vendos kufizime.<\/p>\n<h3>Komponent\u00ebt e Konsistenc\u00ebs Shkaku<\/h3>\n<p>\nTani do t\u00eb flas p\u00ebr disa komponente. N\u00ebse e shqyrtojm\u00eb p\u00ebrgjith\u00ebsisht Konsistenc\u00ebn Shkaku, mund t\u00eb ve\u00e7ojm\u00eb blloqet. Ne zgjodh\u00ebm nga pun\u00ebt q\u00eb p\u00ebrfshihen n\u00eb nj\u00eb bllok: Ndjekja e Var\u00ebsive, zgjedhja e or\u00ebve, si mund t\u00eb sinkronizohen k\u00ebto or\u00eb me nj\u00ebra-tjetr\u00ebn, dhe si ne sigurojm\u00eb sigurin\u00eb \u2013 ky \u00ebsht\u00eb nj\u00eb plan i p\u00ebrgjithsh\u00ebm p\u00ebr at\u00eb q\u00eb do t\u00eb flas\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/10c2631d6e61a280139b448628db763e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Ndjekja e Plot\u00eb e Var\u00ebsive (Full Dependency Tracking)<\/h3>\n<p>\nPse \u00ebsht\u00eb e nevojshme? P\u00ebr t\u00eb siguruar q\u00eb kur t\u00eb dh\u00ebnat replikohen \u2013 \u00e7do regjist\u00ebr, \u00e7do ndryshim i t\u00eb dh\u00ebnave p\u00ebrmban informacione rreth ndryshimeve nga t\u00eb cilat varet. Ndryshimi i par\u00eb dhe m\u00eb na\u00efv \u00ebsht\u00eb kur \u00e7do mesazh q\u00eb p\u00ebrmban nj\u00eb regjist\u00ebr ka informacion mbi mesazhet e m\u00ebparshme:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/fa5d0086c3c77e33631d8a2cd5c217fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb k\u00ebt\u00eb shembull, numri n\u00eb kllapa kaq \u2013 jan\u00eb numrat e regjistrave. Ndonj\u00ebher\u00eb k\u00ebto regjistra me vlera kalojn\u00eb t\u00ebr\u00ebsisht, ndonj\u00ebher\u00eb p\u00ebr\u00e7ohen disa versione. Nd\u00ebrsa q\u00ebllimi \u00ebsht\u00eb q\u00eb \u00e7do ndryshim p\u00ebrmban informacione p\u00ebr t\u00eb m\u00ebparshmet (e sjell k\u00ebt\u00eb n\u00eb vetvete).<\/p>\n<p>Pse vendos\u00ebm t\u00eb mos p\u00ebrdorim nj\u00eb qasje t\u00eb till\u00eb (ndjekje e plot\u00eb)? Qart\u00eb, sepse kjo qasje \u00ebsht\u00eb e paprakti: \u00e7do ndryshim n\u00eb rrjetin social varet nga t\u00eb gjitha ndryshimet e m\u00ebparshme n\u00eb at\u00eb rrjet social, duke e p\u00ebr\u00e7uar, t\u00eb themi, \u00abFacebook\u00bb ose \u00abVkontakte\u00bb n\u00eb \u00e7do p\u00ebrdit\u00ebsim. Megjithat\u00eb, ka shum\u00eb studime mbi ndjekjen e plot\u00eb t\u00eb var\u00ebsive \u2013 k\u00ebto jan\u00eb para rrjeteve sociale, n\u00eb disa situata kjo v\u00ebrtet funksionon.<\/p>\n<h3>Ndjekja e qart\u00eb e var\u00ebsive (Explicit Dependency Tracking)<\/h3>\n<p>\nTjetra \u2013 nj\u00eb qasje m\u00eb e kufizuar. K\u00ebtu shqyrtohet gjithashtu transfert\u00ebn e informacionit, por vet\u00ebm at\u00eb q\u00eb varet qart\u00eb. \u00c7far\u00eb varet nga \u00e7far\u00eb, zakonisht p\u00ebrcaktohet nga Aplikacioni. Kur t\u00eb dh\u00ebnat replikohen, p\u00ebrgjigjet jepen vet\u00ebm kur var\u00ebsit\u00eb e m\u00ebparshme jan\u00eb p\u00ebrmbushur, dmth. jan\u00eb treguar. Kjo \u00ebsht\u00eb m\u00ebnyra se si funksionon konsistenca e shkaktuar.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/7fe101b998c1a0c922788d8d36a5243f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAjo sheh se regjistri 5 varet nga regjistrat 1, 2, 3, 4 \u2013 p\u00ebrkat\u00ebsisht, ajo pret, p\u00ebrpara se klienti t\u00eb ket\u00eb qasje n\u00eb ndryshimet e b\u00ebra nga vendimi i aksesit t\u00eb Penny, kur t\u00eb gjitha ndryshimet e m\u00ebparshme kan\u00eb kaluar n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave.<\/p>\n<p>Kjo gjithashtu nuk na k\u00ebnaq, sepse informatat jan\u00eb shum\u00eb dhe do t\u00eb ngadal\u00ebsojn\u00eb procesin. Ka nj\u00eb qasje tjet\u00ebr\u2026<\/p>\n<h3>Or\u00ebt e Lamportit (Lamport Clock)<\/h3>\n<p>\nAto jan\u00eb shum\u00eb t\u00eb vjetra. Lamport Clock n\u00ebnkupton se k\u00ebto var\u00ebsi shuhen n\u00eb nj\u00eb funksion skalar, i cili quhet Lamport Clock.<\/p>\n<p>Funksioni skalar \u00ebsht\u00eb nj\u00eb num\u00ebr abstrakt. Shpesh e quajn\u00eb koh\u00eb logjike. \u00c7do her\u00eb q\u00eb ndodh nj\u00eb ngjarje, ky counter rritet. Counter, i njohur tani nga procesi, d\u00ebrgon \u00e7do mesazh. \u00cbsht\u00eb e qart\u00eb se proceset mund t\u00eb jen\u00eb jasht\u00eb sinkronizimit, ato mund t\u00eb ken\u00eb koh\u00eb krejt t\u00eb ndryshme. Megjithat\u00eb, me k\u00ebt\u00eb shk\u00ebmbim mesazhesh, sistemi nj\u00ebfar\u00ebsoj balancion or\u00ebt. \u00c7far\u00eb ndodh n\u00eb k\u00ebt\u00eb rast?<\/p>\n<p>E ndava at\u00eb shard t\u00eb madh n\u00eb dy pjes\u00eb, q\u00eb t\u00eb ishte e qart\u00eb: Friends mund t\u00eb jetojn\u00eb n\u00eb nj\u00eb node, q\u00eb p\u00ebrmban nj\u00eb cop\u00eb koleksioni, nd\u00ebrsa Feed \u2013 n\u00eb nj\u00eb node tjet\u00ebr, q\u00eb p\u00ebrmban nj\u00eb cop\u00eb t\u00eb k\u00ebtij koleksioni. A \u00ebsht\u00eb e qart\u00eb se si ata mund t\u00eb mos shkojn\u00eb n\u00eb radh\u00eb? Fillimisht Feed do t\u00eb thot\u00eb: 'U riplikua', dhe m\u00eb pas \u2013 Friends. N\u00ebse sistemi nuk ofron ndonj\u00eb garanci q\u00eb Feed nuk do t\u00eb tregoj\u00eb deri sa var\u00ebsit\u00eb e Friends n\u00eb koleksionin Friends t\u00eb jen\u00eb gjithashtu t\u00eb dor\u00ebzuara, at\u00ebher\u00eb do t\u00eb kemi pik\u00ebrisht situat\u00ebn q\u00eb p\u00ebrmenda.<\/p>\n<p>Ju shihni si rritet logjikisht koha e counter n\u00eb Feed:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu, prona kryesore e k\u00ebtij Lamport Clock dhe Causal consistency (t\u00eb shpjeguar p\u00ebrmes Lamport Clock) q\u00ebndron n\u00eb k\u00ebt\u00eb: n\u00ebse kemi ngjarjet A dhe B, dhe ngjarja B varet nga ngjarja A *, at\u00ebher\u00eb rrjedhimisht LogicalTime e Ngjarjes A \u00ebsht\u00eb m\u00eb e vog\u00ebl se LogicalTime e Ngjarjes B.<\/p>\n<p><i>* Ndonj\u00ebher\u00eb thuhet gjithashtu se A ndodhi para B, q\u00eb do t\u00eb thot\u00eb se A ndodhi m\u00eb par\u00eb se B \u2013 ky \u00ebsht\u00eb nj\u00eb marr\u00ebdh\u00ebnie q\u00eb pjes\u00ebrisht rendit t\u00ebr\u00eb grumbullin e ngjarjeve q\u00eb kan\u00eb ndodhur ndonj\u00ebher\u00eb.<\/i><\/p>\n<p>E kund\u00ebrta nuk \u00ebsht\u00eb e v\u00ebrtet\u00eb. Kjo n\u00eb t\u00eb v\u00ebrtet\u00eb \u00ebsht\u00eb nj\u00eb nd\u00ebr disavantazhet kryesore t\u00eb Lamport Clock \u2013 rendi pjesor. Ka konceptin e ngjarjeve t\u00eb nj\u00ebkohshme, q\u00eb do t\u00eb thot\u00eb ngjarje, n\u00eb t\u00eb cilat as (A ndodhi para B), as (A ndodhi pas B). Nj\u00eb shembull mund t\u00eb jet\u00eb shtimi paralel i Leonardit si mik t\u00eb dikujt tjet\u00ebr (edhe jo Leonardit, por Sheldonit, p\u00ebr shembull).<br \/>\nKy \u00ebsht\u00eb edhe atributi q\u00eb shpesh p\u00ebrdoret gjat\u00eb pun\u00ebs me or\u00ebt Lamport: shikoni pik\u00ebrisht n\u00eb funksion dhe nga kjo nxjerrin p\u00ebrfundimin \u2013 ndoshta k\u00ebto ngjarje jan\u00eb t\u00eb varura. Sepse n\u00eb nj\u00eb drejtim \u00ebsht\u00eb e v\u00ebrtet\u00eb: n\u00ebse LogicalTime A \u00ebsht\u00eb m\u00eb e vog\u00ebl se LogicalTime B, at\u00ebher\u00eb B nuk mund t\u00eb ndodhi para A; nd\u00ebrsa n\u00ebse \u00ebsht\u00eb m\u00eb e madhe, at\u00ebher\u00eb mund t\u00eb jet\u00eb.<\/p>\n<h3>Or\u00ebt vektoriale (Vector Clock)<\/h3>\n<p>\nZhvillimi logjik i or\u00ebve Lamport \u00ebsht\u00eb Or\u00ebt Vektoriale. Ato dallojn\u00eb nga fakti q\u00eb \u00e7do node k\u00ebtu ka or\u00ebt e veta, t\u00eb ve\u00e7anta, dhe ato transmetohen si nj\u00eb vektor.<br \/>\nN\u00eb k\u00ebt\u00eb rast, ju shihni se indeksi zero i vektorit i p\u00ebrgjigjet Feed-it, nd\u00ebrsa indeksi i par\u00eb i vektorit \u2013 miqve (\u00e7do nj\u00eb nga k\u00ebto noda). Dhe tani ato do t\u00eb rriten: indeksi zero i \"Feed\" rritet n\u00eb regjistrim \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPse jan\u00eb m\u00eb t\u00eb mira or\u00ebt vektoriale? Ato lejojn\u00eb t\u00eb kuptoni se cilat ngjarje ndodhin nj\u00ebkoh\u00ebsisht dhe kur ndodhin n\u00eb nodat e ndrysh\u00ebm. Kjo \u00ebsht\u00eb shum\u00eb e r\u00ebnd\u00ebsishme p\u00ebr sistemin e sharding, si \"MongoDB\". Megjithat\u00eb, ne nuk e zgjodh\u00ebm k\u00ebt\u00eb, megjith\u00ebse \u00ebsht\u00eb nj\u00eb gj\u00eb e shk\u00eblqyer dhe punon shum\u00eb mir\u00eb, dhe do na ishte ndoshta e p\u00ebrshtatshme...<\/p>\n<p>N\u00ebse kemi 10 mij\u00eb shard-e, nuk mund t\u00eb transferojm\u00eb 10 mij\u00eb komponent\u00eb, edhe n\u00ebse i kompresojm\u00eb, ende do t\u00eb jemi m\u00eb t\u00eb ul\u00ebt n\u00eb kapacitetin e mbetjeve, se sa \u00ebsht\u00eb volumi i t\u00eb gjith\u00eb k\u00ebtij vektori. Pra, me dhimbje n\u00eb zem\u00ebr dhe me dh\u00ebmb\u00eb, ne e hodh\u00ebm k\u00ebt\u00eb qasje dhe kaluam n\u00eb nj\u00eb tjet\u00ebr.<\/p>\n<h3>Spanner TrueTime. Or\u00eb atomike<\/h3>\n<p>\nKam th\u00ebn\u00eb se do t\u00eb flas p\u00ebr \"Spanner\". Kjo \u00ebsht\u00eb di\u00e7ka e mrekullueshme, e v\u00ebrtet\u00eb e shekullit t\u00eb 21: or\u00eb atomike, sinkronizim GPS.<\/p>\n<p>Cila \u00ebsht\u00eb ideja? \"Spanner\" \u00ebsht\u00eb nj\u00eb sistem i Google-it, i cili koh\u00ebt e fundit u b\u00eb i disponuesh\u00ebm p\u00ebr njer\u00ebzit (ata i shtuan SQL). \u00c7do transaksion atje ka nj\u00eb timestamp t\u00eb caktuar. Pavar\u00ebsisht se koha \u00ebsht\u00eb e sinkronizuar*, \u00e7do ngjarje mund t'i caktohet nj\u00eb koh\u00eb e caktuar \u2013 or\u00ebt atomike kan\u00eb nj\u00eb koh\u00eb pritjeje, pas s\u00eb cil\u00ebs garanton q\u00eb \"ndodh\" nj\u00eb koh\u00eb tjet\u00ebr.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/707b5998fbb500d201aafffccc666f0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu, thjesht duke regjistruar n\u00eb DB dhe duke pritur nj\u00eb periudh\u00eb t\u00eb caktuar kohore, automatike garanton Serializability t\u00eb ngjarjes. Ata kan\u00eb modelin m\u00eb t\u00eb fort\u00eb t\u00eb Consistency q\u00eb mund t\u00eb imagjinohet \u2013 ajo \u00ebsht\u00eb External Consistency.<\/p>\n<p>* Kjo \u00ebsht\u00eb problemi kryesor i or\u00ebve t\u00eb Lampard-it \u2013 ato kurr\u00eb nuk jan\u00eb t\u00eb sinkronizuara n\u00eb sistemet e shp\u00ebrndara. Ato mund t\u00eb shp\u00ebrndahen, edhe me pranin\u00eb e NTP, ato nuk funksionojn\u00eb shum\u00eb mir\u00eb. \"Spanner\" ka or\u00eb atomike dhe sinkronizim, duket se deri n\u00eb mikrosekonda.<\/p>\n<p>Pse ne nuk e zgjodh\u00ebm? Ne nuk supozojm\u00eb se p\u00ebrdoruesit tan\u00eb kan\u00eb or\u00eb atomike t\u00eb integruara. Kur ato t\u00eb jen\u00eb t\u00eb integruara n\u00eb \u00e7do laptop, do t\u00eb ket\u00eb nj\u00eb sinkronizim super t\u00eb mrekulluesh\u00ebm GPS \u2013 at\u00ebher\u00eb po\u2026 Por p\u00ebr momentin, gj\u00ebja m\u00eb e mir\u00eb q\u00eb \u00ebsht\u00eb e mundur \u2013 \u00ebsht\u00eb \"Amazon\", Base Stations \u2013 p\u00ebr fanatik\u00ebt... Prandaj ne p\u00ebrdor\u00ebm or\u00eb t\u00eb tjera.<\/p>\n<h3>Or\u00eb hibride (Hybrid Clock)<\/h3>\n<p>\nKjo \u00ebsht\u00eb, n\u00eb thelb, ajo q\u00eb shkakton \"MongoDB\" t\u00eb ofroj\u00eb konsistenc\u00eb t\u00eb rast\u00ebsishme. Si jan\u00eb t\u00eb p\u00ebrziera? Hibridi \u00ebsht\u00eb nj\u00eb vler\u00eb skalarike, por p\u00ebrb\u00ebhet nga dy komponente:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/dab03a87d9f6ee2e716f75baff1736bc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>E para \u00ebsht\u00eb epoka unixiane (sa sekonda kan\u00eb kaluar nga \"fillimi i bot\u00ebs kompjuterike\").<\/li>\n<li>E dyta \u00ebsht\u00eb nj\u00eb inkrement, gjithashtu nj\u00eb int unsigned 32-bit.<\/li>\n<\/ul>\n<p>\nKjo \u00ebsht\u00eb, n\u00eb fakt, gjith\u00e7ka. Ka nj\u00eb qasje t\u00eb till\u00eb: pjesa q\u00eb p\u00ebrgjigjet p\u00ebr koh\u00ebn sinkronizohet vazhdimisht me or\u00ebt; \u00e7do her\u00eb kur ndodh nj\u00eb p\u00ebrdit\u00ebsim, kjo pjes\u00eb sinkronizohet me or\u00ebt dhe rezulton q\u00eb koha \u00ebsht\u00eb gjithmon\u00eb m\u00eb-llogjikisht e sakt\u00eb, nd\u00ebrsa inkrementi lejon dallimin e ngjarjeve q\u00eb kan\u00eb ndodhur n\u00eb t\u00eb nj\u00ebjtin moment kohor.<\/p>\n<p>Pse \u00ebsht\u00eb kjo e r\u00ebnd\u00ebsishme p\u00ebr \"MongoDB\"? Sepse lejon b\u00ebjm\u00eb disa rikuperime rezerv\u00eb n\u00eb nj\u00eb moment t\u00eb caktuar kohor, pra ngjarja indeksohet me koh\u00ebn. Kjo \u00ebsht\u00eb e r\u00ebnd\u00ebsishme kur duhen disa ngjarje; p\u00ebr DB, ngjarjet jan\u00eb ndryshime n\u00eb DB q\u00eb kan\u00eb ndodhur n\u00eb pika t\u00eb caktuara t\u00eb koh\u00ebs.<\/p>\n<p>Arsyeja kryesore do t\u2019ju them vet\u00ebm juve (ju lutem, mos e thoni askujt tjet\u00ebr)! Ne e b\u00ebm\u00eb k\u00ebt\u00eb sepse k\u00ebshtu duken t\u00eb dh\u00ebnat e renditura, t\u00eb indikuara n\u00eb MongoDB OpLog. OpLog \u00ebsht\u00eb nj\u00eb struktur\u00eb t\u00eb dh\u00ebnash q\u00eb p\u00ebrmban t\u00eb gjitha ndryshimet n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave: ato fillimisht shkojn\u00eb n\u00eb OpLog dhe pastaj aplikohen n\u00eb Storage vet\u00ebm n\u00eb rastin kur \u00ebsht\u00eb data e replikueshme ose e ndar\u00eb.<\/p>\n<p>Kjo ishte arsyeja kryesore. Megjithat\u00eb, ka edhe k\u00ebrkesa praktike p\u00ebr zhvillimin e baz\u00ebs, q\u00eb do t\u00eb thot\u00eb se duhet t\u00eb jet\u00eb e thjesht\u00eb \u2013 sa m\u00eb pak kod, sa m\u00eb pak gj\u00ebra q\u00eb d\u00ebshtojn\u00eb dhe duhet t\u00eb rikodohen dhe testohen. Fakti q\u00eb op-log\u00ebt tan\u00eb u indekseuan me or\u00eb hibride ndihmoi shum\u00eb dhe mund\u00ebsuan nj\u00eb zgjedhje t\u00eb drejt\u00eb. Kjo v\u00ebrtet i justifikoi vetveten dhe ndofta funksionoi magjikisht q\u00eb n\u00eb prototipin e par\u00eb. Ishte shum\u00eb e shk\u00eblqyer!<\/p>\n<h3>Sinkronizimi i or\u00ebve<\/h3>\n<p>\nKa there'sh disa m\u00ebnyra p\u00ebr sinkronizim, t\u00eb p\u00ebrshkruara n\u00eb literatur\u00ebn shkencore. Po flas p\u00ebr sinkronizimin, kur kemi dy sharda t\u00eb ndryshme. N\u00ebse ka nj\u00eb replik\u00eb-set, atje nuk nevojitet asnj\u00eb sinkronizim: \u00ebsht\u00eb \u00absingle-master\u00bb; kemi OpLog, n\u00eb t\u00eb cilin p\u00ebrfshihen t\u00eb gjitha ndryshimet - n\u00eb k\u00ebt\u00eb rast, gjith\u00e7ka \u00ebsht\u00eb tashm\u00eb renditur n\u00eb m\u00ebnyr\u00eb sekondare brenda vet\u00eb \u00abOpLog\u00bb. Por n\u00ebse kemi dy sharda t\u00eb ndryshme, k\u00ebtu sinkronizimi i koh\u00ebs \u00ebsht\u00eb i r\u00ebnd\u00ebsish\u00ebm. K\u00ebtu or\u00ebt vektoriale ndihmuan m\u00eb shum\u00eb! Por ne nuk i kemi ato.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u00ebnyra e dyt\u00eb e p\u00ebrshtatshme jan\u00eb \u00abHeartbeats\u00bb. Mund t\u00eb shk\u00ebmbehen disa sinjale, q\u00eb ndodhin \u00e7do nj\u00ebsi kohe. Por \u00abHeartbeats\u00bb jan\u00eb shum\u00eb t\u00eb ngadalta, nuk mund t'i sigurojm\u00eb klientit ton\u00eb nj\u00eb latenc\u00eb t\u00eb duhur.<\/p>\n<p>True time - padyshim, \u00ebsht\u00eb nj\u00eb gj\u00eb e shk\u00eblqyer. Por, p\u00ebrs\u00ebri, kjo ndoshta \u00ebsht\u00eb e ardhmja\u2026 Megjithat\u00eb, n\u00eb \u00abAtlas\u00bb ndoshta tashm\u00eb b\u00ebhet, tashm\u00eb ka sinkronizues t\u00eb shpejt\u00eb t\u00eb koh\u00ebs \u00abAmazon\u00bb. Por kjo nuk do t\u00eb jet\u00eb e disponueshme p\u00ebr t\u00eb gjith\u00eb.<\/p>\n<p>Gossiping \u2013 kjo \u00ebsht\u00eb kur t\u00eb gjitha mesazhet p\u00ebrfshijn\u00eb koh\u00ebn. Kjo \u00ebsht\u00eb p\u00ebraf\u00ebrsisht ajo q\u00eb ne p\u00ebrdorim. \u00c7do mesazh midis nodave, drejtuesit, router-i i nodave t\u00eb t\u00eb dh\u00ebnave, absolutisht gjith\u00e7ka p\u00ebr \u00abMongoDB\u00bb \u2013 jan\u00eb disa elemente, komponente t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, q\u00eb mbajn\u00eb or\u00eb q\u00eb rrjedhin. Kudo aty ka nj\u00eb vler\u00eb t\u00eb koh\u00ebs hibride, ajo transmetohet. 64 bit? Kjo \u00ebsht\u00eb e mundur, kjo lejohen.<\/p>\n<h3>Si funksionon e gjitha kjo s\u00eb bashku?<\/h3>\n<p>\nK\u00ebtu po shqyrtoj nj\u00eb replik\u00eb-set p\u00ebr ta b\u00ebr\u00eb pak m\u00eb t\u00eb leht\u00eb. Ka Primary dhe Secondary. Secondary b\u00ebn replikimin dhe nuk \u00ebsht\u00eb gjithmon\u00eb plot\u00ebsisht n\u00eb sinkronizim me Primary.<\/p>\n<p>Nj\u00eb insert ndodh n\u00eb \u00abPrimary\u00bb me nj\u00eb vler\u00eb t\u00eb caktuar kohe. Ky insert rrit nj\u00eb num\u00ebrues t\u00eb brendsh\u00ebm me 11, n\u00ebse kjo \u00ebsht\u00eb maksimale. Ose ai do t\u00eb kontrolloj\u00eb vlerat e or\u00ebve dhe do t\u00eb sinkronizohet sipas or\u00ebve, n\u00ebse vlerat jan\u00eb m\u00eb t\u00eb m\u00ebdha. Kjo lejon renditjen sipas koh\u00ebs.<\/p>\n<p>Pasardh\u00ebs i pas regjistrimit ndodh nj\u00eb moment i r\u00ebnd\u00ebsish\u00ebm. Or\u00ebt n\u00eb \u00abMongoDB\u00bb jan\u00eb t\u00eb inkrementuara vet\u00ebm n\u00eb rastin e regjistrimit n\u00eb \u00abOpLog\u00bb. Kjo \u00ebsht\u00eb ngjarja q\u00eb ndryshon gjendjen e sistemit. Absolute n\u00eb t\u00eb gjitha artikujt klasik\u00eb, ngjarje konsiderohet ndarja e nj\u00eb mesazhi n\u00eb nod: mesazhi erdhi - do t\u00eb thot\u00eb se sistemi ka ndryshuar gjendjen e tij.<\/p>\n<p>Kjo lidhet me faktin se kur b\u00ebhet nj\u00eb hulumtim, nuk \u00ebsht\u00eb krejt\u00ebsisht e qart\u00eb se si do t\u00eb interpretohet kjo mesazh. Ne e dim\u00eb sakt\u00ebsisht se n\u00ebse nuk \u00ebsht\u00eb reflektuar n\u00eb \"Oplog\", at\u00ebher\u00eb nuk do t\u00eb interpretohet n\u00eb asnj\u00eb m\u00ebnyr\u00eb, dhe ndryshimi i gjendjes s\u00eb sistemit \u00ebsht\u00eb vet\u00ebm regjistrimi n\u00eb \"Oplog\". Kjo na e thjeshton gjith\u00e7ka: dhe modeli e thjeshton, dhe lejon t\u00eb mbahet rendi brenda nj\u00eb grup replika, dhe shum\u00eb gj\u00ebra t\u00eb tjera t\u00eb dobishme.<\/p>\n<p>Kthehet nj\u00eb vler\u00eb q\u00eb tashm\u00eb \u00ebsht\u00eb regjistruar n\u00eb \"Oplog\" \u2013 ne e dim\u00eb se n\u00eb \"Oplog\" tashm\u00eb \u00ebsht\u00eb kjo vler\u00eb, dhe koha e saj \u00ebsht\u00eb 12. Tani, le t\u00eb themi se fillon leximi nga nj\u00eb nod tjet\u00ebr (Sekondar), dhe ai e kalon tashm\u00eb afterClusterTime n\u00eb vet\u00eb mesazhin. Ai thot\u00eb: \"M\u00eb duhen t\u00eb gjitha ato q\u00eb ndodh\u00ebn t\u00eb pakt\u00ebn pas 12 ose gjat\u00eb dymb\u00ebdhjet\u00ebs\" (shih figur\u00ebn lart).<\/p>\n<p>Kjo \u00ebsht\u00eb ajo q\u00eb quhet Causal a consistent (CAT). Ka nj\u00eb koncept n\u00eb teori q\u00eb \u00ebsht\u00eb nj\u00eb prerje e caktuar kohe, q\u00eb \u00ebsht\u00eb konsistente me vete. N\u00eb k\u00ebt\u00eb rast mund t\u00eb thuhet se \u00ebsht\u00eb gjendja e sistemit, q\u00eb \u00ebsht\u00eb v\u00ebrejtur n\u00eb momentin e koh\u00ebs 12.<\/p>\n<p>Tani k\u00ebtu nuk ka asgj\u00eb p\u00ebr momentin, sepse kjo simiton situat\u00ebn kur Sekondari duhet t\u00eb replikoj\u00eb t\u00eb dh\u00ebnat nga Primari. Ai po pret\u2026 Dhe k\u00ebtu t\u00eb dh\u00ebnat erdh\u00ebn \u2013 kthen k\u00ebto vlera mbrapa.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/54d9de3e2696c1e5d19f4da206be090b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu funksionon gjith\u00e7ka. N\u00eb thelb.<\/p>\n<p>\u00c7far\u00eb do t\u00eb thot\u00eb \"n\u00eb thelb\"? Le t\u00eb supozojm\u00eb se ka ndonj\u00eb person q\u00eb e ka lexuar dhe kuptuar se si funksionon gjith\u00e7ka. Kuptoi se \u00e7do her\u00eb ndodhi ClusterTime, ai p\u00ebrdit\u00ebson or\u00ebt e tij logjike t\u00eb brendshme, dhe pastaj regjistrimi i ardhsh\u00ebm rritet me nj\u00eb. Kjo funksion do t\u00eb marr\u00eb 20 rreshta. Le t\u00eb themi se ky person kalon numrin m\u00eb t\u00eb madh 64-bit, minus nj\u00eb.<\/p>\n<p>Pse \"minus nj\u00eb\"? Sepse or\u00ebt e brendshme do t\u00eb vendosen n\u00eb k\u00ebt\u00eb vler\u00eb (sigurisht, kjo \u00ebsht\u00eb vlera m\u00eb e madhe e mundshme dhe m\u00eb e madhe se koha aktuale), pastaj do t\u00eb ndodh\u00eb regjistrimi n\u00eb \"Oplog\", dhe or\u00ebt do t\u00eb inkrementohen p\u00ebrs\u00ebri me nj\u00eb \u2013 dhe at\u00ebher\u00eb do t\u00eb jet\u00eb vlera maksimale (atje gjith\u00e7ka jan\u00eb nj\u00eb, nuk ka m\u00eb t\u00eb lart\u00eb, unsaint int\u2019\u00eb).<\/p>\n<p>E qart\u00eb se pas k\u00ebtij momenti sistemi b\u00ebhet krejt\u00ebsisht i pavendosur p\u00ebr \u00e7far\u00ebdo. Ai mund t\u00eb shkarkohet, pastruar \u2013 shum\u00eb pun\u00eb manuale. Disponueshm\u00ebria e plot\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb fakt, n\u00ebse kjo riprodhohet diku tjet\u00ebr, at\u00ebher\u00eb e gjith\u00eb klasteri thyhet. Nj\u00eb situat\u00eb krejt e papranueshme, q\u00eb \u00e7do person mund ta organizoj\u00eb shum\u00eb shpejt dhe leht\u00eb! Prandaj, ne e shqyrtuam k\u00ebt\u00eb aspekt si nj\u00eb nga m\u00eb t\u00eb r\u00ebnd\u00ebsishmit. Si ta parandalojm\u00eb at\u00eb?<\/p>\n<h3>Rruga jon\u00eb - t\u00eb n\u00ebnshkruajm\u00eb clusterTime<\/h3>\n<p>\nK\u00ebshtu ai transmetohet n\u00eb mesazhin (deri te teksti blu). Por ne filluam gjithashtu t\u00eb gjenerojm\u00eb n\u00ebnshkrimin (teksti blu):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/c16e985f9610e01a61293e0d6dde459b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00ebnshkrimi gjenerohet me nj\u00eb \u00e7el\u00ebs, i cili ruhet brenda baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, brenda perimetrave t\u00eb mbrojtur; ai gjenerohet, p\u00ebrdit\u00ebsohet (p\u00ebrdoruesit nuk e shohin k\u00ebt\u00eb). Gjenerohet nj\u00eb hash, dhe \u00e7do mesazh, n\u00eb momentin e krijimit n\u00ebnshkruhet, dhe kur merret - validizohet.<br \/>\nNdoshta, ngrihet nj\u00eb pyetje te njer\u00ebzit: \"Sa shum\u00eb e ngadal\u00ebson gjith\u00e7ka kjo?\" Un\u00eb kam th\u00ebn\u00eb se duhet t\u00eb punoj\u00eb shpejt, ve\u00e7an\u00ebrisht n\u00eb munges\u00eb t\u00eb k\u00ebsaj feature.<\/p>\n<p>\u00c7far\u00eb do t\u00eb thot\u00eb t\u00eb p\u00ebrdor\u00ebsh Causal consistency n\u00eb k\u00ebt\u00eb rast? \u00cbsht\u00eb t\u00eb tregosh parametrin afterClusterTime. Pa k\u00ebt\u00eb, ai thjesht do t\u00eb transmetoj\u00eb vlera n\u00eb \u00e7do rast. Gossiping, duke filluar nga versioni 3.6, punon gjithmon\u00eb.<\/p>\n<p>N\u00ebse ne do t\u00eb l\u00ebm\u00eb gjenerimin e vazhduesh\u00ebm t\u00eb n\u00ebnshkrimeve, at\u00ebher\u00eb kjo do ta ngadal\u00ebsoj\u00eb sistemin edhe n\u00eb munges\u00eb t\u00eb feature, q\u00eb nuk p\u00ebrputhet me qasjet dhe k\u00ebrkesat tona. Por \u00e7far\u00eb b\u00ebm\u00eb ne?<\/p>\n<h3>B\u00ebje shpejt!<\/h3>\n<p>\n\u00cbsht\u00eb nj\u00eb gj\u00eb mjaft e thjesht\u00eb, por truku \u00ebsht\u00eb interesant - do t\u00eb ndaja, ndoshta do t'i interesoj\u00eb dikujt.<br \/>\nKemi nj\u00eb hash, n\u00eb t\u00eb cilin ruhen t\u00eb dh\u00ebnat e n\u00ebnshkruara. T\u00eb gjitha t\u00eb dh\u00ebnat kalojn\u00eb p\u00ebrmes caches. Cache n\u00ebnshkruan jo sakt\u00ebsisht koh\u00ebn, por Range. Kur vjen nj\u00eb vler\u00eb e caktuar, ne gjenerojm\u00eb Range, maskojm\u00eb 16 bit\u00ebt e fundit, dhe k\u00ebt\u00eb vler\u00eb n\u00ebnshkruajm\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuke marr\u00eb nj\u00eb n\u00ebnshkrim t\u00eb till\u00eb, ne shpejtojm\u00eb sistemin (kondicionalisht) 65 mij\u00eb her\u00eb. Ai funksionon shk\u00eblqyesh\u00ebm: kur vendos\u00ebm eksperimente - koha realisht u shkurtua 10 mij\u00eb her\u00eb kur kishim nj\u00eb p\u00ebrdit\u00ebsim t\u00eb radh\u00ebs. \u00cbsht\u00eb e qart\u00eb se kur ato jan\u00eb t\u00eb \u00e7rregullta, kjo nuk ndodh. Por n\u00eb shumic\u00ebn e rasteve praktike, kjo funksionon. Kombinimi i n\u00ebnshkrimit t\u00eb Range s\u00eb bashku me n\u00ebnshkrimin e lejuan zgjidhjen e problemit t\u00eb siguris\u00eb.<\/p>\n<h3>\u00c7far\u00eb m\u00ebsuam?<\/h3>\n<p>\nM\u00ebsimet q\u00eb kemi nxjerr\u00eb nga kjo:<\/p>\n<ul>\n<li>Duhet t\u00eb lexoni materiale, histori, artikuj, sepse kemi shum\u00eb gj\u00ebra interesante p\u00ebr t\u00eb. Kur punojm\u00eb mbi ndonj\u00eb ve\u00e7ori (ve\u00e7an\u00ebrisht tani, kur kemi b\u00ebr\u00eb transaksione etj.), duhet t\u00eb lexojm\u00eb dhe t\u00eb kuptojm\u00eb. Kjo merr koh\u00eb, por n\u00eb t\u00eb v\u00ebrtet\u00eb \u00ebsht\u00eb shum\u00eb e dobishme, sepse b\u00ebhet e qart\u00eb ku jemi. Nuk kemi shpikur asgj\u00eb t\u00eb re - thjesht mor\u00ebm p\u00ebrb\u00ebr\u00ebsit.\n<p>N\u00eb p\u00ebrgjith\u00ebsi, v\u00ebrehet nj\u00eb diferenc\u00eb e caktuar n\u00eb mendim kur ndodh nj\u00eb konferenc\u00eb akademike (p.sh. 'Sigmon') - aty t\u00eb gjith\u00eb p\u00ebrqendrohen n\u00eb idet\u00eb e reja. \u00c7far\u00eb \u00ebsht\u00eb noviteti i algoritmit ton\u00eb? K\u00ebtu nuk ka ndonj\u00eb novitet t\u00eb ve\u00e7ant\u00eb. Noviteti p\u00ebrfundimisht q\u00ebndron n\u00eb m\u00ebnyr\u00ebn se si i kemi p\u00ebrzier qasjet ekzistuese. K\u00ebshtu, e para - duhet t\u00eb lexoni klasik\u00ebt, duke filluar nga Lamport.<\/li>\n<li>N\u00eb prodhim ka k\u00ebrkesa krejt ndryshe. Jam i sigurt se shum\u00eb prej jush nuk p\u00ebrballen me databaza 'sferike' n\u00eb nj\u00eb vakuum abstrakt, por me gj\u00ebra normale, reale, t\u00eb cilat kan\u00eb probleme me disponueshm\u00ebrin\u00eb, vones\u00ebn dhe q\u00ebndrueshm\u00ebrin\u00eb ndaj d\u00ebshtimeve.<\/li>\n<li>E fundit - \u00ebsht\u00eb se na duhej t\u00eb shqyrtonim ide t\u00eb ndryshme dhe t\u00eb kombinonim disa artikuj t\u00eb ndrysh\u00ebm n\u00eb nj\u00eb qasje, s\u00eb bashku. Ideja p\u00ebr n\u00ebnshkrimin, p\u00ebr shembull, erdhi nga nj\u00eb artikull q\u00eb shqyrtonte protokollin Paxos, i cili \u00ebsht\u00eb p\u00ebr failet jo-bizantine brenda protokollit t\u00eb autorizimit, p\u00ebr ato bizantine - jasht\u00eb protokollit t\u00eb autorizimit... N\u00eb thelb, kjo \u00ebsht\u00eb sakt\u00ebsisht ajo q\u00eb ne p\u00ebrfundimisht b\u00ebm\u00eb.\n<p>Nuk ka asgj\u00eb t\u00eb re k\u00ebtu! Por sapo i p\u00ebrzjejm\u00eb t\u00eb gjitha s\u00eb bashku... \u00cbsht\u00eb e ngjashme me t\u00eb th\u00ebn\u00eb se receta e sallat\u00ebs Olivier \u00ebsht\u00eb nj\u00eb budallall\u00ebk, sepse vez\u00ebt, majoneza dhe turshit\u00eb jan\u00eb tashm\u00eb shpikur... Kjo \u00ebsht\u00eb p\u00ebraf\u00ebrsisht e nj\u00ebjta histori.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/2f9e5cb77079f9a0f7bdf76430c3386e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebtu do ta mbyll. Faleminderit!<\/p>\n<h3>Pyetje<\/h3>\n<p>\n<b>Pyetje nga publiko (p\u00ebrkat\u00ebsisht - P):<\/b> \u2013 Faleminderit, Mihail, p\u00ebr referatin! Tema p\u00ebr koh\u00ebn \u00ebsht\u00eb interesante. Ju p\u00ebrdorni Gossiping. T\u00eb thash\u00eb q\u00eb t\u00eb gjith\u00eb kan\u00eb koh\u00ebn e tyre, t\u00eb gjith\u00eb e din\u00eb koh\u00ebn e tyre lokale. E kuptova q\u00eb kemi nj\u00eb shofer - mund t\u00eb ket\u00eb shum\u00eb klient\u00eb me shofer\u00eb, po ashtu shum\u00eb planifikues pyetjesh, shum\u00eb skatash... Po p\u00ebr \u00e7far\u00eb kthehet sistemi n\u00ebse ndonj\u00ebher\u00eb ndodh nj\u00eb diferenc\u00eb: dikush vendos se \u00ebsht\u00eb nj\u00eb minut\u00eb p\u00ebrpara, dikush - nj\u00eb minut\u00eb prapa? Ku do t\u00eb jemi?<\/p>\n<p><b>MT:<\/b> \u2013 \u00cbsht\u00eb nj\u00eb pyetje e shk\u00eblqyer n\u00eb t\u00eb v\u00ebrtet\u00eb! Un\u00eb isha duke menduar p\u00ebr shard-et. N\u00ebse e kuptoj sakt\u00eb pyetjen, kemi k\u00ebt\u00eb situat\u00eb: ka shard 1 dhe shard 2, leximi ndodh nga k\u00ebto dy sharde \u2013 ata kan\u00eb dallime, nuk nd\u00ebrveprojn\u00eb me nj\u00ebri-tjetrin, sepse koha q\u00eb ata din\u00eb \u2013 \u00ebsht\u00eb e ndryshme, ve\u00e7an\u00ebrisht koha q\u00eb ata kan\u00eb n\u00eb oplog.<br \/>\nSupozoni se shard 1 ka b\u00ebr\u00eb nj\u00eb milion regjistrime, shard 2 \u2013 asgj\u00eb, dhe k\u00ebrkesa erdhi n\u00eb dy sharde. Dhe i pari ka afterClusterTime m\u00eb t\u00eb madh se nj\u00eb milion. N\u00eb nj\u00eb situat\u00eb t\u00eb till\u00eb, si\u00e7 e shpjegova, shard 2 kurr\u00eb nuk do t\u00eb p\u00ebrgjigjet.<\/p>\n<p><b>P:<\/b> \u2013 Doja t\u00eb dija se si sinkronizohen dhe si zgjedhin nj\u00eb koh\u00eb logjike.<\/p>\n<p><b>MT:<\/b> \u2013 Shum\u00eb thjesht\u00eb sinkronizohen. Shard-i, kur merr afterClusterTime dhe nuk gjen koh\u00ebn n\u00eb \"Oplog\", inicion no approved. Pra, ai e rrit me dor\u00eb koh\u00ebn e tij n\u00eb k\u00ebt\u00eb vler\u00eb. Kjo do t\u00eb thot\u00eb se ai nuk ka ngjarje q\u00eb i p\u00ebrgjigjen k\u00ebsaj k\u00ebrkese. Ai krijon k\u00ebt\u00eb ngjarje artificialisht dhe n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb b\u00ebhet Causal Consistent.<\/p>\n<p><b>P:<\/b> \u2013 E n\u00ebse pas k\u00ebsaj, ndodhin ndonj\u00eb ngjarje q\u00eb jan\u00eb humbur n\u00eb rrjet diku?<\/p>\n<p><b>MT:<\/b> \u2013 Shard-i \u00ebsht\u00eb nd\u00ebrtuar n\u00eb m\u00ebnyr\u00eb q\u00eb ato nuk do t\u00eb vijn\u00eb m\u00eb, pasi \u00ebsht\u00eb nj\u00eb master i vet\u00ebm. N\u00ebse ai e ka regjistruar at\u00eb, ato nuk do t\u00eb vijn\u00eb m\u00eb, por do t\u00eb vijn\u00eb m\u00eb von\u00eb. Nuk mund t\u00eb ndodh\u00eb q\u00eb diku di\u00e7ka t\u00eb ngec\u00eb, pastaj ai t\u00eb b\u00ebj\u00eb no write, dhe pastaj k\u00ebto ngjarje t\u00eb vijn\u00eb \u2013 dhe t\u00eb prishin Causal consistency. Kur ai b\u00ebn no write, ato duhet t\u00eb vijn\u00eb m\u00eb von\u00eb (ai i pret).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/dbbc7c5c653f0c9fa449cceb88ed62ef.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>P:<\/b> \u2013 Kam disa pyetje n\u00eb lidhje me radh\u00ebt. Causal consistency supozon se ka nj\u00eb radh\u00eb t\u00eb caktuar veprimesh q\u00eb duhet t\u00eb realizohen. \u00c7far\u00eb ndodh n\u00ebse ne humbim nj\u00eb paket\u00eb? K\u00ebtu ka shkuar 10-ta, 11\u2026 paketa 12 ka humbur, dhe t\u00eb gjitha t\u00eb tjerat presin q\u00eb ta realizojn\u00eb. Dhe papritmas makina vdiq, ne nuk mund t\u00eb b\u00ebjm\u00eb asgj\u00eb. A ka ndonj\u00eb gjat\u00ebsi maksimale t\u00eb radh\u00ebs, e cila akumulohet para se t\u00eb realizohet? Cili \u00ebsht\u00eb d\u00ebshtimi fatal n\u00eb rast t\u00eb humbjes s\u00eb ndonj\u00eb gjendjeje? P\u00ebr m\u00eb tep\u00ebr, n\u00ebse ne regjistrojm\u00eb se ka nj\u00eb gjendje t\u00eb m\u00ebparshme, ne duhet t\u00eb fillojm\u00eb nga ajo, apo jo? Por ne nuk u nis\u00ebm nga ajo!<\/p>\n<p><b>MT:<\/b> \u2013 Po, gjithashtu nj\u00eb pyetje e shk\u00eblqyer! \u00c7far\u00eb b\u00ebjm\u00eb ne? N\u00eb MongoDB ka nj\u00eb koncept t\u00eb regjistrimeve kuorum dhe leximeve kuorum. N\u00eb cilat raste nj\u00eb mesazh mund t\u00eb humbas\u00eb? Kur regjistrimi \u00ebsht\u00eb jo kuorum ose kur leximi nuk \u00ebsht\u00eb kuorum (gjithashtu mund t\u00eb mbetet ndonj\u00eb garbage).<br \/>\nP\u00ebrsa i p\u00ebrket konsistenc\u00ebs kauzale, kemi kryer nj\u00eb verifikim t\u00eb madh eksperimental, i cili tregoi se n\u00eb rastin kur regjistrimet dhe leximi jan\u00eb jo-kvorum, ndodhin shkelje t\u00eb konsistenc\u00ebs kauzale. Pik\u00ebrisht si\u00e7 thoni ju!<\/p>\n<p>K\u00ebshilla jon\u00eb: t\u00eb p\u00ebrdoret t\u00eb pakt\u00ebn leximi kvorum gjat\u00eb p\u00ebrdorimit t\u00eb konsistenc\u00ebs kauzale. N\u00eb k\u00ebt\u00eb rast, asgj\u00eb nuk do t\u00eb humbas\u00eb, madje edhe n\u00ebse regjistrimi kvorum humbet... Kjo \u00ebsht\u00eb nj\u00eb situat\u00eb ortogonale: n\u00ebse p\u00ebrdoruesi nuk d\u00ebshiron q\u00eb t\u00eb humbasin t\u00eb dh\u00ebnat, duhet t\u00eb p\u00ebrdor\u00eb regjistrim kvorum. Konsistenca kauzale nuk ofron garanci p\u00ebr q\u00ebndrueshm\u00ebri. Garancia p\u00ebr q\u00ebndrueshm\u00ebri ofrohet nga replikimi dhe mekanizmat q\u00eb lidhen me replikimin.<\/p>\n<p><b>P:<\/b> \u2013 Kur krijojm\u00eb nj\u00eb instanc\u00eb, q\u00eb i b\u00ebn sharding (jo master, por slave p\u00ebrkat\u00ebsisht), ajo mb\u00ebshtetet n\u00eb koh\u00ebn unix t\u00eb vet\u00eb makin\u00ebs ose n\u00eb koh\u00ebn e \"masterit\"; a sinkronizohet her\u00ebn e par\u00eb apo periodikisht?<\/p>\n<p><b>MT:<\/b> \u2013 Tani do t\u00eb sqarohem. Shardi (pra, partitoni horizontal) ka gjithmon\u00eb nj\u00eb Primar. N\u00eb shard mund t\u00eb ket\u00eb \"master\" dhe mund t\u00eb ket\u00eb replika. Por shardi gjithmon\u00eb mb\u00ebshtet regjistrimin, sepse duhet t\u00eb mb\u00ebshtes\u00eb nj\u00eb domen t\u00eb caktuar (n\u00eb shard sht\u00eb Primari).<\/p>\n<p><b>P:<\/b> \u2013 Pra, gjith\u00e7ka varet ngusht\u00eb nga \"masteri\"? A p\u00ebrdoret gjithmon\u00eb koha e \"masterit\"?<\/p>\n<p><b>MT:<\/b> \u2013 Po. Mund ta themi figurativisht: or\u00ebt bien, kur ndodh regjistrimi n\u00eb \"master\", n\u00eb \"OpLog\".<\/p>\n<p><b>P:<\/b> \u2013 Ne kemi nj\u00eb klient, i cili lidhet, dhe nuk ka nevoj\u00eb t\u00eb dij\u00eb asgj\u00eb p\u00ebr koh\u00ebn?<\/p>\n<p><b>MT:<\/b> \u2013 Asgj\u00eb nuk ka nevoj\u00eb t\u00eb dij\u00eb! N\u00ebse flasim p\u00ebr m\u00ebnyr\u00ebn se si funksionon tek klienti: klienti, kur d\u00ebshiron t\u00eb p\u00ebrdor\u00eb konsistenc\u00ebn kauzale, duhet t\u00eb hap\u00eb nj\u00eb sesion. Tani atje ka gjith\u00e7ka: dhe transaksionet n\u00eb sesion, dhe retrieve a rights\u2026 Sesioni \u00ebsht\u00eb nj\u00eb renditje e ngjarjeve logjike q\u00eb ndodhin me klientin.<\/p>\n<p>N\u00ebse ai hap k\u00ebt\u00eb sesion dhe atje thot\u00eb se d\u00ebshiron konsistenc\u00eb kauzale (n\u00ebse sipas parazgjedhjes sesioni mb\u00ebshtet konsistenc\u00ebn kauzale), gjith\u00e7ka funksionon automatikisht. Driver-i mbart k\u00ebt\u00eb koh\u00eb dhe e rrit at\u00eb kur merr nj\u00eb mesazh t\u00eb ri. Ai mbart se \u00e7far\u00eb p\u00ebrgjigjeje kishte kthyer m\u00eb par\u00eb serveri, i cili ktheu t\u00eb dh\u00ebnat. K\u00ebrkesa e ardhshme do t\u00eb p\u00ebrmbaj\u00eb afterCluster (\"koha m\u00eb e madhe se kjo\").<\/p>\n<p>Klienti nuk ka nevoj\u00eb t\u00eb dij\u00eb asgj\u00eb! Kjo \u00ebsht\u00eb plot\u00ebsisht e paqart\u00eb p\u00ebr t\u00eb. N\u00ebse njer\u00ebzit p\u00ebrdorin k\u00ebto karakteristika, \u00e7far\u00eb lejohet t\u00eb b\u00ebjn\u00eb? E para, mund t\u00eb lexojn\u00eb sigurt\u00eb nga secondaries: mund t\u00eb shkruajn\u00eb n\u00eb Primary dhe t\u00eb lexojn\u00eb nga secondaries q\u00eb jan\u00eb replikuar gjeografikisht dhe t\u00eb jen\u00eb t\u00eb sigurt se kjo funksionon. Po ashtu, seancat q\u00eb jan\u00eb regjistruar n\u00eb Primary mund t\u00eb kalohen n\u00eb Secondary, dmth. mund t\u00eb p\u00ebrdoren disa seanca.<\/p>\n<p><b>P:<\/b> \u2013 Tematika e Konsistenc\u00ebs Eventuale \u00ebsht\u00eb shum\u00eb e lidhur me nj\u00eb shtres\u00eb t\u00eb re t\u00eb Shkenc\u00ebs Kompjuterike \u2013 llojet e t\u00eb dh\u00ebnave CRDT (Tipet e Dh\u00ebnash t\u00eb Riplikuar pa Konflikte). A keni shqyrtuar integrimin e k\u00ebtyre llojeve t\u00eb t\u00eb dh\u00ebnave n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave dhe \u00e7far\u00eb mund t\u00eb thoni p\u00ebr k\u00ebt\u00eb?<\/p>\n<p><b>MT:<\/b> \u2013 N\u00eb pyetje t\u00eb mir\u00eb! CRDT ka kuptim p\u00ebr konfliktet gjat\u00eb regjistrimit: n\u00eb MongoDB \u2013 nj\u00eb master i vet\u00ebm.<\/p>\n<p><b>P:<\/b> \u2013 Kam nj\u00eb pyetje nga devops-at. N\u00eb bot\u00ebn reale, ndodhin situata t\u00eb tilla hezituese, kur ndodhin d\u00ebshtime bizantine, dhe njer\u00ebz t\u00eb k\u00ebqij brenda perimeterit t\u00eb mbrojtur fillojn\u00eb t\u00eb hetojn\u00eb protokollin, d\u00ebrgojn\u00eb paketa t\u00eb krijuara posa\u00e7\u00ebrisht?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/99a521d04b416e6978aa68ce7c4a4c46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<b>MT:<\/b> \u2013 Njer\u00ebzit e k\u00ebqij brenda perimeterit jan\u00eb ashtu si nj\u00eb kal\u00eb Troje! Njer\u00ebzit e k\u00ebqij brenda perimeterit mund t\u00eb b\u00ebjn\u00eb shum\u00eb gj\u00ebra t\u00eb k\u00ebqija.<\/p>\n<p><b>P:<\/b> \u2013 \u00cbsht\u00eb e qart\u00eb se t\u00eb l\u00ebsh nj\u00eb \"vrim\u00eb\" n\u00eb server, n\u00eb nj\u00eb m\u00ebnyr\u00eb, p\u00ebrmes s\u00eb cil\u00ebs mund t\u00eb kalosh nj\u00eb zoologji elefant\u00ebsh dhe t\u00eb shemb\u00ebsh t\u00ebr\u00eb klasterin p\u00ebrgjithmon\u00eb\u2026 Do t\u00eb nevojitet koh\u00eb p\u00ebr rikuperim manual\u2026 Kjo, leht\u00ebsisht, \u00ebsht\u00eb e gabuara. Nga ana tjet\u00ebr, \u00ebsht\u00eb interesante t\u00eb dihet: n\u00eb jet\u00ebn reale, ndodhin raste t\u00eb tilla kur sulmet e brendshme ndodhin natyrsh\u00ebm?<\/p>\n<p><b>MT:<\/b> \u2013 Pasi nuk i has shpesh d\u00ebshtimet e siguris\u00eb n\u00eb jet\u00ebn reale, nuk mund t\u00eb them \u2013 ndoshta ato ndodhin. Por n\u00ebse flasim p\u00ebr filozofin\u00eb zhvillimore, ne mendojm\u00eb k\u00ebshtu: kemi nj\u00eb perimet\u00ebr q\u00eb siguron ekipi q\u00eb merret me sigurin\u00eb \u2013 ky \u00ebsht\u00eb nj\u00eb \u00e7el\u00ebs, nj\u00eb mur; dhe brenda perimeterit mund t\u00eb b\u00ebjm\u00eb gjith\u00e7ka q\u00eb duam. \u00cbsht\u00eb e qart\u00eb se ka p\u00ebrdorues q\u00eb kan\u00eb vet\u00ebm mund\u00ebsin\u00eb p\u00ebr t\u00eb par\u00eb, dhe ka p\u00ebrdorues me mund\u00ebsin\u00eb p\u00ebr t\u00eb fshir\u00eb katalogun.<\/p>\n<p>N\u00eb var\u00ebsi t\u00eb t\u00eb drejtave, d\u00ebmi q\u00eb p\u00ebrdoruesit mund t\u00eb shkaktojn\u00eb, mund t\u00eb jet\u00eb si nj\u00eb mi, por mund t\u00eb jet\u00eb edhe si nj\u00eb elefant. \u00cbsht\u00eb e qart\u00eb se nj\u00eb p\u00ebrdorues me t\u00eb drejta t\u00eb plota mund t\u00eb b\u00ebj\u00eb gj\u00ebra t\u00eb gjitha. Nj\u00eb p\u00ebrdorues me t\u00eb drejta m\u00eb t\u00eb kufizuara mund t\u00eb shkaktoj\u00eb d\u00ebm shum\u00eb m\u00eb t\u00eb vog\u00ebl. N\u00eb ve\u00e7anti, ai nuk mund t\u00eb prish\u00eb sistemin.<\/p>\n<p><b>P:<\/b> \u2013 N\u00eb perimetrin e mbrojtur, dikush po p\u00ebrpiqet t\u00eb formoj\u00eb protokolle t\u00eb papritura p\u00ebr serverin, duke e vendosur at\u00eb n\u00eb rrezik, dhe n\u00ebse ka fat, ndoshta edhe t\u00eb gjith\u00eb klasterin\u2026 A \u00ebsht\u00eb ndonj\u00ebher\u00eb aq \"e mir\u00eb\"?<\/p>\n<p><b>MT:<\/b> \u2013 Nuk kam d\u00ebgjuar asnj\u00ebher\u00eb p\u00ebr gj\u00ebra t\u00eb tilla. Nuk \u00ebsht\u00eb sekret q\u00eb mund t\u00eb d\u00ebshtosh serverin n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb. T\u00eb d\u00ebshtosh brenda, duke qen\u00eb nj\u00eb p\u00ebrdorues i autorizuar q\u00eb mund t\u00eb shkruaj\u00eb di\u00e7ka n\u00eb mesazh\u2026 N\u00eb t\u00eb v\u00ebrtet\u00eb nuk \u00ebsht\u00eb e mundur, sepse gjithsesi do t\u00eb verifikohet. Ka mund\u00ebsi p\u00ebr t\u00eb \u00e7aktivizuar k\u00ebt\u00eb autentifikim p\u00ebr ata p\u00ebrdorues q\u00eb nuk duan \u2013 kjo \u00ebsht\u00eb pastaj problemi i tyre; ata, n\u00eb m\u00ebnyr\u00eb t\u00eb ashp\u00ebr, e kan\u00eb shembur murin dhe mund t\u00eb futin aty nj\u00eb elefant q\u00eb do t'i shkat\u00ebrroj\u00eb\u2026 N\u00eb t\u00eb v\u00ebrtet\u00eb, mund t\u00eb vish si riparues, t\u00eb vish dhe t\u00eb nxjerr\u00ebsh!<\/p>\n<p><b>P:<\/b> \u2013 Faleminderit p\u00ebr raportin. Sergei (\"Yandex\"). N\u00eb \"Mongo\" ka nj\u00eb konstant\u00eb q\u00eb kufizon numrin e an\u00ebtar\u00ebve votues n\u00eb Replica Set, dhe kjo konstant\u00eb \u00ebsht\u00eb 7 (shtat\u00eb). Pse \u00ebsht\u00eb kjo nj\u00eb konstant\u00eb? Pse nuk \u00ebsht\u00eb ndonj\u00eb paramet\u00ebr?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set mund t\u00eb ket\u00eb deri n\u00eb 40 node. Atje gjithmon\u00eb ka shumic\u00eb. Nuk e di cila \u00ebsht\u00eb versione\u2026<\/p>\n<p><b>P:<\/b> \u2013 N\u00eb Replica Set mund t\u00eb aktivizosh an\u00ebtar\u00eb jo-votues, por votuesit \u2013 maksimumi 7. Si t\u00eb p\u00ebrballohet ndalesa n\u00eb k\u00ebt\u00eb rast, n\u00ebse kemi nj\u00eb Replica Set t\u00eb shp\u00ebrndar\u00eb n\u00eb 3 qendra t\u00eb dh\u00ebnash? Nj\u00eb qend\u00ebr e dh\u00ebnash mund t\u00eb fiket leht\u00ebsisht, dhe nj\u00eb makin\u00eb tjet\u00ebr mund t\u00eb bie jasht\u00eb.<\/p>\n<p><b>MT:<\/b> \u2013 Kjo tashm\u00eb \u00ebsht\u00eb pak jasht\u00eb raportit. Ky \u00ebsht\u00eb nj\u00eb pyetje e p\u00ebrgjithshme. Mund ta tregoj m\u00eb von\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, Mikhail Tyulenev (MongoDB): Konsistenc\u00eb t\u00eb rast\u00ebsishme: nga teoria n\u00eb praktik\u00eb\" 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=\"Luaj videon\" 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>Pak reklam\u00eb \ud83d\ude42<\/h3>\n<p>\nFaleminderit q\u00eb po q\u00ebndroni me ne. Ju p\u00eblqen artikujt tan\u00eb? Doni t\u00eb shihni m\u00eb shum\u00eb materiale interesante? Na mb\u00ebshtesni duke b\u00ebr\u00eb nj\u00eb porosi ose duke rekomanduar tek miqt\u00eb tuaj, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud p\u00ebr zhvillues nga $4.99<\/a><\/noindex>, <b>nj\u00eb analog unik i server\u00ebve entry-level q\u00eb e kemi shpikur p\u00ebr Ju:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">E gjith\u00eb e v\u00ebrteta n\u00eb lidhje me VPS (KVM) E5-2697 v3 (6 B\u00ebrthama) 10GB DDR4 480GB SSD 1Gbps nga $19 ose si ta ndajm\u00eb sakt\u00ebsisht serverin?<\/a><\/noindex> (opcionet me RAID1 dhe RAID10, deri n\u00eb 24 b\u00ebrthama dhe deri n\u00eb 40GB DDR4 jan\u00eb t\u00eb disponueshme).<\/p>\n<p><b>Dell R730xd dyfish m\u00eb i lir\u00eb n\u00eb qend\u00ebr t\u00eb t\u00eb dh\u00ebnave Equinix Tier IV n\u00eb Amsterdam?<\/b> Vet\u00ebm te ne <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 nga $199<\/a><\/noindex> n\u00eb Holand\u00eb! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 nga $99!<\/b><\/b> Lexoni rreth <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Si t\u00eb nd\u00ebrtoni nj\u00eb infrastruktur\u00eb t\u00eb klas\u00ebs korporative me p\u00ebrdorimin e server\u00ebve Dell R730xd E5-2650 v4 me \u00e7mim 9000 euro p\u00ebr pak para?<\/a><\/noindex><br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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 Tyulenyev (MongoDB): Konsistenca Kausale: nga teoria n\u00eb praktik\u00eb | ProHoster","description":"Konferenca e ardhshme HighLoad++ do t\u00eb zhvillohet m\u00eb 6 dhe 7 prill 2020 n\u00eb Sh\u00ebn Petersburg. Detajet dhe biletat n\u00eb lidhje.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/highload-mihail-tyulenev-mongodb-causal-consistency-ot-teorii-k-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/56365","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=56365"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/56365\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=56365"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=56365"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=56365"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}