Arkitektur för lagring och hantering av foton pÄ Badoo

Arkitektur för lagring och hantering av foton pÄ Badoo

Artem Denisov ( bo0rsh201, Badoo)

Badoo Àr vÀrldens största dejtingsajt. För nÀrvarande har vi registrerat cirka 330 miljoner anvÀndare över hela vÀrlden. Men vad som Àr mycket viktigare i sammanhanget av vÄr diskussion idag, Àr att vi lagrar omkring 3 petabyte anvÀndarfoton. Varje dag laddar vÄra anvÀndare upp cirka 3,5 miljoner nya foton, och belastningen för lÀsning Àr omkring 80 000 förfrÄgningar per sekund. Det Àr ganska mycket för vÄr backend, och ibland uppstÄr det problem med det.

Arkitektur för lagring och hantering av foton pÄ Badoo

Jag kommer att berÀtta om designen av detta system som lagrar och levererar foton i stort, och jag kommer att ge en utvecklares perspektiv pÄ det. En kort retrospektiv om hur det har utvecklats, jag kommer att markera de viktigaste milstolparna, men jag kommer att prata mer detaljerat om de lösningar vi anvÀnder nu.

Och nu lÄt oss börja.

Spela video

Som jag redan nÀmnt, detta kommer att vara en retrospektiv, och för att börja nÄgonstans, lÄt oss ta det mest banala exemplet.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi har en allmÀn uppgift, vi behöver ta emot, lagra och leverera anvÀndarfoton. I denna form Àr uppgiften allmÀn, vi kan anvÀnda vad som helst:

  • modern molnlagring,
  • fĂ€rdiga lösningar, som det ocksĂ„ finns mĂ„nga av;
  • vi kan sĂ€tta upp flera maskiner i vĂ„rt datacenter och installera stora hĂ„rddiskar dĂ€r för att lagra foton.

Badoo har historiskt sett — och nu, liksom dĂ„ (pĂ„ den tid nĂ€r detta just hade börjat) — levt pĂ„ egna servrar, inom vĂ„ra egna datacenter. SĂ„ för oss var detta alternativ optimalt.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi tog helt enkelt nÄgra maskiner, kallade dem "photos", och vi skapade en kluster som lagrar foton. Men det verkar som om nÄgot saknas. För att allt detta ska fungera, behöver vi pÄ nÄgot sÀtt avgöra vilken maskin som ska lagra vilka foton. Och hÀr behöver vi inte uppfinna hjulet pÄ nytt.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi lÀgger till ett fÀlt i vÄrt lagringssystem med information om anvÀndarna. Det kommer att vara nyckeln för sharding. I vÄrt fall kallade vi det place_id, och den hÀr id:n för platser indikerar platsen dÀr anvÀndarfotona lagras. Vi skapar kartor.

I det första steget kan detta till och med göras manuellt — vi sĂ€ger att en anvĂ€ndares foto med en viss plats kommer att lagras pĂ„ en viss server. Tack vare denna karta vet vi alltid nĂ€r anvĂ€ndaren laddar upp en bild, var den ska sparas och vet varifrĂ„n den ska levereras.

Detta Àr en helt trivial skiss, men den har tillrÀckligt mÄnga viktiga fördelar. För det första Àr den enkel, som jag redan nÀmnt, och för det andra kan vi med en sÄdan metod enkelt skala horisontellt genom att helt enkelt leverera nya enheter och lÀgga till dem i kartan. Inget mer behöver göras.

SÄ var det under en tid för oss.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det var nÄgon gÄng runt 2009. Vi levererade enheter, vi levererade ...

Och vid en viss tidpunkt började vi mÀrka att denna plan hade vissa nackdelar. Vilka nackdelar?

Först och frÀmst Àr det den begrÀnsade kapaciteten. Vi kan inte stoppa sÄ mÄnga hÄrddiskar i en fysisk server som vi skulle vilja. Och med tiden och tillvÀxten av datasetet blev det ett visst problem.

Och för det andra. Det Àr en atypisk konfiguration av enheter, eftersom sÄdana enheter Àr svÄra att ÄteranvÀnda i andra kluster, de Àr ganska specifika, det vill sÀga de bör ha lÄg prestanda, men samtidigt ha stora hÄrddiskar.

Detta var allt Är 2009, men i princip Àr dessa krav fortfarande aktuella idag. Vi har en tillbakablick, sÄ Är 2009 var allt verkligen dÄligt pÄ detta omrÄde.

Och den sista punkten Àr priset.

Arkitektur för lagring och hantering av foton pÄ Badoo

Priset dÄ var vÀldigt högt och vi behövde leta efter alternativ. Det vill sÀga, vi behövde pÄ nÄgot sÀtt bÀttre utnyttja bÄde utrymmet i datacenter och de fysiska servrar som allt detta lagras pÄ. Och vÄra systemingenjörer inledde en omfattande studie dÀr de gick igenom en mÀngd olika alternativ. De tittade Àven pÄ klusterfilsystem som PolyCeph och Lustre. DÀr fanns det prestandaproblem och ganska komplicerad drift. De avstod. De försökte montera hela datasetet via NFS pÄ varje enhet för att pÄ sÄ vis öka skalningen. LÀsningen gick dÄligt, de prövade olika lösningar frÄn olika leverantörer.

Och till slut kom vi fram till att vi började anvÀnda det sÄ kallade Storage Area Network.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det hÀr Àr stora SHD-enheter som Àr avsedda för lagring av stora datamÀngder. De Àr hyllor med diskar som monteras pÄ de slutgiltiga utdelningsmaskinerna via fiberoptik. SÄ vi har en pool av maskiner, som Àr ganska liten, och dessa SHD-enheter, som Àr transparenta för vÄr utdelningslogik, det vill sÀga för vÄr nginx eller nÄgon annan, hanterar förfrÄgningarna för dessa foton.

