{"id":55009,"date":"2020-01-10T00:00:00","date_gmt":"2020-01-09T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo"},"modified":"2020-02-18T14:03:04","modified_gmt":"2020-02-18T11:03:04","slug":"arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","title":{"rendered":"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/04d68ff091d9d271bfd352a6639e2f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Artem Denisov ( <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/users\/bo0rsh201\/\" class=\"user_link\">bo0rsh201<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/company\/badoo\/\">Badoo<\/a><\/noindex>)<\/h2>\n<p>\nBadoo \u00ebsht\u00eb faqja m\u00eb e madhe e takimeve n\u00eb bot\u00eb. Aktualisht kemi rreth 330 milion\u00eb p\u00ebrdorues t\u00eb regjistruar n\u00eb mbar\u00eb bot\u00ebn. Por ajo q\u00eb \u00ebsht\u00eb shum\u00eb m\u00eb e r\u00ebnd\u00ebsishme n\u00eb kontekstin e bised\u00ebs son\u00eb t\u00eb sotme \u00ebsht\u00eb se ruajm\u00eb rreth 3 petabajt fotografi t\u00eb p\u00ebrdoruesve. \u00c7do dit\u00eb p\u00ebrdoruesit tan\u00eb ngarkojn\u00eb rreth 3,5 milion\u00eb fotografi t\u00eb reja, dhe ngarkesa e leximit arrin n\u00eb <b>80 mij\u00eb k\u00ebrkesa n\u00eb sekond\u00eb<\/b>. Kjo \u00ebsht\u00eb mjaft shum\u00eb p\u00ebr backend-in ton\u00eb dhe ndonj\u00ebher\u00eb sjell v\u00ebshtir\u00ebsi.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/4e4690f9b0d95bd76fbbc1cd6805c26c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDo t\u00eb flas p\u00ebr dizajnin e k\u00ebsaj sistemi q\u00eb ruan dhe shp\u00ebrndan fotografit\u00eb n\u00eb t\u00ebr\u00ebsi, si edhe do ta paraqes nga k\u00ebndv\u00ebshtrimi i nj\u00eb zhvilluesi. P\u00ebr m\u00ebnyr\u00ebn se si ka evoluar, do t\u00eb b\u00ebj nj\u00eb retrospektiv\u00eb t\u00eb shkurt\u00ebr, ku do t\u00eb sh\u00ebnoj etapat kryesore, por m\u00eb n\u00eb detaje do t\u00eb ndalem vet\u00ebm te zgjidhjet q\u00eb p\u00ebrdorim tani.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nTani le t\u00eb fillojm\u00eb.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"SU9ETg39FEg\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/SU9ETg39FEg\/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><br \/>\nSi\u00e7 e thash\u00eb tashm\u00eb, kjo do t\u00eb jet\u00eb nj\u00eb retrospektiv\u00eb, dhe q\u00eb ta nisim nga diku, le t\u00eb marrim shembullin m\u00eb t\u00eb thjesht\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/22b9627cda7ccadd9869b64e9d043d89.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKemi nj\u00eb detyr\u00eb t\u00eb p\u00ebrgjithshme: duhet t\u00eb pranojm\u00eb, ruajm\u00eb dhe shp\u00ebrndajm\u00eb fotografit\u00eb e p\u00ebrdoruesve. N\u00eb k\u00ebt\u00eb form\u00eb, detyra \u00ebsht\u00eb e p\u00ebrgjithshme dhe mund t\u00eb p\u00ebrdorim \u00e7far\u00ebdo:<\/p>\n<ul>\n<li>storage modern n\u00eb cloud,<\/li>\n<li>nj\u00eb zgjidhje t\u00eb gatshme, prej t\u00eb cilave sot ka gjithashtu shum\u00eb;<\/li>\n<li>mund t\u00eb konfigurojm\u00eb disa makina n\u00eb data center-in ton\u00eb dhe t\u00eb vendosim n\u00eb to disqe t\u00eb m\u00ebdha t\u00eb forta, duke i ruajtur fotografit\u00eb atje.<\/li>\n<\/ul>\n<p>\nBadoo historikisht \u2014 si tani, ashtu edhe at\u00ebher\u00eb (n\u00eb koh\u00ebn kur gjith\u00e7ka sapo po niste) \u2014 funksionon n\u00eb server\u00ebt e vet, brenda DC-ve tona. Prandaj, p\u00ebr ne ky variant ishte optimal.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/9434fbabada15670297c551066ad7e71.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThjesht mor\u00ebm disa makina, i quajt\u00ebm \u00abphotos\u00bb dhe na doli nj\u00eb lloj klasteri q\u00eb ruan fotografit\u00eb. Por duket se di\u00e7ka mungon. Q\u00eb e gjith\u00eb kjo t\u00eb funksionoj\u00eb, duhet t\u00eb p\u00ebrcaktojm\u00eb disi se n\u00eb cil\u00ebn makin\u00eb do t\u00eb ruajm\u00eb cilat fotografi. Edhe k\u00ebtu nuk ka nevoj\u00eb t\u00eb shpikim di\u00e7ka t\u00eb re.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/36258e7107fd8c60f7e9e563a2cb681c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe shtojm\u00eb n\u00eb ruajtjen ton\u00eb me informacionin p\u00ebr p\u00ebrdoruesit nj\u00eb fush\u00eb. Kjo do t\u00eb jet\u00eb \u00e7el\u00ebsi i sharding-ut. N\u00eb rastin ton\u00eb e quajt\u00ebm place_id, dhe pik\u00ebrisht ky ID i lokacionit tregon vendin ku ruhen fotografit\u00eb e p\u00ebrdoruesve. Ne p\u00ebrpilojm\u00eb harta.<\/p>\n<p>N\u00eb faz\u00ebn e par\u00eb k\u00ebt\u00eb mund ta b\u00ebnim edhe manualisht \u2014 p\u00ebrcaktonim q\u00eb fotografia e k\u00ebtij p\u00ebrdoruesi me k\u00ebt\u00eb vendosje do t\u00eb ruhej n\u00eb k\u00ebt\u00eb server. Fal\u00eb k\u00ebsaj harte, ne e dim\u00eb gjithmon\u00eb se ku ta ruajm\u00eb fotografin\u00eb kur p\u00ebrdoruesi e ngarkon dhe nga ku ta dor\u00ebzojm\u00eb m\u00eb pas.<\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb skem\u00eb krejt\u00ebsisht e thjesht\u00eb, por ka disa avantazhe t\u00eb r\u00ebnd\u00ebsishme. S\u00eb pari, \u00ebsht\u00eb e thjesht\u00eb, si\u00e7 e thash\u00eb tashm\u00eb, dhe s\u00eb dyti, me k\u00ebt\u00eb qasje mund t\u00eb shkall\u00ebzohemi leht\u00ebsisht horizontalisht duke shtuar thjesht makina t\u00eb reja dhe duke i futur n\u00eb hart\u00eb. Nuk duhet b\u00ebr\u00eb asgj\u00eb tjet\u00ebr.<\/p>\n<p>P\u00ebr nj\u00ebfar\u00eb kohe, k\u00ebshtu funksiononte edhe te ne.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/3effb442702f162f7bad9c18ec54392e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKjo ishte diku rreth vitit 2009. Shtonim makina, shtonim...<\/p>\n<p>Dhe n\u00eb nj\u00eb moment filluam t\u00eb v\u00ebrenim se kjo skem\u00eb kishte disa mang\u00ebsi. Cilat ishin k\u00ebto mang\u00ebsi?<\/p>\n<p>S\u00eb pari, kapaciteti ishte i kufizuar. N\u00eb nj\u00eb server fizik nuk mund t\u00eb vendosnim aq shum\u00eb disqe t\u00eb forta sa do t\u00eb donim. Me kalimin e koh\u00ebs dhe me rritjen e dataset-it, kjo u b\u00eb nj\u00eb problem i qart\u00eb.<\/p>\n<p>Dhe s\u00eb dyti, kjo ishte nj\u00eb konfigurim jo tipik i makinave, sepse k\u00ebto makina v\u00ebshtir\u00eb se mund t\u00eb rip\u00ebrdoren n\u00eb klaster\u00eb t\u00eb tjer\u00eb, pasi jan\u00eb mjaft specifike; pra, duhet t\u00eb ken\u00eb performanc\u00eb t\u00eb ul\u00ebt, por nj\u00ebkoh\u00ebsisht nj\u00eb disk t\u00eb fort\u00eb me kapacitet t\u00eb madh.<\/p>\n<p>E gjith\u00eb kjo i p\u00ebrket vitit 2009, por n\u00eb thelb k\u00ebto k\u00ebrkesa mbeten \u0430\u043a\u0442\u0443ale edhe sot. Duke qen\u00eb se po b\u00ebjm\u00eb nj\u00eb retrospektiv\u00eb, n\u00eb vitin 2009 situata n\u00eb k\u00ebt\u00eb drejtim ishte v\u00ebrtet e dob\u00ebt.<\/p>\n<p>Dhe pika e fundit ishte \u00e7mimi.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/e49010eaeab139199d8fe010caa65bf0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb at\u00eb koh\u00eb \u00e7mimi ishte shum\u00eb i lart\u00eb dhe na duhej t\u00eb k\u00ebrkonim alternativa. Pra, duhej t\u00eb shfryt\u00ebzonim m\u00eb mir\u00eb si hap\u00ebsir\u00ebn n\u00eb data center, ashtu edhe vet\u00eb server\u00ebt fizik\u00eb ku vendosej e gjith\u00eb kjo. Inxhinier\u00ebt tan\u00eb t\u00eb sistemeve nis\u00ebn nj\u00eb studim t\u00eb gjer\u00eb, n\u00eb t\u00eb cilin shqyrtuan shum\u00eb variante t\u00eb ndryshme. Analizuan edhe sistemet e skedar\u00ebve n\u00eb klaster, si PolyCeph dhe Lustre. Aty kishte probleme me performanc\u00ebn dhe operimi ishte mjaft i nd\u00ebrlikuar, ndaj u hoq\u00ebn dor\u00eb. Provuan gjithashtu t\u00eb montonin t\u00eb gjith\u00eb dataset-in p\u00ebrmes NFS n\u00eb \u00e7do makin\u00eb, p\u00ebr t'u shkall\u00ebzuar n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb. As leximi nuk dha rezultat t\u00eb mir\u00eb; u testuan zgjidhje t\u00eb ndryshme nga furnitor\u00eb t\u00eb ndrysh\u00ebm.<\/p>\n<p>Dhe n\u00eb fund vendos\u00ebm t\u00eb p\u00ebrdorim t\u00eb ashtuquajturin Storage Area Network.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/e99402fa641f3bd5fc8d57a9f8995642.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebto jan\u00eb SHD t\u00eb m\u00ebdha, t\u00eb projektuara pik\u00ebrisht p\u00ebr ruajtjen e sasive t\u00eb m\u00ebdha t\u00eb t\u00eb dh\u00ebnave. N\u00eb thelb jan\u00eb rafte me disqe, t\u00eb lidhura me makinat fundore t\u00eb shp\u00ebrndarjes p\u00ebrmes fibr\u00ebs optike. Pra, kemi nj\u00eb grup relativisht t\u00eb vog\u00ebl makinash dhe k\u00ebto SHD, q\u00eb jan\u00eb transparente p\u00ebr logjik\u00ebn ton\u00eb t\u00eb shp\u00ebrndarjes, dometh\u00ebn\u00eb p\u00ebr nginx-in ton\u00eb ose \u00e7far\u00ebdo zgjidhjeje tjet\u00ebr, p\u00ebrpunojn\u00eb k\u00ebrkesat p\u00ebr k\u00ebto fotografi.<\/p>\n<p>Kjo zgjidhje kishte p\u00ebrpar\u00ebsi t\u00eb qarta. Jan\u00eb SHD. Jan\u00eb t\u00eb orientuara pik\u00ebrisht p\u00ebr ruajtjen e fotove. Dhe kjo rezulton m\u00eb ekonomike sesa thjesht t\u00eb konfigurojm\u00eb makina me hard disqe.<\/p>\n<p>P\u00ebrpar\u00ebsia e dyt\u00eb. <\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7fd2e7d629cc239096b14c68be5f76bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKapaciteti u rrit ndjesh\u00ebm, dometh\u00ebn\u00eb n\u00eb shum\u00eb m\u00eb pak hap\u00ebsir\u00eb mund t\u00eb vendosnim shum\u00eb m\u00eb tep\u00ebr storage.<\/p>\n<p>Por pati edhe mang\u00ebsi, t\u00eb cilat u zbuluan mjaft shpejt. Me rritjen e numrit t\u00eb p\u00ebrdoruesve dhe t\u00eb ngarkes\u00ebs mbi k\u00ebt\u00eb sistem, filluan t\u00eb shfaqeshin probleme me performanc\u00ebn. Dhe problemi k\u00ebtu \u00ebsht\u00eb mjaft i qart\u00eb: \u00e7do SHD, e projektuar p\u00ebr t\u00eb ruajtur shum\u00eb fotografi n\u00eb pak hap\u00ebsir\u00eb, zakonisht vuan nga leximi intensiv. N\u00eb fakt, kjo vlen edhe p\u00ebr \u00e7do cloud storage apo \u00e7far\u00ebdo zgjidhjeje t\u00eb ngjashme. Sot nuk ekziston nj\u00eb storage ideal, pafund\u00ebsisht i shkall\u00ebzuesh\u00ebm, ku mund t\u00eb fus\u00ebsh \u00e7far\u00eb t\u00eb duash dhe q\u00eb ta p\u00ebrballoj\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb shk\u00eblqyer leximin. Sidomos leximin e rast\u00ebsish\u00ebm.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/566e836e2fe13a2a3d040ae3fa865d6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAshtu si n\u00eb rastin e photos tona, sepse fotografit\u00eb k\u00ebrkohen n\u00eb m\u00ebnyr\u00eb jo sekuenciale dhe kjo ndikon shum\u00eb n\u00eb performanc\u00ebn e tyre.<\/p>\n<p>Edhe sipas shifrave t\u00eb sotme, n\u00ebse kemi diku m\u00eb shum\u00eb se 500 RPS p\u00ebr foto p\u00ebr nj\u00eb makin\u00eb t\u00eb lidhur me storage, problemet fillojn\u00eb menj\u00ebher\u00eb. Dhe kjo ishte mjaft keq p\u00ebr ne, sepse numri i p\u00ebrdoruesve po rritet dhe gjith\u00e7ka vet\u00ebm sa do t\u00eb p\u00ebrkeq\u00ebsohej. Duhej ta optimizonim disi.<\/p>\n<p>P\u00ebr ta optimizuar, n\u00eb at\u00eb koh\u00eb vendos\u00ebm, natyrisht, t\u00eb shihnim profilin e ngarkes\u00ebs: \u00e7far\u00eb po ndodh n\u00eb t\u00eb v\u00ebrtet\u00eb dhe \u00e7far\u00eb duhet optimizuar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d67310e6b90c4ee1337065790576c9a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe k\u00ebtu gjith\u00e7ka punon n\u00eb favorin ton\u00eb.<\/p>\n<p>Si\u00e7 e thash\u00eb tashm\u00eb n\u00eb slajdin e par\u00eb: kemi 80 mij\u00eb k\u00ebrkesa leximi n\u00eb sekond\u00eb, nd\u00ebrsa vet\u00ebm 3,5 milion\u00eb ngarkime n\u00eb dit\u00eb. Pra, diferenca \u00ebsht\u00eb me tre rende madh\u00ebsie. \u00cbsht\u00eb e qart\u00eb se duhet optimizuar leximi dhe praktikisht \u00ebsht\u00eb e qart\u00eb edhe si.<\/p>\n<p>Ka edhe nj\u00eb moment t\u00eb vog\u00ebl. Specifika e sh\u00ebrbimit \u00ebsht\u00eb e till\u00eb q\u00eb p\u00ebrdoruesi regjistrohet, ngarkon nj\u00eb fotografi, pastaj fillon t\u00eb shoh\u00eb aktivisht njer\u00ebz t\u00eb tjer\u00eb, t\u2019i p\u00eblqej\u00eb ata, dhe profili i tij u shfaqet aktivisht p\u00ebrdoruesve t\u00eb tjer\u00eb. M\u00eb pas ai gjen ose nuk gjen nj\u00eb partner, sipas rastit, dhe p\u00ebr nj\u00ebfar\u00eb kohe ndalon s\u00eb p\u00ebrdoruri sh\u00ebrbimin. Pik\u00ebrisht n\u00eb periudh\u00ebn kur \u00ebsht\u00eb aktiv, fotot e tij jan\u00eb shum\u00eb t\u00eb k\u00ebrkuara \u2014 ato shikohen nga shum\u00eb njer\u00ebz. Sapo ndalon s\u00eb b\u00ebri k\u00ebt\u00eb, ai del mjaft shpejt nga k\u00ebto shfaqje intensive te p\u00ebrdoruesit e tjer\u00eb q\u00eb kishte m\u00eb par\u00eb, dhe fotot e tij pothuajse nuk k\u00ebrkohen m\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/dcc7e306055d8f2b0895f24679bfc3e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPra, ne kemi nj\u00eb dataset shum\u00eb t\u00eb vog\u00ebl hot. Por mbi t\u00eb ka jasht\u00ebzakonisht shum\u00eb k\u00ebrkesa. Dhe zgjidhja m\u00eb e dukshme k\u00ebtu \u00ebsht\u00eb t\u00eb shtojm\u00eb cache.<\/p>\n<p>Cache me LRU do t\u2019i zgjidh\u00eb t\u00eb gjitha problemet tona. \u00c7far\u00eb b\u00ebjm\u00eb?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/2bd0c88a97d928f386db21549fc02500.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara cluster-it ton\u00eb t\u00eb madh me storage shtojm\u00eb edhe nj\u00eb cluster tjet\u00ebr, relativisht t\u00eb vog\u00ebl, q\u00eb quhet photoscache. N\u00eb thelb, ky \u00ebsht\u00eb thjesht nj\u00eb proxy cache.<\/p>\n<p>Si funksionon kjo nga brenda? K\u00ebtu \u00ebsht\u00eb p\u00ebrdoruesi yn\u00eb, k\u00ebtu \u00ebsht\u00eb storage. Gjith\u00e7ka si m\u00eb par\u00eb. \u00c7far\u00eb shtojm\u00eb mes tyre?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7b7b5f102f1c012b2aef8f02ec731fac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKjo \u00ebsht\u00eb thjesht nj\u00eb makin\u00eb me disk fizik lokal, t\u00eb shpejt\u00eb. P\u00ebr shembull, me SSD. Dhe n\u00eb k\u00ebt\u00eb disk ruhet nj\u00eb cache lokale.<\/p>\n<p>Si duket kjo? P\u00ebrdoruesi d\u00ebrgon nj\u00eb k\u00ebrkes\u00eb p\u00ebr nj\u00eb foto. NGINX e k\u00ebrkon fillimisht n\u00eb cache lokale. N\u00ebse nuk gjendet, b\u00ebn thjesht proxy_pass te storage yn\u00eb, e shkarkon fotografin\u00eb prej andej dhe ia jep p\u00ebrdoruesit.<\/p>\n<p>Por kjo \u00ebsht\u00eb shum\u00eb banale dhe nuk \u00ebsht\u00eb e qart\u00eb se \u00e7far\u00eb ndodh brenda. N\u00eb praktik\u00eb funksionon af\u00ebrsisht k\u00ebshtu.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/46be24df171d1008e2a9099b7e4c9be6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCache \u00ebsht\u00eb e ndar\u00eb logjikisht n\u00eb tre shtresa. Kur them \u201ctre shtresa\u201d, kjo nuk do t\u00eb thot\u00eb se aty ka ndonj\u00eb sistem t\u00eb nd\u00ebrlikuar. Jo, kushtimisht jan\u00eb thjesht tre direktori n\u00eb file system:<\/p>\n<ol>\n<li>Ky \u00ebsht\u00eb buffer-i ku p\u00ebrfundojn\u00eb fotografit\u00eb e sapongarkuara nga proxy.<\/li>\n<li>Ky \u00ebsht\u00eb cache hot, ku ruhen fotografit\u00eb q\u00eb po k\u00ebrkohen aktivisht tani.<\/li>\n<li>Dhe cache cold, ku fotografit\u00eb zhvendosen gradualisht nga cache hot kur marrin m\u00eb pak request-e.<\/li>\n<\/ol>\n<p>\nQ\u00eb kjo t\u00eb funksionoj\u00eb, duhet ta menaxhojm\u00eb disi k\u00ebt\u00eb cache, t\u00eb l\u00ebvizim fotografit\u00eb brenda saj, e k\u00ebshtu me radh\u00eb. Edhe ky \u00ebsht\u00eb nj\u00eb proces shum\u00eb primitiv.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/9b16fe3e99a5f88f06169f6e5eedf2b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNginx p\u00ebr \u00e7do k\u00ebrkes\u00eb thjesht shkruan n\u00eb RAMDisk nj\u00eb access.log, ku tregon rrug\u00ebn drejt fotos q\u00eb sapo ka sh\u00ebrbyer (rrug\u00eb relative, natyrisht) dhe nga cili segment \u00ebsht\u00eb sh\u00ebrbyer. Pra, aty mund t\u00eb shkruhet \u00abphoto 1\u00bb dhe m\u00eb pas ose buffer, ose cache i nxeht\u00eb, ose cache i ftoht\u00eb, ose proxy.<\/p>\n<p>N\u00eb var\u00ebsi t\u00eb k\u00ebsaj, duhet t\u00eb marrim nj\u00eb vendim se \u00e7far\u00eb t\u00eb b\u00ebjm\u00eb me foton.<\/p>\n<p>N\u00eb \u00e7do makin\u00eb kemi nj\u00eb daemon t\u00eb vog\u00ebl q\u00eb punon vazhdimisht, lexon k\u00ebt\u00eb log dhe mban n\u00eb memorien e vet statistika p\u00ebr p\u00ebrdorimin e fotove t\u00eb ndryshme.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0dceda5e5ff432d1609520f0c152f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAi thjesht mbledh t\u00eb dh\u00ebnat aty, mban num\u00ebruesit dhe periodikisht b\u00ebn sa vijon. Fotot q\u00eb k\u00ebrkohen shpesh, p\u00ebr t\u00eb cilat vijn\u00eb shum\u00eb request-e, i zhvendos n\u00eb cache-in e nxeht\u00eb, pavar\u00ebsisht se ku ndodhen.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/941c13ecfea88372f3a7eb62d81b0c4e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFotot q\u00eb k\u00ebrkohen rrall\u00eb dhe kan\u00eb filluar t\u00eb k\u00ebrkohen edhe m\u00eb rrall\u00eb, i zhvendos gradualisht nga cache-i i nxeht\u00eb n\u00eb at\u00eb t\u00eb ftoht\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/a07235246995ad2fa4e6aeccae23a629.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe kur n\u00eb cache na mbaron hap\u00ebsira, thjesht fillojm\u00eb t\u00eb fshijm\u00eb gjith\u00e7ka nga cache-i i ftoht\u00eb pa asnj\u00eb p\u00ebrzgjedhje. Dhe, meq\u00eb ra fjala, kjo funksionon mir\u00eb.<\/p>\n<p>Q\u00eb fotoja t\u00eb ruhet menj\u00ebher\u00eb gjat\u00eb proxy-im n\u00eb buffer, ne p\u00ebrdorim direktiv\u00ebn proxy_store dhe buffer-i \u00ebsht\u00eb gjithashtu RAMDisk, pra p\u00ebr p\u00ebrdoruesin kjo funksionon shum\u00eb shpejt. Kjo sa i p\u00ebrket pjes\u00ebs s\u00eb brendshme t\u00eb vet\u00eb serverit t\u00eb cache-it.<\/p>\n<p>Mbetet pyetja se si t\u2019i shp\u00ebrndajm\u00eb request-et n\u00ebp\u00ebr k\u00ebta server\u00eb.<\/p>\n<p>Ta z\u00ebm\u00eb se kemi nj\u00eb cluster me nj\u00ebzet makina storage dhe tre server\u00eb cache (k\u00ebshtu ndodhi).<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6bc970b687701f3b6d57e153e3abed18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuhet t\u00eb p\u00ebrcaktojm\u00eb disi cilat request-e p\u00ebr cilat foto dhe ku duhet t\u00eb drejtohen.<\/p>\n<p>Varianti m\u00eb i thjesht\u00eb \u00ebsht\u00eb Round Robin. Apo ta b\u00ebjm\u00eb k\u00ebt\u00eb rast\u00ebsisht?<\/p>\n<p>Kjo, qartazi, ka nj\u00eb s\u00ebr\u00eb mang\u00ebsish, sepse n\u00eb k\u00ebt\u00eb situat\u00eb do ta p\u00ebrdorim cache-in shum\u00eb joefikasisht. K\u00ebrkesat do t\u00eb p\u00ebrfundojn\u00eb n\u00eb makina t\u00eb rast\u00ebsishme: k\u00ebtu \u00ebsht\u00eb ruajtur n\u00eb cache, nd\u00ebrsa n\u00eb tjetr\u00ebn pran\u00eb nuk \u00ebsht\u00eb m\u00eb. Dhe n\u00ebse gjith\u00eb kjo do t\u00eb funksionoj\u00eb, do t\u00eb funksionoj\u00eb shum\u00eb keq. Edhe me nj\u00eb num\u00ebr t\u00eb vog\u00ebl makinash n\u00eb cluster.<\/p>\n<p>Duhet t\u00eb p\u00ebrcaktojm\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb qart\u00eb se n\u00eb cilin server duhet t\u00eb p\u00ebrfundoj\u00eb secili request.<\/p>\n<p>Ka nj\u00eb m\u00ebnyr\u00eb t\u00eb thjesht\u00eb. Marrim hash-in e URL-s\u00eb ose hash-in e \u00e7el\u00ebsit ton\u00eb t\u00eb sharding-ut q\u00eb ndodhet n\u00eb URL dhe e pjes\u00ebtojm\u00eb pa mbetje me numrin e server\u00ebve. A do t\u00eb funksionoj\u00eb? Po, do t\u00eb funksionoj\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/794a82ac1268b651ab936f0225b802a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPra, kemi nj\u00eb request 100% t\u00eb p\u00ebrcaktuar: p\u00ebr shembull, p\u00ebr nj\u00eb \u00abexample_url\u00bb t\u00eb caktuar ai do t\u00eb p\u00ebrfundoj\u00eb gjithmon\u00eb n\u00eb serverin me indeks \u00ab2\u00bb, dhe cache do t\u00eb shfryt\u00ebzohet vazhdimisht sa m\u00eb mir\u00eb q\u00eb t\u00eb jet\u00eb e mundur.<\/p>\n<p>Por n\u00eb k\u00ebt\u00eb skem\u00eb lind nj\u00eb problem me risharding-un. Me risharding n\u00ebnkuptoj ndryshimin e numrit t\u00eb server\u00ebve.<\/p>\n<p>Le t\u00eb supozojm\u00eb se klasteri yn\u00eb i cache nuk po e p\u00ebrballon m\u00eb ngarkes\u00ebn dhe vendos\u00ebm t\u00eb shtojm\u00eb edhe nj\u00eb makin\u00eb.<\/p>\n<p>E shtojm\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/5f2fcba4c4f267c069811c3677bd0213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTani gjith\u00e7ka nuk pjes\u00ebtohet m\u00eb sakt\u00ebsisht me tre, por me kat\u00ebr. Si rezultat, pothuajse t\u00eb gjith\u00eb \u00e7el\u00ebsat q\u00eb kishim m\u00eb par\u00eb, pothuajse t\u00eb gjitha URL-t\u00eb, tani ndodhen n\u00eb server\u00eb t\u00eb tjer\u00eb. I gjith\u00eb cache u invalidua menj\u00ebher\u00eb. T\u00eb gjitha request-et u derdh\u00ebn te klasteri yn\u00eb storage, ai u mbingarkua, sh\u00ebrbimi d\u00ebshtoi dhe p\u00ebrdoruesit mbet\u00ebn t\u00eb pak\u00ebnaqur. K\u00ebshtu nuk duam t\u00eb veprojm\u00eb.<\/p>\n<p>Edhe ky variant nuk na p\u00ebrshtatet.<\/p>\n<p>Pra, \u00e7far\u00eb duhet t\u00eb b\u00ebjm\u00eb? Duhet disi ta p\u00ebrdorim cache n\u00eb m\u00ebnyr\u00eb efikase, ta \u00e7ojm\u00eb vazhdimisht t\u00eb nj\u00ebjtin request te i nj\u00ebjti server, por nj\u00ebkoh\u00ebsisht t\u00eb jemi rezistent\u00eb ndaj risharding-ut. Dhe nj\u00eb zgjidhje e till\u00eb ekziston; nuk \u00ebsht\u00eb ndonj\u00eb gj\u00eb e nd\u00ebrlikuar. Quhet consistent hashing.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/1380758686274df9755a7ebf7d1c8753.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi duket kjo?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/44f97abfac46fa9f361055548819e8a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMarrim nj\u00eb funksion t\u00eb caktuar t\u00eb \u00e7el\u00ebsit t\u00eb sharding-ut dhe i shp\u00ebrndajm\u00eb t\u00eb gjitha vlerat e tij p\u00ebrgjat\u00eb nj\u00eb rrethi. Pra, n\u00eb pik\u00ebn 0 bashkohen vlerat e tij minimale dhe maksimale. M\u00eb pas, n\u00eb po k\u00ebt\u00eb rreth vendosim t\u00eb gjith\u00eb server\u00ebt tan\u00eb af\u00ebrsisht n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d470ec615a789913a6baa2726b05acea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSecili server p\u00ebrcaktohet nga nj\u00eb pik\u00eb, dhe sektori q\u00eb shtrihet deri te ai n\u00eb drejtim t\u00eb akrepave t\u00eb or\u00ebs sh\u00ebrbehet pik\u00ebrisht nga ky host. Kur na vijn\u00eb request-et, e shohim menj\u00ebher\u00eb se, p\u00ebr shembull, request A \u2014 me at\u00eb hash-in e vet \u2014 sh\u00ebrbehet nga serveri 2. Request B \u2014 nga serveri 3. E k\u00ebshtu me radh\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fcdbd1caa9f1162cf02e8b0a1c79cb74.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c7far\u00eb ndodh n\u00eb k\u00ebt\u00eb situat\u00eb gjat\u00eb risharding-ut?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7386cda826e9419d5f8a9a0d6d6703c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe nuk e invaliduojm\u00eb t\u00eb gjith\u00eb cache, si m\u00eb par\u00eb, dhe nuk i zhvendosim t\u00eb gjith\u00eb \u00e7el\u00ebsat; p\u00ebrkundrazi, zhvendosim secilin sektor p\u00ebr nj\u00eb distanc\u00eb t\u00eb vog\u00ebl, n\u00eb m\u00ebnyr\u00eb q\u00eb n\u00eb hap\u00ebsir\u00ebn e liruar, n\u00eb m\u00ebnyr\u00eb figurative, t\u00eb futet serveri yn\u00eb i gjasht\u00eb q\u00eb duam t\u00eb shtojm\u00eb, dhe e vendosim aty.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8680e0cf023ce911b4d162e9102c0545.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSigurisht, n\u00eb nj\u00eb situat\u00eb t\u00eb till\u00eb edhe \u00e7el\u00ebsat zhvendosen. Por zhvendosen shum\u00eb m\u00eb pak se m\u00eb par\u00eb. Dhe shohim q\u00eb dy \u00e7el\u00ebsat tan\u00eb t\u00eb par\u00eb mbet\u00ebn n\u00eb server\u00ebt e tyre, nd\u00ebrsa serveri i cache-it ndryshoi vet\u00ebm p\u00ebr \u00e7el\u00ebsin e fundit. Kjo funksionon mjaft efektivisht dhe, n\u00ebse shtoni hoste t\u00eb rinj n\u00eb m\u00ebnyr\u00eb inkrementale, k\u00ebtu nuk ka ndonj\u00eb problem t\u00eb madh. I shtoni gradualisht, prisni derisa cache-i t\u00eb mbushet s\u00ebrish, dhe gjith\u00e7ka funksionon mir\u00eb.<\/p>\n<p>Pyetja e vetme mbetet n\u00eb rast d\u00ebshtimesh. Le t\u00eb supozojm\u00eb se na ka dal\u00eb jasht\u00eb funksionit nj\u00eb makin\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8e3301af782ce8983716c4bc9add79a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe nuk do t\u00eb donim aspak q\u00eb n\u00eb at\u00eb moment ta rigjeneronim k\u00ebt\u00eb hart\u00eb, t\u00eb invalidonim nj\u00eb pjes\u00eb t\u00eb cache-it e k\u00ebshtu me radh\u00eb, n\u00ebse, p\u00ebr shembull, makina u rebootua dhe ne duhet disi t\u2019i sh\u00ebrbejm\u00eb k\u00ebrkesat. Ne thjesht mbajm\u00eb n\u00eb secilin lokacion nj\u00eb photo cache rezerv\u00eb, i cili sh\u00ebrben si z\u00ebvend\u00ebsim p\u00ebr \u00e7do makin\u00eb q\u00eb ka dal\u00eb aktualisht jasht\u00eb funksionit. Dhe n\u00ebse papritur nj\u00eb server b\u00ebhet i padisponuesh\u00ebm, trafiku shkon atje. Natyrisht, aty nuk ka asnj\u00eb cache, pra \u00ebsht\u00eb i ftoht\u00eb, por t\u00eb pakt\u00ebn k\u00ebrkesat e p\u00ebrdoruesve p\u00ebrpunohen. N\u00ebse ky \u00ebsht\u00eb nj\u00eb interval i shkurt\u00ebr, e p\u00ebrballojm\u00eb krejt\u00ebsisht pa problem. Thjesht rritet ngarkesa mbi storage. N\u00ebse intervali \u00ebsht\u00eb i gjat\u00eb, at\u00ebher\u00eb mund t\u00eb marrim nj\u00eb vendim \u2014 ta heqim k\u00ebt\u00eb server nga harta ose jo, ose ndoshta ta z\u00ebvend\u00ebsojm\u00eb me nj\u00eb tjet\u00ebr.<\/p>\n<p>Kaq sa i p\u00ebrket sistemit t\u00eb cache-it. Le t\u00eb shohim rezultatet.<\/p>\n<p>N\u00eb pamje t\u00eb par\u00eb, k\u00ebtu nuk ka asgj\u00eb t\u00eb nd\u00ebrlikuar. Por nj\u00eb m\u00ebnyr\u00eb e till\u00eb e menaxhimit t\u00eb cache-it na dha nj\u00eb hit rate rreth 98%. Pra, nga k\u00ebto 80 mij\u00eb request-e n\u00eb sekond\u00eb, vet\u00ebm 1600 arrijn\u00eb te storage-et, dhe kjo \u00ebsht\u00eb nj\u00eb ngarkes\u00eb krejt normale; ato e p\u00ebrballojn\u00eb pa problem dhe ne kemi gjithmon\u00eb rezerv\u00eb.<\/p>\n<p>K\u00ebta server\u00eb i vendos\u00ebm n\u00eb tre DC-t\u00eb tona dhe mor\u00ebm tre pika pranie \u2014 Prag\u00eb, Miami dhe Hong Kong.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/64eef492b65a014d8ba3c808b6579b41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu, ato jan\u00eb t\u00eb vendosura pak a shum\u00eb lokalisht pran\u00eb secilit prej tregjeve tona t\u00eb synuara.<\/p>\n<p>Dhe si nj\u00eb bonus i k\u00ebndsh\u00ebm, mor\u00ebm k\u00ebt\u00eb proxy cache, ku CPU n\u00eb fakt q\u00ebndron kryesisht pa ngarkes\u00eb, sepse p\u00ebr shp\u00ebrndarjen e p\u00ebrmbajtjes nuk nevojitet aq shum\u00eb. Dhe aty, me ndihm\u00ebn e NGINX + Lua, kemi implementuar shum\u00eb logjik\u00eb utilitare.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b65c609df5e1985240d04ee65a3e4f55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebr shembull, mund t\u00eb eksperimentojm\u00eb me webp ose progressive jpeg (k\u00ebto jan\u00eb formate moderne dhe efikase), t\u00eb shohim si ndikon kjo te trafiku, t\u00eb marrim vendime t\u00eb caktuara, t\u2019i aktivizojm\u00eb p\u00ebr vende t\u00eb ve\u00e7anta etj.; t\u00eb b\u00ebjm\u00eb resize dinamik ose crop t\u00eb fotografive n\u00eb koh\u00eb reale.<\/p>\n<p>Ky \u00ebsht\u00eb nj\u00eb use case i mir\u00eb kur, p\u00ebr shembull, keni nj\u00eb aplikacion mobil q\u00eb shfaq foto, dhe aplikacioni nuk d\u00ebshiron t\u00eb shpenzoj\u00eb CPU-n\u00eb e pajisjes s\u00eb klientit p\u00ebr t\u00eb k\u00ebrkuar nj\u00eb foto t\u00eb madhe dhe m\u00eb pas p\u00ebr ta b\u00ebr\u00eb resize n\u00eb nj\u00eb madh\u00ebsi t\u00eb caktuar q\u00eb t\u00eb futet n\u00eb view. Ne mund t\u00eb specifikojm\u00eb thjesht disa parametra dinamik\u00eb n\u00eb URL n\u00eb nj\u00eb UPort hipotetik, dhe photo cache do ta b\u00ebj\u00eb vet\u00eb resize foton. Si rregull, ai zgjedh madh\u00ebsin\u00eb q\u00eb ekziston fizikisht n\u00eb disk dhe q\u00eb \u00ebsht\u00eb sa m\u00eb af\u00ebr asaj t\u00eb k\u00ebrkuar, pastaj e downscale-on sipas koordinatave t\u00eb p\u00ebrcaktuara.<\/p>\n<blockquote><p>Meq\u00eb ra fjala, kemi publikuar me qasje t\u00eb hapur regjistrimet video t\u00eb pes\u00eb viteve t\u00eb fundit t\u00eb konferenc\u00ebs s\u00eb zhvilluesve t\u00eb sistemeve me ngarkes\u00eb t\u00eb lart\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex>. Shikoni, m\u00ebsoni, ndani dhe abonohuni n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/profyclub\">kanalin n\u00eb YouTube<\/a><\/noindex>.<\/p><\/blockquote>\n<p>\nGjithashtu, mund t\u00eb shtojm\u00eb aty shum\u00eb logjik\u00eb produkti. P\u00ebr shembull, sipas parametrave t\u00eb URL-s\u00eb mund t\u00eb shtojm\u00eb watermark-e t\u00eb ndryshme, mund t\u00eb b\u00ebjm\u00eb blur t\u00eb fotografive, t\u2019i turbullojm\u00eb ose t\u2019i pikselizojm\u00eb. Kjo p\u00ebrdoret kur duam t\u00eb shfaqim fotografin\u00eb e nj\u00eb personi, por nuk duam t\u2019i tregojm\u00eb fytyr\u00ebn; funksionon shum\u00eb mir\u00eb, dhe e gjith\u00eb kjo \u00ebsht\u00eb e implementuar k\u00ebtu.<\/p>\n<p>\u00c7far\u00eb mor\u00ebm? Mor\u00ebm tre pika pranis\u00eb, nj\u00eb hit rate t\u00eb mir\u00eb, dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb CPU-ja n\u00eb k\u00ebto makina nuk rri m\u00eb kot. Tani, sigurisht, ajo \u00ebsht\u00eb b\u00ebr\u00eb m\u00eb e r\u00ebnd\u00ebsishme se m\u00eb par\u00eb. Duhet t\u00eb p\u00ebrdorim makina m\u00eb t\u00eb fuqishme, por ia vlen.<\/p>\n<p>Sa i p\u00ebrket shp\u00ebrndarjes s\u00eb fotografive, k\u00ebtu gjith\u00e7ka \u00ebsht\u00eb mjaft e qart\u00eb dhe e dukshme. Mendoj se nuk po zbuloj di\u00e7ka t\u00eb re; k\u00ebshtu funksionon praktikisht \u00e7do CDN.<\/p>\n<p>Dhe ka shum\u00eb gjasa q\u00eb nj\u00eb d\u00ebgjues me p\u00ebrvoj\u00eb t\u00eb ket\u00eb b\u00ebr\u00eb pyetjen: pse t\u00eb mos e z\u00ebvend\u00ebsojm\u00eb thjesht gjith\u00e7ka me CDN? Do t\u00eb ishte af\u00ebrsisht e nj\u00ebjta gj\u00eb, sepse t\u00eb gjitha CDN-t\u00eb moderne i mb\u00ebshtesin k\u00ebto funksione. Dhe k\u00ebtu ka disa arsye.<\/p>\n<p>E para jan\u00eb fotografit\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/592c10eb74d46191bfcedec120f68556.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKy \u00ebsht\u00eb nj\u00eb nga element\u00ebt ky\u00e7 t\u00eb infrastruktur\u00ebs son\u00eb dhe na duhet sa m\u00eb shum\u00eb kontroll mbi to. N\u00ebse b\u00ebhet fjal\u00eb p\u00ebr nj\u00eb zgjidhje nga nj\u00eb vendor i jasht\u00ebm dhe ju nuk keni asnj\u00eb kontroll mbi t\u00eb, do ta keni mjaft t\u00eb v\u00ebshtir\u00eb ta menaxhoni k\u00ebt\u00eb kur keni nj\u00eb dataset t\u00eb madh dhe nj\u00eb fluks shum\u00eb t\u00eb lart\u00eb k\u00ebrkesash nga p\u00ebrdoruesit.<\/p>\n<p>Do t\u00eb jap nj\u00eb shembull. Tani, n\u00eb infrastruktur\u00ebn ton\u00eb, p\u00ebr shembull, n\u00eb rast problemesh apo zhurmash t\u00eb dyshimta \u201cnga posht\u00eb\u201d, ne mund t\u00eb hyjm\u00eb n\u00eb makin\u00eb dhe t\u00eb b\u00ebjm\u00eb debug aty, n\u00ebse mund t\u00eb themi k\u00ebshtu. Mund t\u00eb shtojm\u00eb mbledhjen e metrikeve q\u00eb na duhen vet\u00ebm neve, mund t\u00eb eksperimentojm\u00eb dhe t\u00eb shohim se si kjo do t\u00eb ndikoj\u00eb n\u00eb grafik\u00eb, e k\u00ebshtu me radh\u00eb. Aktualisht mblidhen shum\u00eb statistika p\u00ebr k\u00ebt\u00eb klaster cache, dhe ne i shqyrtojm\u00eb periodikisht duke hetuar p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb anomali t\u00eb ndryshme. N\u00ebse kjo do t\u00eb ishte n\u00eb an\u00ebn e CDN, do t\u00eb ishte shum\u00eb m\u00eb e v\u00ebshtir\u00eb p\u00ebr t\u2019u kontrolluar. Ose, p\u00ebr shembull, n\u00ebse ndodh nj\u00eb incident, ne e dim\u00eb \u00e7far\u00eb ka ndodhur, dim\u00eb si t\u00eb punojm\u00eb me t\u00eb dhe si ta zgjidhim. Ky \u00ebsht\u00eb p\u00ebrfundimi i par\u00eb.<\/p>\n<p>P\u00ebrfundimi i dyt\u00eb \u00ebsht\u00eb gjithashtu m\u00eb tep\u00ebr historik, sepse sistemi po zhvillohet prej koh\u00ebsh dhe n\u00eb faza t\u00eb ndryshme ka pasur shum\u00eb k\u00ebrkesa t\u00eb ndryshme biznesi, t\u00eb cilat jo gjithmon\u00eb p\u00ebrshtaten me konceptin e CDN.<\/p>\n<p>Dhe pika q\u00eb del nga e m\u00ebparshmja \u00ebsht\u00eb \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/007cf3aed2f9cc12185fc3865bf9d196.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTe photo cache ne kemi shum\u00eb logjik\u00eb specifike, e cila jo gjithmon\u00eb mund t\u00eb shtohet sipas k\u00ebrkes\u00ebs. Nuk ka shum\u00eb gjasa q\u00eb ndonj\u00eb CDN, me k\u00ebrkes\u00ebn tuaj, t\u00eb shtoj\u00eb gj\u00ebra t\u00eb personalizuara p\u00ebr ju. P\u00ebr shembull, enkriptimin e URL-ve, n\u00ebse nuk doni q\u00eb klienti t\u00eb mund t\u00eb ndryshoj\u00eb di\u00e7ka. Mund t\u00eb doni t\u00eb ndryshoni URL-n\u00eb n\u00eb server dhe ta enkriptoni, e m\u00eb pas t\u00eb d\u00ebrgoni k\u00ebtu disa parametra dinamik\u00eb.<\/p>\n<p>\u00c7far\u00eb p\u00ebrfundimi del vetvetiu? N\u00eb rastin ton\u00eb, CDN nuk \u00ebsht\u00eb nj\u00eb alternativ\u00eb shum\u00eb e mir\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/cfc2963cca2357cf6b0f63419a4dc436.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNd\u00ebrsa n\u00eb rastin tuaj, n\u00ebse keni k\u00ebrkesa specifike biznesi, mund ta zbatoni vet\u00eb fare qet\u00ebsisht at\u00eb q\u00eb ju tregova. Dhe me nj\u00eb profil t\u00eb ngjash\u00ebm ngarkese, kjo do t\u00eb funksionoj\u00eb shk\u00eblqyesh\u00ebm.<\/p>\n<p>Por n\u00ebse ju duhet nj\u00eb zgjidhje e p\u00ebrgjithshme dhe detyra nuk \u00ebsht\u00eb shum\u00eb specifike, mund t\u00eb zgjidhni fare qet\u00ebsisht nj\u00eb CDN. Ose n\u00ebse p\u00ebr ju koha dhe burimet kan\u00eb shum\u00eb m\u00eb tep\u00ebr r\u00ebnd\u00ebsi sesa kontrolli.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b76d25404918a5d0d8bf1d6644c8d873.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe CDN-t\u00eb moderne kan\u00eb pothuajse gjith\u00e7ka p\u00ebr t\u00eb cil\u00ebn ju tregova tani, me p\u00ebrjashtim t\u00eb pak a shum\u00eb disa ve\u00e7orive.<\/p>\n<p>Kaq sa i p\u00ebrket shp\u00ebrndarjes s\u00eb fotografive.<\/p>\n<p>Tani le t\u00eb ecim pak m\u00eb tej n\u00eb retrospektiv\u00ebn ton\u00eb dhe t\u00eb flasim p\u00ebr ruajtjen.<\/p>\n<p>Ishte viti 2013.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f218bfc899512041967842430c02aa9b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nServer\u00ebt e cache-it u shtuan dhe problemet me performance u zhduk\u00ebn. Gjith\u00e7ka shkonte mir\u00eb. Dataset po rritej. N\u00eb vitin 2013 kishim rreth 80 server\u00eb t\u00eb lidhur me storage-et dhe rreth 40 server\u00eb cache n\u00eb secilin DC. Kjo p\u00ebrb\u00ebnte 560 terabajt t\u00eb dh\u00ebnash n\u00eb \u00e7do DC, pra af\u00ebrsisht nj\u00eb petabajt n\u00eb total.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/ef741ba4a9164e6940f55e93dfb46ef0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDhe me rritjen e dataset-it nis\u00ebn t\u00eb rriteshin ndjesh\u00ebm edhe kostot operative. Si shfaqej kjo?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6cf5e489a4e97bc6e26fc6d4d16505b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb k\u00ebt\u00eb skem\u00eb t\u00eb paraqitur \u2014 me SAN, me makinat e lidhura me t\u00eb dhe me cache-in \u2014 ka shum\u00eb pika d\u00ebshtimi. N\u00ebse me d\u00ebshtimet e server\u00ebve cache ishim marr\u00eb m\u00eb par\u00eb dhe aty gjith\u00e7ka ishte pak a shum\u00eb e parashikueshme dhe e qart\u00eb, at\u00ebher\u00eb n\u00eb an\u00ebn e storage-it situata ishte shum\u00eb m\u00eb e keqe.<\/p>\n<p>S\u00eb pari, vet\u00eb Storage Area Network (SAN), i cili mund t\u00eb d\u00ebshtoj\u00eb.<\/p>\n<p>S\u00eb dyti, ai \u00ebsht\u00eb i lidhur me makinat fundore p\u00ebrmes fibr\u00ebs optike. Mund t\u00eb ket\u00eb probleme me kartat optike dhe me switch-et.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6959b79284c5b1244a70a1d64f191893.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSigurisht, k\u00ebto nuk jan\u00eb aq t\u00eb shpeshta sa problemet me vet\u00eb SAN-in, por megjithat\u00eb edhe k\u00ebto jan\u00eb pika d\u00ebshtimi.<\/p>\n<p>M\u00eb tej \u00ebsht\u00eb vet\u00eb makina q\u00eb \u00ebsht\u00eb e lidhur me storage-in. Edhe ajo mund t\u00eb dal\u00eb jasht\u00eb funksionit.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/1801cb502663a4de14329a5e67dfed79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPra, n\u00eb total kemi tre pika d\u00ebshtimi.<\/p>\n<p>P\u00ebrve\u00e7 pikave t\u00eb d\u00ebshtimit, mir\u00ebmbajtja e vet\u00eb storage-eve \u00ebsht\u00eb e r\u00ebnd\u00eb.<\/p>\n<p>Kjo \u00ebsht\u00eb nj\u00eb sistem kompleks me shum\u00eb komponent\u00eb dhe inxhinier\u00ebt e sistemeve shpesh e kan\u00eb t\u00eb v\u00ebshtir\u00eb ta menaxhojn\u00eb.<\/p>\n<p>Dhe pika e fundit, m\u00eb e r\u00ebnd\u00ebsishmja. N\u00ebse ndodh nj\u00eb d\u00ebshtim n\u00eb cil\u00ebndo nga k\u00ebto tre pika, ekziston nj\u00eb probabilitet real q\u00eb t\u00eb humbasim t\u00eb dh\u00ebnat e p\u00ebrdoruesit, sepse sistemi i skedar\u00ebve mund t\u00eb korruptohet.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/4bf8bc1c73a2beef74cb4ee0ee45679b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb supozojm\u00eb se sistemi i skedar\u00ebve \u00ebsht\u00eb korruptuar. Rikuperimi i tij, s\u00eb pari, zgjat shum\u00eb \u2014 me v\u00ebllime t\u00eb m\u00ebdha t\u00eb dh\u00ebnash kjo mund t\u00eb marr\u00eb nj\u00eb jav\u00eb. Dhe s\u00eb dyti, n\u00eb fund ka shum\u00eb gjasa t\u00eb marrim nj\u00eb grumbull skedar\u00ebsh t\u00eb paqart\u00eb, t\u00eb cil\u00ebt pastaj duhet t\u2019i p\u00ebrputhim disi me fotografit\u00eb e p\u00ebrdoruesve. Dhe ne rrezikojm\u00eb t\u00eb humbasim t\u00eb dh\u00ebna. Rreziku \u00ebsht\u00eb mjaft i lart\u00eb. Dhe sa m\u00eb shpesh t\u00eb ndodhin situata t\u00eb tilla, sa m\u00eb shum\u00eb probleme t\u00eb ket\u00eb n\u00eb gjith\u00eb k\u00ebt\u00eb zinxhir, aq m\u00eb i lart\u00eb b\u00ebhet ky rrezik.<\/p>\n<p>Di\u00e7ka duhej b\u00ebr\u00eb p\u00ebr k\u00ebt\u00eb. Dhe vendos\u00ebm q\u00eb thjesht duhej t\u00eb rezervonim t\u00eb dh\u00ebnat. N\u00eb fakt, kjo ishte nj\u00eb zgjidhje e qart\u00eb dhe e mir\u00eb. \u00c7far\u00eb b\u00ebm\u00eb?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f80ec2b65003c40bd2fabf88966b3e05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu dukej serveri yn\u00eb q\u00eb m\u00eb par\u00eb ishte i lidhur me storage-in. Ky ishte nj\u00eb particion kryesor, thjesht nj\u00eb pajisje blloku, q\u00eb n\u00eb thelb ishte nj\u00eb mount n\u00eb nj\u00eb storage t\u00eb larg\u00ebt p\u00ebrmes fibr\u00ebs optike.<\/p>\n<p>Thjesht shtuam nj\u00eb particion t\u00eb dyt\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d3dba75ef477269d92145cd69d587527.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVendos\u00ebm pran\u00eb nj\u00eb storage t\u00eb dyt\u00eb (fatmir\u00ebsisht, nga ana e kostos kjo nuk ishte aq e shtrenjt\u00eb) dhe e quajt\u00ebm seksioni i backup-it. Edhe ai \u00ebsht\u00eb i lidhur me fib\u00ebr dhe ndodhet n\u00eb t\u00eb nj\u00ebjt\u00ebn makin\u00eb. Por na duhej t\u00eb sinkronizonim disi t\u00eb dh\u00ebnat mes tyre.<\/p>\n<p>K\u00ebtu thjesht krijojm\u00eb pran\u00eb tij nj\u00eb radh\u00eb asinkrone.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/67bced2b45c589009cfb01a1c21398a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAjo nuk \u00ebsht\u00eb shum\u00eb e ngarkuar. E dim\u00eb q\u00eb kemi pak shkrime. Radha \u00ebsht\u00eb thjesht nj\u00eb tabel\u00eb n\u00eb MySQL, ku shkruhen rreshta t\u00eb tipit \u00abduhet b\u00ebr\u00eb backup i k\u00ebsaj fotografie\u00bb. Me \u00e7do ndryshim ose gjat\u00eb upload-it, ne kopjojm\u00eb nga seksioni kryesor te backup-i n\u00eb m\u00ebnyr\u00eb asinkrone ose thjesht me ndonj\u00eb background worker.<\/p>\n<p>Dhe n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb kemi gjithmon\u00eb dy seksione konsistente. Edhe n\u00ebse nj\u00eb pjes\u00eb e k\u00ebtij sistemi del jasht\u00eb funksionit, ne gjithmon\u00eb mund ta nd\u00ebrrojm\u00eb seksionin kryesor me backup-in dhe gjith\u00e7ka do t\u00eb vazhdoj\u00eb t\u00eb punoj\u00eb.<\/p>\n<p>Por p\u00ebr shkak t\u00eb k\u00ebsaj rritet ndjesh\u00ebm ngarkesa e leximit, sepse p\u00ebrve\u00e7 klient\u00ebve q\u00eb lexojn\u00eb nga seksioni kryesor, pasi fillimisht e k\u00ebrkojn\u00eb fotografin\u00eb aty (sepse aty \u00ebsht\u00eb m\u00eb e fresk\u00ebt), dhe vet\u00ebm m\u00eb pas e k\u00ebrkojn\u00eb te backup-i n\u00ebse nuk e gjejn\u00eb (por k\u00ebt\u00eb e b\u00ebn thjesht NGINX), sistemi yn\u00eb i backup-it tani lexon gjithashtu nga seksioni kryesor. Jo se kjo ishte ndonj\u00eb ngushtic\u00eb, por nuk donim t\u00eb rrisnim ngarkes\u00ebn, n\u00eb thelb, kot s\u00eb koti.<\/p>\n<p>Dhe shtuam nj\u00eb disk t\u00eb tret\u00eb, nj\u00eb SSD t\u00eb vog\u00ebl, dhe e quajt\u00ebm buffer.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fd35481822b4170087e5f670bf338dc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi funksionon tani kjo.<\/p>\n<p>P\u00ebrdoruesi e b\u00ebn upload foton n\u00eb buffer, m\u00eb pas hidhet nj\u00eb event n\u00eb radh\u00eb q\u00eb ajo duhet t\u00eb kopjohet n\u00eb dy seksione. Ajo kopjohet, dhe fotografia p\u00ebr nj\u00ebfar\u00eb kohe (ta z\u00ebm\u00eb, nj\u00eb dit\u00eb) q\u00ebndron n\u00eb buffer, e vet\u00ebm m\u00eb pas pastrohet prej andej. Kjo e p\u00ebrmir\u00ebson shum\u00eb user experience, sepse p\u00ebrdoruesi e ngarkon fotografin\u00eb dhe, si rregull, menj\u00ebher\u00eb pas k\u00ebsaj fillojn\u00eb request-et, ose ai vet\u00eb e p\u00ebrdit\u00ebson faqen, b\u00ebn refresh. Por e gjith\u00eb kjo varet nga aplikacioni q\u00eb b\u00ebn upload-in.<\/p>\n<p>Ose, p\u00ebr shembull, persona t\u00eb tjer\u00eb t\u00eb cil\u00ebve ai sapo ka filluar t'ua tregoj\u00eb, menj\u00ebher\u00eb pas k\u00ebsaj fotografie d\u00ebrgojn\u00eb request-e. Ajo ende nuk \u00ebsht\u00eb n\u00eb cache, por k\u00ebrkesa e par\u00eb ndodh shum\u00eb shpejt. N\u00eb thelb, nj\u00ebsoj si me cache-in e fotove. Storage-i i ngadalt\u00eb nuk p\u00ebrfshihet fare k\u00ebtu. Dhe kur pas nj\u00eb dite ajo t\u00eb pastrohet, ose tashm\u00eb \u00ebsht\u00eb cache-uar n\u00eb shtres\u00ebn ton\u00eb t\u00eb caching-ut, ose me shum\u00eb gjas\u00eb nuk i duhet m\u00eb askujt. Pra, user experience k\u00ebtu u p\u00ebrmir\u00ebsua ndjesh\u00ebm fal\u00eb k\u00ebtyre veprimeve t\u00eb thjeshta.<\/p>\n<p>Dhe, m\u00eb e r\u00ebnd\u00ebsishmja: ne ndaluam s\u00eb humburi t\u00eb dh\u00ebna.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/526f549457dd0c438f32b0adb76df76c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb themi k\u00ebshtu, ne ndaluam <em>e mundshme<\/em> t\u00eb humbnim t\u00eb dh\u00ebna, sepse n\u00eb fakt pothuajse nuk i humbnim fare. Por rreziku ekzistonte. E shohim q\u00eb nj\u00eb zgjidhje e till\u00eb, sigurisht, \u00ebsht\u00eb e mir\u00eb, por i ngjan disi zbutjes s\u00eb simptomave t\u00eb problemit, n\u00eb vend q\u00eb ta zgjidh\u00eb at\u00eb plot\u00ebsisht. Dhe k\u00ebtu mbet\u00ebn ende disa probleme.<\/p>\n<p>S\u00eb pari, pika e d\u00ebshtimit n\u00eb form\u00ebn e vet\u00eb host-it fizik, mbi t\u00eb cilin punon e gjith\u00eb kjo infrastruktur\u00eb, nuk u zhduk askund.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0eb3d292655a7edf912793ed81e8931c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00eb dyti, mbet\u00ebn problemet me SAN-et, mbeti mir\u00ebmbajtja e tyre e r\u00ebnd\u00eb etj. Kjo nuk ishte domosdoshm\u00ebrisht nj\u00eb faktor kritik, por donim t\u00eb provonim t\u00eb jetonim disi edhe pa k\u00ebt\u00eb.<\/p>\n<p>Dhe ne b\u00ebm\u00eb versionin e tret\u00eb (n\u00eb thelb, t\u00eb dytin n\u00eb fakt) \u2014 versionin me rezervim. Si dukej kjo?<\/p>\n<p>Kjo \u00ebsht\u00eb ajo q\u00eb kishim \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8b1749b6feed200f8a64529ee2316c1a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemet kryesore i kishim nga fakti q\u00eb ky \u00ebsht\u00eb nj\u00eb host fizik.<\/p>\n<p>S\u00eb pari, ne heqim SAN-et, sepse duam t\u00eb eksperimentojm\u00eb, duam t\u00eb provojm\u00eb thjesht disqe lokale.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fd0f5a8627d9179fcbc7097c1c18505f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKjo ishte tashm\u00eb periudha 2014-2015, dhe n\u00eb at\u00eb koh\u00eb situata me disqet dhe me kapacitetin e tyre brenda nj\u00eb host-i ishte p\u00ebrmir\u00ebsuar ndjesh\u00ebm. Vendos\u00ebm: pse t\u00eb mos e provojm\u00eb.<\/p>\n<p>Dhe m\u00eb pas thjesht marrim ndarjen ton\u00eb t\u00eb backup-it dhe e zhvendosim fizikisht n\u00eb nj\u00eb makin\u00eb t\u00eb ve\u00e7ant\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/456e00bc8557d3340b06efcd1dde8a08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebshtu, marrim nj\u00eb skem\u00eb t\u00eb till\u00eb. Kemi dy makina q\u00eb ruajn\u00eb t\u00eb nj\u00ebjtat dataset-e. Ato e rezervojn\u00eb plot\u00ebsisht nj\u00ebra-tjetr\u00ebn dhe sinkronizojn\u00eb t\u00eb dh\u00ebnat p\u00ebrmes rrjetit n\u00ebp\u00ebrmjet nj\u00eb radhe asinkrone n\u00eb t\u00eb nj\u00ebjtin MySQL.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d44cdb7b440ad4c58cc625123306a8c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPse kjo funksionon mir\u00eb? Sepse kemi pak shkrime. Dometh\u00ebn\u00eb, n\u00ebse shkrimet do t\u00eb ishin t\u00eb krahasueshme me leximet, ndoshta do t\u00eb kishim ndonj\u00eb overhead rrjeti dhe probleme. Ka pak shkrime, shum\u00eb lexime \u2014 kjo m\u00ebnyr\u00eb funksionon mir\u00eb, pra ne kopjojm\u00eb fotografi midis k\u00ebtyre dy server\u00ebve mjaft rrall\u00eb.<\/p>\n<p>Si funksionon kjo, n\u00ebse e shohim pak m\u00eb n\u00eb detaje.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/071c11abb6ee1d7734c53052139ff04b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUpload. Balancuesi thjesht zgjedh host-e t\u00eb rast\u00ebsish\u00ebm nga \u00e7ifti dhe b\u00ebn upload tek ai. Natyrisht, ai kryen health checks, kontrollon q\u00eb makina t\u00eb mos ket\u00eb r\u00ebn\u00eb. Pra, ai b\u00ebn upload t\u00eb fotove vet\u00ebm n\u00eb nj\u00eb server aktiv, e m\u00eb pas p\u00ebrmes nj\u00eb radhe asinkrone e gjith\u00eb kjo kopjohet te serveri fqinj. Me upload-in gjith\u00e7ka \u00ebsht\u00eb maksimalisht e thjesht\u00eb.<\/p>\n<p>Me task-un \u00ebsht\u00eb pak m\u00eb e nd\u00ebrlikuar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f494904aec823456e18b987a8c98bf56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebtu na ndihmoi Lua, sepse n\u00eb NGINX-in vanilla nj\u00eb logjik\u00eb e till\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb zbatohet. Fillimisht b\u00ebjm\u00eb nj\u00eb request te serveri i par\u00eb dhe kontrollojm\u00eb n\u00ebse fotografia ndodhet aty, sepse potencialisht mund t\u00eb jet\u00eb ngarkuar, p\u00ebr shembull, te nyja fqinje, nd\u00ebrsa k\u00ebtu ende t\u00eb mos ket\u00eb mb\u00ebrritur. N\u00ebse fotografia \u00ebsht\u00eb aty, kjo \u00ebsht\u00eb shum\u00eb mir\u00eb. E dor\u00ebzojm\u00eb menj\u00ebher\u00eb te klienti dhe, n\u00ebse duhet, e ruajm\u00eb n\u00eb cache.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/de5f77e997bb049f4cfc1709da0f1788.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00ebse nuk \u00ebsht\u00eb aty, thjesht b\u00ebjm\u00eb nj\u00eb k\u00ebrkes\u00eb te nyja fqinje dhe e marrim prej andej me garanci.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/79aa5592acd28dfbc815261d0276c2e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPra, s\u00ebrish mund t\u00eb thuhet se mund t\u00eb ket\u00eb probleme me performanc\u00ebn, sepse round trip-et e vazhdueshme \u2014 fotografia u ngarkua, k\u00ebtu nuk \u00ebsht\u00eb, ndaj b\u00ebjm\u00eb dy k\u00ebrkesa n\u00eb vend t\u00eb nj\u00ebr\u00ebs \u2014 teorikisht duhet ta ngadal\u00ebsojn\u00eb pun\u00ebn.<\/p>\n<p>N\u00eb rastin ton\u00eb, kjo nuk funksionon ngadal\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/52ca3902d80990f512201672cd5e6441.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNe mbledhim shum\u00eb metrika p\u00ebr k\u00ebt\u00eb sistem, dhe hit rate-i i k\u00ebtij mekanizmi \u00ebsht\u00eb rreth 95%. Kjo do t\u00eb thot\u00eb se vonesa e k\u00ebtij backup-i \u00ebsht\u00eb e vog\u00ebl dhe, fal\u00eb k\u00ebsaj, pothuajse gjithmon\u00eb, pasi fotografia \u00ebsht\u00eb ngarkuar, e marrim q\u00eb n\u00eb p\u00ebrpjekjen e par\u00eb pa b\u00ebr\u00eb dy k\u00ebrkesa diku tjet\u00ebr.<\/p>\n<p>Pra, \u00e7far\u00eb tjet\u00ebr fituam dhe \u00e7far\u00eb \u00ebsht\u00eb kaq e bukur k\u00ebtu?<\/p>\n<p>M\u00eb par\u00eb kishim ndarjen kryesore dhe backup p\u00ebr ruajtje, dhe lexonim prej tyre n\u00eb m\u00ebnyr\u00eb sekuenciale. Dometh\u00ebn\u00eb, gjithmon\u00eb k\u00ebrkonim fillimisht n\u00eb kryesoren dhe m\u00eb pas n\u00eb backup. Ky ishte nj\u00eb skenar i vet\u00ebm leximi.<\/p>\n<p>Tani shfryt\u00ebzojm\u00eb leximin nga dy makina nj\u00ebkoh\u00ebsisht. K\u00ebrkesat i shp\u00ebrndajm\u00eb me Round Robin. N\u00eb nj\u00eb p\u00ebrqindje t\u00eb vog\u00ebl rastesh b\u00ebjm\u00eb dy k\u00ebrkesa. Por n\u00eb p\u00ebrgjith\u00ebsi tani kemi dyfish m\u00eb shum\u00eb rezerv\u00eb p\u00ebr lexim sesa kishim m\u00eb par\u00eb. Dhe ngarkesa \u00ebsht\u00eb ulur ndjesh\u00ebm si te makinat q\u00eb sh\u00ebrbejn\u00eb p\u00ebr dor\u00ebzim, ashtu edhe te storage-et q\u00eb kishim n\u00eb at\u00eb koh\u00eb.<\/p>\n<p>Sa i p\u00ebrket fault tolerance. N\u00eb fakt, pik\u00ebrisht p\u00ebr k\u00ebt\u00eb po luftonim kryesisht. Dhe k\u00ebtu fault tolerance doli v\u00ebrtet shk\u00eblqyesh\u00ebm.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/a030a477e60d6e1f3d0b4e3395013df5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNj\u00eb makin\u00eb del jasht\u00eb funksioni.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/42900b24e340c03ea642fd49f5b410ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAsnj\u00eb problem! Inxhinieri i sistemit madje nuk ka pse t\u00eb zgjohet nat\u00ebn, mund t\u00eb pres\u00eb deri n\u00eb m\u00ebngjes, nuk do t\u00eb ndodh\u00eb asgj\u00eb e keqe.<\/p>\n<p>Edhe n\u00ebse, gjat\u00eb d\u00ebshtimit t\u00eb k\u00ebsaj makine, bie edhe radha, p\u00ebrs\u00ebri nuk ka asnj\u00eb problem: log-u fillimisht do t\u00eb grumbullohet n\u00eb makin\u00ebn q\u00eb mbetet aktive, m\u00eb pas do t\u00eb futet n\u00eb radh\u00eb dhe m\u00eb von\u00eb do t\u00eb d\u00ebrgohet te ajo makin\u00eb q\u00eb do t\u00eb rikthehet n\u00eb pun\u00eb pas nj\u00ebfar\u00eb kohe.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/ef42eadaaf3e3ecbf70847e9f88c1582.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE nj\u00ebjta gj\u00eb vlen edhe p\u00ebr maintenance. Thjesht fikim nj\u00eb nga makinat, e heqim manualisht nga t\u00eb gjitha pool-et, trafiku ndalon s\u00eb shkuari tek ajo, b\u00ebjm\u00eb ndonj\u00eb maintenance, rregullojm\u00eb \u00e7far\u00eb duhet dhe m\u00eb pas e rikthejm\u00eb n\u00eb pun\u00eb; ky backup sinkronizohet s\u00ebrish mjaft shpejt. Pra, humbja e nj\u00eb makine p\u00ebr nj\u00eb dit\u00eb rikuperohet brenda pak minutash. Kjo \u00ebsht\u00eb v\u00ebrtet shum\u00eb pak. Sa i p\u00ebrket fault tolerance, po e them s\u00ebrish, k\u00ebtu gjith\u00e7ka \u00ebsht\u00eb shum\u00eb mir\u00eb.<\/p>\n<p>\u00c7far\u00eb p\u00ebrfundimesh mund t\u00eb nxjerrim nga kjo skem\u00eb rezervimi?<\/p>\n<p>Fituam fault tolerance.<\/p>\n<p>Operim i thjesht\u00eb. Meqen\u00ebse makinat kan\u00eb disqe lokale, kjo \u00ebsht\u00eb shum\u00eb m\u00eb e p\u00ebrshtatshme nga pik\u00ebpamja e inxhinier\u00ebve q\u00eb punojn\u00eb me to.<\/p>\n<p>Fituam nj\u00eb rezerv\u00eb t\u00eb dyfisht\u00eb p\u00ebr lexim.<\/p>\n<p>Ky \u00ebsht\u00eb nj\u00eb bonus shum\u00eb i mir\u00eb, p\u00ebrve\u00e7 fault tolerance.<\/p>\n<p>Por ka edhe probleme. Tani zhvillimi i disa feature-ve q\u00eb lidhen me k\u00ebt\u00eb \u00ebsht\u00eb b\u00ebr\u00eb shum\u00eb m\u00eb kompleks, sepse sistemi \u00ebsht\u00eb b\u00ebr\u00eb 100% eventually consistent.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b650276a41730cc303180e8304c5dabb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDuhet, fjala vjen, q\u00eb n\u00eb ndonj\u00eb background job t\u00eb mendojm\u00eb vazhdimisht: \u201cN\u00eb cilin server po ekzekutohemi tani?\u201d, \u201cA \u00ebsht\u00eb v\u00ebrtet k\u00ebtu fotografia m\u00eb e p\u00ebrdit\u00ebsuar?\u201d e k\u00ebshtu me radh\u00eb. Natyrisht, e gjith\u00eb kjo \u00ebsht\u00eb mb\u00ebshtjell\u00eb me wrapper-a dhe p\u00ebr programuesin q\u00eb shkruan logjik\u00ebn e biznesit kjo \u00ebsht\u00eb transparente. Por, megjithat\u00eb, \u00ebsht\u00eb shfaqur nj\u00eb shtres\u00eb e madhe dhe komplekse. Gjithsesi, jemi t\u00eb gatsh\u00ebm ta pranojm\u00eb k\u00ebt\u00eb n\u00eb k\u00ebmbim t\u00eb p\u00ebrfitimeve q\u00eb mor\u00ebm prej saj.<\/p>\n<p>Edhe k\u00ebtu lind s\u00ebrish nj\u00eb lloj konflikti.<\/p>\n<p>N\u00eb fillim thash\u00eb se ruajtja e gjith\u00e7kaje n\u00eb disqe lokale \u00ebsht\u00eb gj\u00eb e keqe. Nd\u00ebrsa tani po them se kjo na p\u00eblqeu.<\/p>\n<p>Po, v\u00ebrtet, me kalimin e koh\u00ebs situata ka ndryshuar shum\u00eb dhe tani kjo qasje ka fituar shum\u00eb avantazhe. S\u00eb pari, ne p\u00ebrfitojm\u00eb nj\u00eb operim shum\u00eb m\u00eb t\u00eb thjesht\u00eb.<\/p>\n<p>S\u00eb dyti, \u00ebsht\u00eb m\u00eb performante, sepse nuk kemi k\u00ebta kontrollues automatik\u00eb dhe lidhjet me raftet e disqeve.<\/p>\n<p>Atje ka nj\u00eb infrastruktur\u00eb gjigante, nd\u00ebrsa k\u00ebtu jan\u00eb thjesht disa disqe t\u00eb montuara n\u00eb RAID direkt n\u00eb k\u00ebt\u00eb makin\u00eb.<\/p>\n<p>Por ka edhe mang\u00ebsi.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/3c090e0801f1a686dc0d5fefce697c56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKjo \u00ebsht\u00eb af\u00ebrsisht 1,5 her\u00eb m\u00eb e shtrenjt\u00eb sesa p\u00ebrdorimi i SAN-ve, edhe me \u00e7mimet e sotme. Prandaj vendos\u00ebm t\u00eb mos e konvertojm\u00eb me aq guxim t\u00eb gjith\u00eb klasterin ton\u00eb t\u00eb madh n\u00eb makina me disqe lokale dhe t\u00eb ruajm\u00eb nj\u00eb zgjidhje hibride.<\/p>\n<p>Rreth gjysma e makinave tona punojn\u00eb me disqe t\u00eb ngurt\u00eb (epo, jo tamam gjysma \u2014 ndoshta rreth 30%). Pjesa tjet\u00ebr jan\u00eb makina t\u00eb vjetra, ku m\u00eb par\u00eb p\u00ebrdorej skema e par\u00eb e rezervimit. Thjesht i rikonfiguruam, sepse nuk na duheshin as t\u00eb dh\u00ebna t\u00eb reja, as di\u00e7ka tjet\u00ebr \u2014 vet\u00ebm zhvendos\u00ebm mount-et nga nj\u00eb host fizik n\u00eb dy.<\/p>\n<p>K\u00ebshtu fituam nj\u00eb rezerv\u00eb t\u00eb madhe n\u00eb lexim dhe e zgjeruam shkall\u00ebn. N\u00ebse m\u00eb par\u00eb n\u00eb nj\u00eb makin\u00eb montonim nj\u00eb storage, tani n\u00eb nj\u00eb pal\u00eb montojm\u00eb kat\u00ebr, p\u00ebr shembull. Dhe kjo funksionon normalisht.<\/p>\n<p>Le t\u00eb b\u00ebjm\u00eb nj\u00eb p\u00ebrmbledhje t\u00eb shkurt\u00ebr t\u00eb asaj q\u00eb arrit\u00ebm, p\u00ebr \u00e7far\u00eb luftuam dhe n\u00ebse ia dol\u00ebm.<\/p>\n<h3>P\u00ebrfundime<\/h3>\n<p>\nKemi p\u00ebrdorues \u2014 plot 33 milion\u00eb.<\/p>\n<p>Kemi tre pika prezence \u2014 Prag\u00eb, Miami, Hong Kong.<\/p>\n<p>Aty ndodhet shtresa e cache-it, e p\u00ebrb\u00ebr\u00eb nga makina me disqe lokale t\u00eb shpejta (SSD), ku funksionon nj\u00eb mekaniz\u00ebm i thjesht\u00eb me NGINX, access.log-un e tij dhe daemon\u00eb n\u00eb Python q\u00eb e p\u00ebrpunojn\u00eb gjith\u00eb k\u00ebt\u00eb dhe menaxhojn\u00eb cache-in.<\/p>\n<p>N\u00ebse d\u00ebshironi, n\u00eb projektin tuaj, n\u00ebse fotot nuk jan\u00eb aq kritike sa p\u00ebr ne, ose n\u00ebse p\u00ebr ju balanca mes kontrollit dhe shpejt\u00ebsis\u00eb s\u00eb zhvillimit e kostos s\u00eb burimeve anon nga ana tjet\u00ebr, at\u00ebher\u00eb mund ta z\u00ebvend\u00ebsoni pa problem me nj\u00eb CDN \u2014 CDN-t\u00eb moderne e b\u00ebjn\u00eb k\u00ebt\u00eb shum\u00eb mir\u00eb.<\/p>\n<p>M\u00eb pas vjen shtresa e ruajtjes, ku kemi klastera me \u00e7ifte makinash q\u00eb rezervojn\u00eb nj\u00ebra-tjetr\u00ebn; skedar\u00ebt kopjohen n\u00eb m\u00ebnyr\u00eb asinkrone nga nj\u00ebra te tjetra sa her\u00eb q\u00eb ka ndryshim.<\/p>\n<p>Nj\u00eb pjes\u00eb e k\u00ebtyre makinave punojn\u00eb me disqe t\u00eb ngurt\u00eb lokal\u00eb.<\/p>\n<p>Nj\u00eb pjes\u00eb e k\u00ebtyre makinave jan\u00eb t\u00eb lidhura me SAN-e.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/5ddbc4f73d86aa1f83734885d8c9dea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNga nj\u00ebra an\u00eb, kjo \u00ebsht\u00eb m\u00eb e p\u00ebrshtatshme p\u00ebr operim dhe pak m\u00eb performuese; nga ana tjet\u00ebr, \u00ebsht\u00eb e leverdishme p\u00ebr nga dend\u00ebsia e vendosjes dhe \u00e7mimi p\u00ebr gigabajt.<\/p>\n<p>Ky \u00ebsht\u00eb nj\u00eb p\u00ebrmbledhje e shkurt\u00ebr e arkitektur\u00ebs q\u00eb mor\u00ebm dhe e m\u00ebnyr\u00ebs si u zhvillua e gjith\u00eb kjo.<\/p>\n<p>Edhe disa k\u00ebshilla t\u00eb tjera t\u00eb thjeshta, fare bazike.<\/p>\n<p>S\u00eb pari, n\u00ebse nj\u00eb dit\u00eb vendosni se duhet urgjentisht t\u00eb p\u00ebrmir\u00ebsoni gjith\u00e7ka n\u00eb infrastruktur\u00ebn tuaj t\u00eb fotove, mateni fillimisht, sepse ka shum\u00eb mund\u00ebsi q\u00eb n\u00eb fakt t\u00eb mos ket\u00eb nevoj\u00eb p\u00ebr asnj\u00eb p\u00ebrmir\u00ebsim.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7770f41d0b190eb78ae0d19f4c8182a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo jap nj\u00eb shembull. Kemi nj\u00eb klaster makinash q\u00eb shp\u00ebrndan fotografi nga attachment-i n\u00eb biseda, dhe aty ende funksionon skema q\u00eb nga viti 2009, dhe askush nuk vuan prej k\u00ebsaj. T\u00eb gjith\u00eb jan\u00eb mir\u00eb, t\u00eb gjith\u00ebve u p\u00eblqen.<\/p>\n<p>Q\u00eb t\u00eb mund ta matni, fillimisht vendosni sa m\u00eb shum\u00eb metrika, analizojini dhe m\u00eb pas vendosni sakt\u00ebsisht me \u00e7far\u00eb nuk jeni t\u00eb k\u00ebnaqur dhe \u00e7far\u00eb duhet p\u00ebrmir\u00ebsuar. P\u00ebr k\u00ebto matje, ne kemi nj\u00eb mjet shum\u00eb t\u00eb mir\u00eb q\u00eb quhet Pinba.<\/p>\n<p>Ai ju lejon t\u00eb grumbulloni statistika shum\u00eb t\u00eb detajuara nga NGINX p\u00ebr \u00e7do request, kodet e p\u00ebrgjigjeve dhe shp\u00ebrndarjen e koh\u00ebve \u2014 gjith\u00e7ka q\u00eb ju nevojitet. Ka bindings p\u00ebr sisteme t\u00eb ndryshme analitike, k\u00ebshtu q\u00eb m\u00eb pas mund t\u2019i shikoni t\u00eb gjitha k\u00ebto n\u00eb m\u00ebnyr\u00eb t\u00eb qart\u00eb dhe komode.<\/p>\n<p>S\u00eb pari mateni \u2014 pastaj p\u00ebrmir\u00ebsojeni.<\/p>\n<p>M\u00eb tej. Leximin e optimizojm\u00eb me cache, shkrimin me sharding, por kjo \u00ebsht\u00eb pjesa e qart\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f53a4777f1a2c7793eba4a72c94263a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u00eb tej. N\u00ebse sapo po filloni t\u00eb nd\u00ebrtoni sistemin tuaj, \u00ebsht\u00eb shum\u00eb m\u00eb mir\u00eb t\u2019i ruani fotot si skedar\u00eb immutable. K\u00ebshtu eliminoni menj\u00ebher\u00eb nj\u00eb klas\u00eb t\u00eb t\u00ebr\u00eb problemesh me invalidimin e cache, me m\u00ebnyr\u00ebn se si logjika duhet t\u00eb gjej\u00eb versionin e sakt\u00eb t\u00eb fotos e k\u00ebshtu me radh\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f345c59681275326cda1320b4f188ce9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebr shembull, ngarkuat nj\u00eb foto, pastaj e rrotulluat \u2014 b\u00ebjeni n\u00eb m\u00ebnyr\u00eb q\u00eb kjo t\u00eb jet\u00eb fizikisht nj\u00eb skedar tjet\u00ebr. Pra, mos mendoni: tani do t\u00eb kursej pak hap\u00ebsir\u00eb, do ta ruaj n\u00eb t\u00eb nj\u00ebjtin skedar dhe do t\u2019i ndryshoj versionin. Kjo pothuajse gjithmon\u00eb funksionon keq dhe m\u00eb pas sjell shum\u00eb dhimbje koke.<\/p>\n<p>Pika tjet\u00ebr. P\u00ebr resize n\u00eb koh\u00eb reale.<\/p>\n<p>M\u00eb par\u00eb, kur p\u00ebrdoruesit uploadonin nj\u00eb foto, ne krijonim menj\u00ebher\u00eb nj\u00eb num\u00ebr t\u00eb madh dimensionesh p\u00ebr \u00e7do rast p\u00ebrdorimi, p\u00ebr klient\u00eb t\u00eb ndrysh\u00ebm, dhe t\u00eb gjitha ruheshin n\u00eb disk. Tani kemi hequr dor\u00eb nga kjo qasje.<\/p>\n<p>Kemi l\u00ebn\u00eb vet\u00ebm tre madh\u00ebsi kryesore: t\u00eb vog\u00ebl, t\u00eb mesme dhe t\u00eb madhe. Gjith\u00e7ka tjet\u00ebr thjesht e downscale-ojm\u00eb nga madh\u00ebsia q\u00eb vjen menj\u00ebher\u00eb pas asaj q\u00eb \u00ebsht\u00eb k\u00ebrkuar n\u00eb Uport, thjesht b\u00ebjm\u00eb downscale dhe ia dor\u00ebzojm\u00eb p\u00ebrdoruesit.<\/p>\n<p>CPU i shtres\u00ebs s\u00eb cache k\u00ebtu rezulton shum\u00eb m\u00eb i lir\u00eb sesa t\u00eb rigjeneronim vazhdimisht k\u00ebto madh\u00ebsi n\u00eb \u00e7do storage. P\u00ebr shembull, n\u00ebse duam t\u00eb shtojm\u00eb nj\u00eb t\u00eb re, kjo \u00ebsht\u00eb pun\u00eb p\u00ebr nj\u00eb muaj \u2014 t\u00eb ekzekutosh kudo nj\u00eb skript q\u00eb ta b\u00ebj\u00eb gjith\u00eb k\u00ebt\u00eb me kujdes, pa e rr\u00ebzuar cluster-in. Pra, n\u00ebse keni mund\u00ebsi t\u00eb zgjidhni tani, \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb krijoni sa m\u00eb pak madh\u00ebsi fizike, por gjithsesi t\u00eb keni nj\u00ebfar\u00eb shp\u00ebrndarjeje, le t\u00eb themi tre. Dhe gjith\u00e7ka tjet\u00ebr thjesht ta ndryshoni n\u00eb madh\u00ebsi n\u00eb koh\u00eb reale me ndihm\u00ebn e moduleve t\u00eb gatshme. Sot kjo \u00ebsht\u00eb shum\u00eb e leht\u00eb dhe e arritshme.<\/p>\n<p>Nd\u00ebrsa backup inkremental asinkron \u00ebsht\u00eb nj\u00eb zgjidhje e mir\u00eb.<\/p>\n<p>Si\u00e7 ka treguar praktika jon\u00eb, nj\u00eb skem\u00eb e till\u00eb funksionon shk\u00eblqyesh\u00ebm me kopjimin e vonuar t\u00eb skedar\u00ebve t\u00eb ndryshuar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0e550721e838654e61e1fa4d08f9bb93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPika e fundit \u00ebsht\u00eb po aq e qart\u00eb. N\u00ebse n\u00eb infrastruktur\u00ebn tuaj tani nuk ka probleme t\u00eb tilla, por ka di\u00e7ka q\u00eb mund t\u00eb prishet, ajo patjet\u00ebr do t\u00eb prishet sapo ngarkesa t\u00eb rritet qoft\u00eb edhe pak. Prandaj \u00ebsht\u00eb m\u00eb mir\u00eb ta mendoni k\u00ebt\u00eb paraprakisht dhe t\u00eb mos p\u00ebrballeni me probleme. Kaq kisha.<\/p>\n<h3>Kontakte<\/h3>\n<p>\n\u00bb <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/users\/bo0rsh201\/\" class=\"user_link\">bo0rsh201<\/a><\/noindex> <br \/>\n\u00bb <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/company\/badoo\/\">Blogu i kompanis\u00eb Badoo<\/a><\/noindex><\/p>\n<blockquote><p>Ky raport \u00ebsht\u00eb transkriptimi i nj\u00eb prej prezantimeve m\u00eb t\u00eb mira n\u00eb konferenc\u00ebn e zhvilluesve t\u00eb sistemeve me ngarkes\u00eb t\u00eb lart\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/highload.ru\/?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">HighLoad++<\/a><\/noindex>. Deri n\u00eb konferenc\u00ebn HighLoad++ 2017 ka mbetur m\u00eb pak se nj\u00eb muaj.<\/p>\n<p>Ne e kemi tashm\u00eb gati <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\">Programi i konferenc\u00ebs<\/a><\/noindex>, dhe tani po formohet n\u00eb m\u00ebnyr\u00eb aktive programi.<\/p>\n<p>Edhe k\u00ebt\u00eb vit vazhdojm\u00eb t\u00eb eksplorojm\u00eb tem\u00ebn e arkitekturave dhe shkall\u00ebzimit:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\/2946.html?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">Si t\u00eb sh\u00ebrbeni nj\u00eb miliard p\u00ebrdorues dhe t\u00eb ofroni nj\u00eb terabit trafik<\/a><\/noindex> \/ \u0418\u0433\u043e\u0440\u044c \u0412\u0430\u0441\u0438\u043b\u044c\u0435\u0432<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\/3088.html?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">Si t\u00eb rishkruani nga e para baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb mesazheve private t\u00eb VKontakte dhe t\u00eb migroni drejt saj pa downtime<\/a><\/noindex> \/ \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0415\u0433\u043e\u0440\u043e\u0432<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\/2843.html?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">Vdekje nga uljet: si Yandex.Money u p\u00ebrpoq t\u00eb p\u00ebrshpejtohej p\u00ebr Black Friday dhe t\u2019ia dilte mban\u00eb<\/a><\/noindex> \/ \u0410\u043d\u0430\u0442\u043e\u043b\u0438\u0439 \u041f\u043b\u0430\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0439<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\/3003.html?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">Arkitektur\u00eb rezistente ndaj d\u00ebshtimeve p\u00ebr sistemin frontal t\u00eb bank\u00ebs<\/a><\/noindex> \/ \u0420\u043e\u043c\u0430\u043d \u0428\u0435\u0445\u043e\u0432\u0446\u043e\u0432, \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0440\u043e\u043c\u0430\u0442\u0447\u0438\u043a\u043e\u0432<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\/2948.html?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">Arkitektura e sistemit t\u00eb pagesave: pothuajse enterprise<\/a><\/noindex> \/ \u0424\u0438\u043b\u0438\u043f\u043f \u0414\u0435\u043b\u044c\u0433\u044f\u0434\u043e<\/li>\n<\/ul>\n<p>\nGjithashtu, disa nga k\u00ebto materiale i p\u00ebrdorim n\u00eb kursin ton\u00eb online p\u00ebr zhvillimin e sistemeve me ngarkes\u00eb t\u00eb lart\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/highload.guide\/?utm_source=habr&amp;utm_medium=media&amp;utm_campaign=past.articles&amp;utm_content=common\">HighLoad.Guide<\/a><\/noindex> \u2014 \u00ebsht\u00eb nj\u00eb seri e p\u00ebrzgjedhur posa\u00e7\u00ebrisht emailesh, artikujsh, materialesh dhe videosh. Q\u00eb tani, n\u00eb tekstin ton\u00eb m\u00ebsimor ka m\u00eb shum\u00eb se 30 materiale unike. Bashkohuni!\n<\/p><\/blockquote>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/340976\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u0440\u0442\u0435\u043c \u0414\u0435\u043d\u0438\u0441\u043e\u0432 ( bo0rsh201, Badoo) Badoo \u2014 \u044d\u0442\u043e \u043a\u0440\u0443\u043f\u043d\u0435\u0439\u0448\u0438\u0439 \u0432 \u043c\u0438\u0440\u0435 \u0441\u0430\u0439\u0442 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443 \u043d\u0430\u0441 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430 330 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0438\u0440\u0443. \u041d\u043e, \u0447\u0442\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430, \u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u043e\u043a\u043e\u043b\u043e 3 \u043f\u0435\u0442\u0430\u0431\u0430\u0439\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439. \u041a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u0430\u043b\u0438\u0432\u0430\u044e\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 3,5 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 [&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-55009","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=\"\u0410\u0440\u0442\u0435\u043c \u0414\u0435\u043d\u0438\u0441\u043e\u0432 (\" \/>\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\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo\" \/>\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\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0447\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 Badoo | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u0440\u0442\u0435\u043c \u0414\u0435\u043d\u0438\u0441\u043e\u0432 (\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo\" \/>\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-01-09T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:04+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\udd47Arkitektura e ruajtjes dhe shp\u00ebrndarjes s\u00eb fotografive n\u00eb Badoo | ProHoster","description":"Artem Denisov (","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","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\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u0434\u0430\u0447\u0438 \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0439 \u0432 Badoo | ProHoster","og:description":"\u0410\u0440\u0442\u0435\u043c \u0414\u0435\u043d\u0438\u0441\u043e\u0432 (","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","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-01-09T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:04+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55009","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":"2026-01-24 13:30:15","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:53:49","updated":"2026-01-24 13:30:15","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\/55009","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=55009"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/55009\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=55009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=55009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=55009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}