{"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 piltide salvestamise ja edastamise arhitektuur","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 tutvumisportaal. Meil on praegu registreeritud umbes 330 miljonit kasutajat kogu maailmas. Kuid, mis on meie t\u00e4nase arutelu kontekstis palju olulisem, on see, et hoiame umbes 3 petabaiti kasutajafotosid. Igal p\u00e4eval laadivad 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 sellega on aeg-ajalt probleeme.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/4e4690f9b0d95bd76fbbc1cd6805c26c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nR\u00e4\u00e4gin s\u00fcsteemi kujundusest, mis hoiab ja jagab fotosid \u00fcldiselt, ning tutvustan seda arendaja vaatenurgast. Kuidas see arenes, tuleb l\u00fchike \u00fclevaade, kus ma m\u00e4\u00e4ratlen peamised verstapostid, kuid r\u00e4\u00e4gin p\u00f5hjalikumalt vaid nendest lahendustest, mida me praegu kasutame.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nNii et 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=\"Vaata 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, on see retrospektiiv, ja et alustada, v\u00f5tame k\u00f5ige tavalisema n\u00e4ite.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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, hoidma ja jagama kasutajate fotosid. Sellisel kujul on \u00fclesanne \u00fcldine, saame kasutada mida iganes:<\/p>\n<ul>\n<li>kaasaegset pilvep\u00f5hist salvestust,<\/li>\n<li>karbiv\u00e4lisel lahendusel, mida on n\u00fc\u00fcd samuti palju;<\/li>\n<li>v\u00f5ime \u00fcles seada mitu masinat oma andmekeskuses ja paigaldada neile suured k\u00f5vaketaste, et hoida fotosid seal.<\/li>\n<\/ul>\n<p>\nBadoo ajaloos \u2013 nii praegu kui tollal (ajal, mil see alles algas) \u2013 elab meieenda serverites, meie enda andmekeskustes. Seet\u00f5ttu oli see variant meile optimaalseim.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 saime klastrit, mis hoiab fotosid. Kuid tundub, et millestki on puudu. Selleks, et k\u00f5ik see t\u00f6\u00f6taks, tuleb kuidagi m\u00e4\u00e4ratleda, millisel masinal hoitakse milliseid fotosid. Ja siin ei pea Ameerikat taasavastama.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/36258e7107fd8c60f7e9e563a2cb681c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLisame oma salvestusse kasutaja teabe juurde mingi v\u00e4lja. See on sharding'i v\u00f5ti. Meie puhul nimetatakse seda place_id-ks ja see id n\u00e4itab kohta, kus hoitakse kasutajate fotosid. Loome kaardid.<\/p>\n<p>Esimesel etapil saab seda isegi k\u00e4sitsi teha - me r\u00e4\u00e4gime, et selle kasutaja foto sellise kohaga maandub sellisel serveril. T\u00e4nu sellele kaardile teame alati, kui kasutaja \u00fcles laadib foto, kuhu see salvestada, ja teame, kust seda jagada.<\/p>\n<p>See on t\u00e4iesti triviaalne skeem, kuid sellel on \u00fcsna olulised plussid. Esiteks, see on lihtne, nagu ma juba \u00fctlesin, ja teiseks, sellise l\u00e4henemisega saame h\u00f5lpsasti horisontaalselt skaleeruda, lihtsalt toomise uued masinad ja lisades nad kaardile. Rohkem teha ei ole vaja.<\/p>\n<p>Nii t\u00f6\u00f6tasime m\u00f5nda aega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/3effb442702f162f7bad9c18ec54392e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee oli kuskil 2009. aastal. Saime masinaid, toimetasime\u2026<\/p>\n<p>Ja mingil hetkel hakkasime m\u00e4rkama, et sellel skeemil on teatud puudused. Millised puudused?<\/p>\n<p>Esiteks on piiratud mahutavus. \u00dchele f\u00fc\u00fcsilisele serverile ei saa me paigutada nii palju k\u00f5vaketaste kui sooviksime. Ja see on aja jooksul ja andmestiku kasvades muutunud t\u00f5eliseks probleemiks.<\/p>\n<p>Teiseks. See on ebat\u00fc\u00fcpiline seadmete konfiguratsioon, kuna selliseid masinaid on raske kasutada m\u00f5nes teises klastris, nad on \u00fcsna spetsiifilised, st nad peavad olema madala j\u00f5udlusega, kuid samas suurte k\u00f5vaketastega.<\/p>\n<p>See k\u00f5ik leidis aset 2009. aastal, kuid tegelikult on need n\u00f5udmised endiselt aktuaalsed. Meie retrospektiivis oli 2009. aastal k\u00f5ik selle osas halb.<\/p>\n<p>Ja viimane punkt \u2013 hind.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/e49010eaeab139199d8fe010caa65bf0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHind oli siis \u00fcsna k\u00f5rge ja pidime otsima mingeid alternatiive. St pidiime kuidagi paremini ka kasutama nii ruumi andmekeskustes kui ka f\u00fc\u00fcsilisi servereid, millel see k\u00f5ik paikneb. Meie s\u00fcsteemi insenerid alustasid suurt uurimist\u00f6\u00f6d, kus nad vaatasid mitmeid erinevaid variante. Nad uurisid klasterp\u00f5hiseid failis\u00fcsteeme, nagu PolyCeph ja Lustre. Seal olid j\u00f5udluse probleemid ja selle haldamine oli \u00fcsna keeruline. L\u00f5petasid. Proovisime mountida kogu andmestiku NFS-i kaudu iga masina juurde, et sel moel kuidagi skaleerida. Lugemine ei sujunud ka h\u00e4sti, proovisime eri lahendusi erinevatelt tarnijatelt.<\/p>\n<p>Ja l\u00f5puks otsustasime, et hakkame kasutama nii nimetatud Storage Area Network.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/e99402fa641f3bd5fc8d57a9f8995642.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNeed on suured SHD-d, mis on m\u00f5eldud suurte andmemahtude s\u00e4ilitamiseks. Need on ketaste riiulid, mis on \u00fchendatud l\u00f5pptootmismasinatele optiliselt. Seega, meil on v\u00e4ike masinate grupp, ja need SHD-d, mis on meie l\u00f5pptootmisloogika, st meie nginx-i v\u00f5i kellegi muu jaoks l\u00e4bipaistvad, teenindavad p\u00e4ringuid nende piltide taga.<\/p>\n<p>Selle lahenduse eelised olid ilmsed. See on SHD. See on suunatud piltide s\u00e4ilitamisele. See on odavam kui lihtsalt seadistada masinad k\u00f5vaketastega.<\/p>\n<p>Teine eelis. <\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7fd2e7d629cc239096b14c68be5f76bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on see, et mahutavus on suurenenud, st me saame palju rohkem salvestusruumi v\u00e4iksemas mahus mahutada.<\/p>\n<p>Aga kiiresti ilmus ka miinuseid. Kasutajate arvu ja s\u00fcsteemi koormuse suurenemisega hakkasid tekkima j\u00f5udlusprobleemid. Probleem on m\u00f5istetav \u2014 iga SHD, mis on m\u00f5eldud paljude piltide hoidmiseks v\u00e4ikeses mahus, kannatab tavaliselt intensiivse lugemise all. See on t\u00f5si ka igasuguste pilvesalvestuste puhul. Praegu ei ole meil ideaalset salvestust, mis oleks piiramatult skaleeritav ja kuhu v\u00f5iks k\u00f5ike talletada, et see taluks v\u00e4ga h\u00e4sti lugemist. Eriti juhuslikku lugemist.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/566e836e2fe13a2a3d040ae3fa865d6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNagu meie fotode puhul, kuna fotosid k\u00fcsitakse eba\u00fchtlaselt, m\u00f5jutab see nende j\u00f5udlust oluliselt.<\/p>\n<p>Ieven kui t\u00e4na, kui meil langetab kusagil rohkem kui 500 RPS fotodele masin, millega salvestus on \u00fchendatud, algavad juba probleemid. See oli meile murettekitav, kuna kasutajate arv kasvab ja olukord peaks vaid halvenema. Peame sellega kuidagi optimeerima.<\/p>\n<p>Optimeerimiseks otsustasime siis vaadata koormusprofiili \u2014 mis t\u00e4pselt toimub, mida on vaja optimeerida.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d67310e6b90c4ee1337065790576c9a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa k\u00f5ik m\u00e4ngib meile kasuks.<\/p>\n<p>Olen esimeses slaidis juba maininud: meil on 80 000 lugemisp\u00e4ringut sekundis ning ainult 3,5 miljonit \u00fcleslaadimist p\u00e4evas. Seega on vahe kolm korda. Ilmselgelt on vaja optimeerida lugemist ja praktiliselt on selge, kuidas seda teha.<\/p>\n<p>On veel \u00fcks v\u00e4ike n\u00fcanss. Teenuse iseloom on selline, et inimene registreerib end, \u00fcles laadib foto, seej\u00e4rel hakkab aktiivselt teiste inimesi vaatama, nende postitusi nagu, ja teda n\u00e4idatakse aktiivselt teistele. Siis ta leiab omale paarilise v\u00f5i mitte, see s\u00f5ltub sellest, kuidas l\u00e4heb, ja teatud ajaks l\u00f5petab teenuse kasutamise. Just sel hetkel, kui ta teenust kasutab, on tema pildid v\u00e4ga palavikuline \u2014 neid n\u00f5utakse ja neid vaatab v\u00e4ga palju inimesi. Kui ta sellest tegevusest loobub, langeb ta kiiresti neist intensiivsetest n\u00e4idustest, nagu varem, ja tema pilte praktiliselt ei k\u00fcsita.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/dcc7e306055d8f2b0895f24679bfc3e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega, meil on v\u00e4ga v\u00e4ike kuum andmestik. Kuid sellel on siiski v\u00e4ga palju p\u00e4ringuid. Ja t\u00e4iesti loogiline lahendus on koodi lisamine.<\/p>\n<p>Caching LRU lahendab k\u00f5ik meie probleemid. Mida me teeme?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/2bd0c88a97d928f386db21549fc02500.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe lisame meie suure salvestusklastri ette veel \u00fche suhteliselt v\u00e4ikese, mida nimetatakse fotokettaks (photoscache). See on sisuliselt lihtsalt vahem\u00e4lu proks.<\/p>\n<p>Kuidas see seestpoolt t\u00f6\u00f6tab? See on kasutaja, see on salvestus. K\u00f5ik nagu varem. Mida me nende vahele lisame?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7b7b5f102f1c012b2aef8f02ec731fac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on lihtsalt masin koos kiire f\u00fc\u00fcsilise kohaliku kettaga. See on SSD, n\u00e4iteks. Ja sellel kettal hoitakse mingit kohalikku vahem\u00e4lu.<\/p>\n<p>Kuidas see v\u00e4lja n\u00e4eb? Kasutaja saadab p\u00e4ringu foto saamiseks. NGINX otsib seda esmalt kohalikust vahem\u00e4lust. Kui ei, siis teeb lihtsalt proxy_pass meie salvestusele, laadib foto sealt alla ja annab selle kasutajale.<\/p>\n<p>Aga see on v\u00e4ga lihtne ja arusaamatu, mis seestpoolt toimub. See t\u00f6\u00f6tab umbes nii.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/46be24df171d1008e2a9099b7e4c9be6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVahem\u00e4lu on loogiliselt jagatud kolmeks tasemeks. Kui ma \u00fctlen \"kolm taset\", ei t\u00e4henda see, et seal on mingi keeruline s\u00fcsteem. Ei, seal on tinglikult lihtsalt kolm katalooge failis\u00fcsteemis:<\/p>\n<ol>\n<li>See on puhversalvestus, kuhu satuvad just proksist alla laaditud fotod.<\/li>\n<li>See on kuum vahem\u00e4lu, kus hoitakse aktiivselt hinnatud fotosid.<\/li>\n<li>Ja k\u00fclm vahem\u00e4lu, kuhu j\u00e4rk-j\u00e4rgult t\u00f5ukatakse fotosid kuumast vahem\u00e4lust, kui neile j\u00f5uab v\u00e4hem p\u00e4ringuid.<\/li>\n<\/ol>\n<p>\nKuna see t\u00f6\u00f6tab, peame kuidagi seda vahem\u00e4lu haldama, peame fotosid seal ringi liigutama jne. See on samuti v\u00e4ga primitiivne protsess.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/9b16fe3e99a5f88f06169f6e5eedf2b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNginx kirjutab iga p\u00e4ringu kohta RAMDiskile access.log, kus ta m\u00e4rgib tee fotoni, mida ta hetkel teenindab (ilma kahteta, suhteline tee) ja samuti selle, millise osaga see teenindati. N\u00e4iteks v\u00f5ib seal olla kirjas \"foto 1\" ning edasi on v\u00f5i siis vahem\u00e4lu, kuum vahem\u00e4lu, k\u00fclm vahem\u00e4lu v\u00f5i proxy.<\/p>\n<p>S\u00f5ltuvalt sellest peame kuidagi otsustama, mida fotoga teha.<\/p>\n<p>Igal masinal t\u00f6\u00f6tab v\u00e4ike daemon, mis pidevalt loeb seda logi ja hoiab oma m\u00e4lus statistikat kasutatud fotode kohta.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0dceda5e5ff432d1609520f0c152f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee lihtsalt kogub andmeid, juhib loendureid ja perioodiliselt teeb j\u00e4rgmist: aktiivselt k\u00fcsitavaid fotosid, millele tuleb palju p\u00e4ringuid, t\u00f5ukab ta kuuma vahem\u00e4llu, kus nad ka ei asu.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/941c13ecfea88372f3a7eb62d81b0c4e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFotod, mida k\u00fcsitakse harva ja mis on muutunud veel harvemaks, t\u00f5ukab ta tasapisi k\u00fclma vahem\u00e4lust v\u00e4lja.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/a07235246995ad2fa4e6aeccae23a629.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa kui meie vahem\u00e4lus ei ole enam ruumi, hakkame lihtsalt k\u00fclmast vahem\u00e4lust k\u00f5ike segamatult kustutama. Ja see t\u00f6\u00f6tab muide v\u00e4ga h\u00e4sti.<\/p>\n<p>Kuna foto salvestatakse kohe vahem\u00e4llu proxy'imise ajal, kasutame direktiivi proxy_store ja vahem\u00e4lu \u2014 see on samuti RAMDisk, nii et kasutaja jaoks t\u00f6\u00f6tab see v\u00e4ga kiiresti. See, mis puudutab t\u00f5eliselt vahem\u00e4lu serveri sisemust.<\/p>\n<p>K\u00fcsimus on j\u00e4\u00e4nud, kuidas hajutada p\u00e4ringuid nende serverite vahel.<\/p>\n<p>Oletame, et meil on kaheksateist storage-masinat ja kolm vahem\u00e4lu serverit (nii juhtub).<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 \u2014 see on Round Robin. V\u00f5i teha seda juhuslikult?<\/p>\n<p>Ilmselgelt on sel olnud mitmeid puudusi, kuna sellises olukorras ei kasutataks vahem\u00e4lu efektiivselt. P\u00e4ringud maanduvad juhuslikel masinatel: siin on see vahem\u00e4lus, aga naaber masinas ei ole seda. Ja see k\u00f5ik t\u00f6\u00f6tab kui t\u00f6\u00f6tab, siis v\u00e4ga halvasti. Isegi v\u00e4ikese masinate arvu puhul klastris.<\/p>\n<p>Peame leidma m\u00f5ne viisi, kuidas \u00fchem\u00f5tteliselt m\u00e4\u00e4rata, millisele serverile suunata \u00fcks v\u00f5i teine p\u00e4ring.<\/p>\n<p>On \u00fcks lihtne viis. Me v\u00f5tame URL'ist hash'i v\u00f5i meie jagamisv\u00f5tme hash'i, mis on URL'is, ja jagame selle tervikuna serverite arvuga. Kas see t\u00f6\u00f6tab? Jah.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/794a82ac1268b651ab936f0225b802a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSt me ei tingimata identifitseerime p\u00e4ringu, n\u00e4iteks m\u00f5ne \"example_url\", alati maandub serveris, mille indeks on \"2\", ja vahem\u00e4lu kasutatakse pidevalt paremini.<\/p>\n<p>Kuid sellises skeemis tekib probleem uuesti jagamisega. Uuesti jagamine \u2014 ma m\u00f5tlen serverite arvu muutmist.<\/p>\n<p>Oletame, et meie vahem\u00e4lu klaster ei suutnud enam hakkama saada ja otsustasime lisada \u00fche masina.<\/p>\n<p>Lisa.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/5f2fcba4c4f267c069811c3677bd0213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeil on n\u00fc\u00fcd kogu see jaotamine mitte enam kolmek\u00fcmnele, vaid neljale. Nii et praktiliselt k\u00f5ik meie v\u00f5tmed, mis me varem olime, praktiliselt k\u00f5ik URL'id elavad n\u00fc\u00fcd teistes serverites. Kogu vahem\u00e4lu kehtetuks, lihtsalt hetkega. K\u00f5ik p\u00e4ringud jooksid meie klastrisse-storage, see hakkas halvasti t\u00f6\u00f6tama ja rahulolematud kasutajad. Seda ei soovi me teha.<\/p>\n<p>See variant ei sobi meile samuti.<\/p>\n<p>Nii et mida me peame tegema? Peame leidma viisi, kuidas t\u00f5husalt kasutada vahem\u00e4lu, pidevalt suunama \u00fche p\u00e4ringu sama serveri suunas, kuid samas olema uuesti jagamisele vastupidavad. Ja selline lahendus on olemas, see pole just keeruline. Seda kutsutakse pidevaks hashimiseks.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/1380758686274df9755a7ebf7d1c8753.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKuidas see v\u00e4lja n\u00e4eb?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/44f97abfac46fa9f361055548819e8a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe v\u00f5tame mingisuguse funktsiooni jagamisv\u00f5tmest ja jagame k\u00f5ik selle v\u00e4\u00e4rtused ringil. St punktis 0 on meil nende minimaalsed ja maksimaalsed v\u00e4\u00e4rtused. J\u00e4tkame ringil k\u00f5igi meie serverite paigutamisega umbes selliselt:<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d470ec615a789913a6baa2726b05acea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIga server m\u00e4\u00e4ratakse \u00fche punktiga, ja see sektor, mis kulgeb kellaosuti suunas kuni temani, teenindatakse vastavalt sellele hostile. Kui meile tulevad p\u00e4ringud, n\u00e4eme kohe, et n\u00e4iteks p\u00e4ring A \u2014 selle hash on selline \u2014 ja selle teenindab server 2. P\u00e4ring B \u2014 serveri 3. Ja nii edasi.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/fcdbd1caa9f1162cf02e8b0a1c79cb74.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMis toimub sel juhul uuesti jagamisel?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7386cda826e9419d5f8a9a0d6d6703c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe ei kehtesta kogu vahem\u00e4lu, nagu varem, ja ei nihuta k\u00f5iki v\u00f5tmeid, vaid nihutame iga sektori v\u00e4ikese vahemaa v\u00f5rra, et vabasse ruumi, tinglikult \u00f6eldes, mahuks meie kuues server, mille tahame lisada, ja lisame selle sinna.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8680e0cf023ce911b4d162e9102c0545.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMuidugi, sellises olukorras v\u00f5tmed nihkuvad samuti. Kuid nad nihkuvad palju v\u00e4hem kui varem. Ja me n\u00e4eme, et meie esimesed kaks v\u00f5tmed on j\u00e4\u00e4nud oma serverites, ja ainult viimane v\u00f5tme jaoks on server vahem\u00e4llu muutunud. See t\u00f6\u00f6tab \u00fcsna t\u00f5husalt, ja kui te lisate uusi hoste j\u00e4rk-j\u00e4rgult, siis pole siin suurt probleemi. Lisage j\u00e4rk-j\u00e4rgult, oodake, kuni vahem\u00e4lu uuesti t\u00e4itub ja k\u00f5ik t\u00f6\u00f6tab h\u00e4sti.<\/p>\n<p>Ainult \u00fcks k\u00fcsimus j\u00e4\u00e4b alles, kui tegemist on riketega. Oletame, et meil on mingisugune masin rikki l\u00e4inud.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8e3301af782ce8983716c4bc9add79a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa me ei tahaks selles olukorras kaarti \u00fcmber genereerida, t\u00fchistada osa vahem\u00e4lust jne, kui n\u00e4iteks masin on taask\u00e4ivitatud ja meil on mingil moel vaja teenindada p\u00e4ringuid. Me hoiame lihtsalt igas asukohas \u00fcht varukoopiat, mis toimib asendajana igasugusele masinale, mis on hetkel rikki l\u00e4inud. Ja kui m\u00f5ni meie server mingil hetkel muutub k\u00e4ttesaamatuks, liigub liiklus sinna. Meil ei ole seal loomulikult mingit vahem\u00e4lu, see on k\u00fclm, aga v\u00e4hemalt t\u00f6\u00f6tavad kasutajate p\u00e4ringud. Kui see on l\u00fchike intervall, siis me saame selle t\u00e4iesti rahulikult \u00fcle elada. Lihtsalt suureneb koormus salvestusele. Kui intervall on pikk, saame juba otsustada \u2014 kas eemaldada see server kaardilt v\u00f5i mitte, v\u00f5i \u00e4kki asendada see millegi muuga.<\/p>\n<p>See oli vahem\u00e4lus\u00fcsteemi kohta. Vaadakem tulemusi.<\/p>\n<p>Tundub, et siin pole midagi keerulist. Kuid selline l\u00e4henemine vahem\u00e4lu haldamisele andis meile umbes 98% hitrate'i. See t\u00e4hendab, et neist 80 000 p\u00e4ringust sekundis j\u00f5uab ainult 1600 salvestustele, ja see on t\u00e4iesti normaalne koormus, nad taluvad seda rahulikult, meil on alati varu.<\/p>\n<p>Me paigutasime need serverid kolmes meie andmekeskuses ja saime kolm kohaloleku punkti \u2014 Praha, Miami ja Hongkong.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/64eef492b65a014d8ba3c808b6579b41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii on nad enam-v\u00e4hem paiknenud iga\u00fche meie sihtturgude l\u00e4hedal.<\/p>\n<p>Ja meeldiva boonuse osana saime selle vahem\u00e4luproxy, mille CPU on tegelikult throughout, kuna sisu edastamiseks ei ole see nii vajalik. Ja seal oleme NGINX+ Lua abil rakendanud palju utiliitide loogikat.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b65c609df5e1985240d04ee65a3e4f55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4iteks saame katsetada webp v\u00f5i progressive jpeg (need on t\u00f5husad kaasaegsed formaadid), vaadata, kuidas see m\u00f5jutab liiklust, teha mingeid otsuseid, lubada teatud riikides jne; teha d\u00fcnaamilist suuruse muutmist v\u00f5i fotosid k\u00e4rpida reaalajas.<\/p>\n<p>See on hea kasutusjuht, n\u00e4iteks kui teil on mobiilirakendus, mis kuvab fotosid, ja mobiilirakendus ei soovi klientide CPU-d raisata, et k\u00fcsida suurt fotot ja seej\u00e4rel selle suurust v\u00e4hendada, et see mahtuda vaateaknasse. Saame lihtsalt d\u00fcnaamiliselt URL-is m\u00e4\u00e4rata m\u00f5ningaid parameetreid ja fotovahem\u00e4lu k\u00e4rbib foto ise. T\u00fc\u00fcpiliselt valib see suuruse, mis meil f\u00fc\u00fcsiliselt kettal on, maksimaalselt l\u00e4hedase taotletavale, ja skaleerib selle konkreetsetes koordinaatides.<\/p>\n<blockquote><p>Muide, oleme teinud viimaste viie aasta arendajate konverentside videosalvestused avalikuks. <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 sinna lisada palju tooteloogikat. N\u00e4iteks saame URL parameetrite p\u00f5hjal lisada erinevaid vesim\u00e4rke, saame fotosid uduseks muuta, udune v\u00f5i piksliline. See on siis, kui soovime n\u00e4idata inimese fotot, kuid mitte n\u00e4idata tema n\u00e4gu, see t\u00f6\u00f6tab h\u00e4sti, k\u00f5ik on siin realiseeritud.<\/p>\n<p>Mida me saavutasime? Saime kolm kohaloleku punkti, hea hitrate, ja samal ajal ei seisa CPU nende masinate peal. See on n\u00fc\u00fcd kindlasti olulisem kui varem. Me peame panema endale v\u00f5imsamad masinad, aga see on seda v\u00e4\u00e4rt.<\/p>\n<p>See on see, mis puudutab fotode edastamist. Siin on k\u00f5ik piisavalt selge ja ilmselge. Arvan, et ei ole avanud Ameerikat, nii t\u00f6\u00f6tab praktiliselt iga CDN.<\/p>\n<p>Ja t\u00f5en\u00e4oliselt v\u00f5iks kogenud kuulajal tekkida k\u00fcsimus: miks mitte lihtsalt v\u00f5tta ja vahetada k\u00f5ik CDN-iks? See oleks umbes sama, k\u00f5ik kaasaegsed CDNd oskavad seda. Ja siin on m\u00f5ned p\u00f5hjused.<\/p>\n<p>Esiteks \u2014 need on fotod.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/592c10eb74d46191bfcedec120f68556.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on \u00fcks meie infrastruktuuri v\u00f5tmeelemente, ja meil on vaja nende \u00fcle v\u00f5imalikult palju kontrolli. Kui see on mingisugune lahendus kolmandalt osapoolelt, ja teil ei ole selle \u00fcle mingit v\u00f5imu, on teiega sellel rasket elada, kui teil on suur andmestik ja v\u00e4ga suur kasutajate p\u00e4ringute voog.<\/p>\n<p>Toodan n\u00e4ite. Praegu oma infrastruktuuris saame n\u00e4iteks, kui tekivad mingid probleemid v\u00f5i maapinna helid, minna masinasse ja seal vigade parandust teha, nii-\u00f6elda. Saame lisada kogumise teatud meetrikatest, mis on vaid meile olulised, ning katsetada, vaadata, kuidas see graafikutele m\u00f5jub jne. Praegu kogutakse selle vahem\u00e4lu klastriga palju statistikat. Ja me vaatame seda perioodiliselt ning uurime p\u00f5hjalikult teatud anomaaliaid. Kui see oleks CDN-i poolel, oleks palju raskem kontrollida. V\u00f5i n\u00e4iteks, kui juhtub mingi avarii, teame, mida teha, teame, kuidas sellega toime tulla ja seda \u00fcletada. See on esimene j\u00e4reldus.<\/p>\n<p>Teine j\u00e4reldus on pigem ajalooline, kuna s\u00fcsteem on juba pikka aega arenenud ja erinevaid \u00e4rin\u00f5udeid on olnud erinevatel etappidel, ning need ei mahu alati CDN-i kontseptsiooni.<\/p>\n<p>Ja punkt, mis tuleneb eelmisest \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/007cf3aed2f9cc12185fc3865bf9d196.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee, et meie fotov\u00e4cache'ides on palju spetsiifilist loogikat, mida ei saa alati lisada soovi korral. V\u00e4hesed CDN-id lisaksid teie palve peale mingeid kohandusi. N\u00e4iteks URL-ide kr\u00fcpteerimine, kui te ei soovi, et klient saaks midagi muuta. Soovite muuta URL-i serveris ja kr\u00fcpteerida selle ning seej\u00e4rel edastada mingeid d\u00fcnaamilisi parameetreid.<\/p>\n<p>Kumb j\u00e4reldus toob? Meie puhul ei ole CDN v\u00e4ga hea alternatiiv.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/cfc2963cca2357cf6b0f63419a4dc436.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeie puhul, kui teil on spetsiifilised \u00e4rin\u00f5uded, saate t\u00e4iesti rahulikult ellu viia seda, mida ma teile n\u00e4itasin. Ja see t\u00f6\u00f6tab suurep\u00e4raselt sarnaste koormusprofiilide korral.<\/p>\n<p>Aga kui teil on mingi \u00fcldine lahendus ja probleem ei ole v\u00e4ga eriline, v\u00f5ite t\u00e4iesti rahulikult valida CDN-i. V\u00f5i kui teie jaoks on piiratud aeg ja ressursid t\u00e4htsamad kui kontroll.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b76d25404918a5d0d8bf1d6644c8d873.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa kaasaegsed CDN-id omavad praktiliselt k\u00f5ike seda, millest ma teile praegu r\u00e4\u00e4kisin. V.a m\u00f5ned funktsioonid.<\/p>\n<p>See oli r\u00e4\u00e4kides piltide edastamisest.<\/p>\n<p>Liigume n\u00fc\u00fcd natuke edasi meie retrospektiivis ja r\u00e4\u00e4gime ladustamisest.<\/p>\n<p>Aasta 2013.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f218bfc899512041967842430c02aa9b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVahem\u00e4lu serverid on lisandunud, j\u00f5udlusprobleemid on kadunud. K\u00f5ik on h\u00e4sti. Dataset kasvab. 2013. aastal oli meil umbes 80 serverit, mis olid \u00fchendatud salvestusseadmetega, ja umbes 40 vahem\u00e4lu igas D\u0421-s. See on 560 terabaiti andmeid igas D\u0421-s, st kokku umbes petabait.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/ef741ba4a9164e6940f55e93dfb46ef0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJa koos dataset'i kasvuga hakkasid operatsioonikulud t\u00f5siselt kasvama. Milles see v\u00e4ljendus?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/6cf5e489a4e97bc6e26fc6d4d16505b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSelles skeemis, mis on joonistatud - SAN-iga, selle juurde \u00fchendatud masinate ja vahem\u00e4ludega - on v\u00e4ga palju rikkeid. Kui me juba leppisime kokku vahem\u00e4lu serverite riketega, seal on k\u00f5ik enam-v\u00e4hem ennustatav ja arusaadav, siis salvestusseadmest oli olukord palju halvem.<\/p>\n<p>Esiteks, ise Storage Area Network (SAN), mis v\u00f5ib eba\u00f5nnestuda.<\/p>\n<p>Teiseks, see on \u00fchendatud optikaga l\u00f5ppmasinatega. V\u00f5ivad olla probleemid optiliste kaartide ja l\u00fclititega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/6959b79284c5b1244a70a1d64f191893.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNende hulk, muidugi, ei ole nii suur kui SAN-i enda puhul, kuid siiski on need ka rikke kohad.<\/p>\n<p>J\u00e4rgmine, masin, mis on \u00fchendatud salvestusseadmega. Ka see v\u00f5ib eba\u00f5nnestuda.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/1801cb502663a4de14329a5e67dfed79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega on meil kolm rikke kohta.<\/p>\n<p>Lisaks rikke kohtadele on ka salvestusseadmete keeruline hooldus.<\/p>\n<p>See on keeruline koostisosade s\u00fcsteem, ja s\u00fcsteeminseneridel on selle haldamine keeruline.<\/p>\n<p>Ja viimane, k\u00f5ige olulisem punkt. Kui mis tahes kolmandas punktis juhtub rike, on meil olemas mitte-null t\u00f5en\u00e4osus kaotada kasutajaandmeid, kuna failis\u00fcsteem v\u00f5ib kahjustuda.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/4bf8bc1c73a2beef74cb4ee0ee45679b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOletame, et meil on failis\u00fcsteem kahjustunud. Selle taastamine v\u00f5tab aega, eeskujuks, v\u00f5ib see kesta n\u00e4dal aega suure andmemahtude puhul. Ja teiseks, l\u00f5ppkokkuv\u00f5ttes saame t\u00f5en\u00e4oliselt palju arusaamatuid faile, mida tuleb kasutajate piltidega mingil moel kokku sobitada. Ja me riskime andmete kaotamisega. Risk on piisavalt k\u00f5rge. Ja mida sagedamini sellised olukorrad juhtuvad, ja mida rohkem probleeme kogu selles ahelas tekib, seda suurem on see risk.<\/p>\n<p>Sellega pidi midagi tegema. Otsustasime, et peame lihtsalt andmed varundama. See on tegelikult ilmne ja hea lahendus. Mida me tegime?<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f80ec2b65003c40bd2fabf88966b3e05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNii v\u00e4lja n\u00e4gi meie server, mis oli varem \u00fchendatud salvestusseadmega. See oli \u00fcks peamine partitsioon, see on lihtsalt blokiseade, mis t\u00f5eliselt esindab kaugel asuvat salvestusseadet optiliselt.<\/p>\n<p>Lihtsalt lisasime teise partitsiooni.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/d3dba75ef477269d92145cd69d587527.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe installisime k\u00f5rvale teise salvestusseadme (\u00f5nneks ei ole see rahaliselt v\u00e4ga kallis) ja nimetasime selle varukoopia partitsiooniks. See on samuti \u00fchendatud optikaga, sama masin on seal. Kuid peame nende andmeid mingil moel s\u00fcnkroonima.<\/p>\n<p>Siin teeme lihtsalt k\u00f5rval as\u00fcnkroonse j\u00e4rjekorra.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 \u0437\u0430\u043f\u0438\u0441\u0438. Ootej\u00e4rjekord on lihtsalt tabel MySQLis, kuhu kirjutatakse read, nagu \u201eon vaja varundada see foto\u201c. Iga muudatuse v\u00f5i \u00fcleslaadimise korral kopeerime p\u00f5hiosast varundusse as\u00fcnkroonselt v\u00f5i lihtsalt mingi taustat\u00f6\u00f6taja abil.<\/p>\n<p>Nii saame alati kaks konsistentset osa. Isegi kui \u00fcks osa sellest s\u00fcsteemist t\u00f5rkub, saame alati vahetada p\u00f5hiosa varunduse vastu ja k\u00f5ik t\u00f6\u00f6tab j\u00e4tkuvalt.<\/p>\n<p>Kuid seet\u00f5ttu suureneb oluliselt lugemise koormus, kuna lisaks klientidele, kes loevad p\u00f5hiosast, sest nad vaatavad esialgu fotot seal (see on ju ajakohasem), otsivad nad varundusest, kui nad ei leia (aga selle teeb lihtsalt NGINX), meie varunduss\u00fcsteem loevad n\u00fc\u00fcd samuti p\u00f5hiosast. See ei olnud just kitsaskoht, kuid ei tahtnud koormust lihtsalt niisama suurendada.<\/p>\n<p>Lisame kolmanda ketta, mis on v\u00e4ike SSD, ja nimetame selle puhvriuks.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 puhvri, seej\u00e4rel saadetakse s\u00fcndmus ootej\u00e4rjekorda, et see tuleb kopeerida kahte ossa. See kopeeritakse, ja foto elab mingi aja (\u00fctleme, p\u00e4eva) puhvris ning alles siis see kustutatakse. See parandab kasutajakogemust, kuna kasutaja laadib foto ja tavaliselt saadetakse selle j\u00e4rele kohe p\u00e4ringud, v\u00f5i ta ise uuendab lehte, v\u00e4rskendab seda. Kuid see s\u00f5ltub rakendusest, mis \u00fcleslaadimist teeb.<\/p>\n<p>V\u00f5i n\u00e4iteks teised inimesed, kellele ta on hakanud fotot n\u00e4itama, saadavad kohe sellele foto j\u00e4rele p\u00e4ringud. Vahem\u00e4lus seda veel ei ole, esimene p\u00e4ring toimub v\u00e4ga kiiresti. P\u00f5him\u00f5tteliselt sama nagu fotovahem\u00e4el. Aeglane salvestus ei osale \u00fcldse selles. Ja kui see p\u00e4ev hiljem kustutatakse, on see juba kas meie vahem\u00e4lus v\u00f5i on t\u00f5en\u00e4oliselt enam kellelegi vajalik. See t\u00e4hendab, et kasutajakogemus on oluliselt paranenud selliste lihtsate manipulatsioonide t\u00f5ttu.<\/p>\n<p>Noh, ja k\u00f5ige olulisem: me oleme l\u00f5petanud andmete kadumise.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/526f549457dd0c438f32b0adb76df76c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe, \u00fctleme nii, l\u00f5petasime <em>potentsiaalset<\/em> andmete kaotamise, sest me ei kaotanud neid tegelikult. Kuid oht oli olemas. N\u00e4eme, et selline lahendus on kindlasti hea, kuid see meenutab veidi s\u00fcmptomeid, mitte l\u00f5plikku probleemi lahendamist. Ja teatud probleemid on endiselt olemas.<\/p>\n<p>Esiteks, see on t\u00f5rke koht f\u00fc\u00fcsilise hosti kujul, millel kogu see masin t\u00f6\u00f6tab, see ei ole kuhugi kadunud.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0eb3d292655a7edf912793ed81e8931c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTeiseks, olid mured SANidega, j\u00e4i \u00fcle nende keeruline hooldamine jne. See ei olnud just kriitiline tegur, kuid tahtsime proovida, kuidas \u00e4ra elada ilma selleta.<\/p>\n<p>Ja me tegime kolmanda versiooni (p\u00f5him\u00f5tteliselt teise t\u00f5eliselt) \u2014 varundusversioon. Kuidas see v\u00e4lja n\u00e4gi?<\/p>\n<p>See, mis oli \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/8b1749b6feed200f8a64529ee2316c1a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeie p\u00f5hiprobleem on see, et see on f\u00fc\u00fcsiline host.<\/p>\n<p>Esiteks, me eemaldame SANid, sest tahame eksperimenteerida, tahame proovida lihtsalt kohalikke k\u00f5vakettasid.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/fd0f5a8627d9179fcbc7097c1c18505f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on juba 2014-2015 aasta, ja sel ajal oli olukord ketaste ja nende mahutavuse osas \u00fches hostis palju parem. Me otsustasime, miks mitte proovida.<\/p>\n<p>Ja seej\u00e4rel v\u00f5tame lihtsalt meie varundusosa ja liigutame selle f\u00fc\u00fcsiliselt eraldi masinasse.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 masinat, mis hoiavad samu andmebaase. Need varundavad teineteist t\u00e4ielikult ja s\u00fcnkroniseerivad andmeid \u00fcle v\u00f5rgu as\u00fcnkroonses j\u00e4rjekorras samas MySQLis.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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, on see, et meil on v\u00e4he \u0437\u0430\u043f\u0438\u0441\u0438. Kui \u0437\u0430\u043f\u0438\u0441\u0438 oleks sama suur kui lugemine, v\u00f5ib-olla oleksime saanud mingit v\u00f5rgu \u00fclekoormust ja probleeme. \u0437\u0430\u043f\u0438\u0441\u044b on v\u00e4he, lugemisi palju \u2014 see meetod t\u00f6\u00f6tab h\u00e4sti, see t\u00e4hendab, et me kopeerime fotosid m\u00f5lema serveri vahel piisavalt harva.<\/p>\n<p>Kuidas see t\u00f6\u00f6tab, kui vaadata pisut l\u00e4hemalt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/071c11abb6ee1d7734c53052139ff04b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dcleslaadimine. Koormuste tasandaja valib lihtsalt juhuslikud hostid paaris ja teeb \u00fcleslaadimise. Samal ajal teeb ta loomulikult tervisekontrolle, et vaadata, et masin ei oleks v\u00e4lja langenud. See t\u00e4hendab, et ta laadib fotosid ainult elavale serverile, ja siis kopeeritakse see k\u00f5ik as\u00fcnkroonses j\u00e4rjekorras tema naabri juurde. \u00dcleslaadimisega on k\u00f5ik \u00fclimalt lihtne.<\/p>\n<p>K\u00fcsimus on veidi keerulisem.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f494904aec823456e18b987a8c98bf56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSiin aitas meid Lua, sest puhtal NGINXil on sellise loogika tegemine keeruline. Esiteks teeme p\u00e4ringu esimeses serveris, vaatame, kas foto on seal, sest see v\u00f5ib olla n\u00e4iteks naabri juurde \u00fcles laaditud, kuid siia pole veel j\u00f5udnud. Kui foto on seal, on see hea. Anname selle kohe kliendile ja v\u00f5ib-olla vahem\u00e4lust.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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 saame selle sealt garanteeritult.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/79aa5592acd28dfbc815261d0276c2e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSeega, v\u00f5ib j\u00e4lle \u00f6elda: v\u00f5ivad olla probleemid j\u00f5udlusega, sest pidevad round trip'id \u2014 pildi \u00fcleslaadimine, seda pole, teeme kaks p\u00e4ringut \u00fche asemel, see peaks aeglaselt t\u00f6\u00f6tama.<\/p>\n<p>Meie olukorras see ei t\u00f6\u00f6ta aeglaselt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/52ca3902d80990f512201672cd5e6441.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMeil koguneb selle s\u00fcsteemi j\u00e4rgi palju m\u00f5\u00f5dikuid, ja selle mehhanismi tinglik hitrate on umbes 95%. Seega, selle backup'i viivitus on v\u00e4ike ja t\u00e4nu sellele saame p\u00e4rast pildi \u00fcleslaadimist selle esmakordselt k\u00e4tte ja ei pea kahel korral minema.<\/p>\n<p>Seega, mida me veel saime, ja mis on v\u00e4ga \u00e4ge?<\/p>\n<p>Varem olid meil peamised backup-ossad, ja me lugesime neid j\u00e4rjestikku. St, et me otsisime alati esmalt peamisest ja seej\u00e4rel backup'ist. See oli \u00fcks k\u00e4ik.<\/p>\n<p>N\u00fc\u00fcd kasutame kahe masina samaaegset lugemist. Jagame p\u00e4ringud Round Robin'i meetsodil. V\u00e4ikeses protsendis juhtumitel teeme kaks p\u00e4ringut. Kuid igal juhul on meil n\u00fc\u00fcd kahekordne lugemisruum v\u00f5rreldes varasema olukorraga. Ning koormus on t\u00f5eliselt v\u00e4henenud nii teenindavatel masinatel kui ka salvestustel, mis meil sel ajal samuti olid.<\/p>\n<p>Mis puudutab t\u00f5rkev\u00f5imet. Selle nimel me p\u00f5hiliselt t\u00f6\u00f6tasime. T\u00f5rkev\u00f5ime on siin suurep\u00e4raselt toimiv.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/a030a477e60d6e1f3d0b4e3395013df5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dcks masin l\u00e4heb rikki.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/42900b24e340c03ea642fd49f5b410ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEi mingit probleemi! S\u00fcsteemitehnik ei pea isegi \u00f6\u00f6sel \u00e4rkama, ta kannatab hommikuni, ei juhtu midagi halba.<\/p>\n<p>Isegi kui selle masina rikki minekul tekib j\u00e4rjekord, pole mingeid probleeme, lihtsalt logi hakkab kogunema esmalt elavale masinale ja seej\u00e4rel j\u00f5uab juba j\u00e4rjekorda, ja hiljem masinasse, mis naaseb teenistusse mingil hetkel.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise 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, eemaldame selle k\u00e4sitsi k\u00f5igist r\u00fchmades, sellele ei suunata enam liiklust, teeme mingit hooldust, korrigeerime midagi, ja p\u00e4rast seda suuname ta tagasi teenistusse, ning see backup j\u00f5uab kiiresti kohale. St, et \u00fche masina seisakuaeg tagatakse kuskil paariks minutiks. See on t\u00f5eliselt v\u00e4ike. T\u00f5rkev\u00f5ime osas, veelkord \u00fctlen, et siin on k\u00f5ik suurep\u00e4rane.<\/p>\n<p>Milliseid j\u00e4reldusi me saame selle reservohje skeemi p\u00f5hjal teha?<\/p>\n<p>Saime t\u00f5rkev\u00f5ime.<\/p>\n<p>Lihtne kasutamine. Kuna masinatel on kohalikud k\u00f5vakettad, on see inseneride t\u00f6\u00f6tamiseks palju mugavam.<\/p>\n<p>Saime kahekordse lugemisruumi varu.<\/p>\n<p>See on t\u00f5eliselt hea boonus t\u00f5rkev\u00f5ime t\u00e4ienduseks.<\/p>\n<p>Aga on ka probleeme. N\u00fc\u00fcd on meil palju keerulisem arendada funktsioone, mis sellega seonduvad, sest s\u00fcsteem on muutunud 100% l\u00f5puks j\u00e4rjepidevaks.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/b650276a41730cc303180e8304c5dabb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe peame n\u00e4iteks mingisuguses taustat\u00f6\u00f6s pidevalt m\u00f5tlema: \"Millisel serveril me n\u00fc\u00fcd t\u00f6\u00f6tame?\", \"Kas siin on kindlasti ajakohane pilt?\" jne. Loomulikult on see k\u00f5ik kotitud \u00fcmber erinevatesse kihtidesse, ja programmeerijale, kes kirjutab \u00e4riloogikat, on see l\u00e4bipaistav. Kuid sellegipoolest on see suur keeruline kiht tekinud. Kuid me oleme valmis sellega leppima vastutasuks nende eeliste eest, mida me sellega saime.<\/p>\n<p>Ja siin tekib j\u00e4lle teatud konflikt.<\/p>\n<p>Ma \u00fctlesin alguses, et k\u00f5ik kohalike k\u00f5vaketaste hoidmine on halb. Ja n\u00fc\u00fcd \u00fctlen, et see meeldib meile.<\/p>\n<p>Jah, t\u00f5epoolest, aja jooksul on olukord palju muutunud ja n\u00fc\u00fcd on selle l\u00e4henemisega palju eeliseid. Esiteks saame me palju lihtsamat kasutust.<\/p>\n<p>Teiseks on see t\u00f5husam, kuna meil pole neid automaatseid kontrollerid, mis on \u00fchendatud ketas\u00fcsteemidega.<\/p>\n<p>Seal on tohutu masinav\u00e4rk, kuid need on lihtsalt m\u00f5ned kettad, mis on siin konkreetselt masinas RAID'is kokku pandud.<\/p>\n<p>Aga on ka puudusi.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/3c090e0801f1a686dc0d5fefce697c56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSee on umbes 1,5 korda kallim kui SAN'ide kasutamine isegi t\u00e4naste hindadega. Seet\u00f5ttu me ei otsustanud kogu meie suurt klastrit julgelt konverteerida kohalike k\u00f5vaketaste masinateks ja otsustasime j\u00e4tta h\u00fcbriidlahenduse.<\/p>\n<p>Pool masinatest t\u00f6\u00f6tab k\u00f5vaketastega (noh, mitte pool \u2013 t\u00f5en\u00e4oliselt umbes 30%). Ja \u00fclej\u00e4\u00e4nud osa on vanad masinad, millel oli varem esimene reservohje skeem. Me lihtsalt remondime neid, kuna me ei vaja uusi andmeid ega midagi muud, lihtsalt liigsime mount'id \u00fchest f\u00fc\u00fcsilisest hostist kahele.<\/p>\n<p>Ja meil on suur lugemisruumi varu, ja me oleme suurendanud. Kui varem monteerisime \u00fche masina kohta \u00fche salvestuse, siis n\u00fc\u00fcd monteerime \u00fche paari kohta neli, n\u00e4iteks. Ja see t\u00f6\u00f6tab normaalselt.<\/p>\n<p>Kokkuv\u00f5ttes, mis meil siin on, millega me tegelesime, ja kas see meil \u00f5nnestus.<\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\nMeil on kasutajaid \u2014 kokku 33 miljonit.<\/p>\n<p>Meil on kolm kohaloleku punkti \u2014 Praha, Miami, Hongkong.<\/p>\n<p>Neis on vahem\u00e4lu kiht, mis koosneb kiiretest lokaalsetest ketastest (SSD), mille peal t\u00f6\u00f6tab kerge masinav\u00e4rk NGINX, tema access.log ja Pythonis jooksvaid deemonid, mis seda k\u00f5ike t\u00f6\u00f6tlevad ja haldavad.<\/p>\n<p>Kui soovite, saate oma projektis, kui fotode kvaliteet ei ole teie jaoks nii kriitiline nagu meil, v\u00f5i kui teete kompromissi kontrolli ja arendamise kiirusest ning ressursside kuludest, siis v\u00f5ite rahulikult asendada selle CDN-iga, t\u00e4nap\u00e4eva CDN-d teevad seda h\u00e4sti.<\/p>\n<p>J\u00e4rgmiseks on salvestuse kiht, kus asuvad paaride klastrid, mis \u00fcksteist varundavad, as\u00fcnkroonselt kopeerivad faile \u00fchest teise mistahes muudatuse korral.<\/p>\n<p>Samuti toimib osa neist masinatest lokaalsete k\u00f5vakettadega.<\/p>\n<p>Osa nendest masinatest on \u00fchendatud SAN-idega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/5ddbc4f73d86aa1f83734885d8c9dea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00dchel poolt on see kasutuses mugavam ja pisut tootlikum, teine \u200b\u200bpool on see tiheduse ja gigabaidi hinna poolest mugav.<\/p>\n<p>See on kiire \u00fclevaade meie arhitektuurist ja selle arengust.<\/p>\n<p>Veel m\u00f5ned n\u00f5uanded kogenud isikult, v\u00e4ga lihtsad.<\/p>\n<p>Esiteks, kui te \u00e4kki otsustate, et peate oma fotoinfrastruktuuri kiiresti parandama, siis minge esmalt m\u00f5\u00f5tke, sest v\u00f5ib-olla pole midagi paranevat.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/7770f41d0b190eb78ae0d19f4c8182a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKodaniku n\u00e4ide. Meil on masinaklaster, mis edastab fotosid vestluste manustest, ja seal t\u00f6\u00f6tab endiselt 2009. aasta skeem ning keegi ei kannata selle all. K\u00f5ik on rahul ja k\u00f5igile meeldib.<\/p>\n<p>M\u00f5\u00f5tmiseks riputage esmalt \u00fcles hulk m\u00f5\u00f5dikuid, vaadake neid ja seej\u00e4rel otsustage, mis teie arvates ei ole rahuldav, mida tuleb parandada. Selleks on meil suurep\u00e4rane t\u00f6\u00f6riist, mida nimetatakse Pinba.<\/p>\n<p>See v\u00f5imaldab koguda NGINX-i s\u00fcsteemilt v\u00e4ga detailset statistikat iga p\u00e4ringu ja vastuse koodide kohta, sealhulgas vastuste ajajaotust \u2014 k\u00f5ike, mida soovite. Sellel on sidemed erinevate anal\u00fc\u00fctiliste s\u00fcsteemidega ning saate seda k\u00f5ike kenasti vaadata.<\/p>\n<p>Esmalt m\u00f5\u00f5tsime \u2014 seej\u00e4rel parandasime.<\/p>\n<p>Edasi. Loeme me optimeerime vahem\u00e4luga, kirjutame \u2014 jagamisega, kuid see on ilmne punkt.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f53a4777f1a2c7793eba4a72c94263a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEdasi. Kui te alles hakkate oma s\u00fcsteemi \u00fcles ehitama, siis on palju parem teha fotod mitte-muutuvate failidena. Nii kaotate kohe terve klassi probleeme vahem\u00e4lu t\u00fchistamisega, kuidas loogika peab leidma \u00f5ige versiooni fotost jne.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/f345c59681275326cda1320b4f188ce9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOletame, et laadisite \u00fcles sada, p\u00e4rast seda p\u00f6\u00f6rate selle \u00fcmber, saate teha seda nii, et see oleks f\u00fc\u00fcsiliselt teine fail. Ei ole vaja m\u00f5elda: praegu s\u00e4\u00e4stan ma natuke ruumi, salvestan sama faili, muudan versiooni. See t\u00f6\u00f6tab alati halvasti ja see toob endaga kaasa palju peavalu.<\/p>\n<p>J\u00e4rgmiseks punktiks. Kuidas pilti kohapeal muuta.<\/p>\n<p>Varem, kui kasutajad \u00fcles laadisid foto, l\u00f5ikasime me kohe v\u00e4lja mitu suurust igaks juhuks, erinevate klientide jaoks, ja need k\u00f5ik olid kettal. N\u00fc\u00fcd oleme sellest loobunud.<\/p>\n<p>Oleme j\u00e4tnud ainult kolm p\u00f5hisuurust: v\u00e4ike, keskmine ja suur. K\u00f5ik muu nende suuruste jaoks, mida me Uportis k\u00fcsime, lihtsalt v\u00e4hendame ja anname kasutajale.<\/p>\n<p>CPU vahem\u00e4lu kiht on siin tunduvalt odavam kui kui me pidevalt need suurused iga salvestuse juures uuesti genereeriksime. Oletame, et soovime lisada uue, see v\u00f5tab kuu \u2014 k\u00e4itame igal pool skripti, mis selle k\u00f5ik korralikult teeb, samas mitte klastrit maas. Seega, kui on v\u00f5imalus valida, on parem teha nii v\u00e4he f\u00fc\u00fcsilisi suurusi kui v\u00f5imalik, kuid et oleks mingisugune jaotus, \u00fctleme, et kolm. Ja k\u00f5ik muu lihtsalt muudetakse kohapeal olemasolevate moodulite abil. See on n\u00fc\u00fcd k\u00f5ik v\u00e4ga lihtne ja kergesti k\u00e4tte saadav.<\/p>\n<p>Ja inkrementaalne as\u00fcnkroonne varundamine on hea.<\/p>\n<p>Kuna meie praktika on n\u00e4idanud, toimib selline skeem suurep\u00e4raselt muudetud failide edasil\u00fckatud kopeerimisega.<\/p>\n<p><img decoding=\"async\" alt=\"Badoo piltide salvestamise ja edastamise arhitektuur\" src=\"\/wp-content\/uploads\/2020\/01\/0e550721e838654e61e1fa4d08f9bb93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nViimane punkt on samuti ilmne. Kui teie infrastruktuuris pole selliseid probleeme, kuid on midagi, mis v\u00f5ib puruneda, puruneb see kindlasti, kui sellest saab natukene rohkem. Seega on parem m\u00f5elda sellele eelnevalt ning mitte kogeda sellega seotud probleeme. Mul on 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 ettekande on \u00fche parima esitluse transkriptsioon k\u00f5rge laengu 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>. Enne HighLoad++ 2017 konverentsi 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>, kavandamine k\u00e4ib aktiivselt.<\/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 miljard kasutajat ja edastada terabiti 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 nullist \u00fcmber kirjutada VKontakte isiklike s\u00f5numite andmebaas ja migrida sellele ilma seisakuta<\/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\">L\u00f5pp m\u00fc\u00fcgiga: kuidas Yandex.Money \u00fcritas Black Friday eel hoogu saada 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\">Vastupidav arhitektuur panga frontaals\u00fcsteemis<\/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>\nM\u00f5ningaid neist materjalidest kasutame ka meie online-koolituses k\u00f5rge koormusega s\u00fcsteemide arendamise kohta <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 valitud kirjade, artiklite, materjalide ja videote ahel. Meie \u00f5pikutes on 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.0.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.0.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\udd47Badoo foto salvestamise ja jagamise 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}]}}