Den hÀr lösningen hade uppenbara fördelar. Det Àr en SHD-enhet. Den Àr inriktad pÄ att lagra foton. Det blir billigare Àn om vi bara sÀtter upp maskiner med hÄrddiskar.

Den andra fördelen.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det Àr att kapaciteten har blivit betydligt större, det vill sÀga att vi kan lagra mycket mer lagring pÄ mycket mindre utrymme.

Men det fanns ocksĂ„ nackdelar som snabbt blev uppenbara. Med ökning av antalet anvĂ€ndare och belastningen pĂ„ systemet började prestandaproblem dyka upp. Problemet Ă€r ganska uppenbart — vilken SHD-enhet som helst, som Ă€r avsedd för att lagra mĂ„nga foton pĂ„ liten yta, lider vanligtvis av intensiv lĂ€sning. Det Ă€r faktiskt aktuellt för all form av molnlagring, och vad som helst. Det finns för nĂ€rvarande ingen perfekt lagring som Ă€r oĂ€ndligt skalbar, dĂ€r man kan stoppa in vad som helst, och som hanterar lĂ€sning mycket vĂ€l, sĂ€rskilt slumpmĂ€ssig lĂ€sning.

Arkitektur för lagring och hantering av foton pÄ Badoo

Som i fallet med vÄra foton, eftersom foton efterfrÄgas oregelbundet, och det pÄverkar deras prestanda avsevÀrt.

Även med dagens siffror, om vi har över 500 RPS för foton pĂ„ den maskin som Ă€r ansluten till lagringen, börjar problemen redan dyka upp. Och det var ganska dĂ„ligt för oss eftersom antalet anvĂ€ndare ökar, och allt mĂ„ste bara bli sĂ€mre. Vi behöver optimera detta pĂ„ nĂ„got sĂ€tt.

För att optimera beslutade vi dĂ„ att tydligt titta pĂ„ belastningsprofilen — vad hĂ€nder egentligen, vad behöver optimeras.

Arkitektur för lagring och hantering av foton pÄ Badoo

Och hÀr spelar allt till vÄr fördel.

Jag nÀmnde redan i den första sliden: vi har 80 000 lÀsförfrÄgningar per sekund vid endast 3,5 miljoner uppladdningar per dag. Det vill sÀga, det Àr en skillnad pÄ tre ordningar. Uppenbart Àr att vi mÄste optimera lÀsningen och det Àr ganska klart hur.

Det finns ett litet moment till. Specifika tjÀnsten fungerar sÄ att en person registrerar sig, laddar upp ett foto, börjar aktivt titta pÄ andra mÀnniskor, gilla dem, och de visas aktivt för andra. Sedan hittar han eller hon en partner eller inte, det Àr som det Àr, och slutar anvÀnda tjÀnsten ett tag. I det ögonblicket, nÀr han eller hon anvÀnder det, Àr deras foton mycket heta - de efterfrÄgas, de ses av mÄnga. SÄ fort de slutar göra det, faller de ganska snabbt ut frÄn de intensiva visningarna för andra, som tidigare, och deras foton efterfrÄgas nÀstan inte.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det vill sÀga, vi har en mycket liten het dataset. Men det finns ÀndÄ vÀldigt mÄnga förfrÄgningar. En uppenbar lösning hÀr Àr att lÀgga till cache.

Cache med LRU kommer att lösa alla vÄra problem. Vad gör vi?

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi lÀgger till en relativt liten komponent framför vÄr stora lagringskluster, som vi kallar fotocache (photoscache). Detta Àr i grunden bara en cacheproxy.

Hur fungerar det inuti? HÀr Àr vÄr anvÀndare, hÀr Àr lagringen. Allt som tidigare. Vad lÀgger vi till mellan dem?

Arkitektur för lagring och hantering av foton pÄ Badoo

Detta Àr bara en maskin med en snabb fysisk lokal disk. Det kan vara med SSD, till exempel. Och pÄ denna disk lagras en lokal cache.

Hur ser detta ut? AnvÀndaren skickar en förfrÄgan om ett foto. NGINX letar efter det först i den lokala cachen. Om det inte finns dÀr, gör den helt enkelt proxy_pass till vÄr lagring, laddar ner bilden dÀrifrÄn och ger den till anvÀndaren.

Men det Àr vÀldigt banalt och oklart vad som hÀnder inuti. Det fungerar ungefÀr sÄ hÀr.

Arkitektur för lagring och hantering av foton pÄ Badoo

Cache Àr logiskt uppdelad i tre lager. NÀr jag sÀger 'tre lager', betyder det inte att det finns nÄgot komplicerat system. Nej, det Àr i princip bara tre kataloger i filsystemet:

  1. Detta Àr en buffert dÀr foton som just har laddats upp frÄn proxy hamnar.
  2. Detta Àr en het cache som lagrar foton som just nu aktivt efterfrÄgas.
  3. Och en kall cache dÀr foton gradvis trycks ut frÄn den heta cachen nÀr de fÄr fÀrre förfrÄgningar.

För att detta ska fungera mÄste vi pÄ nÄgot sÀtt hantera denna cache, vi mÄste flytta foton i den osv. Detta Àr ocksÄ en mycket primitiv process.

Arkitektur för lagring och hantering av foton pÄ Badoo

Nginx skriver helt enkelt till RAMDisken access.log för varje förfrÄgan, dÀr den anger sökvÀgen till fotot som den just nu serverar (en relativ sökvÀg, förstÄs), samt vilken sektion det serverades frÄn. Det kan stÄ "foto 1" och sedan antingen bufferten, den heta cachen, den kalla cachen eller proxy.

Baserat pÄ detta mÄste vi pÄ nÄgot sÀtt fatta ett beslut om vad vi ska göra med fotot.

Vi har en liten demon som körs pÄ varje maskin, som stÀndigt lÀser denna logg och lagrar statistik om anvÀndningen av olika foton i sitt minne.

Arkitektur för lagring och hantering av foton pÄ Badoo

