{"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++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 \/>\nT\u00eb dh\u00ebnat dhe biletat <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/2sSxgBx\">n\u00eb lidhje<\/a><\/noindex>. HighLoad++ Siberia 2019. Salla \"Krasnojarsk\". 25 qershor, 12:00. T\u00ebzat 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++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 p\u00ebrplasen me teorin\u00eb, ku aspekte t\u00eb r\u00ebnd\u00ebsishme p\u00ebr produktin komercial nuk merren parasysh. N\u00eb k\u00ebt\u00eb prezantim paraqitet procesi i zgjedhjes dhe kombinimit t\u00eb qasjeve t\u00eb ndryshme p\u00ebr krijimin e komponent\u00ebve t\u00eb Causal consistency, bazuar n\u00eb studime akademike, duke u bazuar n\u00eb k\u00ebrkesat e produkteve komerciale. D\u00ebgjuesit do t\u00eb m\u00ebsojn\u00eb p\u00ebr qasjet teorike ekzistuese ndaj logical clocks, tracking t\u00eb var\u00ebsive, sigurin\u00eb e sistemeve, sinkronizimin e or\u00ebve, dhe pse MongoDB zgjodhi disa nga k\u00ebto zgjidhje.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><b>Mikhail Tyulenyev (m\u00eb pas \u2013 MT):<\/b> \u2013 Do t\u00eb flas p\u00ebr Causal consistency \u2013 kjo \u00ebsht\u00eb nj\u00eb ve\u00e7ori mbi t\u00eb cil\u00ebn kemi punuar n\u00eb MongoDB. Punoj n\u00eb grupin e sistemeve t\u00eb shp\u00ebrndara, ne e zhvilluam at\u00eb rreth dy vjet m\u00eb par\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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, duhej t\u00eb familiarizohem me nj\u00eb num\u00ebr t\u00eb madh k\u00ebrkimesh akademike, pasi kjo ve\u00e7ori \u00ebsht\u00eb studiuar mjaft mir\u00eb. Doli q\u00eb asnj\u00eb artikull nuk p\u00ebrputhet me at\u00eb q\u00eb k\u00ebrkohet n\u00eb prodhim, duke pasur parasysh k\u00ebrkesa shum\u00eb specifike q\u00eb ka \u00e7do aplikacion prodhimi.<\/p>\n<p>Do t\u00eb flas p\u00ebr at\u00eb se si ne, si konsumator\u00eb t\u00eb k\u00ebrkimeve akademike, p\u00ebrgatisim di\u00e7ka q\u00eb m\u00eb pas mund t'ia paraqesim p\u00ebrdoruesve tan\u00eb si nj\u00eb pjat\u00eb t\u00eb gatshme, t\u00eb leht\u00eb dhe t\u00eb sigurt p\u00ebr t'u p\u00ebrdorur.<\/p>\n<h3>Causal consistency. Le t\u00eb sqarojm\u00eb disa koncepte<\/h3>\n<p>\nP\u00ebr fillim, dua t\u00eb them n\u00eb terma t\u00eb p\u00ebrgjithsh\u00ebm se \u00e7far\u00eb \u00ebsht\u00eb Causal consistency. Jan\u00eb dy personazhe \u2013 Leonard dhe Penny (seriali \"Teoria e Big Bangut\"):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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, dhe Leonard d\u00ebshiron t'i b\u00ebj\u00eb nj\u00eb surpriz\u00eb, nj\u00eb fest\u00eb. Dhe ai nuk di \u00e7far\u00eb tjet\u00ebr t\u00eb b\u00ebj\u00eb, sesa ta heq\u00eb at\u00eb nga lista e miqve, dhe t\u00eb d\u00ebrgoj\u00eb nj\u00eb azhurnim n\u00eb feed-in e t\u00eb gjith\u00ebve: \"Le t\u00eb g\u00ebzojm\u00eb Penny-n!\" (ajo \u00ebsht\u00eb n\u00eb Evrop\u00eb, p\u00ebr momentin fle, nuk e sheh k\u00ebt\u00eb dhe nuk mund ta shoh\u00eb, sepse nuk \u00ebsht\u00eb aty). N\u00eb fund, ai e fshin k\u00ebt\u00eb postim, e fshin nga \"Feed-i\" dhe rivendos aksesin, q\u00eb ajo t\u00eb mos e kuptoj\u00eb dhe t\u00eb mos ket\u00eb z\u00ebnk\u00eb.<br \/>\nKjo \u00ebsht\u00eb e shk\u00eblqyer, por le t\u00eb supozojm\u00eb se sistemi \u00ebsht\u00eb shp\u00ebrndar\u00eb, dhe ngjarjet ndodh\u00ebn ndryshe. Mund t\u00eb ndodh\u00eb, p\u00ebr shembull, q\u00eb kufizimi i aksesit p\u00ebr Penny ndodhi pasi ky postim u shfaq, n\u00ebse ngjarjet nuk jan\u00eb t\u00eb lidhura me nj\u00ebra-tjetr\u00ebn me lidhje p\u00ebrkat\u00ebsie. N\u00eb thelb, kjo \u00ebsht\u00eb nj\u00eb shembull se si nevojitet Causal consistency p\u00ebr t\u00eb realizuar nj\u00eb funksion biznesi (n\u00eb k\u00ebt\u00eb rast).<\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, k\u00ebto jan\u00eb cil\u00ebsi mjaft jo triviale t\u00eb bazave t\u00eb dh\u00ebnash \u2013 shum\u00eb pak i mb\u00ebshtesin ato. Le t\u00eb kalojm\u00eb n\u00eb modelet.<\/p>\n<h3>Modelet e konsistenc\u00ebs<\/h3>\n<p>\n\u00c7far\u00eb \u00ebsht\u00eb model konsistence n\u00eb bazat e dh\u00ebnash? K\u00ebto jan\u00eb disa garantime q\u00eb nj\u00eb sistem i shp\u00ebrndar\u00eb jep lidhur me at\u00eb se cilat t\u00eb dh\u00ebna dhe n\u00eb cil\u00ebn rend mundet klienti t\u00eb marr\u00eb.<\/p>\n<p>N\u00eb thelb, t\u00eb gjitha modelet e konsistenc\u00ebs reduktohen n\u00eb at\u00eb se sa i ngjan nj\u00eb sistem i shp\u00ebrndar\u00eb nj\u00eb sistemi q\u00eb punon, p\u00ebr shembull, n\u00eb nj\u00eb nod t\u00eb vet\u00ebm n\u00eb nj\u00eb laptop. Dhe sa i ngjan nj\u00eb sistem q\u00eb punon n\u00eb mij\u00ebra nod\u00eb t\u00eb shp\u00ebrndara, laptopit, ku t\u00eb gjitha k\u00ebto ve\u00e7ori plot\u00ebsohen automatikisht.<\/p>\n<p>Prandaj, modelet e konsistenc\u00ebs aplikohen vet\u00ebm n\u00eb sistemet e shp\u00ebrndara. T\u00eb gjitha sistemet q\u00eb m\u00eb par\u00eb ekzistonin dhe punonin n\u00eb nj\u00eb shkall\u00eb vertikale, nuk kishin k\u00ebto probleme. Atje kishte nj\u00eb Buffer Cache, dhe gjith\u00e7ka e lexonte nga ai gjithmon\u00eb.<\/p>\n<h3>Modeli Strong<\/h3>\n<p>\nSakt\u00ebsisht, modeli i par\u00eb \u00ebsht\u00eb Strong (ose linearity, si\u00e7 quhet shpesh). Ky \u00ebsht\u00eb nj\u00eb model konsistence q\u00eb garanton q\u00eb \u00e7do ndryshim, sapo marrim konfirmimin q\u00eb 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 ngjarjeve n\u00eb Baze t\u00eb Dh\u00ebnash. Kjo \u00ebsht\u00eb nj\u00eb cil\u00ebsi shum\u00eb e fort\u00eb e konsistenc\u00ebs dhe \u00ebsht\u00eb mjaft e kushtueshme. Megjithat\u00eb, ajo mb\u00ebshtetet shum\u00eb mir\u00eb. Thjesht \u00ebsht\u00eb shum\u00eb e shtrenjt\u00eb dhe e ngadalshme \u2013 prandaj p\u00ebrdoret rrall\u00eb. Kjo quhet linearitet.<\/p>\n<p>Ka nj\u00eb ve\u00e7ori tjet\u00ebr, madje m\u00eb t\u00eb fort\u00eb, e cila mbahet n\u00eb \"Spanner\" \u2013 e quajtur Konsistenca Eksterne. Do ta diskutojm\u00eb k\u00ebt\u00eb m\u00eb von\u00eb.<\/p>\n<h3>Causal<\/h3>\n<p>\nNj\u00eb tjet\u00ebr \u00ebsht\u00eb Causal, q\u00eb \u00ebsht\u00eb ajo p\u00ebr t\u00eb cil\u00ebn kam folur. Nd\u00ebrmjet Strong dhe Causal ekzistojn\u00eb disa nivele t\u00eb tjer\u00eb q\u00eb nuk do t\u00eb flas p\u00ebr to, por t\u00eb gjitha ato reduktohen n\u00eb Causal. Ky \u00ebsht\u00eb nj\u00eb model i r\u00ebnd\u00ebsish\u00ebm, sepse \u00ebsht\u00eb konsistenca m\u00eb e fort\u00eb e t\u00eb gjitha modele, konsistenca m\u00eb e fort\u00eb n\u00eb pranin\u00eb e rrjeteve ose ndarjeve.<\/p>\n<p>Causals \u2013 \u00ebsht\u00eb situata ku ngjarjet jan\u00eb t\u00eb lidhura me nj\u00ebra-tjetr\u00ebn me nj\u00eb lidhje shkak\u00ebsore. Shpesh her\u00eb, ato kuptohen si Read your on rights nga perspektiva e klientit. N\u00ebse klienti ka v\u00ebzhguar disa vlera, ai nuk mund t\u00eb shikoj\u00eb vlerat q\u00eb ishin n\u00eb t\u00eb kaluar\u00ebn. Ai fillon t\u00eb shoh\u00eb leximet me prefiks. E gjitha kjo reduktohet n\u00eb t\u00eb nj\u00ebjt\u00ebn gj\u00eb.<br \/>\nCausals si model konsistence \u2013 nj\u00eb renditje e pjesshme e ngjarjeve n\u00eb server, ku ngjarjet nga t\u00eb gjith\u00eb klient\u00ebt v\u00ebzhgohen 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 \u2013 \u00ebsht\u00eb Eventual Consistency. Ky \u00ebsht\u00eb nj\u00eb model q\u00eb mb\u00ebshtetet nga t\u00eb gjitha sistemet e shp\u00ebrndara, nj\u00eb model minimal q\u00eb ka ndonj\u00eb kuptim. Ai do t\u00eb thot\u00eb se: kur ndodhin disa ndryshime n\u00eb t\u00eb dh\u00ebna, ato n\u00eb nj\u00eb moment b\u00ebhen konsistente.<\/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 i popullarizuar, m\u00eb i p\u00ebrhapuri. Si parazgjedhje, t\u00eb gjith\u00eb p\u00ebrdoruesit e sistemeve t\u00eb shp\u00ebrndara p\u00ebrdorin sakt\u00ebsisht Eventual Consistency.<\/p>\n<p>Dua t\u00eb jap disa shembuj krahasues:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 konsistenc\u00ebs, ajo b\u00ebhet m\u00eb e madhe p\u00ebr arsye t\u00eb qarta: duhen b\u00ebr\u00eb m\u00eb shum\u00eb regjistrime, t\u00eb merret nj\u00eb konfirmim nga t\u00eb gjitha host-t\u00eb dhe nodet q\u00eb jan\u00eb pjes\u00eb e klasterit, se t\u00eb dh\u00ebnat jan\u00eb aty. P\u00ebrkat\u00ebsisht, n\u00eb Eventual Consistency, p\u00ebrgjigjja m\u00eb e shpejt\u00eb \u00ebsht\u00eb, sepse aty, zakonisht, mund t\u00eb angazhoheni madje edhe n\u00eb memory dhe kjo do t\u00eb ishte mjaft e mjaftueshme.<\/li>\n<li><b>Availability.<\/b> N\u00ebse e kuptojm\u00eb si mund\u00ebsi t\u00eb sistemit p\u00ebr t\u00eb p\u00ebrgjigjur n\u00eb prani t\u00eb \u00e7arjeve t\u00eb rrjetit, partitions, ose ndonj\u00eb d\u00ebshtimi \u2013 q\u00ebndrueshm\u00ebria rritet me uljen e modelit t\u00eb konsistenc\u00ebs, sepse mjafton q\u00eb nj\u00eb host t\u00eb jet\u00eb n\u00eb funksion dhe t\u00eb ofroj\u00eb disa t\u00eb dh\u00ebna. Eventual Consistency nuk garanton asgj\u00eb p\u00ebr t\u00eb dh\u00ebnat \u2013 ato mund t\u00eb jen\u00eb \u00e7far\u00ebdo.<\/li>\n<li><b>Anomalies.<\/b> Megjithat\u00eb, natyrisht, rritet numri i anomali-ve. N\u00eb Strong Consistency, ato pothuajse nuk duhet t\u00eb ekzistojn\u00eb, nd\u00ebrsa n\u00eb Eventual Consistency ato mund t\u00eb jen\u00eb \u00e7far\u00ebdo. Lind pyetja: pse e zgjedhin njer\u00ebzit Eventual Consistency, kur ajo p\u00ebrmban anomali? P\u00ebrgjigja \u00ebsht\u00eb se modelet e Eventual Consistency jan\u00eb t\u00eb aplikueshme, dhe anomalit\u00eb ekzistojn\u00eb, p\u00ebr shembull, p\u00ebr nj\u00eb periudh\u00eb t\u00eb shkurt\u00ebr; ka mund\u00ebsin\u00eb p\u00ebr t\u00eb p\u00ebrdorur master p\u00ebr t\u00eb lexuar dhe n\u00eb m\u00ebnyr\u00eb m\u00eb ose m\u00eb pak p\u00ebr t\u00eb lexuar t\u00eb dh\u00ebna konsistente; shpesh ka mund\u00ebsi p\u00ebr t\u00eb p\u00ebrdorur modele t\u00eb forta konsistence. Praktikisht, kjo funksionon, dhe shpesh 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 shihni fjal\u00ebt konsistenc\u00eb, disponueshm\u00ebri \u2013 \u00e7far\u00eb ju vjen n\u00eb mend? E sakt\u00eb \u2013 teorema CAP! Dua t\u00eb heq nj\u00eb mit\u2026 Nuk jam un\u00eb \u2013 ka Martin Kleppmann, i cili ka shkruar nj\u00eb artikull t\u00eb shk\u00eblqyer, nj\u00eb lib\u00ebr t\u00eb shk\u00eblqyer.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 \u2013 \u00ebsht\u00eb nj\u00eb parim i formuluar n\u00eb vitet 2000, q\u00eb thot\u00eb se Konsistenca, Disponueshm\u00ebria, Particionet: merrni \u00e7do dy, dhe nuk mund t\u00eb zgjidhni tre. Ky ishte nj\u00eb parim. Ai u provua si teorem disa vjet m\u00eb von\u00eb, p\u00ebr t\u00eb cil\u00ebn u kujdes\u00ebn Gilbert dhe Lynch. Pastaj kjo filloi t\u00eb p\u00ebrdorej, si nj\u00eb mantra \u2013 sistemet 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 u shqyrtua jo si nj\u00eb vler\u00eb e vazhdueshme nga zero n\u00eb nj\u00ebqind (0 - sistemi \"i vdekur\", 100 - p\u00ebrgjigje t\u00eb shpejt\u00eb; ne e kemi zakonisht t\u00eb analizojm\u00eb k\u00ebshtu), por si nj\u00eb pron\u00eb e algoritmit q\u00eb garanton se n\u00eb t\u00eb gjitha ekzekutimet e tij, ai kthen t\u00eb dh\u00ebna.<\/p>\n<p>Nuk ka asnj\u00eb fjal\u00eb p\u00ebr koh\u00ebn e p\u00ebrgjigjes! Ekziston nj\u00eb algorit\u00ebm q\u00eb kthen t\u00eb dh\u00ebna pas 100 vjet\u00ebsh \u2013 nj\u00eb algorit\u00ebm mjaft i disponuesh\u00ebm, i cili \u00ebsht\u00eb pjes\u00eb e teorem\u00ebs CAP.<br \/>\nE dyta: teorema u provua p\u00ebr ndryshimet n\u00eb vlerat e nj\u00ebjti \u00e7el\u00ebsi, ndon\u00ebse k\u00ebto ndryshime jan\u00eb nj\u00eb linj\u00eb e resizeable. Kjo do t\u00eb thot\u00eb se ato n\u00eb t\u00eb v\u00ebrtet\u00eb nuk p\u00ebrdoren shum\u00eb, sepse modelet e tjera jan\u00eb Eventual Consistency, Strong Consistency (ndoshta).<\/p>\n<p>P\u00ebr \u00e7far\u00eb po flasim? P\u00ebr at\u00eb se teorema CAP n\u00eb form\u00ebn e saj, ashtu si \u00ebsht\u00eb provuar, n\u00eb t\u00eb v\u00ebrtet\u00eb nuk \u00ebsht\u00eb shum\u00eb e aplikueshme, p\u00ebrdoret rrall\u00eb. N\u00eb form\u00ebn teorike, ajo n\u00eb nj\u00eb far\u00eb m\u00ebnyre kufizon gjith\u00e7ka. Kemi nj\u00eb parim, i cili \u00ebsht\u00eb intuitivisht i v\u00ebrtet\u00eb, por n\u00eb p\u00ebrgjith\u00ebsi nuk \u00ebsht\u00eb provuar.<\/p>\n<h3>Konsistenca shkak\u00ebsore \u2013 modeli m\u00eb i fort\u00eb<\/h3>\n<p>\nAjo q\u00eb po ndodh tani \u2013 \u00ebsht\u00eb e mundur t\u00eb keni t\u00eb gjitha tri gj\u00ebrat: Konsistenc\u00ebn, Disponueshm\u00ebrin\u00eb duke p\u00ebrdorur Particionet. N\u00eb ve\u00e7anti, konsistenca shkak\u00ebsore \u2013 modeli m\u00eb i fort\u00eb i konsistenc\u00ebs, i cili n\u00eb prani t\u00eb Particioneve (\u00e7arjeve n\u00eb rrjet) vazhdon t\u00eb funksionoj\u00eb. Prandaj, ajo p\u00ebrfaq\u00ebson nj\u00eb interes t\u00eb madh, prandaj ne u angazhuam me t\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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, ka mb\u00ebshtetje t\u00eb madhe nga serveri: kur t\u00eb gjitha sh\u00ebnimet q\u00eb ndodhin brenda nj\u00eb klienti sigurohet q\u00eb t\u00eb vijn\u00eb n\u00eb at\u00eb renditje te klienti tjet\u00ebr. S\u00eb dyti, ajo p\u00ebrballon ndarjet.<\/p>\n<h3>Kuzhina brendshme e MongoDB<\/h3>\n<p>\nDuke pasur parasysh drek\u00ebn, ne kalojm\u00eb n\u00eb kuzhin\u00eb. Do t\u00eb flas p\u00ebr modelin e sistemit, konkretisht \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++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 \u00abMongoDB\u00bb) \u00ebsht\u00eb nj\u00eb sistem i shp\u00ebrndar\u00eb q\u00eb mb\u00ebshtet shkall\u00ebzimin horizontal, dmth. sharding; dhe brenda \u00e7do shard gjithashtu mb\u00ebshtet tepric\u00ebn e t\u00eb dh\u00ebnave, dmth. replikimin.<\/p>\n<p>Sharding n\u00eb \u00abMongoDB\u00bb (nj\u00eb DB jo-relacional) kryen balancimin automatike, dmth. \u00e7do koleksion dokumentesh (ose \u00abtabel\u00eb\u00bb n\u00eb terminologjin\u00eb e t\u00eb dh\u00ebnave relacional) n\u00eb pjes\u00eb, dhe tashm\u00eb serveri e l\u00ebviz ato automatikisht midis shards.<\/p>\n<p>Query Router, i cili shp\u00ebrndan k\u00ebrkesat, p\u00ebr klientin \u00ebsht\u00eb nj\u00eb klient i caktuar, p\u00ebrmes t\u00eb cilit ai punon. Ai tashm\u00eb di se ku dhe cilat t\u00eb dh\u00ebna ndodhen, drejton t\u00eb gjitha k\u00ebrkesat n\u00eb shardin e duhur.<\/p>\n<p>Nj\u00eb tjet\u00ebr moment 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 sh\u00ebnime, mb\u00ebshtetur n\u00eb ato \u00e7el\u00ebsa q\u00eb ai p\u00ebrmban. Nuk \u00ebsht\u00eb e mundur t\u00eb b\u00ebsh shkruarje multi-master.<\/p>\n<p>Ne kemi b\u00ebr\u00eb lan\u00e7imin 4.2 \u2013 aty jan\u00eb shfaqur gj\u00ebra t\u00eb reja interesante. N\u00eb ve\u00e7anti, kemi futur Lucene \u2013 k\u00ebrkimin \u2013 konkretisht executable java direkt n\u00eb \u00abMongo\u00bb, dhe tani \u00ebsht\u00eb e mundur t\u00eb b\u00ebsh k\u00ebrkime p\u00ebrmes Lucene, ashtu si n\u00eb \u00abElasticsearch\u00bb.<\/p>\n<p>Dhe kemi krijuar nj\u00eb produkt t\u00eb ri \u2013 Charts, i cili gjithashtu \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb \u00abAtlas\u00bb (n\u00eb vet\u00eb Cloud \u00abMongo\u00bb). Ata kan\u00eb Free Tier \u2013 mund t\u00eb luash me k\u00ebt\u00eb. Charts m\u00eb ka p\u00eblqyer shum\u00eb \u2013 vizualizimi i t\u00eb dh\u00ebnave, shum\u00eb intuitiv.<\/p>\n<h3>P\u00ebrb\u00ebr\u00ebsit e konsistenc\u00ebs kauzale<\/h3>\n<p>\nKam num\u00ebruar rreth 230 artikuj, t\u00eb cil\u00ebt jan\u00eb publikuar mbi k\u00ebt\u00eb tem\u00eb \u2013 nga Leslie Lamport. Tani, nga kujtesa, do t'ju transmetoj disa pjes\u00eb t\u00eb k\u00ebtyre materialeve.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/e88b34b7a724e94837b944a4ddd21a04.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7do gj\u00eb filloi me nj\u00eb artikull nga Leslie Lamport, i cili u shkrua n\u00eb vitet 1970. Si\u00e7 e shihni, k\u00ebrkimet mbi k\u00ebt\u00eb tem\u00eb vazhdojn\u00eb akoma. Aktualisht, konsistenca kauzale po p\u00ebrjeton nj\u00eb interes p\u00ebr shkak t\u00eb zhvillimit t\u00eb sistemeve t\u00eb shp\u00ebrndara.<\/p>\n<h3>Kufizimet<\/h3>\n<p>\n\u00c7far\u00eb kufizimesh ka? Kjo n\u00eb t\u00eb v\u00ebrtet\u00eb \u00ebsht\u00eb nj\u00eb nga piketat kryesore, sepse kufizimet q\u00eb sistemet e prodhimit i vendosin jan\u00eb shum\u00eb t\u00eb ndryshme nga ato q\u00eb ekzistojn\u00eb n\u00eb artikujt akademik\u00eb. Shpesh ato jan\u00eb mjaft artificiale.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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, \u00abMongoDB\u00bb \u00ebsht\u00eb nj\u00eb master i vet\u00ebm, si\u00e7 e kam th\u00ebn\u00eb m\u00eb par\u00eb (kjo e b\u00ebn gjith\u00e7ka m\u00eb t\u00eb thjesht\u00eb).<\/li>\n<li>Ne mendojm\u00eb se sistemi duhet t\u00eb mb\u00ebshtes\u00eb rreth 10,000 shards. Nuk mund t\u00eb marrim ndonj\u00eb vendim arkitekturor q\u00eb do t\u00eb kufizonte qart\u00eb k\u00ebt\u00eb vler\u00eb.<\/li>\n<li>Kemi nj\u00eb cloud, por supozojm\u00eb se personi duhet t\u00eb ket\u00eb mund\u00ebsin\u00eb, kur shkarkon binary, ta nis\u00eb at\u00eb n\u00eb laptopin e tij dhe gjith\u00e7ka t\u00eb punoj\u00eb p\u00ebrsosur.<\/li>\n<li>Ne supozojm\u00eb se n\u00eb k\u00ebrkime p\u00ebrdoret rrall\u00eb: klient\u00ebt e jasht\u00ebm mund t\u00eb b\u00ebjn\u00eb \u00e7far\u00ebdo. \u00abMongoDB\u00bb \u00ebsht\u00eb open-source. Si rezultat, klient\u00ebt mund t\u00eb jen\u00eb kaq t\u00eb zgjuar, t\u00eb keq, mund t\u00eb duan t\u00eb prishin gjith\u00e7ka. Ne supozojm\u00eb se mund t\u00eb ndodhin Byzantine Failures.<\/li>\n<li>P\u00ebr klient\u00ebt e jasht\u00ebm, t\u00eb cil\u00ebt jan\u00eb p\u00ebrtej perimetrave \u2013 nj\u00eb kufizim i r\u00ebnd\u00ebsish\u00ebm: n\u00ebse kjo ve\u00e7ori \u00ebsht\u00eb e \u00e7aktivizuar, nuk duhet t\u00eb ket\u00eb ndonj\u00eb degradim t\u00eb performanc\u00ebs.<\/li>\n<li>Nj\u00eb tjet\u00ebr moment \u2013 n\u00eb p\u00ebrgjith\u00ebsi antin\u00eb akademik: p\u00ebrputhshm\u00ebria e versioneve t\u00eb m\u00ebparshme dhe atyre t\u00eb ardhshme. Driverat e vjet\u00ebr duhet t\u00eb mb\u00ebshtesin p\u00ebrdit\u00ebsimet e reja, dhe DB duhet t\u00eb mb\u00ebshtes\u00eb driverat 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 kauzale<\/h3>\n<p>\nTani do t\u00eb flas p\u00ebr disa komponent\u00eb. N\u00ebse e shqyrtojm\u00eb n\u00eb p\u00ebrgjith\u00ebsi konsistenc\u00ebn kauzale, mund t\u00eb identifikojm\u00eb blloqe. Ne zgjodh\u00ebm nga punimet q\u00eb i p\u00ebrkasin nj\u00eb blloku t\u00eb caktuar: Ndjekja e Var\u00ebsive, zgjedhja e or\u00ebve, si mund t\u00eb sinkronizohen k\u00ebto or\u00eb me nj\u00ebra-tjetr\u00ebn, dhe si sigurojm\u00eb sigurin\u00eb \u2013 kjo \u00ebsht\u00eb nj\u00eb p\u00ebrmbledhje e thjesht\u00eb e asaj q\u00eb do t\u00eb flas:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 sh\u00ebnim, \u00e7do ndryshim t\u00eb dh\u00ebnash t\u00eb p\u00ebrmbaj\u00eb informacion rreth ndrrimeve nga t\u00eb cilat varet. Ndryshimi m\u00eb i par\u00eb dhe m\u00eb i naiv \u00ebsht\u00eb kur \u00e7do mesazh q\u00eb p\u00ebrmban nj\u00eb sh\u00ebnim, p\u00ebrmban informacion mbi mesazhet e m\u00ebparshme:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 \u00ebsht\u00eb numri i sh\u00ebnimeve. N sometimes k\u00ebto sh\u00ebnime me vlera kalohen madje krejt\u00ebsisht, ndonj\u00ebher\u00eb kalohen disa versione. Thelbi q\u00ebndron se \u00e7do ndryshim p\u00ebrmban informacionin mbi t\u00eb kaluar\u00ebn (e sjell k\u00ebt\u00eb gjithmon\u00eb me vete).<\/p>\n<p>Pse vendos\u00ebm t\u00eb mos p\u00ebrdorim k\u00ebt\u00eb qasje (ndjekje e plot\u00eb)? \u00cbsht\u00eb e qart\u00eb, sepse kjo qasje \u00ebsht\u00eb jopraktike: \u00e7do ndryshim n\u00eb nj\u00eb rrjet social varet nga t\u00eb gjith\u00eb ndryshimet e m\u00ebparshme n\u00eb k\u00ebt\u00eb rrjet social, duke i kaluar, le t\u00eb themi, \"Facebook\" ose \"Vkontakte\" n\u00eb \u00e7do p\u00ebrdit\u00ebsim. Megjithat\u00eb, ka shum\u00eb k\u00ebrkime pik\u00ebrisht mbi Ndjekjen e Plot\u00eb t\u00eb Var\u00ebsive \u2013 k\u00ebto jan\u00eb para rrjeteve sociale, p\u00ebr disa situata kjo v\u00ebrtet funksionon.<\/p>\n<h3>Ndjekja e qart\u00eb e var\u00ebsive (Explicit Dependency Tracking)<\/h3>\n<p>\nE ardhshmja \u2013 m\u00eb e kufizuar. K\u00ebtu gjithashtu shqyrtohet transmetimi i informacionit, por vet\u00ebm atij q\u00eb \u00ebsht\u00eb qart\u00eb i varur. \u00c7far\u00eb varet nga \u00e7far\u00eb, zakonisht e p\u00ebrcakton tashm\u00eb Aplikacioni. Kur t\u00eb dh\u00ebnat riprodhohen, n\u00eb k\u00ebrkes\u00eb jepen vet\u00ebm p\u00ebrgjigjet, kur var\u00ebsit\u00eb e m\u00ebparshme jan\u00eb p\u00ebrmbushur, pra jan\u00eb treguar. Kjo \u00ebsht\u00eb thelbi i funksionit t\u00eb Causal consistency.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 sh\u00ebnimi 5 varet nga sh\u00ebnimet 1, 2, 3, 4 \u2013 p\u00ebrkat\u00ebsisht, ajo pret, p\u00ebrpara se klienti t\u00eb ket\u00eb qasje n\u00eb ndryshimet e kryera nga procedura e aksesit t\u00eb Penny, kur t\u00eb gjitha ndryshimet e m\u00ebparshme tashm\u00eb kan\u00eb kaluar n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave.<\/p>\n<p>Kjo gjithashtu nuk na k\u00ebnaq, sepse megjithat\u00eb informacioni \u00ebsht\u00eb shum\u00eb i madh, dhe do ta ngadal\u00ebsonte. Ka nj\u00eb qasje tjet\u00ebr...<\/p>\n<h3>Or\u00ebt Lamport (Lamport Clock)<\/h3>\n<p>\nAto jan\u00eb shum\u00eb t\u00eb vjetra. Orari Lamport n\u00ebnkupton se k\u00ebto var\u00ebsi p\u00ebrmbledhin n\u00eb nj\u00eb funksion skalar, i cili quhet Orari Lamport.<\/p>\n<p>Nj\u00eb funksion skalar \u00ebsht\u00eb nj\u00eb num\u00ebr abstrakt. Shpesh quhet koh\u00eb logjike. Me \u00e7do ngjarje ky num\u00ebr rritet. Numri, i cili aktualisht \u00ebsht\u00eb i njohur p\u00ebr procesin, d\u00ebrgon \u00e7do mesazh. \u00cbsht\u00eb e qart\u00eb se proceset mund t\u00eb jen\u00eb jasht\u00eb sinkronizimi, ato mund t\u00eb ken\u00eb koh\u00eb krejt\u00ebsisht t\u00eb ndryshme. Megjithat\u00eb, me k\u00ebt\u00eb shk\u00ebmbim mesazhesh, sistemi balancoj or\u00ebt. \u00c7far\u00eb ndodh n\u00eb k\u00ebt\u00eb rast?<\/p>\n<p>E kam ndar\u00eb at\u00eb shard t\u00eb madh n\u00eb dy pjes\u00eb, q\u00eb t\u00eb jet\u00eb e qart\u00eb: Friends mund t\u00eb jetojn\u00eb n\u00eb nj\u00eb nod, i cili p\u00ebrmban nj\u00eb cop\u00eb koleksioni, dhe Feed \u2013 n\u00eb nj\u00eb nod tjet\u00ebr, ku p\u00ebrmban nj\u00eb cop\u00eb t\u00eb k\u00ebsaj koleksioni. \u00cbsht\u00eb e qart\u00eb se si ata mund t\u00eb mos jen\u00eb n\u00eb radh\u00eb? N\u00eb fillim Feed do t\u00eb thot\u00eb: 'U riprodhua', dhe pastaj \u2013 Friends. N\u00ebse sistemi nuk siguron ndonj\u00eb garanci q\u00eb Feed nuk do t\u00eb shfaqet derisa var\u00ebsit\u00eb e Friends n\u00eb koleksionin e Friends gjithashtu t\u00eb jen\u00eb dor\u00ebzuar, at\u00ebher\u00eb na ndodh situata p\u00ebr t\u00eb cil\u00ebn po flas.<\/p>\n<p>Shihni si rritet logjike koha e numrit n\u00eb Feed:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/bae152d1890b53804f2cb28122983df6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrandaj, pron\u00ebsia kryesore e Orarit Lamport dhe Causal consistency (q\u00eb shpjegohet p\u00ebrmes Orarit Lamport) \u00ebsht\u00eb e till\u00eb: n\u00ebse kemi ngjarje A dhe B, dhe ngjarja B varet nga ngjarja A *, at\u00ebher\u00eb nga kjo ndjekim se 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, dmth A ndodhi p\u00ebrpara B \u2013 kjo \u00ebsht\u00eb nj\u00eb marr\u00ebdh\u00ebnie q\u00eb rendit pjes\u00ebrisht gjithsej ngjarjeve q\u00eb ndodhin.<\/i><\/p>\n<p>N\u00eb drejtimin e kund\u00ebrt, kjo nuk \u00ebsht\u00eb e v\u00ebrtet\u00eb. Kjo \u00ebsht\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb nj\u00eb nga disavantazhet kryesore t\u00eb Orarit Lamport \u2013 rendi pjesor. Atje ka nj\u00eb koncept p\u00ebr ngjarje t\u00eb sinkronizuara, dmth ngjarje n\u00eb t\u00eb cilat as (A ndodhi para B) dhe as (A ndodhi para B). Nj\u00eb shembull mund t\u00eb jet\u00eb shtimi paralel nga Leonard n\u00eb miqt\u00eb e dikujt tjet\u00ebr (madje jo nga Leonard, por nga Sheldon, p\u00ebr shembull).<br \/>\nKy \u00ebsht\u00eb nj\u00eb ve\u00e7ori q\u00eb shpesh p\u00ebrdoret kur punoni me or\u00ebt Lamport: shikoni pik\u00ebrisht funksionin dhe nga k\u00ebtu t\u00eb nxirrni p\u00ebrfundimin \u2013 ndoshta k\u00ebto ngjarje jan\u00eb t\u00eb varura. Sepse n\u00eb nj\u00eb drejtim kjo \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; dhe n\u00ebse \u00ebsht\u00eb m\u00eb e madhe, at\u00ebher\u00eb ndoshta.<\/p>\n<h3>Or\u00ebt vektoriale (Vector Clock)<\/h3>\n<p>\nZhvillimi logjik i Or\u00ebve Lamport \u00ebsht\u00eb Or\u00ebt Vektoriale. Ato dallohen nga fakti se \u00e7do nod k\u00ebtu p\u00ebrmban or\u00ebt e tij t\u00eb ndara dhe ato d\u00ebrgohen si nj\u00eb vektor.<br \/>\nN\u00eb k\u00ebt\u00eb rast, shihni se indeksi zero i vektorit p\u00ebrputhet me Feed, nd\u00ebrsa indeksi i par\u00eb i vektorit me Friends (secili nga k\u00ebto nod). Tani ata do t\u00eb rriten: indeksi zero i 'Feed' rritet me sh\u00ebnimin \u2013 1, 2, 3:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/d89292686ed8dd41aef06090f16db1c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7far\u00eb \u00ebsht\u00eb m\u00eb e mira te Or\u00ebt Vektoriale? Q\u00eb lejojn\u00eb t\u00eb kuptoni se cilat ngjarje jan\u00eb sinkronizuar dhe kur ndodhin n\u00eb nodet e ndryshme. Kjo \u00ebsht\u00eb shum\u00eb e r\u00ebnd\u00ebsishme p\u00ebr sistemin e shardimit, si 'MongoDB'. Megjithat\u00eb, ne nuk zgjedhim k\u00ebt\u00eb, ndon\u00ebse \u00ebsht\u00eb nj\u00eb gj\u00eb e shk\u00eblqyer, funksionon mir\u00eb dhe ndoshta do na p\u00ebrkiste...<\/p>\n<p>N\u00ebse kemi 10 mij\u00eb sharde, nuk mund t\u00eb d\u00ebrgojm\u00eb 10 mij\u00eb komponent\u00eb, edhe n\u00ebse i kompresojm\u00eb, duke menduar di\u00e7ka tjet\u00ebr \u2013 megjithat\u00eb ngarkesa \u00ebsht\u00eb shum\u00eb m\u00eb e vog\u00ebl se v\u00ebllimi total i k\u00ebtij vektori. Prandaj, me dhimbje n\u00eb zem\u00ebr dhe dh\u00ebmb\u00eb, ne u t\u00ebrhoq\u00ebm nga kjo qasje dhe kaluam n\u00eb nj\u00eb tjet\u00ebr.<\/p>\n<h3>Spanner TrueTime. Or\u00ebt atomike<\/h3>\n<p>\nKam th\u00ebn\u00eb se do t\u00eb flas p\u00ebr 'Spanner'. Kjo \u00ebsht\u00eb nj\u00eb gj\u00eb e mrekullueshme, me t\u00eb v\u00ebrtet\u00eb n\u00eb shekullin XXI: or\u00ebt atomike, sinkronizimi GPS.<\/p>\n<p>Cila \u00ebsht\u00eb ideja? \u00abSpanner\u00bb \u00ebsht\u00eb nj\u00eb sistem i Google q\u00eb s\u00eb fundmi ka filluar t\u00eb jet\u00eb i aksesuesh\u00ebm p\u00ebr njer\u00ebzit (ata i shtuan SQL atij). \u00c7do transaksion atje ka nj\u00eb fiksim t\u00eb caktuar t\u00eb koh\u00ebs. Duke qen\u00eb se koha \u00ebsht\u00eb e sinkronizuar*, \u00e7do ngjarje mund t'i caktohet nj\u00eb fiksim i caktuar i koh\u00ebs - or\u00ebt atomike kan\u00eb nj\u00eb periudh\u00eb pritje, pas s\u00eb cil\u00ebs garanton q\u00eb \u00abndodh\u00bb nj\u00eb koh\u00eb tjet\u00ebr.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 kohe, automatikisht garantohet Serializability e ngjarjes. Ata kan\u00eb modelin m\u00eb t\u00eb fort\u00eb t\u00eb Konsistenc\u00ebs, q\u00eb mund t\u00eb imagjinohet \u2013 ajo \u00ebsht\u00eb Konsistenca Eksterne.<\/p>\n<p>* Kjo \u00ebsht\u00eb problemi kryesor i or\u00ebve t\u00eb Lamportit \u2013 ato kurr\u00eb nuk jan\u00eb n\u00eb sinkronizim n\u00eb sistemet e shp\u00ebrndara. Ato mund t\u00eb shkojn\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb pasinkronizuar, edhe me NTP, megjithat\u00eb nuk funksionojn\u00eb shum\u00eb mir\u00eb. \u00abSpanner\u00bb ka or\u00eb atomike dhe sinkronizim t\u00eb till\u00eb, duket se n\u00eb mikrosekonda.<\/p>\n<p>Pse nuk e zgjodh\u00ebm? Ne nuk presim q\u00eb p\u00ebrdoruesit tan\u00eb t\u00eb ken\u00eb or\u00eb atomike t\u00eb integruara. Kur t\u00eb b\u00ebhen t\u00eb integruara n\u00eb \u00e7do laptop, do t\u00eb ket\u00eb nj\u00eb sinkronizim super t\u00eb shk\u00eblqyer GPS \u2013 at\u00ebher\u00eb po... Nd\u00ebrsa aktualisht, gj\u00ebja m\u00eb e mir\u00eb q\u00eb \u00ebsht\u00eb e mundur \u2013 \u00ebsht\u00eb \u00abAmazon\u00bb, Base Stations \u2013 p\u00ebr fanatic\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 tregon n\u00eb \u00abMongoDB\u00bb kur siguron Konsistenc\u00eb Kausale. Ato jan\u00eb hibride n\u00eb \u00e7far\u00eb? Hibridi \u00ebsht\u00eb nj\u00eb vler\u00eb skalarike, por ajo p\u00ebrb\u00ebhet nga dy komponente:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 \u2013 \u00ebsht\u00eb epoka unix (sa sekonda kan\u00eb kaluar nga \u00abfillimi i bot\u00ebs kompjuterike\u00bb).<\/li>\n<li>E dyta \u2013 nj\u00eb inkrementim, gjithashtu nj\u00eb int unsigned 32-bit.<\/li>\n<\/ul>\n<p>\nKjo \u00ebsht\u00eb, n\u00eb thelb, e gjitha. Ka nj\u00eb qasje t\u00eb till\u00eb: pjesa q\u00eb merret me koh\u00ebn, gjithmon\u00eb sinkronizohet me or\u00ebt; sa her\u00eb q\u00eb ndodh nj\u00eb p\u00ebrdit\u00ebsim, kjo pjes\u00eb sinkronizohet me or\u00ebt dhe rezulton q\u00eb koha \u00ebsht\u00eb gjithmon\u00eb m\u00eb shum\u00eb-m\u00eb pak e sakt\u00eb, nd\u00ebrsa inkrementimi lejon t\u00eb dallohet ngjarjet q\u00eb ndodhin n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb.<\/p>\n<p>Pse \u00ebsht\u00eb e r\u00ebnd\u00ebsishme kjo p\u00ebr \u00abMongoDB\u00bb? Sepse lejon t\u00eb b\u00ebhen disa rikthime rezervash n\u00eb nj\u00eb moment t\u00eb caktuar t\u00eb koh\u00ebs, dmth ngjarja indikohet me koh\u00ebn. Kjo \u00ebsht\u00eb thelb\u00ebsore kur disa ngjarje k\u00ebrkohen; p\u00ebr DB, ngjarjet jan\u00eb ndryshimet n\u00eb DB q\u00eb ndodhin n\u00eb intervale t\u00eb caktuara t\u00eb koh\u00ebs.<\/p>\n<p>Arsyeja kryesore do t'ju them vet\u00ebm juve (t\u00eb lutem, mos e thuaj askujt tjet\u00ebr)! Ne e b\u00ebm\u00eb k\u00ebt\u00eb sepse k\u00ebshtu duken t\u00eb dh\u00ebnat e renditura dhe t\u00eb indekstuara 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\u00eb: ato fillimisht shkojn\u00eb n\u00eb OpLog dhe pastaj aplikohen n\u00eb Storage, n\u00eb rast se jan\u00eb t\u00eb dh\u00ebna t\u00eb replikueshme ose t\u00eb ndara.<\/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 t\u00eb prishura q\u00eb duhen rishkruar dhe testuar. Fakti q\u00eb oplog\u00ebt tan\u00eb ishin t\u00eb indeksuar me or\u00eb hibride, ndihmoi shum\u00eb dhe mund\u00ebsoi nj\u00eb zgjedhje t\u00eb sakt\u00eb. Kjo me t\u00eb v\u00ebrtet\u00eb e justifikoi veten dhe si p\u00ebr nj\u00eb magji, funksionoi q\u00eb n\u00eb prototipin e par\u00eb. Ishte shum\u00eb e bukur!<\/p>\n<h3>Sinkronizimi i or\u00ebve<\/h3>\n<p>\nKa disa metoda sinkronizimi, t\u00eb p\u00ebrshkruara n\u00eb literatur\u00ebn shkencore. Un\u00eb po flas p\u00ebr sinkronizimin kur kemi dy sharda t\u00eb ndryshme. N\u00ebse nj\u00eb grup replikash \u2013 nuk ka nevoj\u00eb p\u00ebr asnj\u00eb sinkronizim: ky \u00ebsht\u00eb nj\u00eb \u00abmaster t\u00eb vet\u00ebm\u00bb; kemi nj\u00eb OpLog, ku gjithe ndryshimet barten \u2013 n\u00eb k\u00ebt\u00eb rast gjith\u00e7ka \u00ebsht\u00eb renditur sekuencialisht n\u00eb \u00abOpLog\u00bb. Por n\u00ebse kemi dy sharda t\u00eb ndrysh\u00ebm, 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++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/7d3306747490ac044b7f8130defea0c9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNj\u00eb q\u00ebndrim tjet\u00ebr \u00ebsht\u00eb \u00abHeartbeats\u00bb. Mund t\u00eb shk\u00ebmbejn\u00eb disa sinjale, q\u00eb ndodhin \u00e7do nj\u00ebsi kohe. Por \u00abHeartbeats\u00bb jan\u00eb shum\u00eb t\u00eb ngadalta, ne nuk mund t\u00eb sigurojm\u00eb latenc\u00ebn p\u00ebr klientin ton\u00eb.<\/p>\n<p>Koha e v\u00ebrtet\u00eb \u2013 natyrisht, \u00ebsht\u00eb nj\u00eb gj\u00eb e mrekullueshme. Por, p\u00ebrs\u00ebri, ndoshta kjo \u00ebsht\u00eb e ardhmja... Megjith\u00ebse n\u00eb \u00abAtlas\u00bb tashm\u00eb mund t\u00eb b\u00eb shp\u00ebrndar\u00eb; ka sinkronizues t\u00eb koh\u00ebs t\u00eb shpejt\u00eb t\u00eb \u00abAmazon\u00bb, por kjo nuk do t\u00eb jet\u00eb e aksesueshme p\u00ebr t\u00eb gjith\u00eb.<\/p>\n<p>Gossiping \u2013 \u00ebsht\u00eb kur t\u00eb gjitha mesazhet p\u00ebrfshijn\u00eb koh\u00ebn. Kjo \u00ebsht\u00eb aty ku e p\u00ebrdorim. \u00c7do mesazh midis node-ve, drejtuesi, routeri i n\u00ebnave t\u00eb t\u00eb dh\u00ebnave, \u00e7do gj\u00eb p\u00ebr \u00abMongoDB\u00bb \u2013 jan\u00eb disa elemente, komponent\u00eb t\u00eb baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, q\u00eb p\u00ebrmbajn\u00eb or\u00eb q\u00eb kalojn\u00eb. Ka gjithandej nj\u00eb vler\u00eb t\u00eb koh\u00ebs hibride, ajo p\u00ebrcillet. 64 bite? Kjo \u00ebsht\u00eb e mundur.<\/p>\n<h3>Si funksionon gjith\u00e7ka s\u00eb bashku?<\/h3>\n<p>\nK\u00ebtu po shqyrtoj nj\u00eb grup replikash, p\u00ebr t\u00eb qen\u00eb pak m\u00eb e thjesht\u00eb. Ka Primary dhe Secondary. Sekondari b\u00ebn replikimin dhe nuk \u00ebsht\u00eb gjithmon\u00eb plot\u00ebsisht i sinkronizuar me Primary.<\/p>\n<p>Nj\u00eb insert po ndodh n\u00eb \"Primer\" me nj\u00eb vler\u00eb t\u00eb caktuar kohe. Ky insert rrit num\u00ebruesin e brendsh\u00ebm me 11, n\u00ebse ky \u00ebsht\u00eb maksimal. Ose do t\u00eb kontrolloj\u00eb vlerat e or\u00ebve dhe do t\u00eb sinkronizohet sipas or\u00ebve, n\u00ebse vlerat e or\u00ebve jan\u00eb m\u00eb t\u00eb m\u00ebdha. Kjo lejon q\u00eb t\u00eb rendisim sipas koh\u00ebs.<\/p>\n<p>Pas regjistrimit, ndodh nj\u00eb moment i r\u00ebnd\u00ebsish\u00ebm. Or\u00ebt n\u00eb \"MongoDB\" rriten vet\u00ebm n\u00eb rast t\u00eb regjistrimit n\u00eb \"Oplog\". Kjo \u00ebsht\u00eb ngjarja q\u00eb ndryshon gjendjen e sistemit. N\u00eb t\u00eb gjitha artikujt klasik\u00eb, ngjarja konsiderohet si koha kur nj\u00eb mesazh arrin n\u00eb nod: mesazhi arriti \u2013 do t\u00eb thot\u00eb, sistemi ndryshoi gjendjen e tij.<\/p>\n<p>Kjo ndodh sepse gjat\u00eb hetimit nuk mund t\u00eb kuptohet si do t\u00eb interpretohet ky mesazh. Ne e dim\u00eb me siguri se n\u00ebse nuk pasqyrohet n\u00eb \"Oplog\", at\u00ebher\u00eb nuk do t\u00eb interpretohet kurr\u00eb, dhe ndryshimi i gjendjes s\u00eb sistemit \u00ebsht\u00eb vet\u00ebm regjistrimi n\u00eb \"Oplog\". Kjo e thjeshton: modelin e thjeshton dhe lejon renditjen brenda nj\u00eb grupi replikues, dhe shum\u00eb gj\u00ebra t\u00eb tjera t\u00eb dobishme.<\/p>\n<p>Kthehet nj\u00eb vler\u00eb q\u00eb \u00ebsht\u00eb regjistruar tashm\u00eb n\u00eb \"Oplog\" \u2013 ne e dim\u00eb se kjo vler\u00eb \u00ebsht\u00eb dukur atje, dhe koha e saj \u00ebsht\u00eb 12. Tani, le t\u00eb themi, fillon leximi nga nj\u00eb nod tjet\u00ebr (Sekondar), dhe ai transmeton 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 m\u00eb lart).<\/p>\n<p>Kjo quhet Causal a consistent (CAT). Ekziston nj\u00eb koncept n\u00eb teori, q\u00eb \u00ebsht\u00eb nj\u00eb prerje e koh\u00ebs, e cila \u00ebsht\u00eb vet\u00eb konsistente. N\u00eb k\u00ebt\u00eb rast, mund t\u00eb thuhet se kjo \u00ebsht\u00eb gjendja e sistemit, e cila \u00ebsht\u00eb v\u00ebzhguar n\u00eb momentin 12.<\/p>\n<p>Tani k\u00ebtu nuk ka asgj\u00eb, sepse kjo simulohet si situat\u00eb ku Sekondari duhet t\u00eb replikoj\u00eb t\u00eb dh\u00ebnat nga Primari. Ai prit... Dhe ja, t\u00eb dh\u00ebnat erdh\u00ebn \u2013 kthen k\u00ebto vlera prapa.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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. Af\u00ebrsisht.<\/p>\n<p>\u00c7far\u00eb do t\u00eb thot\u00eb \"af\u00ebrsisht\"? Le t\u00eb supozojm\u00eb se ka nj\u00eb person q\u00eb ka lexuar dhe kuptuar se si funksionon gjith\u00e7ka. E kuptoi se \u00e7do her\u00eb ndodh ClusterTime, ai p\u00ebrdit\u00ebson or\u00ebt logjike t\u00eb brendshme, dhe pastaj regjistrimi i ardhsh\u00ebm rrit at\u00eb me nj\u00eb. Kjo funksion merr 20 rreshta. Le t\u00eb themi se ky person transmeton 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 maksimale e mundshme dhe m\u00eb shum\u00eb se koha aktuale), pastaj do t\u00eb ndodh\u00eb regjistrimi n\u00eb \"Oplog\", dhe or\u00ebt do t\u00eb rriten akoma me nj\u00eb \u2013 dhe do t\u00eb ket\u00eb tashm\u00eb vler\u00ebn maksimale (aty jan\u00eb thjesht t\u00eb gjitha nj\u00eb, nuk ka m\u00eb shum\u00eb, unsaint int\u2019\u00ebt).<\/p>\n<p>E qart\u00eb se pas k\u00ebsaj sistemi b\u00ebhet krejt\u00ebsisht i pavlefsh\u00ebm p\u00ebr gjith\u00e7ka. Ai mund t\u00eb shkarkohet vet\u00ebm, t\u00eb pastrohet \u2013 shum\u00eb pun\u00eb manuale. Disponueshm\u00ebria totale:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/634b25fe0ef1e0af39181cd59c7b522f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00ebse kjo replikon diku tjet\u00ebr, at\u00ebher\u00eb thjesht e gjith\u00eb grupa do t\u00eb shkoj\u00eb n\u00ebn. Nj\u00eb situat\u00eb krejt\u00ebsisht e papranueshme, t\u00eb cil\u00ebn \u00e7do person mund ta organizoj\u00eb shum\u00eb shpejt dhe leht\u00eb! Prandaj ne e trajtuam k\u00ebt\u00eb moment si nj\u00eb nga m\u00eb t\u00eb r\u00ebnd\u00ebsishmit. Si ta parandalojm\u00eb at\u00eb?<\/p>\n<h3>Ruga jon\u00eb \u2013 t\u00eb n\u00ebnshkruajm\u00eb clusterTime<\/h3>\n<p>\nAjo transmetohet n\u00eb mesazh (para tekstit blu). Por ne filluam gjithashtu t\u00eb gjenerojm\u00eb nj\u00eb n\u00ebnshkrim (teksti blu):<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 nj\u00eb perimetrin t\u00eb sigurt; vet\u00eb gjenerohet, p\u00ebrdit\u00ebsohet (p\u00ebrdoruesit nuk shohin asgj\u00eb nga kjo). Nj\u00eb hash gjenerohet, dhe \u00e7do mesazh gjat\u00eb krijimit n\u00ebnshkruhet, nd\u00ebrsa gjat\u00eb pranim \u2013 validizohet.<br \/>\nMe siguri lind nj\u00eb pyetje tek njer\u00ebzit: \"Sa shum\u00eb ngadal\u00ebson kjo?\" Kisha th\u00ebn\u00eb se duhet t\u00eb punoj\u00eb shpejt, ve\u00e7an\u00ebrisht n\u00eb munges\u00eb t\u00eb k\u00ebsaj ve\u00e7orie.<\/p>\n<p>\u00c7far\u00eb do t\u00eb thot\u00eb t\u00eb p\u00ebrdor\u00ebsh Causal consistency n\u00eb k\u00ebt\u00eb rast? T\u00eb tregohet parametri afterClusterTime. Ndryshe, ai 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 mbajm\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 ve\u00e7oris\u00eb, q\u00eb nuk p\u00ebrputhet me qasjet dhe k\u00ebrkesat tona. Dhe \u00e7far\u00eb b\u00ebm\u00eb ne?<\/p>\n<h3>B\u00ebje k\u00ebt\u00eb shpejt!<\/h3>\n<p>\nNj\u00eb gj\u00eb mjaft e thjesht\u00eb, por truku interesant \u2013 do t\u00eb ndaj, ndoshta do t\u00eb jet\u00eb interesante p\u00ebr disa.<br \/>\nKemi nj\u00eb hash, ku ruhet t\u00eb dh\u00ebnat e n\u00ebnshkruara. T\u00eb gjitha t\u00eb dh\u00ebnat kalojn\u00eb p\u00ebrmes nj\u00eb cache. 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 bitat e fundit, dhe k\u00ebt\u00eb vler\u00eb n\u00ebnshkruajm\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: nga teoria n\u00eb praktik\u00eb\" src=\"\/wp-content\/uploads\/2020\/02\/f4810456f08ba1cc69730ac0079d4206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuke k\u00ebt\u00eb n\u00ebnshkrim, ne p\u00ebrshpejtojm\u00eb sistemin (n\u00eb m\u00ebnyr\u00eb t\u00eb kusht\u00ebzuar) 65,000 her\u00eb. Funksionon mrekullisht: kur b\u00ebm\u00eb eksperimentet \u2013 n\u00eb t\u00eb v\u00ebrtet\u00eb koha u reduktua me 10,000 her\u00eb, kur kishim nj\u00eb p\u00ebrdit\u00ebsim t\u00eb nj\u00ebpasnj\u00ebsh\u00ebm. \u00cbsht\u00eb e qart\u00eb se kur ato jan\u00eb t\u00eb \u00e7organizuara, kjo nuk ndodh. Por n\u00eb shumic\u00ebn e rasteve praktike, kjo funksionon. Kombinimi i n\u00ebnshkrimit Range s\u00eb bashku me n\u00ebnshkrimin e lejuan t\u00eb zgjidhet problemi i siguris\u00eb.<\/p>\n<h3>\u00c7far\u00eb m\u00ebsuam?<\/h3>\n<p>\nM\u00ebsimet q\u00eb nxorr\u00ebm nga kjo:<\/p>\n<ul>\n<li>Duhet t\u00eb lexojm\u00eb materiale, histori, artikuj, sepse kemi shum\u00eb gj\u00ebra interesante. Kur punojm\u00eb n\u00eb ndonj\u00eb funksionalitet (sidomos tani, kur po b\u00ebjm\u00eb transaksione etj.), duhet t\u00eb lexojm\u00eb, t\u00eb kuptojm\u00eb. Kjo merr koh\u00eb, por \u00ebsht\u00eb shum\u00eb e dobishme, sepse kuptohet se ku jemi. Nuk kemi shpikur asgj\u00eb t\u00eb re \u2013 thjesht mor\u00ebm p\u00ebrb\u00ebr\u00ebsit.\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, v\u00ebrehet nj\u00eb ndryshim i caktuar n\u00eb m\u00ebnyr\u00ebn e mendimit kur ka nj\u00eb konferenc\u00eb akademike (p.sh. \"Sigmon\") \u2013 atje t\u00eb gjith\u00eb p\u00ebrqendrohen n\u00eb ide t\u00eb reja. Cila \u00ebsht\u00eb noviteti i algoritmit ton\u00eb? K\u00ebtu nuk ka ndonj\u00eb novitet t\u00eb jasht\u00ebzakonsh\u00ebm. Noviteti q\u00ebndron m\u00eb shum\u00eb n\u00eb at\u00eb si i kemi kombinuar qasjet ekzistuese. Prandaj e para \u2013 duhet t\u00eb lexojm\u00eb klasiket, duke filluar nga Lamport.<\/li>\n<li>N\u00eb prodhim k\u00ebrkesat jan\u00eb krejt ndryshe. Un\u00eb jam i sigurt se shum\u00eb prej jush p\u00ebrballen jo me bazat e dh\u00ebnash \"sferike\" n\u00eb nj\u00eb boshll\u00ebk abstrakt, por me gj\u00ebra normale, reale, t\u00eb cilat kan\u00eb probleme me disponibilitetin, vonesat dhe q\u00ebndrueshm\u00ebrin\u00eb.<\/li>\n<li>E fundit \u2013 \u00ebsht\u00eb se na duhet t\u00eb shqyrtojm\u00eb ide t\u00eb ndryshme dhe t\u00eb kombinojm\u00eb disa artikuj krejt ndryshe n\u00eb nj\u00eb qasje, s\u00eb bashku. Ideja e n\u00ebnshkrimit erdhi, p\u00ebr shembull, nga nj\u00eb artikull q\u00eb shqyrtonte protokollin Paxos, p\u00ebr ndonj\u00eb fail orm q\u00eb nuk \u00ebsht\u00eb vizantian brenda protokollit t\u00eb autorizimit, p\u00ebr ato vizantine \u2013 jasht\u00eb protokollit t\u00eb autorizimit... N\u00eb thelb, kjo \u00ebsht\u00eb ajo q\u00eb ne p\u00ebrfundimisht b\u00ebm\u00eb.\n<p>K\u00ebtu nuk ka asgj\u00eb t\u00eb re! Por sa her\u00eb q\u00eb i kombinomim t\u00eb gjitha... \u00cbsht\u00eb si t\u00eb thuash se receta e sallat\u00ebs Olivier \u00ebsht\u00eb d\u00ebshtim, sepse vez\u00ebt, majonezi dhe kastravecat tashm\u00eb jan\u00eb shpikur... \u00cbsht\u00eb pak a shum\u00eb e nj\u00ebjta histori.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 e mbyll. Faleminderit!<\/p>\n<h3>Pyetje<\/h3>\n<p>\n<b>Pyetje nga auditoriumi (m\u00eb pas \u2013 P):<\/b> \u2013 Faleminderit, Mikhail p\u00ebr prezantimin! \u00c7\u00ebshtja p\u00ebr koh\u00ebn \u00ebsht\u00eb interesante. Ju p\u00ebrdorni Gossiping. Keni th\u00ebn\u00eb se t\u00eb gjith\u00eb kan\u00eb koh\u00ebn e tyre, t\u00eb gjith\u00eb e din\u00eb koh\u00ebn e tyre lokale. E kuptova se kemi nj\u00eb driver \u2013 klient\u00ebt me driver\u00eb mund t\u00eb ken\u00eb shum\u00eb, gjithashtu query-planner t\u00eb shumt\u00eb, dhe shum\u00eb shards gjithashtu\u2026 \u00c7far\u00eb ndodh me sistemin, n\u00ebse papritmas ndodh nj\u00eb ndarje: dikush vendos q\u00eb \u00ebsht\u00eb nj\u00eb minut\u00eb p\u00ebrpara, dikush - nj\u00eb minut\u00eb mbrapa? Ku do t\u00eb p\u00ebrfundojm\u00eb?<\/p>\n<p><b>MT:<\/b> \u2013 Pyetje shum\u00eb e mir\u00eb n\u00eb t\u00eb v\u00ebrtet\u00eb! Pik\u00ebrisht p\u00ebr shards doja t\u00eb flisja. N\u00ebse e kuptoj sakt\u00eb pyetjen, kemi nj\u00eb situat\u00eb t\u00eb till\u00eb: ka shard 1 dhe shard 2, leximi ndodh nga k\u00ebto dy shards \u2013 ata kan\u00eb ndarjen, ata nuk komunikohet me nj\u00ebri-tjetrin, sepse koha q\u00eb ata e din\u00eb \u00ebsht\u00eb e ndryshme, sidomos koha q\u00eb ekziston n\u00eb oplog.<br \/>\nSupozoni se shard 1 ka b\u00ebr\u00eb nj\u00eb milion regjistrime, shard 2 asgj\u00eb, dhe k\u00ebrkesa ka ardhur n\u00eb dy shards. Dhe i pari ka afterClusterTime m\u00eb shum\u00eb 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>M:<\/b> \u2013 Doja t\u00eb dija se si ata sinkronizohen dhe zgjedhin nj\u00eb koh\u00eb logjike?<\/p>\n<p><b>MT:<\/b> \u2013 Shum\u00eb thjesht sinkronizohen. Shardi, kur merr afterClusterTime, dhe nuk gjen koh\u00ebn n\u00eb \"Oplog\" \u2013 inicion no approved. Dometh\u00ebn\u00eb, ai e rrit me dor\u00eb koh\u00ebn e tij n\u00eb k\u00ebt\u00eb vler\u00eb. Kjo do t\u00eb thot\u00eb se nuk ka ngjarje q\u00eb i p\u00ebrgjigjen k\u00ebsaj k\u00ebrkese. Ai krijon k\u00ebt\u00eb ngjarje n\u00eb m\u00ebnyr\u00eb artificiale dhe b\u00ebhet k\u00ebshtu Causal Consistent.<\/p>\n<p><b>M:<\/b> \u2013 Dhe n\u00ebse pas k\u00ebsaj vijn\u00eb ndonj\u00eb ngjarje t\u00eb tjera, q\u00eb jan\u00eb humbur diku n\u00eb rrjet?<\/p>\n<p><b>MT:<\/b> \u2013 Shardi \u00ebsht\u00eb nd\u00ebrtuar n\u00eb m\u00ebnyr\u00eb q\u00eb ato nuk do t\u00eb vijn\u00eb m\u00eb, sepse \u00ebsht\u00eb single master. N\u00ebse ai e ka regjistruar at\u00eb, ato nuk do t\u00eb vijn\u00eb m\u00eb, por do t\u00eb jen\u00eb m\u00eb pas. Nuk mund t\u00eb ndodh\u00eb q\u00eb diku di\u00e7ka t\u00eb ngec\u00eb, pastaj ai b\u00ebn no write, dhe pastaj k\u00ebto ngjarje erdh\u00ebn \u2013 dhe u prish Causal consistency. Kur ai b\u00ebn no write, ato t\u00eb gjitha duhet t\u00eb vijn\u00eb m\u00eb tej (ai do t'i pres\u00eb).<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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>M:<\/b> \u2013 Kam kam disa disa pyetje n\u00eb lidhje me radh\u00ebt. K\u00ebshtu, konsistenca shkak\u00ebsore sugjeron se ekziston nj\u00eb renditje e caktuar veprimesh q\u00eb duhen kryer. \u00c7far\u00eb do t\u00eb ndodhte n\u00ebse na humbet nj\u00eb paket\u00eb? Dola n\u00eb t\u00eb dhjet\u00ebn, n\u00eb t\u00eb nj\u00ebmb\u00ebdhjet\u00ebn\u2026 paketa e dymb\u00ebdhjet\u00eb humbi, nd\u00ebrsa t\u00eb gjitha t\u00eb tjerat po presin q\u00eb ajo t\u00eb ekzekutohet. Dhe papritmas, makina jon\u00eb vdes, nuk mund t\u00eb b\u00ebjm\u00eb asgj\u00eb. A ka nj\u00eb gjat\u00ebsi maksimale t\u00eb radh\u00ebs q\u00eb mbledh\u00ebt para se t\u00eb ekzekutohet? Cila \u00ebsht\u00eb d\u00ebshtimi fatal q\u00eb ndodh n\u00ebse humbim ndonj\u00eb nga gjendjet? Akoma m\u00eb tep\u00ebr, n\u00ebse regjistrojm\u00eb se ka nj\u00eb gjendje t\u00eb m\u00ebparshme, at\u00ebher\u00eb duhet t\u00eb nisim nga ajo? Megjithat\u00eb, nuk u nis\u00ebm nga ajo!<\/p>\n<p><b>MT:<\/b> \u2013 Po, nj\u00eb tjet\u00ebr pyetje e shk\u00eblqyer! \u00c7far\u00eb b\u00ebjm\u00eb? N\u00eb MongoDB ka konceptin e sh\u00ebnimeve kuorum dhe leximin kuorum. N\u00eb cilat raste mund t\u00eb humbas\u00eb nj\u00eb mesazh? Kur sh\u00ebnimi nuk \u00ebsht\u00eb kuorum ose kur leximi nuk \u00ebsht\u00eb kuorum (edhe kjo mund t\u00eb sjell\u00eb ndonj\u00eb trash\u00ebgimi t\u00eb pad\u00ebshiruar).<br \/>\nN\u00eb lidhje me konsistenc\u00ebn shkak\u00ebsore, ne kemi realizuar nj\u00eb kontroll t\u00eb madh eksperimental, rezultat i t\u00eb cilit \u00ebsht\u00eb se kur sh\u00ebnimet dhe leximet jan\u00eb t\u00eb pa-kuorum, ndodhin shkelje t\u00eb konsistenc\u00ebs shkak\u00ebsore. Pik\u00ebrisht ajo q\u00eb thoni!<\/p>\n<p>K\u00ebshilla jon\u00eb: p\u00ebrdorni t\u00eb pakt\u00ebn leximin kuorum kur p\u00ebrdorni konsistenc\u00ebn shkak\u00ebsore. N\u00eb k\u00ebt\u00eb rast, asgj\u00eb nuk do t\u00eb humbas\u00eb, madje n\u00ebse sh\u00ebnimi kuorum humbet... Kjo \u00ebsht\u00eb nj\u00eb situat\u00eb ortogonale: n\u00ebse nj\u00eb p\u00ebrdorues nuk d\u00ebshiron q\u00eb t\u00eb dh\u00ebnat t\u00eb humbin, duhet t\u00eb p\u00ebrdor\u00eb sh\u00ebnime kuorum. Konsistenca shkak\u00ebsore nuk ofron garanci p\u00ebr q\u00ebndrushm\u00ebrin\u00eb. Garancit\u00eb p\u00ebr q\u00ebndrushm\u00ebrin\u00eb ofrojn\u00eb replikimi dhe mekanizmat e lidhura me replikimin.<\/p>\n<p><b>M:<\/b> \u2013 Kur krijojm\u00eb nj\u00eb instanc\u00eb, e cila kryen shp\u00ebrndarjen (jo master, por slave p\u00ebrkat\u00ebsisht), a mb\u00ebshtetet n\u00eb koh\u00ebn unix t\u00eb makin\u00ebs s\u00eb saj apo n\u00eb koh\u00ebn e \"masterit\"; a sinkronizohet p\u00ebr her\u00eb t\u00eb par\u00eb apo periodikisht?<\/p>\n<p><b>MT:<\/b> \u2013 Tani do t\u00eb sqarohem. Shard (dmth. ndarja horizontale) \u2013 atje gjithmon\u00eb ka nj\u00eb Primar. Dhe n\u00eb shard mund t\u00eb ket\u00eb \"master\" dhe mund t\u00eb ket\u00eb replika. Por shard gjithmon\u00eb mb\u00ebshtet sh\u00ebnimin, sepse duhet t\u00eb mbaj\u00eb nj\u00eb domen t\u00eb caktuar (n\u00eb shard ndodhet Primari).<\/p>\n<p><b>M:<\/b> \u2013 Pra, gjith\u00e7ka varet vet\u00ebm 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 sh\u00ebnimi n\u00eb \"master\", n\u00eb \"OpLog\".<\/p>\n<p><b>M:<\/b> \u2013 Kemi nj\u00eb klient q\u00eb lidhet dhe nuk ka nevoj\u00eb t\u00eb dij\u00eb asgj\u00eb p\u00ebr koh\u00ebn?<\/p>\n<p><b>MT:<\/b> \u2013 Aspak nuk ka nevoj\u00eb t\u00eb dij\u00eb asgj\u00eb! N\u00ebse flasim p\u00ebr m\u00ebnyr\u00ebn se si funksionon n\u00eb klient: klienti, kur d\u00ebshiron t\u00eb p\u00ebrdor\u00eb konsistenc\u00ebn shkak\u00ebsore, duhet t\u00eb hap\u00eb nj\u00eb sesion. Atje \u00ebsht\u00eb gjith\u00e7ka: dhe transaksionet n\u00eb sesion, dhe marrja e t\u00eb drejtave... 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 thot\u00eb se d\u00ebshiron konsistenc\u00ebn shkak\u00ebsore (n\u00ebse si parazgjedhje sesioni mb\u00ebshtet konsistenc\u00ebn shkak\u00ebsore), gjith\u00e7ka funksionon automatikisht. Drejtori memorizon k\u00ebt\u00eb koh\u00eb dhe e rrit kur merr nj\u00eb mesazh t\u00eb ri. Ai memorizon se \u00e7far\u00eb p\u00ebrgjigjeje ktheu serveri i m\u00ebparsh\u00ebm q\u00eb kthente 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 fare asgj\u00eb! \u00cbsht\u00eb absolutisht e padukshme p\u00ebr t\u00eb. N\u00ebse njer\u00ebzit p\u00ebrdorin k\u00ebto ve\u00e7ori, \u00e7far\u00eb lejon t\u00eb b\u00ebhet? N\u00eb radh\u00eb t\u00eb par\u00eb, mund t\u00eb lexoni n\u00eb m\u00ebnyr\u00eb t\u00eb sigurt nga secondaries: mund t\u00eb shkruani n\u00eb Primar, dhe t\u00eb lexoni nga secondaries t\u00eb riprodhuara gjeografikisht dhe t\u00eb jeni t\u00eb sigurt se kjo funksionon. N\u00eb k\u00ebt\u00eb rast, sesionet q\u00eb jan\u00eb regjistruar n\u00eb Primar mund t\u00eb p\u00ebrcillen edhe n\u00eb Secondary, dmth. mund t\u00eb p\u00ebrdoren jo nj\u00eb sesion, por disa.<\/p>\n<p><b>M:<\/b> \u2013 Temat lidhur me konsistenc\u00ebn eventuale jan\u00eb shum\u00eb t\u00eb lidhura me nj\u00eb shtres\u00eb t\u00eb re t\u00eb shkenc\u00ebs kompjuterike \u2013 llojet e t\u00eb dh\u00ebnave CRDT (Tipet e t\u00eb Dh\u00ebnave t\u00eb Replikuara pa Konflikta). A keni shqyrtuar integrimin e k\u00ebtyre llojeve t\u00eb t\u00eb dh\u00ebnave n\u00eb baz\u00eb dhe \u00e7far\u00eb mund t\u00eb thoni p\u00ebr k\u00ebt\u00eb?<\/p>\n<p><b>MT:<\/b> \u2013 Pyetje e mir\u00eb! CRDT ka kuptim p\u00ebr konflikte gjat\u00eb sh\u00ebnimit: n\u00eb MongoDB \u2013 nj\u00eb master i vet\u00ebm.<\/p>\n<p><b>M:<\/b> \u2013 Kam nj\u00eb pyetje nga devops. N\u00eb bot\u00ebn reale hasen situata t\u00eb tilla ishuetike, kur ndodhin d\u00ebshtime bizantine, dhe njer\u00ebz t\u00eb k\u00ebqij brenda perimetrin e siguris\u00eb fillojn\u00eb t\u00eb nd\u00ebrhyjn\u00eb n\u00eb protokoll, duke d\u00ebrguar paketa t\u00eb craftuara n\u00eb m\u00ebnyr\u00eb t\u00eb ve\u00e7ant\u00eb?<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 perimetrin \u2013 \u00ebsht\u00eb e nj\u00ebjt\u00eb si nj\u00eb kal\u00eb Troje! Njer\u00ebzit e k\u00ebqij brenda perimetrin mund t\u00eb b\u00ebjn\u00eb shum\u00eb gj\u00ebra t\u00eb k\u00ebqija.<\/p>\n<p><b>M:<\/b> \u2013 Natyrisht, l\u00ebnia n\u00eb server, n\u00eb terma t\u00eb thjesht\u00eb, e nj\u00eb vrim\u00eb, p\u00ebrmes s\u00eb cil\u00ebs mund t\u00eb kaloni nj\u00eb \u00e7erdhe elefantesh dhe t\u00eb shembni t\u00eb gjith\u00eb clusterin p\u00ebrgjithmon\u00eb... Do t\u00eb k\u00ebrkohet koh\u00eb p\u00ebr rikuperim manual... Kjo, leht\u00ebsisht, \u00ebsht\u00eb e gabuar. Nga ana tjet\u00ebr, \u00ebsht\u00eb interesante t\u00eb dini: n\u00eb jet\u00ebn reale, n\u00eb praktik\u00eb, ndodhin situata t\u00eb tilla kur sulme t\u00eb brendshme ndodhin natyrsh\u00ebm?<\/p>\n<p><b>MT:<\/b> \u2013 Pavar\u00ebsisht se nuk kam hasur shpesh n\u00eb shkelje t\u00eb siguris\u00eb n\u00eb jet\u00ebn reale, nuk mund t\u00eb them - ndoshta ato ndodhin. Por n\u00ebse flasim p\u00ebr filozofin\u00eb e zhvilluesve, mendojm\u00eb k\u00ebshtu: kemi nj\u00eb perimet\u00ebr q\u00eb siguron ata q\u00eb merakosen p\u00ebr sigurin\u00eb - ky \u00ebsht\u00eb nj\u00eb \u00e7el\u00ebs, nj\u00eb mur; dhe brenda perimetrin mund t\u00eb b\u00ebsh gjith\u00e7ka. \u00cbsht\u00eb e qart\u00eb se ka p\u00ebrdorues me mund\u00ebsi vet\u00ebm p\u00ebr t\u00eb par\u00eb, dhe ka p\u00ebrdorues me mund\u00ebsi p\u00ebr t\u00eb fshir\u00eb nj\u00eb katalog.<\/p>\n<p>N\u00eb var\u00ebsi t\u00eb t\u00eb drejtave, d\u00ebmimi q\u00eb p\u00ebrdoruesit mund t\u00eb shkaktojn\u00eb mund t\u00eb jet\u00eb si me nj\u00eb mi, ashtu edhe me nj\u00eb elefant. \u00cbsht\u00eb e qart\u00eb se p\u00ebrdoruesi me t\u00eb drejta t\u00eb plota mund t\u00eb b\u00ebj\u00eb gjith\u00e7ka. P\u00ebrdoruesi me t\u00eb drejta t\u00eb ngushta mund t\u00eb shkaktoj\u00eb ndjesh\u00ebm m\u00eb pak d\u00ebm. N\u00eb ve\u00e7anti, ai nuk mund ta prish\u00eb sistemin.<\/p>\n<p><b>M:<\/b> \u2013 N\u00eb nj\u00eb perimetrin e mbrojtur, dikush mund t\u00eb provoj\u00eb t\u00eb formoj\u00eb protokolle t\u00eb papritura p\u00ebr serverin, p\u00ebr ta v\u00ebn\u00eb serverin n\u00eb nj\u00eb pozit\u00eb t\u00eb v\u00ebshtir\u00eb, dhe n\u00ebse ka fat, ndoshta edhe t\u00ebr\u00eb klasterin... A ndodhin ndonj\u00ebher\u00eb kaq \"mir\u00eb\"?<\/p>\n<p><b>MT:<\/b> \u2013 Asnj\u00ebher\u00eb nuk kam d\u00ebgjuar p\u00ebr gj\u00ebra t\u00eb tilla. Q\u00eb mund t\u00eb d\u00ebmtohet serveri n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb - kjo nuk \u00ebsht\u00eb sekret. T\u00eb shkatht\u00ebrosh brenda, duke qen\u00eb me protokoll, si p\u00ebrdorues i autorizuar q\u00eb mund t\u00eb shkruaj\u00eb n\u00eb mesazhin di\u00e7ka t\u00eb till\u00eb... N\u00eb t\u00eb v\u00ebrtet\u00eb, nuk mundet, sepse gjithsesi do t\u00eb verifikohet. Ka mund\u00ebsi p\u00ebr t\u00eb \u00e7aktivizuar k\u00ebt\u00eb autentikim p\u00ebr ata p\u00ebrdorues q\u00eb nuk e duan - kjo at\u00ebher\u00eb \u00ebsht\u00eb problemi i tyre; ata, thjesht, vet\u00eb shkat\u00ebrruan muret dhe mund t\u00eb fusin aty nj\u00eb elefant q\u00eb do t'i shkat\u00ebrroj\u00eb... N\u00eb p\u00ebrgjith\u00ebsi, mund t\u00eb vishesh si teknik, t\u00eb vish dhe ta nxjerr\u00ebsh!<\/p>\n<p><b>M:<\/b> \u2013 Faleminderit p\u00ebr raportin. Sergey (\"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 e barabart\u00eb me 7 (shtat\u00eb). Pse \u00ebsht\u00eb kjo konstant\u00eb? Pse nuk \u00ebsht\u00eb ndonj\u00eb paramet\u00ebr?<\/p>\n<p><b>MT:<\/b> \u2013 Replica Set kemi edhe 40 nodule. Aty gjithmon\u00eb \u00ebsht\u00eb shumica. Nuk di cila \u00ebsht\u00eb versioni...<\/p>\n<p><b>M:<\/b> \u2013 N\u00eb Replica Set mund t\u00eb nisin an\u00ebtar\u00eb q\u00eb nuk votojn\u00eb, por p\u00ebr votuesit - maksimumi 7. Si mund t\u00eb p\u00ebrballohet nj\u00eb nd\u00ebrprerje n\u00ebse kemi nj\u00eb Replica Set t\u00eb shp\u00ebrndar\u00eb n\u00eb 3 qendra t\u00eb dh\u00ebnash? Nj\u00eb qend\u00ebr mund t\u00eb shuhet leht\u00ebsisht, dhe nj\u00eb makin\u00eb tjet\u00ebr t\u00eb bjer\u00eb.<\/p>\n<p><b>MT:<\/b> \u2013 Kjo \u00ebsht\u00eb jasht\u00eb raportit pak. Kjo \u00ebsht\u00eb nj\u00eb pyetje e p\u00ebrgjithshme. Ndoshta m\u00eb von\u00eb mund ta tregoj.<\/p>\n<p><img decoding=\"async\" alt=\"HighLoad++, \u041c\u0438\u0445\u0430\u0438\u043b \u0422\u044e\u043b\u0435\u043d\u0435\u0432 (MongoDB): Konsistenca kauzale: 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 q\u00ebndroni me ne. Ju p\u00eblqejn\u00eb artikujt tan\u00eb? D\u00ebshironi t\u00eb shihni m\u00eb shum\u00eb materiale interesante? Na mb\u00ebshtetni duke b\u00ebr\u00eb nj\u00eb porosi ose duke na rekomanduar njohurive 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, i nd\u00ebrtuar p\u00ebr ju:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">E gjith\u00eb e v\u00ebrteta rreth VPS (KVM) E5-2697 v3 (6 Nuclea) 10GB DDR4 480GB SSD 1Gbps nga $19 ose si ta ndajm\u00eb sakt\u00ebsisht serverin?<\/a><\/noindex> (disponohen variante me RAID1 dhe RAID10, deri n\u00eb 24 b\u00ebrthama dhe deri n\u00eb 40GB DDR4).<\/p>\n<p><b>Dell R730xd dyfish m\u00eb i lir\u00eb n\u00eb qendr\u00ebn e t\u00eb dh\u00ebnave Equinix Tier IV n\u00eb Amsterdam?<\/b> Vet\u00ebm k\u00ebtu <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\u00ebrtosh nj\u00eb infrastruktur\u00eb t\u00eb klas\u00ebs korporative me p\u00ebrdorimin e server\u00ebve Dell R730xd E5-2650 v4 me \u00e7mim prej 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.0.1 - 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.0.1\" \/>\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++, Mikhail Tyulenev (MongoDB): Causal consistency: nga teoria n\u00eb praktik\u00eb | ProHoster","description":"Konferenca tjet\u00ebr 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}]}}