{"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\/et\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","title":{"rendered":"Badoo fotode salvestamise ja jagamise arhitektuur","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" 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 on maailma suurim tutvumissait. Praeguseks on meil registreeritud umbes 330 miljonit kasutajat \u00fcle kogu maailma. Kuid, mis on meie t\u00e4nase arutelu kontekstis palju t\u00e4htsam, on see, et s\u00e4ilitame umbes 3 petabaiti kasutajate fotosid. Igal p\u00e4eval laevad meie kasutajad \u00fcles umbes 3,5 miljonit uut fotot ja lugemise koormus on umbes <b>80 tuhat p\u00e4ringut sekundis<\/b>. See on meie tagaplaanile piisavalt suur koormus ja vahel tekivad sellega probleemid.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/4e4690f9b0d95bd76fbbc1cd6805c26c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e4\u00e4gin sellest s\u00fcsteemi disainist, mis hoiab ja jagab fotosid, ja annan selle kohta arendaja vaate. Kuidas see on arenenud, kirjeldan ma l\u00fchidalt ajaloosus, kus ma peamised etapid m\u00e4rkida, kuid hakkan juba p\u00f5hjalikumalt r\u00e4\u00e4kima ainult neist lahendustest, mida me praegu kasutame.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAga n\u00fc\u00fcd alustame.<\/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=\"M\u00e4ngi videot\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nNagu ma juba \u00fctlesin, see on tagasiulatuv \u00fclevaade, ja et seda millegagi alustada, v\u00f5tame k\u00f5ige lihtsama n\u00e4ite.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/22b9627cda7ccadd9869b64e9d043d89.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeil on \u00fcldine \u00fclesanne, peame vastu v\u00f5tma, s\u00e4ilitama ja jagama kasutajate fotosid. Sel viisil on \u00fclesanne \u00fcldine, saame kasutada, mida iganes:<\/p>\n<ul>\n<li>kaasaegset pilvesalvestust,<\/li>\n<li>karbile lahendust, mida on praegu samuti palju;<\/li>\n<li>v\u00f5ime seadistada mitu masinat oma andmekeskuses ja paigaldada neile suured k\u00f5vakettad ja hoida seal fotosid.<\/li>\n<\/ul>\n<p>\nBadoo on ajalooliselt \u2014 nii praegu kui ka siis (ajal, mil see alles algas) \u2014 elanud oma serverites, meie enda andmekeskustes. Seet\u00f5ttu oli see variant meie jaoks optimaalseim.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/9434fbabada15670297c551066ad7e71.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe lihtsalt v\u00f5tsime mitu masinat, nimetasime need \"photos\" ja meil tekkis selline kluster, mis hoiab fotosid. Kuid tundub, et midagi on puudu. Selleks, et k\u00f5ik see toimiks, on vajalik kuidagi m\u00e4\u00e4rata, millistel masinatel millised fotod peavad olema. Ja siin ei ole vaja Ameerikat avastama.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/36258e7107fd8c60f7e9e563a2cb681c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLisame meie kasutajainfoga salvestusse mingi v\u00e4lja. See on jagamise v\u00f5ti. Meie puhul nimetasime selle place_id-ks, ja see id kohtade m\u00e4\u00e4rab, kus hoitakse kasutajate fotosid. Koostame kaardid.<\/p>\n<p>Esimese sammuna saab seda isegi manuaalselt teha \u2014 me \u00fctleme, et selle kasutaja foto sellel platvormil maandub sellele serverile. T\u00e4nu sellele kaardile teame alati, kui kasutaja foto \u00fcles laadib, kuhu see salvestada ja kust see anda.<\/p>\n<p>See on t\u00e4iesti triviaalne skeem, kuid sellel on piisavalt olulised eelised. Esimene on see, et see on lihtne, nagu ma juba \u00fctlesin, ja teine on see, et sellise l\u00e4henemisega saame h\u00f5lpsasti horisontaalselt skaleeruda, lihtsalt toimetades uusi seadmeid ja lisades need kaardile. Rohkem ei ole vaja midagi teha.<\/p>\n<p>Nii oligi meil m\u00f5nda aega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/3effb442702f162f7bad9c18ec54392e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee oli umbes 2009. aastal. Toimetasime masinaid, toimetasime...<\/p>\n<p>Ja mingil hetkel hakkasime m\u00e4rkama, et see skeem omab teatud puudusi. Millised puudused?<\/p>\n<p>Esiteks on see piiratud mahutavus. \u00dchele f\u00fc\u00fcsilisele serverile ei saa me mahutada nii palju k\u00f5vakettaid, kui sooviksime. Ja see on aja jooksul ja andmekogumi kasvu t\u00f5ttu muutunud teatud probleemiks.<\/p>\n<p>Ja teine. See on ebat\u00fc\u00fcpiline masinakujundus, kuna selliseid masinaid on raske kasutada teiste klastrite puhul, nad on piisavalt spetsiifilised, st nad peavad olema v\u00e4hese j\u00f5udlusega, kuid samas suure k\u00f5vakettaga.<\/p>\n<p>See k\u00f5ik oli 2009. aastal, kuid tegelikult on need n\u00f5uded endiselt aktuaalsed. Meil on retrospektiiv, seega oli 2009. aastal k\u00f5ik sellega halvasti.<\/p>\n<p>Ja viimane punkt \u2014 see on hind.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/e49010eaeab139199d8fe010caa65bf0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHind oli siis v\u00e4ga kr\u00f5be ja meil oli vaja leida m\u00f5ni alternatiiv. St me pidime kuidagi paremini kasutama nii andmekeskustes olevat ruumi kui ka f\u00fc\u00fcsilisi servereid, millel k\u00f5ik see asub. Ja meie s\u00fcsteemiinsenerid alustasid suurt uuringut, kus nad vaatasid l\u00e4bi palju erinevaid variante. Nad vaatasid ka klastrifailis\u00fcsteeme, nagu PolyCeph ja Lustre. Seal olid probleemid j\u00f5udlusega ja piisavalt keeruline t\u00f6\u00f6. Nad loobusid. Proovisime monteerida kogu andmestiku NFS kaudu igale seadmele, et niimoodi mingil moel skaleerida. Lugemine ei l\u00e4inud ka h\u00e4sti, proovisime erinevaid lahendusi erinevatelt m\u00fc\u00fcjatelt.<\/p>\n<p>Ja l\u00f5puks otsustasime, et hakkasime kasutama nn Storage Area Networki.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/e99402fa641f3bd5fc8d57a9f8995642.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeed on suured SHDed, mis on suunatud suurte andmehulkade salvestamisele. Nad esindavad riiuleid, kus on kettad, mis on \u00fchendatud l\u00f5pptoimingumasinatega optika kaudu. Nii et meil on mingi v\u00e4ike masinapool, ja need SHDed, mis on l\u00e4bipaistvad meie edastamisloogikale, st meie nginxile v\u00f5i kellelegi muule, teenindavad neid piltide p\u00e4ringute j\u00e4rgi.<\/p>\n<p>Sellel lahendusel oli ilmselgeid plusse. Need on SHDed. Need on suunatud fotode salvestamisele. See on odavam, kui me lihtsalt seadistame masinaid k\u00f5vaketastega.<\/p>\n<p>Teine pluss. <\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7fd2e7d629cc239096b14c68be5f76bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee, et mahutavus on muutunud palju suuremaks, st me saame palju rohkem salvestust paljuski v\u00e4iksemas mahus paigutada.<\/p>\n<p>Aga olid ka miinused, mis ilmnesid \u00fcsna kiiresti. Kasutajate arvu ja koormuse kasvades hakkasid s\u00fcsteemis esinema j\u00f5udlusprobleemid. Ja probleem on siin piisavalt ilmne \u2014 \u00fcksk\u00f5ik milline SHD, mis on ette n\u00e4htud paljude piltide salvestamiseks v\u00e4ikeses mahus, kannatab tavaliselt intensiivse lugemise all. See on tegelikult aktuaalne ka mis tahes pilvesalvestuse puhul. Praegu pole meil olemas ideaalset salvestust, mis oleks piiramatu skaleerimisega, kuhu saaks panna k\u00f5ike, ja mis taluks lugemist v\u00e4ga h\u00e4sti. Eriti juhuslikku lugemist.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/566e836e2fe13a2a3d040ae3fa865d6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNagu ka meie piltide puhul, kuna pilte k\u00fcsitakse ebasoodsalt, ja see m\u00f5jutab nende j\u00f5udlust tohutult.<\/p>\n<p>Isegi t\u00e4naste numbrite p\u00f5hjal, kui meil on kuskil \u00fcle 500 RPS fotode peale masinas, mis on \u00fchendatud salvestusega, tekivad juba probleemid. Ja see oli meile \u00fcsna halb, kuna kasutajate arv kasvab ja k\u00f5ik peaks saama vaid halvemaks. Peame selle kuidagi optimeerima.<\/p>\n<p>Selle optimeerimiseks otsustasime toona ilmselgelt vaadata koormuse profiili \u2014 mis \u00fcldse toimub, mida tuleb optimeerida.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d67310e6b90c4ee1337065790576c9a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa siin m\u00e4ngib k\u00f5ik meie kasuks.<\/p>\n<p>Ma \u00fctlesin esimeses slaidis juba: meil on 80 000 p\u00e4ringut sekundis lugemisel, mille puhul on p\u00e4evas vaid 3,5 miljonit \u00fcleslaadimist. See t\u00e4hendab kolmekordset erinevust. On ilmne, et lugemist tuleb optimeerida ja praktiliselt on selge, kuidas.<\/p>\n<p>On veel \u00fcks v\u00e4ike detail. Teenuse spetsiifika on selline, et inimene registreerib end, laadib \u00fcles foto, seej\u00e4rel hakkab aktiivselt vaatama teisi inimesi, k\u00fcsima neilt meeldimisi, tema profiili n\u00e4idatakse muudele inimestele. Siis leiab ta paarilise v\u00f5i ei leia, see oleneb, ja m\u00f5neks ajaks l\u00f5petab teenuse kasutamise. Just sel hetkel, kui ta teenust kasutab, on tema fotod v\u00e4ga populaarsed \u2014 neid vaatavad v\u00e4ga paljud inimesed. Niipea, kui ta l\u00f5petab, kaob ta kiiresti sellistest intensiivsetest n\u00e4itamistest, nagu varem, ja tema fotosid k\u00fcsitakse praktiliselt mitte kunagi.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/dcc7e306055d8f2b0895f24679bfc3e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee t\u00e4hendab, et meil on v\u00e4ga v\u00e4ike kuum dataset. Kuid selle taga on siiski v\u00e4ga palju p\u00e4ringuid. Siit t\u00f5ukub \u00fcsna ilmne lahendus \u2014 tuleks lisada cache.<\/p>\n<p>LRU cache lahendab k\u00f5ik meie probleemid. Mida me teeme?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/2bd0c88a97d928f386db21549fc02500.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLisame oma suure klastriga, kus on salvestust, veel \u00fche suhteliselt v\u00e4ikese, mida nimetatakse fotokd_cache'iks (photoscache). See on p\u00f5him\u00f5tteliselt lihtsalt vahem\u00e4lu proxy.<\/p>\n<p>Kuidas see seestpoolt t\u00f6\u00f6tab? Siin on meie kasutaja ja siin on salvestus. K\u00f5ik nagu varem. Mida me nende vahele lisame?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7b7b5f102f1c012b2aef8f02ec731fac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on lihtsalt masin f\u00fc\u00fcsilise kohalikuga kiirdiskiga. N\u00e4iteks SSD. Ja sellele diskile salvestatakse mingi kohalik vahem\u00e4lu.<\/p>\n<p>Kuidas see v\u00e4lja n\u00e4eb? Kasutaja saadab p\u00e4ringu foto jaoks. NGINX otsib selle k\u00f5igepealt kohalikust vahem\u00e4lust. Kui ei leia, siis teeb lihtsalt proxy_pass meie salvestusele, laadib foto sealt ja annab selle kasutajale.<\/p>\n<p>Kuid see tundub v\u00e4ga lihtne ja pole selge, mis seestpoolt toimub. See toimib umbes nii.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/46be24df171d1008e2a9099b7e4c9be6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVahem\u00e4lu on loogiliselt jagatud kolme kihti. Kui ma \u00fctlen 'kolm kihti', siis ei t\u00e4henda see, et seal on mingi keeruline s\u00fcsteem. Ei, see on lihtsalt kolm kausta failis\u00fcsteemis:<\/p>\n<ol>\n<li>See on puhvri salvestus, kuhu satuvad just proxi kaudu \u00fcles laaditud fotod.<\/li>\n<li>See on kuum vahem\u00e4lu, kus salvestatakse aktiivselt k\u00fcsitud fotod.<\/li>\n<li>Ja k\u00fclm vahem\u00e4lu, kuhu fotod j\u00e4rk-j\u00e4rgult t\u00f5ukatakse kuumalt vahem\u00e4lult, kui nende p\u00e4ringute arv v\u00e4heneb.<\/li>\n<\/ol>\n<p>\nKuna see t\u00f6\u00f6taks, peame me kuidagi selle vahem\u00e4lu haldama, peame fotosid seal \u00fcmber paigutama jne. See on samuti v\u00e4ga primitiivne protsess.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/9b16fe3e99a5f88f06169f6e5eedf2b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNginx kirjutab iga p\u00e4ringu jaoks RAMDisk'i access.log faili, kus ta n\u00e4itab teed fotole, mida ta hetkel teenindas (loomulikult suhteline tee), ning seda, millise sektsiooni kaudu see teenindati. Seal v\u00f5ib olla kirjas 'foto 1' ja edasi v\u00f5ib olla kas puhver, kuum vahem\u00e4lu, k\u00fclm vahem\u00e4lu v\u00f5i proxy.<\/p>\n<p>Selle p\u00f5hjal peame otsustama, kuidas fotoga edasi minna.<\/p>\n<p>Igal masinal t\u00f6\u00f6tab v\u00e4ike daemon, mis pidevalt loeb seda logi ja hoiab m\u00e4lu sees statistikat, kuidas erinevaid fotosid kasutatakse.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0dceda5e5ff432d1609520f0c152f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTa lihtsalt kogub seal andmeid, peab arve ja teeb perioodiliselt j\u00e4rgmist. Aktiivselt n\u00f5utud fotod, mille j\u00e4rgi tuleb palju p\u00e4ringuid, liigutatakse kuuma vahem\u00e4llu, kus iganes nad ka ei asu.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/941c13ecfea88372f3a7eb62d81b0c4e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFotod, mida k\u00fcsitakse harva ja mille n\u00f5udlus on v\u00e4henenud, t\u00f5ukab ta j\u00e4rk-j\u00e4rgult kuumast vahem\u00e4lust k\u00fclma.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/a07235246995ad2fa4e6aeccae23a629.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa kui meie vahem\u00e4lus on ruum otsa saanud, hakkame lihtsalt k\u00fchveldama k\u00fclmast vahem\u00e4lust asju v\u00e4lja ilma eristamiseta. Ja see, muide, t\u00f6\u00f6tab v\u00e4ga h\u00e4sti.<\/p>\n<p>Kuna fotod salvestatakse kohe vahem\u00e4lus, kasutame me direktiivi proxy_store, ja vahem\u00e4lu \u2014 see on samuti RAMDisk, seega t\u00f6\u00f6tab see kasutajale v\u00e4ga kiiresti. See on, mis puudutab ise k\u00fcberserveri sisemust.<\/p>\n<p>K\u00fcsimus on j\u00e4\u00e4nud, kuidas jagada p\u00e4ringud nende serverite vahel.<\/p>\n<p>Oletame, et meil on kaksk\u00fcmmend storage-masinat ja kolm vahem\u00e4luserverit (niimoodi on l\u00e4inud).<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/6bc970b687701f3b6d57e153e3abed18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPeame kuidagi m\u00e4\u00e4rama, millised p\u00e4ringud on milliste fotode jaoks ja kuhu need suunata.<\/p>\n<p>K\u00f5ige lihtsam variant on Round Robin. V\u00f5i peaksime seda juhuslikult tegema?<\/p>\n<p>See, ilmselt, toob endaga kaasa mitmeid puudusi, kuna me kasutame sellises olukorras vahem\u00e4lu v\u00e4ga ebat\u00f5husalt. P\u00e4ringud suunatakse mingitele juhuslikele masinatele: seal on see vahem\u00e4lus, aga naabreid seda enam pole. Ja kui see peaks t\u00f6\u00f6tama, siis t\u00f6\u00f6taks see v\u00e4ga halvasti. Isegi v\u00e4ikese arvu masinatega klastris.<\/p>\n<p>Peame kuidagi \u00fchem\u00f5tteliselt m\u00e4\u00e4rama, millisele serverile suunata millise p\u00e4ringu.<\/p>\n<p>On lihtne viis. Me v\u00f5tame URL-ist hash'i v\u00f5i meie shardimise v\u00f5tme hash'i, mis on URL-is, ja jagame selle tervikuna serverite arvuga. Kas see t\u00f6\u00f6tab? Jah, see t\u00f6\u00f6tab.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/794a82ac1268b651ab936f0225b802a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee, we have a hundred percent request, for example, for some \u00abexample_url\u00bb will always land on the server with index \u00ab2\u00bb, and the cache will be utilized as efficiently as possible.<\/p>\n<p>But there's a problem with resharding in such a scheme. Resharding \u2014 I mean changing the number of servers.<\/p>\n<p>Let's assume our caching cluster has stopped coping, and we decided to add another machine.<\/p>\n<p>We add it.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/5f2fcba4c4f267c069811c3677bd0213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNow everything is divided not into three, but into four. Thus, almost all the keys we previously had, almost all the URLs now reside on different servers. The entire cache was invalidated in a moment. All requests flooded our cluster storage, it became overwhelmed, service failed, and users were unhappy. We really don't want that to happen.<\/p>\n<p>This option doesn't suit us either.<\/p>\n<p>So what should we do? We need to somehow use the cache efficiently, continually landing one request on the same server, but still be resistant to resharding. And there's a solution for that; it's not overly complicated. It's called consistent hashing.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/1380758686274df9755a7ebf7d1c8753.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHow does it look?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/44f97abfac46fa9f361055548819e8a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe take some function from the sharding key and spread all its values around a circle. That is, at point 0, we have its minimum and maximum values converging. Next, we place all our servers on this same circle approximately like this:<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d470ec615a789913a6baa2726b05acea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEach server is defined by one point, and the sector that goes to it clockwise, accordingly, is served by this host. When requests come in, we immediately see that, for example, request A \u2014 it has this hash \u2014 and it is served by server 2. Request B \u2014 by server 3. And so on.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/fcdbd1caa9f1162cf02e8b0a1c79cb74.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWhat happens in this situation during resharding?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7386cda826e9419d5f8a9a0d6d6703c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nWe do not invalidate the entire cache like before, and we do not move all the keys, but we shift each sector by a small distance so that in the freed-up space, so to speak, our sixth server, which we want to add, can fit there, and we add it.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8680e0cf023ce911b4d162e9102c0545.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLoomulikult, sellises olukorras v\u00f5tavad v\u00f5tmed samuti tuule alla. Kuid nad langevad oluliselt v\u00e4hem kui varem. Ja me n\u00e4eme, et meie kaks esimest v\u00f5tit on j\u00e4\u00e4nud oma serveritesse, ning vahetunud on ainult vahem\u00e4lu server viimasest v\u00f5tme jaoks. See t\u00f6\u00f6tab piisavalt t\u00f5husalt, ja kui lisate uusi hoste j\u00e4rk-j\u00e4rgult, siis suurt probleemi siin ei ole. Lisate aeglaselt, ootate, kuni vahem\u00e4lu taas t\u00e4itub, ja k\u00f5ik t\u00f6\u00f6tab h\u00e4sti.<\/p>\n<p>Ainuke k\u00fcsimus on h\u00e4iretega seoses. Oletame, et meil on mingi masin rikki l\u00e4inud.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8e3301af782ce8983716c4bc9add79a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa me ei oleks just eriti \u00e4revil, kui sellisel hetkel see kaart uuesti genereerida, vahem\u00e4lu osaliselt invalideerida ja nii edasi, kui n\u00e4iteks masin taask\u00e4ivitub, kuid peame kuidagi teenindama p\u00e4ringute. Me hoidime lihtsalt igas kohas \u00fchte reserveeritud fotovahem\u00e4lu, mis toimib asendajana igasuguste masinate jaoks, mis praegu rikki l\u00e4ksid. Ja kui \u00e4kki m\u00f5ni meie serveritest muutub k\u00e4ttesaamatuks, suundub liiklus sinna. Meil ei ole seal, loomulikult, mingit vahem\u00e4lu, st see on k\u00fclm, kuid v\u00e4hemalt saadetakse kasutajate p\u00e4ringud edasi. Kui see on l\u00fchike vaheaeg, saame selle t\u00e4iesti rahulikult \u00fcle elada. Lihtsalt koormus storage'ile suureneb. Kui see vaheaeg on pikk, siis saame juba teha otsuse \u2014 kas eemaldada see server kaardilt v\u00f5i mitte, v\u00f5i v\u00f5ib-olla asendada see m\u00f5nega.<\/p>\n<p>See r\u00e4\u00e4gib vahem\u00e4lu s\u00fcsteemist. Vaadakem tulemusi.<\/p>\n<p>Tundub, et siin pole midagi keerulist. Kuid selline vahem\u00e4lu haldamise meetod andis meile ligikaudu 98% eduv\u00f5imaluse. St. neist 80 tuhande p\u00e4ringust sekundis j\u00f5uab vaid 1600 storage'idesse, mis on t\u00e4iesti normaalne koormus, nad taluvad seda rahulikult, meil on alati varu.<\/p>\n<p>Me oleme paigutanud need serverid kolme meie andmekeskusesse, ja saime kolm kohaloleku punkti \u2014 Praha, Miami ja Hongkong.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/64eef492b65a014d8ba3c808b6579b41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega on nad enam-v\u00e4hem kohalikult asetatud iga meie sihtturu l\u00e4hedale.<\/p>\n<p>Ja meeldiva boonusena saime selle vahem\u00e4lu proxy, mille protsessor on tegelikult alakoormatud, kuna sisu edastamiseks ei ole see nii vajalik. Me oleme seal NGINX+i ja Lua abil teostanud palju utilitaarset loogikat.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b65c609df5e1985240d04ee65a3e4f55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4iteks saame eksperimenteerida WebP v\u00f5i progressiivse JPEG-iga (need on efektiivsed ja kaasaegsed formaadid), vaadata, kuidas see m\u00f5jutab liiklust, teha otsuseid, lubada teatud riikidele jne; teostada d\u00fcnaamilist resize'i v\u00f5i k\u00e4rpimist otse piltidele.<\/p>\n<p>See on hea kasutusjuht, kui teil on n\u00e4iteks mobiilirakendus, mis n\u00e4itab fotosid, ja mobiilirakendus ei taha kulutada kliendi CPU-d, et k\u00fcsida suurt pilti ja seej\u00e4rel seda mingisse suurusesse resize'ida, et see vaatesse suruda. Saame lihtsalt d\u00fcnaamiliselt URL-i kaudu m\u00e4\u00e4rata teatud parameetrid ja pildis\u00fclearvustus ise resize'ib pildi. Tavalise praktika kohaselt valib see suuruse, mis meil f\u00fc\u00fcsiliselt on kettal, mis on maksimaalselt l\u00e4hedane n\u00f5utud suurusele, ja v\u00e4hendab seda konkreetsetes koordinaatides.<\/p>\n<blockquote><p>Muide, oleme avaldanud viie viimase aasta jooksul arendajatelt k\u00f5rge koormusega s\u00fcsteemide konverentside videod. <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex>. Vaadake, uurige, jagage ja tellige meie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/profyclub\">YouTube'i kanal<\/a><\/noindex>.<\/p><\/blockquote>\n<p>\nSamuti saame lisada sinna palju tootele \u00e4ri loogikat. N\u00e4iteks saame URL-i parameetrite kaupa lisada erinevaid vesimarke, saame fotoid h\u00e4gustada, udustada v\u00f5i piksliseerida. See on siis, kui soovime n\u00e4idata inimese pilti, kuid ei soovi n\u00e4idata tema n\u00e4gu, see t\u00f6\u00f6tab h\u00e4sti ning k\u00f5ik see on siia ellu viidud.<\/p>\n<p>Mida me saime? Saime kolm kohaloleku punkti, hea hitrate'i, ja samal ajal ei j\u00e4\u00e4 CPU nendel masinatel seisma. See on n\u00fc\u00fcd muidugi t\u00e4htsam kui varem. Peame endale panema v\u00f5imsamaid masinaid, aga see tasub end \u00e4ra.<\/p>\n<p>See, mis puudutab piltide edastamist. Siin on k\u00f5ik piisavalt selge ja ilmne. Arvan, et ei avastanud Ameerikat, see on nii, nagu enamik moderne CDN-e t\u00f6\u00f6tab.<\/p>\n<p>Ja t\u00f5en\u00e4oliselt v\u00f5iks kogenud kuulajatel tekkida k\u00fcsimus: miks mitte lihtsalt vahetada k\u00f5ik CDN-i peale? Tulemuseks oleks peaaegu sama, k\u00f5ik kaasaegsed CDN-id oskavad seda teha. Ja siin on m\u00f5ned p\u00f5hjused.<\/p>\n<p>Esiteks - need on fotod.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/592c10eb74d46191bfcedec120f68556.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on meie infrastruktuuri \u00fcks v\u00f5tmeelemente ja meil on nende \u00fcle v\u00f5imalikult palju kontrolli. Kui see on mingi lahendus kolmanda osapoole pakkujalt, ja te ei oma selle \u00fcle mingit v\u00f5imu, siis on teil seda keeruline taluda, kui teil on suur andmestik ja v\u00e4ga suur kasutajate p\u00e4ringute voog.<\/p>\n<p>To give an example. Right now, on our infrastructure, we can, for instance, in case of any issues or underground noises, access the machine, debug there, so to speak. We can add the collection of certain metrics that we need, experiment in some way, and see how it affects the graphs, and so on. A lot of statistics are currently being collected on this caching cluster. We periodically look at it and spend a lot of time investigating certain anomalies. If this were on the CDN side, it would be much harder to control. Or, for instance, if an accident occurs, we know what happened, we know how to live with it and how to deal with it. That\u2019s the first conclusion.<\/p>\n<p>The second conclusion is more historical because the system has been evolving for a long time, and there have been many different business requirements at various stages, and they don't always fit the CDN concept.<\/p>\n<p>And a point that follows from the previous one \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/007cf3aed2f9cc12185fc3865bf9d196.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nThe thing is, we have a lot of specific logic in our photo caches, which is not always possible to add upon request. It's unlikely that any CDN would add custom things at your request. For example, URL encryption, if you don't want the client to change anything. If you want to change a URL on the server and encrypt it, and then send some dynamic parameters here.<\/p>\n<p>What conclusion can we draw? In our case, CDN is not a very good alternative.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/cfc2963cca2357cf6b0f63419a4dc436.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBut in your case, if you have specific business requirements, you can comfortably implement what I showed you yourself. And with a similar load profile, it will work great.<\/p>\n<p>But if you have a general solution, and the task is not very specific, you can safely use a CDN. Or if time and resources are much more important to you than control.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b76d25404918a5d0d8bf1d6644c8d873.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnd modern CDNs have virtually everything I just talked about. With the exception of plus or minus some features.<\/p>\n<p>This is regarding the delivery of photos.<\/p>\n<p>Now let's move a little forward in our retrospective and talk about storage.<\/p>\n<p>The year was 2013.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f218bfc899512041967842430c02aa9b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00fcsteemi\u00fcksused on juurde tulnud, j\u00f5udlusprobleemid on kadunud. K\u00f5ik on h\u00e4sti. Andmestik suureneb. 2013. aastaks oli meil umbes 80 serverit, mis olid \u00fchendatud salvestusseadmetega, ja igas andmekeskuses umbes 40 kiirendajat. See t\u00e4hendab 560 terabaiti andmeid igas andmekeskuses, kokku umbes petabait.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/ef741ba4a9164e6940f55e93dfb46ef0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa koos andmestiku kasvuga hakkasid oluliselt suurenema ka k\u00e4ituskulud. Kuidas see v\u00e4ljendus?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/6cf5e489a4e97bc6e26fc6d4d16505b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles skeemis, mis on joonistatud \u2014 koos SAN-iga, millele on \u00fchendatud masinad ja vahem\u00e4lud \u2014 on v\u00e4ga palju t\u00f5rkeid. Kui me oleme varasemalt suutnud toime tulla vahem\u00e4luserverite rikete ja probleemidega, mis on enam-v\u00e4hem ettearvatavad ja arusaadavad, siis salvestusseadmiste poolel olid asjad palju halvemad.<\/p>\n<p>Esiteks v\u00f5ib eba\u00f5nnestuda ise Storage Area Network (SAN).<\/p>\n<p>Teiseks on see \u00fchendatud optilise kiirusega l\u00f5ppmasinatega. V\u00f5ivad olla probleemid optiliste kaartide ja l\u00fclititega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/6959b79284c5b1244a70a1d64f191893.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeid on muidugi v\u00e4hem kui SAN-is, aga siiski on see ka t\u00f5rkekoht.<\/p>\n<p>Seej\u00e4rel on masin, mis on \u00fchendatud salvestusseadmiega. Ka see v\u00f5ib rikki minna.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/1801cb502663a4de14329a5e67dfed79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKokku on meil kolm t\u00f5rkepunkti.<\/p>\n<p>Lisaks t\u00f5rkekohtadele on ka ise salvestusseadmest hooldamine keeruline.<\/p>\n<p>See on keeruline mitmekomponentne s\u00fcsteem ning s\u00fcsteemiinseneritel on selle t\u00f5ttu sageli raskusi.<\/p>\n<p>Ja viimane, k\u00f5ige olulisem punkt. Kui m\u00f5nes neist kolmest punktist juhtub t\u00f5rge, on meil v\u00f5imalus kasutaja andmeid kaotada, kuna failis\u00fcsteem v\u00f5ib rikki minna.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/4bf8bc1c73a2beef74cb4ee0ee45679b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOletame, et meil on failis\u00fcsteem katki l\u00e4inud. Selle taastamine v\u00f5tab aega \u2014 see v\u00f5ib v\u00f5tta n\u00e4dala, kui andmeid on palju. Ja teiseks, t\u00f5en\u00e4oliselt saame me tulemusena hunniku arusaamatuid faile, mida tuleb mingil moel sobitada kasutajate fotodele. Ja me riskime andmete kaotamisega. Risk on piisavalt k\u00f5rge. Mida sagedamini sellised olukorrad juhtuvad ja mida rohkem on probleemid kogu selles ahelas, seda k\u00f5rgem on see risk.<\/p>\n<p>Sellega tuli midagi ette v\u00f5tta. Ja me otsustasime, et peame lihtsalt andmed varundama. See on tegelikult ilmne ja hea lahendus. Mida me tegime?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f80ec2b65003c40bd2fabf88966b3e05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii n\u00e4gi v\u00e4lja meie server, mis oli varem \u00fchendatud salvestusseadmega. See on \u00fcks p\u00f5hiosa, see on lihtsalt plokkseade, mis esindab tegelikult mount'i kaug-salvestusseadmest optilise kiirusega.<\/p>\n<p>Me lihtsalt lisasime teise osa.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d3dba75ef477269d92145cd69d587527.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPanime teise storage'i k\u00f5rvale (\u00f5nneks ei ole see rahaliselt nii kallis) ja nimetasime selle backup-osaks. See on samuti \u00fchendatud optika kaudu ja asub samal masinal. Kuid me peame kuidagi need andmed s\u00fcnkroonima.<\/p>\n<p>Siin loome lihtsalt k\u00f5rval as\u00fcnkroonse j\u00e4rjekorra.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/67bced2b45c589009cfb01a1c21398a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee ei ole v\u00e4ga koormatud. Me teame, et meil on v\u00e4he kirjeid. J\u00e4rjekord on lihtsalt tabel MySQL-is, kuhu kirjutatakse ridu t\u00fc\u00fcpi \"peab selle foto varundama\". Igal muudatusel v\u00f5i \u00fcleslaadimisel kopeerime peamisest osast backup'i as\u00fcnkroonselt v\u00f5i lihtsalt m\u00f5ne taustat\u00f6\u00f6taja abil.<\/p>\n<p>Ja seega on meil alati kaks koosk\u00f5lastatud osa. Isegi kui \u00fcks osa sellest s\u00fcsteemist eba\u00f5nnestub, saame alati vahetada peamise osa backup'iga ning k\u00f5ik j\u00e4tkab t\u00f6\u00f6d.<\/p>\n<p>Kuid selle t\u00f5ttu suureneb lugemise koormus oluliselt, sest peale klientide, kes loevad peamisest osast, kuna nad vaatavad fotot seal (see on ju v\u00e4rskem), otsivad nad siis backup'ist, kui nad ei leia (aga selle teeb juba NGINX), pluss ka meie backup-s\u00fcsteem n\u00fc\u00fcd loeb peamisest osast. See ei olnud just kitsaskoht, kuid ma ei soovinud koormust lihtsalt niisama suurendada.<\/p>\n<p>Ja me lisasime kolmanda ketta, mis on v\u00e4ike SSD ja nimetasime selle puhvriks.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/fd35481822b4170087e5f670bf338dc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas see n\u00fc\u00fcd t\u00f6\u00f6tab.<\/p>\n<p>Kasutaja laadib foto puhvrisse, seej\u00e4rel saadetakse \u00fcritus, et see tuleb kopeerida kahte ossa. See kopeeritakse ja foto elab mingiaeg (\u00fctleme, \u00f6\u00f6p\u00e4ev) puhvrisse, kuni see sealt purgitud saab. See parandab oluliselt kasutajakogemust, kuna kasutaja laadib foto \u00fcles ja tavaliselt hakkavad kohe tulema p\u00e4ringud, v\u00f5i v\u00e4rskendab ta ise lehte. Kuid see k\u00f5ik oleneb rakendusest, mis \u00fcleslaadimise sooritab.<\/p>\n<p>V\u00f5i n\u00e4iteks teised inimesed, kellele ta hakkas n\u00e4itama, saadavad kohe p\u00e4rast seda fotot p\u00e4ringud. Vahem\u00e4lus seda veel ei ole, esimene p\u00e4ring toimub v\u00e4ga kiiresti. \u00d5ieti, see on nagu fotovahem\u00e4lu. Aeglane storage ei osale selles \u00fcldse. Ja kui see \u00f6\u00f6p\u00e4eva p\u00e4rast purgitakse, siis on see juba kas vahem\u00e4lus v\u00f5i t\u00f5en\u00e4oliselt ei ole seda enam kellelegi vaja. Seega on kasutajakogemus siin oluliselt paranenud nende lihtsate manipulatsioonide t\u00f5ttu.<\/p>\n<p>Ja k\u00f5ige t\u00e4htsam: me l\u00f5petasime andmete kaotamise.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/526f549457dd0c438f32b0adb76df76c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNoh, \u00fctleme nii, et me l\u00f5petasime. <em>j\u00e4\u00e4vaid<\/em> andmed kaotada, kuna me ei kaotanud neid kuigi palju. Kuid oht oli olemas. N\u00e4eme, et selline lahendus on muidugi hea, kuid see sarnaneb veidi probleemi s\u00fcmptomeid silumisega, selle asemel et seda t\u00e4ielikult lahendada. Ja probleemid on siin m\u00f5ned j\u00e4\u00e4nud.<\/p>\n<p>Esiteks, see on t\u00f5rketegur f\u00fc\u00fcsilise hosti n\u00e4ol, millel kogu see masinav\u00e4rk t\u00f6\u00f6tab, see ei ole kuhugi kadunud.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0eb3d292655a7edf912793ed81e8931c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeiseks, probleemid SAN-ide osas on j\u00e4\u00e4nud, nende keeruline hooldus jms. See ei olnud just kriitiline tegur, kuid oleks tahtnud proovida elada ka ilma selleta.<\/p>\n<p>Ja me tegime kolmanda versiooni (t\u00f5eliselt, teise) \u2014 varundamise versiooni. Kuidas see v\u00e4lja n\u00e4gi?<\/p>\n<p>See, mis oli \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8b1749b6feed200f8a64529ee2316c1a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPeamised probleemid on meil selle f\u00fc\u00fcsilise hostiga.<\/p>\n<p>Esiteks, me eemaldame SAN-id, sest tahame katsetada, tahame proovida lihtsalt kohalikke k\u00f5vakettaid.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/fd0f5a8627d9179fcbc7097c1c18505f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee oli juba 2014-2015 aasta, ja sel ajal on olukord ketaste ja nende mahutavusega \u00fchel hostil muutunud palju paremaks. Otsustasime, et miks mitte proovida.<\/p>\n<p>Ja seej\u00e4rel v\u00f5tame lihtsalt meie varukoopia ja kantime selle f\u00fc\u00fcsiliselt eraldi masinale.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/456e00bc8557d3340b06efcd1dde8a08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii saame sellise skeemi. Meil on kaks seadmeid, mis salvestavad sama andmestikku. Need varundavad \u00fcksteist t\u00e4ielikult ja s\u00fcnkroniseerivad andmed \u00fcle v\u00f5rgu as\u00fcnkroonse j\u00e4rjekorra kaudu samas MySQL-is.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d44cdb7b440ad4c58cc625123306a8c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMiks see h\u00e4sti t\u00f6\u00f6tab \u2014 sest meil on v\u00e4he kirjeid. See t\u00e4hendab, kui kirje oleks v\u00f5rdselt lugemisega, v\u00f5iksime saada mingit v\u00f5rgu \u00fclekandmise kulu ja probleeme. Kirjeid on v\u00e4he, lugemist palju \u2014 see meetod t\u00f6\u00f6tab h\u00e4sti, st me kopeerime fotosid nende kahe serveri vahel piisavalt harva.<\/p>\n<p>Kuidas see t\u00f6\u00f6tab, kui vaadata veidi detailsemalt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/071c11abb6ee1d7734c53052139ff04b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUpload. Tasakaalustaja valib lihtsalt juhuslikud hostid paarist ja teeb sellele uploadi. Samal ajal teeb ta loomulikult health check'e, j\u00e4lgides, et masin ei kukuks v\u00e4lja. See t\u00e4hendab, et ta upload'ib fotosid ainult elavale serverile ja seej\u00e4rel kopeeritakse see k\u00f5ik as\u00fcnkroonse j\u00e4rjekorra kaudu tema naabrile. Upload'iga on k\u00f5ik \u00e4\u00e4rmiselt lihtne.<\/p>\n<p>\u00dclesanne on veidi keerulisem.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f494904aec823456e18b987a8c98bf56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiin aitas meid Lua, kuna vanill NGINX-is on raske sellise loogika rakendamine. Esiteks teeme p\u00e4ringu esimesse serverisse, vaatame, kas seal on foto, kuna see v\u00f5ib potentsiaalselt olla \u00fcles laetud n\u00e4iteks naabrile ja siia pole veel j\u00f5udnud. Kui foto on olemas, on see hea. Anname selle kohe kliendile ja v\u00f5imalusel salvestame vahem\u00e4lu.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/de5f77e997bb049f4cfc1709da0f1788.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKui seda ei ole, teeme lihtsalt p\u00e4ringu naabrile ja sealt saadame selle garanteeritult edasi.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/79aa5592acd28dfbc815261d0276c2e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega v\u00f5ib j\u00e4lle \u00f6elda, et v\u00f5ivad olla probleemid j\u00f5udlusega, kuna pidevad ringreisid - foto on \u00fcles laaditud, siin seda ei ole, teeme kaks p\u00e4ringut \u00fche asemel, see peaks t\u00f6\u00f6tama aeglaselt.<\/p>\n<p>Meie olukorras ei toimi see aeglaselt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/52ca3902d80990f512201672cd5e6441.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeil on selle s\u00fcsteemi kohta kokku kogutud hulk m\u00f5\u00f5dikuid ja sellise mehhanismi tinglik hitt m\u00e4\u00e4r on umbes 95%. See t\u00e4hendab, et selle varukoopia viivitus on v\u00e4ike ja seet\u00f5ttu saame peaaegu garanteeritult, p\u00e4rast seda, kui foto on \u00fcles laetud, selle esmakordselt k\u00e4tte ja ei pea kaks korda minema.<\/p>\n<p>Nii et mis veel me saanud oleme ja mis on v\u00e4ga lahe?<\/p>\n<p>Varem oli meil peamine varukoopia ja lugesime neid j\u00e4rk-j\u00e4rgult. St. otsisime alati esmalt p\u00f5hjas ja siis varukoopias. See oli \u00fcks k\u00e4ik.<\/p>\n<p>N\u00fc\u00fcd kasutame me lugemist kahest masinast korraga. Jagame p\u00e4ringud Round Robin'i meetodil. V\u00e4ikese protsendi juhtudel teeme kaks p\u00e4ringut. Aga n\u00fc\u00fcd on meil kokku kaks korda rohkem lugemisvaru, kui oli varem. Koormus on t\u00f5eliselt v\u00e4henenud ning andmete edastamise masinatel ja ka sellel salvestusel, mis meil oli, samuti.<\/p>\n<p>Mis puudutab rikketalo, siis selle nimel me peamiselt k\u00e4mpisime. Rikketalo osas on k\u00f5ik sujuvalt v\u00e4lja tulnud.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/a030a477e60d6e1f3d0b4e3395013df5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dcks masin kukub v\u00e4lja.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/42900b24e340c03ea642fd49f5b410ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEi mingit probleemi! S\u00fcsteemi insener ei pea isegi \u00f6\u00f6sel \u00fcles \u00e4rkama, ootab hommikuni, ei juhtu midagi hullu.<\/p>\n<p>Kui ka selle masina eba\u00f5nnestumise korral j\u00e4rjekord v\u00e4lja kukkus, siis samuti pole probleeme, lihtsalt logi hakkab kogunema esmalt elusoleva masina peale ja seej\u00e4rel j\u00f5uab j\u00e4rjekorda ning siis sinna masinasse, mis tuleb teenistusse m\u00f5ne aja p\u00e4rast.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/ef42eadaaf3e3ecbf70847e9f88c1582.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSama kehtib ka hoolduse kohta. Me lihtsalt l\u00fclitame \u00fche masina v\u00e4lja, t\u00f5mbame ta k\u00e4sitsi k\u00f5igist puulidest v\u00e4lja, ta ei saa enam liiklust, teeme teatud hooldust\u00f6id, muudame midagi ja p\u00e4rast seda paneme ta tagasi t\u00f6\u00f6le, ning backup j\u00f5uab \u00fcsna kiiresti j\u00e4rgi. St, \u00fche masinakaotuse seisak aeg kompenseeritakse paar minuti jooksul. See on t\u00f5esti v\u00e4he. Klienditeenindus on, nagu ma juba \u00fctlesin, siin v\u00e4ga paindlik.<\/p>\n<p>Milliseid j\u00e4reldusi saame teha sellest varukoopiate skeemist?<\/p>\n<p>Oleme saavutanud t\u00f5rke taluvuse.<\/p>\n<p>Lihtne kasutamine. Kuna masinatel on kohalikud k\u00f5vakettad, on see inseneride jaoks, kes sellega t\u00f6\u00f6tavad, palju mugavam.<\/p>\n<p>Oleme saanud kahekordse reservi lugemiseks.<\/p>\n<p>See on t\u00f5eliselt hea boonus t\u00f5rke taluvuse juurde.<\/p>\n<p>Kuid on ka probleeme. N\u00fc\u00fcd on meil palju keerulisem arendada mingeid funktsioone, seoses sellega, kuna s\u00fcsteem on 100% l\u00f5puks konsistentne.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b650276a41730cc303180e8304c5dabb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPeame n\u00e4iteks mingisugustes taustat\u00f6\u00f6des pidevalt m\u00f5tlema: \"Millisel serveril me praegu t\u00f6\u00f6tame?\", \"Kas siin on t\u00f5esti v\u00e4rske pilt?\" jne. See on k\u00f5ik loomulikult pakitud kihtidesse, ja arendajale, kes kirjutab \u00e4riloogikat, on see l\u00e4bipaistev. Kuid siiski on see suur keeruline kiht, mis on tekkinud. Oleme valmis sellega leppima kaubaks saadud kasude nimel.<\/p>\n<p>Ja siin tekib j\u00e4lle teatud konflikt.<\/p>\n<p>Olen alguses \u00f6elnud, et k\u00f5ik lokalisatsioonid k\u00f5vakettale hoidmine on halb. Ja n\u00fc\u00fcd \u00fctlen, et see meeldib meile.<\/p>\n<p>Jah, t\u00f5epoolest, aja jooksul on olukord oluliselt muutunud ja n\u00fc\u00fcd on sellel l\u00e4henemisel palju eeliseid. Esiteks saame palju lihtsama kasutamise.<\/p>\n<p>Teiseks, see on tulemuslikum, sest meil ei ole neid automaatseid kontrollerid, mis \u00fchendatakse kettakappidega.<\/p>\n<p>Seal on tohutu masin, kuid need on lihtsalt m\u00f5ned kettad, mis on konkreetselt siin masinas RAID-ina kokku pandud.<\/p>\n<p>Kuid on ka miinuseid.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/3c090e0801f1a686dc0d5fefce697c56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee maksab ligikaudu 1,5 korda rohkem kui SANide kasutamine isegi t\u00e4nap\u00e4eva hindade j\u00e4rgi. Seet\u00f5ttu otsustasime, et ei muuda oma suurt klastri t\u00e4ielikult kohalikeks k\u00f5vaketaste masinateks ja otsustasime j\u00e4\u00e4da h\u00fcbriidlahendusele.<\/p>\n<p>Pool masinatest t\u00f6\u00f6tavad meil k\u00f5vakettaga (noh, mitte pool \u2013 umbes 30 protsenti vist). Ja \u00fclej\u00e4\u00e4nud osa on vanad masinad, millel oli varem esimene varundamise skeem. Lihtsalt renoveerisime need, kuna me ei vaja uusi andmeid ega midagi muud, lihtsalt kolisime m\u00e4hised \u00fche f\u00fc\u00fcsilise hosti pealt kahele.<\/p>\n<p>Ja meil on suur lugemisreserv ja me oleme suurendanud. Kui varem mountisime \u00fche masina peale \u00fche salvestuse, siis n\u00fc\u00fcd mountime \u00fche paari peale neli, n\u00e4iteks. Ja see t\u00f6\u00f6tab normaalselt.<\/p>\n<p>Kokkuv\u00f5tteks, vaatame l\u00fchidalt, mis meil on, mille nimel me v\u00f5itlesime ja kas see l\u00e4ks korda.<\/p>\n<h3>Summary<\/h3>\n<p>\nMeil on kasutajaid \u2013 lausa 33 miljonit.<\/p>\n<p>Meil on kolm kohaloleku punkti \u2013 Praha, Miami, Hongkong.<\/p>\n<p>Seal on vahem\u00e4lu kiht, mis koosneb masinatest kiiresti lokaliseeritud ketaste (SSD) peal, kus t\u00f6\u00f6tab lihtne struktuur NGINX-ist, selle access.log'ist ja Python'i deemonitest, mis k\u00f5ike seda t\u00f6\u00f6tlevad ja haldavad.<\/p>\n<p>Soovi korral v\u00f5ite oma projektis, kui pildid ei ole teile nii kriitilised kui meile, v\u00f5i kui teie jaoks on tasakaalu kontroll ja arenduse kiirus ning ressursside kulud teises suunas, siis v\u00f5ite rahulikult asendada selle CDN-iga, modernsed CDN-id teevad seda h\u00e4sti.<\/p>\n<p>Edasi tuleb salvestuskiht, kus meil on paaride klastrid masinatest, mis teineteist varundavad, s\u00fcnkroonselt kopeerivad failid \u00fcksteisele igal muudatusel.<\/p>\n<p>Selle juures t\u00f6\u00f6tavad osad neist masinatest kohalike k\u00f5vaketastega.<\/p>\n<p>Osad neist masinatest on \u00fchendatud SAN-idega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/5ddbc4f73d86aa1f83734885d8c9dea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dchelt poolt on see k\u00e4itamisel mugavam ja veidi efektiivsem, teiselt poolt on see mugav paigutuse tiheduse ja gigabaiti hindade poolest.<\/p>\n<p>See on l\u00fchike \u00fclevaade arhitektuurist, mida oleme saanud ja kuidas see k\u00f5ik arenes.<\/p>\n<p>Veel m\u00f5ned n\u00f5uanded kaptenilt, t\u00e4iesti lihtsad.<\/p>\n<p>Esiteks, kui otsustate, et teil on h\u00e4dasti vaja kogu oma fotoinfrastruktuuri parandada, m\u00f5\u00f5tke k\u00f5igepealt, sest v\u00f5ib-olla pole midagi parandada.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7770f41d0b190eb78ae0d19f4c8182a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00f5in n\u00e4iteks. Meil on masinate klaster, mis edastab pilte chat'ide attachment'ist, ja seal t\u00f6\u00f6tab endiselt skeem 2009. aastast, ning keegi ei kannata selle all. K\u00f5igil on h\u00e4sti, k\u00f5ik on rahul.<\/p>\n<p>Ette m\u00f5\u00f5ta, riputage k\u00f5igepealt \u00fcles hunnik m\u00f5\u00f5dikuid, vaadake neid ning siis otsustage, millega te rahul ei ole ja mida tuleb parandada. Selle m\u00f5\u00f5tmiseks on meil suurep\u00e4rane t\u00f6\u00f6riist nimega Pinba.<\/p>\n<p>See v\u00f5imaldab koguda NGINX-i kaudu v\u00e4ga detailselt statistikat iga p\u00e4ringu ja vastuse koodide kohta, samuti ajade jaotuse kohta \u2013 k\u00f5ike, mida soovite. Sellel on sidemed erinevate anal\u00fc\u00fcsis\u00fcsteemidega, nii et saate hiljem k\u00f5ik ilusasti vaadata.<\/p>\n<p>Esiteks m\u00f5\u00f5tsime \u2013 p\u00e4rast seda parandasime.<\/p>\n<p>J\u00e4tkates. Optimeerime lugemise jaoks vahem\u00e4lu, kirjutamise \u2013 shardingu jaoks, kuid see on ilmselge punkt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f53a4777f1a2c7793eba4a72c94263a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJ\u00e4tkates. Kui te alles hakkate oma s\u00fcsteemi ehitama, siis on palju parem teha fotosid immutatiivsete failidena. Kuna te kaotate kohe terve klass probleeme vahem\u00e4lu kehtetuks muutumisega, sellega, kuidas loogika peaks leidma \u00f5ige versiooni fotost jne.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f345c59681275326cda1320b4f188ce9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOletame, et laadisite \u00fcles sada, siis keerutasite selle \u00fcmber, tehke nii, et see oleks f\u00fc\u00fcsiliselt erinev fail. St. ei ole vaja m\u00f5elda: n\u00fc\u00fcd ma s\u00e4\u00e4stan natuke ruumi, kirjutan sama faili, muudan versiooni. See ei t\u00f6\u00f6ta kunagi h\u00e4sti, sellega on hiljem palju peavalu.<\/p>\n<p>J\u00e4rgmine punkt. Resize reaalajas.<\/p>\n<p>Varem, kui kasutajad laadisid \u00fcles foto, l\u00f5ikasime kohe v\u00e4lja palju erinevaid suurusi igaks juhuks, erinevatele klientidele, ja need k\u00f5ik olid kettale. N\u00fc\u00fcd oleme sellest loobunud.<\/p>\n<p>Oleme j\u00e4tnud vaid kolm peamist suurust: v\u00e4ike, keskmine ja suur. K\u00f5ik muu me lihtsalt allapoole skaleerime selle suuruse p\u00f5hjal, mida k\u00fcsiti Uport-is, lihtsalt teeme allapoole skaleerimise ja anname selle kasutajale.<\/p>\n<p>Vahem\u00e4lu kihtide CPU on siin tunduvalt odavam, kui me pidevalt k\u00e4ivitaksime need suurused igas salvestuses \u00fcmber. Oletame, et soovime lisada uue, see on kuu t\u00f6\u00f6 \u2013 k\u00e4ivitada igal pool skript, mis k\u00f5ik selle korralikult teeks, ilma et klastrisse halb l\u00e4heks. St. kui on v\u00f5imalus praegu valida, tehke v\u00e4hem f\u00fc\u00fcsilisi suurusi, kuid et oleks mingi jaotus, \u00fctleme kolm. Ja k\u00f5ik muu lihtsalt skaleerida reaalajas olemasolevate moodulite abil. See on praegu k\u00f5ik v\u00e4ga lihtne ja kergesti k\u00e4ttesaadav.<\/p>\n<p>Aga inkrementaalne as\u00fcnkroonne varukoopia on hea.<\/p>\n<p>Kuna meie praktika on n\u00e4idanud, t\u00f6\u00f6tab selline skeem suurep\u00e4raselt muudetud failide viivitusega kopeerimisega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo fotode salvestamise ja jagamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0e550721e838654e61e1fa4d08f9bb93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViimased punkt on samuti ilmne. Kui teie infrastruktuuris pole praegu selliseid probleeme, kuid on midagi, mis v\u00f5ib t\u00f5rkuda, juhtub see kindlasti siis, kui koormus veidi suureneb. Seet\u00f5ttu on parem m\u00f5elda sellele ette ning mitte kogeda probleeme. Minu poolest k\u00f5ik.<\/p>\n<h3>Kontaktid<\/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\/\">Badoo ettev\u00f5tte blogi<\/a><\/noindex><\/p>\n<blockquote><p>See ettekanne on \u00fchte parimatest esinemistest k\u00f5rge koormusega s\u00fcsteemide arendajate konverentsil. <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>. HighLoad++ 2017 konverentsini on v\u00e4hem kui kuu aega.<\/p>\n<p>Meil on juba valmis <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\">Konverentsi programm<\/a><\/noindex>, praegu koostatakse aktiivselt ajakava.<\/p>\n<p>Sel aastal j\u00e4tkame arhitektuuride ja skaleerimise teema uurimist:<\/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\">Kuidas teenindada miljardit kasutajat ja edastada terabitti liiklust<\/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\">Kuidas kirjutada nullist \u00fcmber VKontakte isiklike s\u00f5numite andmebaas ja migreerida see ilma seisakuteta<\/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\">M\u00fc\u00fcgi surm: kuidas Yandex.Money p\u00fc\u00fcdis Black Friday tarvis varuda ja vastu pidada<\/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\">Panga esmas\u00fcsteemi t\u00f5rkepeatamise arhitektuur<\/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\">Makse s\u00fcsteemi arhitektuur: peaaegu ettev\u00f5tte tasemel<\/a><\/noindex> \/ \u0424\u0438\u043b\u0438\u043f\u043f \u0414\u0435\u043b\u044c\u0433\u044f\u0434\u043e<\/li>\n<\/ul>\n<p>\nSamuti kasutatakse m\u00f5ningaid neist materjalidest meie online-kursuses k\u00f5rge koormusega s\u00fcsteemide arendamiseks. <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 see on spetsiaalselt koostatud kirjade, artiklite, materjalide, videotega koosnevad s\u00f5numid. Meie \u00f5pik sisaldab juba \u00fcle 30 ainulaadse materjali. Liituge!\n<\/p><\/blockquote>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/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\udd47 Badoo fotode salvestamise ja edastamise arhitektuur | ProHoster","description":"Artem Denisov (","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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\/et\/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\/et\/wp-json\/wp\/v2\/posts\/55009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=55009"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/55009\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=55009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=55009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=55009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}