Den samlar helt enkelt dÀr, hÄller rÀkning och gör regelbundet följande. Aktivt begÀrda foton, som fÄr mÄnga förfrÄgningar, flyttar den till den heta cachen, oavsett var de ligger.

Arkitektur för lagring och hantering av foton pÄ Badoo

Foton som begÀrs sÀllan och har blivit Ànnu mer sÀllan begÀrda, trycker den gradvis ut frÄn den heta cachen till den kalla.

Arkitektur för lagring och hantering av foton pÄ Badoo

Och nÀr vi fÄr slut pÄ plats i cacharna börjar vi helt enkelt ta bort frÄn den kalla cachen utan att göra nÄgra urval. Och detta fungerar för övrigt riktigt bra.

För att fotot ska sparas direkt vid proxying i bufferten anvĂ€nder vi direktivet proxy_store och bufferten — det Ă€r ocksĂ„ RAMDisk, alltsĂ„ fungerar det vĂ€ldigt snabbt för anvĂ€ndaren. Det hĂ€r gĂ€ller den interna funktionen hos sjĂ€lva cache-servern.

FrÄgan kvarstÄr om hur man ska fördela förfrÄgningarna mellan dessa servrar.

Anta att det finns en kluster av tjugo lagringsmaskiner och tre cache-servrar (sÄ blev det).

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi behöver pÄ nÄgot sÀtt definiera vilka förfrÄgningar som gÀller vilka foton och var de ska landa.

Det mest grundlÀggande alternativet Àr Round Robin. Eller ska vi göra det slumpmÀssigt?

Det har uppenbarligen sina nackdelar, eftersom vi i en sĂ„dan situation kommer att anvĂ€nda cachen pĂ„ ett mycket ineffektivt sĂ€tt. FörfrĂ„gningarna kommer att landa pĂ„ olika slumpmĂ€ssiga maskiner: hĂ€r har den cachats, pĂ„ grannservern finns den inte lĂ€ngre. Och allt kommer att fungera, om det ens gör det, vĂ€ldigt dĂ„ligt. Även med ett litet antal maskiner i klustret.

Vi behöver pÄ nÄgot sÀtt entydigt bestÀmma pÄ vilken server varje förfrÄgan ska landa.

Det finns ett enkelt sÀtt. Vi tar hash frÄn URL:en eller hash frÄn vÄr shardnyckel, som finns i URL:en, och delar den helt pÄ antalet servrar. Kommer det att fungera? Ja.

Arkitektur för lagring och hantering av foton pÄ Badoo

AlltsÄ, vi har en hundraprocentig begÀran, till exempel för en "example_url" kommer alltid att hamna pÄ server med index "2", och cachen kommer att utnyttjas sÄ bra som möjligt.

Men det uppstĂ„r ett problem med resurshantering i ett sĂ„dant schema. Resurshantering — jag menar förĂ€ndring av antalet servrar.

Anta att vÄr cachekluster har slutat klara av belastningen, och vi har beslutat att lÀgga till en ytterligare maskin.

Vi lÀgger till.

Arkitektur för lagring och hantering av foton pÄ Badoo

Nu delar vi inte lÀngre upp det i tre, utan i fyra. SÄledes lever praktiskt taget alla nycklar som vi tidigare hade, praktiskt taget alla URL:er nu pÄ andra servrar. Hela cachen har invalidiserats Ätskilliga gÄnger. Alla begÀrningar strömmade till vÄrt klusterlagring, det mÄdde dÄligt, misslyckade tjÀnster och missnöjda anvÀndare. Det vill vi inte ha.

Det alternativet passar oss inte heller.

Vad ska vi dÄ göra? Vi mÄste pÄ nÄgot sÀtt effektivt anvÀnda cachen, stÀndigt dirigera en begÀran till samma server, men samtidigt vara motstÄndskraftiga mot resurshantering. Och det finns en sÄdan lösning, den Àr inte direkt komplicerad. Den kallas för konsekvent hashning.

Arkitektur för lagring och hantering av foton pÄ Badoo

Hur ser det ut?

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi tar en funktion frÄn shardnyckeln och sprider ut alla dess vÀrden pÄ en cirkel. Det vill sÀga, vid punkt 0 möts dess minimala och maximala vÀrden. Vidare placerar vi alla vÄra servrar pÄ samma cirkel pÄ ungefÀr detta sÀtt:

Arkitektur för lagring och hantering av foton pÄ Badoo

Varje server definieras av en punkt, och sektorn som gĂ„r till den medurs, betjĂ€nas av denna vĂ€rd. NĂ€r begĂ€rningar kommer in ser vi genast att till exempel begĂ€ran A — har en sĂ„dan hash — och den betjĂ€nas av server 2. BegĂ€ran B — av server 3. Och sĂ„ vidare.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vad hÀnder i denna situation vid resurshantering?

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi invalidiserar inte hela cachen, som förut, och flyttar inte alla nycklar, utan vi flyttar varje sektor en liten bit sÄ att den lediga platsen, sÄ att sÀga, kan rymma vÄr sjÀtte server som vi vill lÀgga till och lÀgger till den dÀr.

Arkitektur för lagring och hantering av foton pÄ Badoo

SjÀlvklart, i en sÄdan situation kan nycklarna ocksÄ strula. Men de fungerar mycket bÀttre Àn tidigare. Vi ser att vÄra tvÄ första nycklar har stannat kvar pÄ sina servrar, och endast den cache-server som förÀndrats rör den senaste nyckeln. Det fungerar tillrÀckligt effektivt, och om du lÀgger till nya vÀrdar gradvis, finns det inget stort problem. Du lÀgger till lite i taget, vÀntar tills cachen fylls pÄ igen, och allt fungerar bra.

Den enda frÄgan som kvarstÄr vid fel Àr vad som hÀnder om nÄgon maskin gÄr sönder.

Arkitektur för lagring och hantering av foton pÄ Badoo

Och vi skulle inte gĂ€rna vilja behöva regenerera den hĂ€r kartan, ogiltigförklara en del av cachen och sĂ„ vidare, om en maskin exempelvis skulle starta om och vi mĂ„ste hantera förfrĂ„gningar. Vi har bara en reservfotovĂ€rd pĂ„ varje plats som fungerar som en ersĂ€ttning för vilken maskin som helst som just nu Ă€r ur funktion. Och om plötsligt nĂ„gon server blir otillgĂ€nglig, gĂ„r trafiken dit. Vi har, naturligtvis, ingen cache dĂ€r, dvs. den Ă€r kall, men Ă„tminstone hanteras anvĂ€ndarnas förfrĂ„gningar. Om detta Ă€r en kort tidsperiod klarar vi det helt enkelt. Det blir bara mer belastning pĂ„ lagringen. Om det Ă€r en lĂ€ngre period kan vi fatta beslut — att ta bort den servern frĂ„n kartan eller inte, eller kanske ersĂ€tta den med en annan.

Detta gÀller cachesystemet. LÄt oss titta pÄ resultaten.

Det verkar som om det inte finns nÄgot komplicerat hÀr. Men den hÀr metoden för att hantera cachen har gett oss en trÀffsÀkerhet pÄ cirka 98%. Det betyder att av de 80 000 förfrÄgningarna per sekund nÄr endast 1 600 lagringarna, och det Àr helt normal belastning, de klarar det lugnt, vi har alltid en buffert.

Vi har placerat dessa servrar i tre av vĂ„ra datacenter och har fĂ„tt tre nĂ€rvaropunkter — Prag, Miami och Hongkong.

Arkitektur för lagring och hantering av foton pÄ Badoo

DÀrmed Àr de mer eller mindre lokaliserade till var och en av vÄra mÄlmarknader.

Och som en trevlig bonus fick vi den hÀr caching-proxy, dÀr CPU:n faktiskt Àr relativt inaktiv, eftersom den inte behövs i sÄ stor utstrÀckning för att leverera innehÄllet. Och dÀr har vi med hjÀlp av NGINX + Lua implementerat mycket anvÀndbar logik.

Arkitektur för lagring och hantering av foton pÄ Badoo

Till exempel kan vi experimentera med webp eller progressive jpeg (detta Àr moderna, effektiva format), se hur det pÄverkar trafiken, fatta vissa beslut, aktivera för vissa lÀnder osv.; göra dynamisk storleksÀndring eller beskÀrning av bilder i realtid.

Det hÀr Àr ett bra anvÀndningsfall, nÀr du, till exempel, har en mobilapp som visar bilder, och mobilappen inte vill anvÀnda klientens CPU för att begÀra en stor bild och sedan Àndra dess storlek till en viss storlek för att passa i vyn. Vi kan helt enkelt dynamiskt ange vissa parametrar i URL:en i UPort, och bildcachet kommer automatiskt att Àndra storlek pÄ bilden. Vanligtvis kommer det att vÀlja den storlek som vi fysiskt har pÄ disken, sÄ nÀra den begÀrda storleken som möjligt, och downsizza den till de specifika koordinaterna.

Förresten har vi publicerat videoinspelningar frÄn de senaste fem Ären av konferenser för utvecklare av högbelastade system. HighLoad++. Titta, lÀr er, dela och prenumerera pÄ YouTube-kanalen..

Vi kan ocksÄ lÀgga till mycket produktlogik dÀr. Till exempel kan vi baserat pÄ URL-parametrarna lÀgga till olika vattenstÀmplar, vi kan sudda bilder, oskarpa eller pixla dem. Detta Àr nÀr vi vill visa en bild av en person men inte vill visa deras ansikte, vilket fungerar bra; allt detta Àr implementerat hÀr.

Vad har vi fÄtt? Vi har fÄtt tre punkter för nÀrvaro, en bra hitrate, och samtidigt stÄr inte CPU:n stilla pÄ dessa maskiner. Den har nu blivit viktigare Àn tidigare. Vi behöver installera kraftfullare maskiner, men det Àr vÀrt det.

Detta handlar om bildutbyte. HÀr Àr allt ganska klart och uppenbart. Jag tror att jag inte har avslöjat nÄgot nytt - sÄ hÀr fungerar praktiskt taget alla CDN.

Och det Àr troligt att den krÀsna lyssnaren kan ha undrat: varför inte bara ta och byta allt till CDN? Det skulle vara ungefÀr samma sak, alla moderna CDN kan göra detta. Och hÀr Àr flera orsaker.

Första — det handlar om bilder.

Arkitektur för lagring och hantering av foton pÄ Badoo

Detta Àr en av de nyckelpunkter i vÄr infrastruktur, och vi behöver sÄ mycket kontroll som möjligt över dem. Om det Àr en lösning frÄn en extern leverantör, och du har ingen makt över det, kommer det att bli ganska svÄrt att leva med detta nÀr du har en stor datamÀngd och en mycket hög anvÀndarförfrÄgningsström.

LÄt mig ge ett exempel. Just nu kan vi pÄ vÄr infrastruktur, till exempel om det uppstÄr nÄgra problem eller underjordiska knackningar, gÄ in pÄ maskinen och debugga dÀr, sÄ att sÀga. Vi kan lÀgga till insamling av vissa mÀtvÀrden som endast vi behöver, vi kan experimentera och se hur det pÄverkar graferna och sÄ vidare. Just nu samlas det in mycket statistik om denna cache-kluster. Och vi tittar periodiskt pÄ den och undersöker lÀnge vissa anomalier. Om det hade varit pÄ CDN-sidan skulle det ha varit mycket svÄrare att kontrollera. Eller till exempel, om en olycka intrÀffar, vet vi vad som har hÀnt, vi vet hur vi ska leva med det och hur vi ska övervinna det. Det Àr den första slutsatsen.

Den andra slutsatsen Àr ocksÄ snarare historisk eftersom systemet har utvecklats lÀnge, och det har funnits mÄnga olika affÀrskrav vid olika tidpunkter, och de passar sÀllan in i konceptet för CDN.

Och punkten som följer av den föregĂ„ende –

Arkitektur för lagring och hantering av foton pÄ Badoo

Det Àr att vi har mycket specifik logik i vÄra foto-cachar som inte alltid kan lÀggas till pÄ begÀran. Det Àr osannolikt att nÄgot CDN kommer att lÀgga till nÄgra anpassade funktioner pÄ din begÀran. Till exempel, kryptering av URL:er, om du inte vill att kunden ska kunna Àndra nÄgot. Vill du byta URL pÄ servern och kryptera den, och sedan överlÀmna vissa dynamiska parametrar hÀr.

Vilken slutsats dras? I vÄrt fall Àr CDN inte en sÀrskilt bra alternativ.

Arkitektur för lagring och hantering av foton pÄ Badoo

Men i ert fall, om ni har nÄgra specifika affÀrskrav, kan ni sjÀlva enkelt genomföra det jag har visat er. Och nÀr det gÀller en liknande belastningsprofil kommer det att fungera utmÀrkt.

Men om ni har en allmÀn lösning, och uppgiften inte Àr sÀrskilt specifik, kan ni lugnt anvÀnda CDN. Eller om tiden och resurserna Àr mycket viktigare för er Àn kontroll.

Arkitektur för lagring och hantering av foton pÄ Badoo

Och moderna CDN har praktiskt taget allt det jag just har berÀttat om. Med undantag för vissa funktioner.

Detta gÀller fotoleveransen.

LÄt oss nu gÄ framÄt i vÄr retrospektiv och prata om lagring.

År 2013.

Arkitektur för lagring och hantering av foton pÄ Badoo

Cache-servrar har lagts till, prestandaproblem har försvunnit. Allt Ă€r bra. Datasetet vĂ€xer. År 2013 hade vi omkring 80 servrar som var kopplade till lagringssystem och cirka 40 cache-servrar i varje datacenter. Det handlar om 560 terabyte data per datacenter, alltsĂ„ nĂ€stan ett petabyte totalt.

Arkitektur för lagring och hantering av foton pÄ Badoo

Med tillvÀxten av datasetet ökade driftskostnaderna kraftigt. Hur manifesterade detta sig?

Arkitektur för lagring och hantering av foton pÄ Badoo

I den hÀr diagrammet, som visar SAN-systemet med anslutna maskiner och cacher, finns det mÄnga felpunkter. Vi har hanterat problem med cache-servrar tidigare, dÀr Àr allt mer eller mindre förutsÀgbart och klart, men pÄ lagringssidan var det mycket vÀrre.

För det första, sjÀlva Storage Area Network (SAN) kan misslyckas.

För det andra Àr den ansluten via fiber till slutmaskinerna. Det kan uppstÄ problem med fiberkorten och switcharna.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det finns naturligtvis inte sÄ mÄnga felpunkter som med sjÀlva SAN:et, men det Àr ÀndÄ potentiella felpunkter.

Sedan Àr det sjÀlva maskinen som Àr kopplad till lagringssystemet. Den kan ocksÄ gÄ sönder.

Arkitektur för lagring och hantering av foton pÄ Badoo

SĂ„ vi har totalt tre felpunkter.

Förutom felpunkterna Àr det ocksÄ en tung underhÄllsbelastning av lagringssystemen.

Det Àr en komplex multikomponentsystem, och systemingenjörer kan ha det svÄrt med det.

Och den sista, mest viktiga punkten. Om nÄgot av dessa tre punkter misslyckas, finns det en icke-noll sannolikhet att förlora anvÀndardata, eftersom filsystemet kan skadas.

Arkitektur för lagring och hantering av foton pÄ Badoo

Anta att vĂ„rt filsystem har skadats. ÅterstĂ€llningen tar, för det första, lĂ„ng tid - det kan ta en vecka vid stora datamĂ€ngder. För det andra kommer vi troligen att fĂ„ en massa oklara filer, som pĂ„ nĂ„got sĂ€tt mĂ„ste matchas med anvĂ€ndarnas bilder. Och vi riskerar att förlora data. Risken Ă€r ganska hög. Ju oftare sĂ„dana situationer intrĂ€ffar och ju fler problem som uppstĂ„r i hela denna kedja, desto högre blir denna risk.

Vi mÄste göra nÄgot Ät det. Och vi beslutade att helt enkelt sÀkerhetskopiera data. Det Àr faktiskt en uppenbar och bra lösning. Vad gjorde vi?

Arkitektur för lagring och hantering av foton pÄ Badoo

SÄ hÀr sÄg vÄr server ut som var ansluten till lagringssystemet tidigare. Det Àr en huvudpartition, det Àr helt enkelt en blocenhet som i praktiken representerar en montering pÄ ett avlÀgset lagringssystem via fiber.

Vi lade helt enkelt till en andra partition.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi installerade en andra lagring bredvid (lyckligtvis Àr det inte sÄ dyrt), och kallade den för backup-partition. Den Àr ocksÄ ansluten via fiber, samma maskin. Men vi behöver pÄ nÄgot sÀtt synkronisera data mellan dem.

HÀr gör vi bara en asynkron kö bredvid.

Arkitektur för lagring och hantering av foton pÄ Badoo

Den Àr inte sÄ belastad. Vi vet att vi har fÄ poster. Kön Àr bara en tabell i MySQL dÀr rader skrivs in som "behöver sÀkerhetskopiera den hÀr bilden". Vid vilket Àndring eller vid uppladdning kopierar vi frÄn huvudpartitionen till backup med asynkron eller helt enkelt en bakgrundsprocess.

SĂ„ pĂ„ detta sĂ€tt har vi alltid tvĂ„ konsekventa partitioner. Även om en del av systemet gĂ„r ner kan vi alltid byta huvudsidan med backup, och allt fortsĂ€tter att fungera.

Men pÄ grund av detta ökar belastningen pÄ lÀsning kraftigt, eftersom förutom kunder som lÀser frÄn huvudpartitionen, eftersom de först ser bilden dÀr (den Àr ju nyare dÀr), och sedan letar pÄ backup om de inte hittade den (men det gör NGINX), sÄ lÀser Àven vÄrt backupsystem nu frÄn huvudpartitionen. Det var inte riktigt en flaskhals, men vi ville inte öka belastningen, i stort sett, helt i onödan.

Och vi lade till en tredje disk, som Àr en liten SSD, och kallade den för buffert.

Arkitektur för lagring och hantering av foton pÄ Badoo

SÄ hÀr fungerar det nu.

AnvÀndaren laddar upp en bild till bufferten, sedan skickas en hÀndelse till kön om att den bör kopieras till de tvÄ partitionerna. Den kopieras, och bilden lever ett tag (lÄt oss sÀga en dag) i bufferten, och först efter det rensas den. Det förbÀttrar anvÀndarupplevelsen avsevÀrt, eftersom anvÀndaren laddar upp en bild, och som regel börjar förfrÄgningar omedelbart komma in, eller att anvÀndaren uppdaterar sidan, gör en refresh. Men allt beror pÄ applikationen som gör uppladdningen.

Eller, till exempel, andra personer som börjar se bilden skickar omedelbart förfrÄgningar för den. Den finns Ànnu inte i cachen, den första förfrÄgan gÄr vÀldigt snabbt. I princip Àr det samma som med bildcachen. Den lÄngsamma lagringen deltar överhuvudtaget inte i detta. Och nÀr den rensats efter en dag Àr den antingen cachad pÄ vÄrt cachelager, eller sÄ Àr den antagligen ingen lÀngre behövlig. Det vill sÀga att anvÀndarupplevelsen hÀr har förbÀttrats kraftigt tack vare sÄdana enkla manipulationer.

Och viktigast av allt: vi har slutat förlora data.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi kan sÀga att vi har slutat potentiellt att förlora data, eftersom vi faktiskt inte förlorade dem. Men risken fanns. Vi ser att en sÄdan lösning sÄ klart Àr bra, men den liknar nÄgot av en symtomlindring av problemet, snarare Àn att lösa det helt. Och vissa problem kvarstÄr hÀr.

För det första, det Àr en felpunkt i form av den fysiska vÀrd som all denna maskinvara körs pÄ, den har inte försvunnit.

Arkitektur för lagring och hantering av foton pÄ Badoo

För det andra, det kvarstÄr problem med SAN, dess tunga underhÄll etc. Det var inte direkt en kritisk faktor, men vi ville pröva att leva utan det pÄ nÄgot sÀtt.

Och vi gjorde tredje versionen (i praktiken Ă€r det egentligen den andra) — en version för redundans. Hur sĂ„g det ut?

Det var som följande —

Arkitektur för lagring och hantering av foton pÄ Badoo

De största problemen vi har Àr med det fysiska vÀrden.

För det första tar vi bort SAN, eftersom vi vill experimentera, vi vill försöka med lokala hÄrddiskar.

Arkitektur för lagring och hantering av foton pÄ Badoo

Detta Àr redan Är 2014-2015, och vid den tidpunkten hade situationen med hÄrddiskar och deras lagringskapacitet pÄ en vÀrd blivit mycket bÀttre. Vi beslutade, varför inte prova.

Och dÀrefter tar vi helt enkelt vÄr backup-partition och flyttar den fysiskt till en separat maskin.

Arkitektur för lagring och hantering av foton pÄ Badoo

SÄledes fÄr vi en sÄdan schema. Vi har tvÄ maskiner som lagrar identiska dataset. De backar helt upp varandra och synkroniserar data över nÀtverket via en asynkron kö i samma MySQL.

Arkitektur för lagring och hantering av foton pÄ Badoo

Varför detta fungerar bra — eftersom vi har fĂ„ skrivningar. Dvs. om skrivningen var jĂ€mförbar med lĂ€sningen, kanske vi skulle fĂ„ nĂ„gon nĂ€tverksöverbelastning och problem. FĂ„ skrivningar, mycket lĂ€sningar — denna metod fungerar bra, dvs. vi kopierar relativt sĂ€llan bilder mellan dessa tvĂ„ servrar.

Hur detta fungerar, om man tittar lite mer detaljerat.

Arkitektur för lagring och hantering av foton pÄ Badoo

Upload. Lastbalanseraren vÀljer helt enkelt slumpmÀssiga vÀrdar med ett par och gör upload till dem. Under tiden gör den sjÀlvklart hÀlsokontroller, ser till att maskinen inte har fallit ut. Dvs. den laddar upp bilder bara till en levande server, och sedan kopieras allt det genom en asynkron kö till dess granne. Med upload Àr det extremt enkelt.

Uppgiften Àr nÄgot mer komplex.

Arkitektur för lagring och hantering av foton pÄ Badoo

HÀr hjÀlpte Lua oss, eftersom det Àr ganska svÄrt att skapa en sÄdan logik med vanilla NGINX. Först gör vi en begÀran till den första servern, kollar om bilden finns dÀr, eftersom den potentiellt kan ha laddats upp till en granne och Ànnu inte nÄtt hit. Om bilden finns dÀr Àr det bra. Vi ger den genast till kunden och kanske cachar den.

Arkitektur för lagring och hantering av foton pÄ Badoo

Om den inte finns, gör vi helt enkelt en begÀran till grannen och fÄr den garanterat dÀrifrÄn.

Arkitektur för lagring och hantering av foton pÄ Badoo

SĂ„ledes kan vi Ă„terigen sĂ€ga: det kan uppstĂ„ problem med prestanda, eftersom stĂ€ndiga round trips — bilden som laddades upp, hĂ€r finns den inte, vi gör tvĂ„ förfrĂ„gningar istĂ€llet för en, detta bör fungera lĂ„ngsamt.

I vÄr situation fungerar det inte lÄngsamt.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi samlar massor av mÀtningar pÄ detta system, och den hypotetiska trÀfffrekvensen för denna mekanism ligger pÄ ungefÀr 95%. Det vill sÀga, lagget pÄ denna backup Àr litet, och tack vare detta fÄr vi praktiskt taget garanterat, efter att en bild har laddats upp, den redan vid första försöket och gÄr aldrig dit tvÄ gÄnger.

SÄ pÄ sÄ sÀtt, vad har vi ocksÄ fÄtt, och vad Àr verkligen coolt?

Tidigare hade vi en huvudbackup-sektion och lÀste sekventiellt frÄn dem. Det vill sÀga, vi sökte alltid först pÄ huvudservern och sedan pÄ backupen. Det var ett steg.

Nu utnyttjar vi lÀsning frÄn tvÄ maskiner samtidigt. Vi fördelar begÀrningarna med Round Robin. I en liten procentandel av fallen gör vi tvÄ förfrÄgningar. Men nu har vi helt enkelt dubbelt sÄ mycket kapacitet för lÀsning som vi hade tidigare. Och belastningen har verkligen minskat bÄde pÄ avlÀmningsmaskinerna och pÄ lagringssystemen, som ocksÄ fanns vid den tidpunkten.

NÀr det gÀller hög tillgÀnglighet. I grund och botten var det detta vi kÀmpade mest för. Hög tillgÀnglighet hÀr har fungerat fantastiskt.

Arkitektur för lagring och hantering av foton pÄ Badoo

En maskin gÄr ner.

Arkitektur för lagring och hantering av foton pÄ Badoo

Inga problem! Systemingenjören kan till och med sova vidare pÄ natten, vÀnta till morgonen, ingenting hemskt kommer att hÀnda.

Om Àven kön gÄr ner nÀr denna maskin faller ut, inga problem, loggen kommer först att samlas pÄ den levande maskinen, och sedan försöka igen till kön, och dÀrefter till den maskin som kommer att ÄterstÀllas efter en tid.

Arkitektur för lagring och hantering av foton pÄ Badoo

Samma sak med underhÄll. Vi stÀnger helt enkelt av en av maskinerna, plockar manuellt bort den frÄn alla pooler, trafiken upphör, vi gör nÄgot underhÄll, fixar lite dÀr, och efter det sÀtter vi tillbaka den i drift, och den hÀr backupen hinner ifatt ganska snabbt. D.v.s. en nedtid pÄ en maskin hinner ifatt inom nÄgra minuter pÄ ett dygn. Det Àr verkligen vÀldigt lite. Med hög tillgÀnglighet, som jag sagt tidigare, Àr allt riktigt bra hÀr.

Vilka slutsatser kan vi dra frÄn det hÀr schemat med redundans?

Vi har uppnÄtt hög tillgÀnglighet.

Enkel drift. Eftersom maskinerna har lokala hÄrddiskar Àr det mycket mer bekvÀmt ur ett driftsperspektiv för ingenjörerna som arbetar med detta.

Vi har fÄtt dubbel marginal för lÀsning.

Detta Àr en mycket bra bonus pÄ pluskontot för hög tillgÀnglighet.

Men det finns ocksÄ problem. Nu har vi en betydligt mer komplex utveckling av funktioner kopplade till detta, eftersom systemet nu Àr 100% eventual consistent.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vi mÄste, sÀg, tÀnka stÀndigt i nÄgot background job: "Vilken server kör vi just nu?", "Finns det verkligen en aktuell bild hÀr?" o.s.v. Detta Àr naturligtvis allt inpackat i wrappers, och för programmeraren som skriver affÀrslogik Àr detta transparent. Men ÀndÄ har ett stort komplext lager tillkommit. Men vi Àr beredda att acceptera detta i utbyte mot de fördelar vi fÄtt.

Och hÀr uppstÄr Äterigen en viss konflikt.

Jag sa tidigare att det var dÄligt att lagra allt pÄ lokala hÄrddiskar. Nu sÀger jag att vi gillar det.

Ja, faktiskt, över tid har situationen förÀndrats avsevÀrt, och nu har denna metod mÄnga fördelar. För det första fÄr vi en mycket mer enkel drift.

För det andra Àr det mer effektivt, eftersom vi inte har dessa automatiska kontroller, kopplingar till lagringssystem.

Det finns en enorm maskinpark dÀr, men hÀr handlar det bara om nÄgra hÄrddiskar som Àr samlade i RAID lokalt i maskinen.

Men det finns ocksÄ nackdelar.

Arkitektur för lagring och hantering av foton pÄ Badoo

Det Àr ungefÀr 1,5 gÄnger dyrare Àn att anvÀnda SAN, Àven enligt dagens priser. DÀrför valde vi att inte sÄ rÄtt konvertera hela vÄr stora kluster till maskiner med lokala hÄrddiskar, utan istÀllet behÄlla en hybridlösning.

HĂ€lften av vĂ„ra maskiner arbetar med hĂ„rddiskar (nĂ„ja, inte riktigt hĂ€lften – kanske 30 procent). Den resterande delen Ă€r gamla maskiner dĂ€r den första backup-lösningen tidigare var installerad. Vi omkonfigurerade dem, eftersom vi varken behöver nĂ„gra nya data eller nĂ„got annat, vi flyttade helt enkelt mounts frĂ„n en fysisk vĂ€rd till tvĂ„.

Och vi fick en stor kapacitet för lÀsning, och vi gjorde en uppgradering. Tidigare monterade vi en lagring pÄ en maskin, nu monterar vi till exempel fyra pÄ ett par. Och det fungerar bra.

LÄt oss sammanfatta kort vad vi har uppnÄtt, vad vi har kÀmpat för, och hur det har gÄtt.

Sammanfattning

Vi har anvĂ€ndare – helt 33 miljoner.

Vi har tre nĂ€rvaro punkter – Prag, Miami, Hongkong.

DÀr finns ett cache-lager, bestÄende av maskiner med snabba lokala diskar (SSD), dÀr en enkel lösning med NGINX körs, dess access.log och Python-daemoner som hanterar och administrerar cache.

Om du önskar kan du i ditt projekt, om dina bilder inte Àr lika kritiska som de Àr för oss, eller om trade-off mellan kontroll och utvecklingshastighet kostnader lutar Ät det andra hÄllet för dig, dÄ kan du enkelt byta ut det mot en CDN, moderna CDN klarar detta bra.

DÀrefter kommer lagringsskiktet, dÀr vi har kluster av par av maskiner som sÀkerhetskopierar varandra, asynkront kopieras filer frÄn en till en annan vid varje Àndring.

NÄgra av dessa maskiner arbetar med lokala hÄrddiskar.

En del av dessa maskiner Àr anslutna till SAN.

Arkitektur för lagring och hantering av foton pÄ Badoo

Å ena sidan Ă€r det mer praktiskt att anvĂ€nda och nĂ„got mer effektivt, Ă„ andra sidan Ă€r det bekvĂ€mt ur tĂ€tbyrĂ„ns och kostnaden per gigabyte.

Detta Àr en kort översikt av arkitekturen som vi har fÄtt och hur allt har utvecklats.

HÀr Àr nÄgra ytterligare tips frÄn chefen, vÀldigt enkla.

För det första, om du plötsligt bestÀmmer dig för att du brÄdskande behöver förbÀttra alla fotoinfrastrukturer, mÀt först, för kanske behövs det inga förbÀttringar.

Arkitektur för lagring och hantering av foton pÄ Badoo

LÄt mig ge ett exempel. Vi har ett kluster av maskiner som levererar bilder frÄn bifogningar i chattar, och dÀr fungerar fortfarande en lösning frÄn 2009, och ingen lider av detta. Alla Àr nöjda, alla gillar det.

För att mÀta, börja med att sÀtta upp en mÀngd metrik, titta pÄ dem och avgör sedan vad du Àr missnöjd med och vad som behöver förbÀttras. För att kunna mÀta detta har vi ett hÀftigt verktyg som heter Pinba.

Det gör att du kan samla in detaljerad statistik frĂ„n NGINX för varje begĂ€ran, inklusive svarskoder och tidsfördelningar — allt du kan tĂ€nka dig. Det finns bindningar till olika analytiska system, och du kan sedan se allt detta pĂ„ ett snyggt sĂ€tt.

MĂ€t först — förbĂ€ttra sedan.

Vidare. Vi optimerar lÀsningen med cache och skrivningen med sharding, men det Àr en uppenbar punkt.

Arkitektur för lagring och hantering av foton pÄ Badoo

Vidare. Om du just nu börjar bygga ditt system, sÄ Àr det mycket bÀttre att göra foton som oförÀnderliga filer. Eftersom du genast slipper en hel klass av problem med cache-invalidering och hur logiken ska hitta rÀtt version av bilden, och sÄ vidare.

Arkitektur för lagring och hantering av foton pÄ Badoo

Anta att du laddat upp en hundra, sedan har du roterat den, se till att det blir en fysiskt annan fil. Det vill sÀga, tÀnk inte: nu sparar jag lite plats genom att spela in i samma fil och Àndra versionen. Det fungerar alltid dÄligt, och det blir mycket huvudvÀrk senare.

NĂ€sta punkt. Om resizing i realtid.

Tidigare, nÀr anvÀndare laddade upp en bild, skar vi omedelbart upp ett stort antal storlekar för alla tÀnkbara situationer, för olika kunder, och de lÄg alla pÄ disken. Nu har vi övergivit detta.

Vi har behÄllit endast tre grundlÀggande storlekar: liten, medium och stor. Allt annat downsizas frÄn den storlek som efterfrÄgades i Uport, vi gör helt enkelt downsizing och ger det till anvÀndaren.

CPU:n i cache-lagret blir mycket billigare Ă€n om vi stĂ€ndigt skulle regenerera dessa storlekar pĂ„ varje lagring. Anta att vi vill lĂ€gga till en ny, det tar en mĂ„nad — att köra ett skript överallt som skulle göra detta noggrant utan att krascha klustret. SĂ„ om det finns möjlighet att vĂ€lja nu, Ă€r det bĂ€ttre att göra sĂ„ fĂ„ fysiska storlekar som möjligt, men Ă€ndĂ„ ha nĂ„gon form av fördelning, sĂ€g tre. Och allt annat kan bara resizingas i realtid med hjĂ€lp av fĂ€rdiga moduler. Det Ă€r nu vĂ€ldigt enkelt och tillgĂ€ngligt.

Och en inkrementell asynkron backup Àr bra.

Som vÄr erfarenhet har visat fungerar en sÄdan schema bra med att skjuta upp kopiering av Àndrade filer.

Arkitektur för lagring och hantering av foton pÄ Badoo

Den sista punkten Àr ocksÄ uppenbar. Om det inte finns nÄgra sÄdana problem i din infrastruktur nu, men det finns nÄgot som kan gÄ sönder, sÄ kommer det garanterat att gÄ sönder nÀr belastningen ökar lite. DÀrför Àr det bÀst att tÀnka pÄ detta i förvÀg och slippa problem. Det var allt frÄn min sida.

Kontakter

» bo0rsh201
» Baddoos företagsblogg

Denna rapport Àr en transkription av en av de bÀsta presentationerna pÄ konferensen för utvecklare av högbelastade system HighLoad++. Det Àr mindre Àn en mÄnad kvar till konferensen HighLoad++ 2017.

Vi har redan förberett Konferensprogrammet, och schemat hÄller just nu pÄ att fÀrdigstÀllas.

I Är fortsÀtter vi att utforska Àmnet arkitekturer och skalning:

Även nĂ„gra av dessa material anvĂ€nds av oss i vĂ„r utbildningskurs online om utveckling av högbelastade system HighLoad.Guide Ă€r en kedja av noggrant utvalda brev, artiklar, material och videor. Redan nu finns det mer Ă€n 30 unika material i vĂ„r lĂ€robok. Anslut er!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster