{"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\/sv\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","title":{"rendered":"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/04d68ff091d9d271bfd352a6639e2f20.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Artem Denisov ( <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/users\/bo0rsh201\/\" class=\"user_link\">bo0rsh201<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/habrahabr.ru\/company\/badoo\/\">Badoo<\/a><\/noindex>)<\/h2>\n<p>\nBadoo \u00e4r v\u00e4rldens st\u00f6rsta dejtingsajt. F\u00f6r n\u00e4rvarande har vi registrerat cirka 330 miljoner anv\u00e4ndare \u00f6ver hela v\u00e4rlden. Men vad som \u00e4r mycket viktigare i sammanhanget av v\u00e5r diskussion idag, \u00e4r att vi lagrar omkring 3 petabyte anv\u00e4ndarfoton. Varje dag laddar v\u00e5ra anv\u00e4ndare upp cirka 3,5 miljoner nya foton, och belastningen f\u00f6r l\u00e4sning \u00e4r omkring <b>80 000 f\u00f6rfr\u00e5gningar per sekund<\/b>. Det \u00e4r ganska mycket f\u00f6r v\u00e5r backend, och ibland uppst\u00e5r det problem med det.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/4e4690f9b0d95bd76fbbc1cd6805c26c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJag kommer att ber\u00e4tta om designen av detta system som lagrar och levererar foton i stort, och jag kommer att ge en utvecklares perspektiv p\u00e5 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\u00f6sningar vi anv\u00e4nder nu.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOch nu l\u00e5t oss b\u00f6rja.<\/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=\"Spela video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\nSom jag redan n\u00e4mnt, detta kommer att vara en retrospektiv, och f\u00f6r att b\u00f6rja n\u00e5gonstans, l\u00e5t oss ta det mest banala exemplet.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/22b9627cda7ccadd9869b64e9d043d89.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi har en allm\u00e4n uppgift, vi beh\u00f6ver ta emot, lagra och leverera anv\u00e4ndarfoton. I denna form \u00e4r uppgiften allm\u00e4n, vi kan anv\u00e4nda vad som helst:<\/p>\n<ul>\n<li>modern molnlagring,<\/li>\n<li>f\u00e4rdiga l\u00f6sningar, som det ocks\u00e5 finns m\u00e5nga av;<\/li>\n<li>vi kan s\u00e4tta upp flera maskiner i v\u00e5rt datacenter och installera stora h\u00e5rddiskar d\u00e4r f\u00f6r att lagra foton.<\/li>\n<\/ul>\n<p>\nBadoo har historiskt sett \u2014 och nu, liksom d\u00e5 (p\u00e5 den tid n\u00e4r detta just hade b\u00f6rjat) \u2014 levt p\u00e5 egna servrar, inom v\u00e5ra egna datacenter. S\u00e5 f\u00f6r oss var detta alternativ optimalt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/9434fbabada15670297c551066ad7e71.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi tog helt enkelt n\u00e5gra maskiner, kallade dem \"photos\", och vi skapade en kluster som lagrar foton. Men det verkar som om n\u00e5got saknas. F\u00f6r att allt detta ska fungera, beh\u00f6ver vi p\u00e5 n\u00e5got s\u00e4tt avg\u00f6ra vilken maskin som ska lagra vilka foton. Och h\u00e4r beh\u00f6ver vi inte uppfinna hjulet p\u00e5 nytt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/36258e7107fd8c60f7e9e563a2cb681c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi l\u00e4gger till ett f\u00e4lt i v\u00e5rt lagringssystem med information om anv\u00e4ndarna. Det kommer att vara nyckeln f\u00f6r sharding. I v\u00e5rt fall kallade vi det place_id, och den h\u00e4r id:n f\u00f6r platser indikerar platsen d\u00e4r anv\u00e4ndarfotona lagras. Vi skapar kartor.<\/p>\n<p>I det f\u00f6rsta steget kan detta till och med g\u00f6ras manuellt \u2014 vi s\u00e4ger att en anv\u00e4ndares foto med en viss plats kommer att lagras p\u00e5 en viss server. Tack vare denna karta vet vi alltid n\u00e4r anv\u00e4ndaren laddar upp en bild, var den ska sparas och vet varifr\u00e5n den ska levereras.<\/p>\n<p>Detta \u00e4r en helt trivial skiss, men den har tillr\u00e4ckligt m\u00e5nga viktiga f\u00f6rdelar. F\u00f6r det f\u00f6rsta \u00e4r den enkel, som jag redan n\u00e4mnt, och f\u00f6r det andra kan vi med en s\u00e5dan metod enkelt skala horisontellt genom att helt enkelt leverera nya enheter och l\u00e4gga till dem i kartan. Inget mer beh\u00f6ver g\u00f6ras.<\/p>\n<p>S\u00e5 var det under en tid f\u00f6r oss.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/3effb442702f162f7bad9c18ec54392e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet var n\u00e5gon g\u00e5ng runt 2009. Vi levererade enheter, vi levererade ...<\/p>\n<p>Och vid en viss tidpunkt b\u00f6rjade vi m\u00e4rka att denna plan hade vissa nackdelar. Vilka nackdelar?<\/p>\n<p>F\u00f6rst och fr\u00e4mst \u00e4r det den begr\u00e4nsade kapaciteten. Vi kan inte stoppa s\u00e5 m\u00e5nga h\u00e5rddiskar i en fysisk server som vi skulle vilja. Och med tiden och tillv\u00e4xten av datasetet blev det ett visst problem.<\/p>\n<p>Och f\u00f6r det andra. Det \u00e4r en atypisk konfiguration av enheter, eftersom s\u00e5dana enheter \u00e4r sv\u00e5ra att \u00e5teranv\u00e4nda i andra kluster, de \u00e4r ganska specifika, det vill s\u00e4ga de b\u00f6r ha l\u00e5g prestanda, men samtidigt ha stora h\u00e5rddiskar.<\/p>\n<p>Detta var allt \u00e5r 2009, men i princip \u00e4r dessa krav fortfarande aktuella idag. Vi har en tillbakablick, s\u00e5 \u00e5r 2009 var allt verkligen d\u00e5ligt p\u00e5 detta omr\u00e5de.<\/p>\n<p>Och den sista punkten \u00e4r priset.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/e49010eaeab139199d8fe010caa65bf0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPriset d\u00e5 var v\u00e4ldigt h\u00f6gt och vi beh\u00f6vde leta efter alternativ. Det vill s\u00e4ga, vi beh\u00f6vde p\u00e5 n\u00e5got s\u00e4tt b\u00e4ttre utnyttja b\u00e5de utrymmet i datacenter och de fysiska servrar som allt detta lagras p\u00e5. Och v\u00e5ra systemingenj\u00f6rer inledde en omfattande studie d\u00e4r de gick igenom en m\u00e4ngd olika alternativ. De tittade \u00e4ven p\u00e5 klusterfilsystem som PolyCeph och Lustre. D\u00e4r fanns det prestandaproblem och ganska komplicerad drift. De avstod. De f\u00f6rs\u00f6kte montera hela datasetet via NFS p\u00e5 varje enhet f\u00f6r att p\u00e5 s\u00e5 vis \u00f6ka skalningen. L\u00e4sningen gick d\u00e5ligt, de pr\u00f6vade olika l\u00f6sningar fr\u00e5n olika leverant\u00f6rer.<\/p>\n<p>Och till slut kom vi fram till att vi b\u00f6rjade anv\u00e4nda det s\u00e5 kallade Storage Area Network.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/e99402fa641f3bd5fc8d57a9f8995642.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet h\u00e4r \u00e4r stora SHD-enheter som \u00e4r avsedda f\u00f6r lagring av stora datam\u00e4ngder. De \u00e4r hyllor med diskar som monteras p\u00e5 de slutgiltiga utdelningsmaskinerna via fiberoptik. S\u00e5 vi har en pool av maskiner, som \u00e4r ganska liten, och dessa SHD-enheter, som \u00e4r transparenta f\u00f6r v\u00e5r utdelningslogik, det vill s\u00e4ga f\u00f6r v\u00e5r nginx eller n\u00e5gon annan, hanterar f\u00f6rfr\u00e5gningarna f\u00f6r dessa foton.<\/p>\n<p>Den h\u00e4r l\u00f6sningen hade uppenbara f\u00f6rdelar. Det \u00e4r en SHD-enhet. Den \u00e4r inriktad p\u00e5 att lagra foton. Det blir billigare \u00e4n om vi bara s\u00e4tter upp maskiner med h\u00e5rddiskar.<\/p>\n<p>Den andra f\u00f6rdelen. <\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7fd2e7d629cc239096b14c68be5f76bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet \u00e4r att kapaciteten har blivit betydligt st\u00f6rre, det vill s\u00e4ga att vi kan lagra mycket mer lagring p\u00e5 mycket mindre utrymme.<\/p>\n<p>Men det fanns ocks\u00e5 nackdelar som snabbt blev uppenbara. Med \u00f6kning av antalet anv\u00e4ndare och belastningen p\u00e5 systemet b\u00f6rjade prestandaproblem dyka upp. Problemet \u00e4r ganska uppenbart \u2014 vilken SHD-enhet som helst, som \u00e4r avsedd f\u00f6r att lagra m\u00e5nga foton p\u00e5 liten yta, lider vanligtvis av intensiv l\u00e4sning. Det \u00e4r faktiskt aktuellt f\u00f6r all form av molnlagring, och vad som helst. Det finns f\u00f6r n\u00e4rvarande ingen perfekt lagring som \u00e4r o\u00e4ndligt skalbar, d\u00e4r man kan stoppa in vad som helst, och som hanterar l\u00e4sning mycket v\u00e4l, s\u00e4rskilt slumpm\u00e4ssig l\u00e4sning.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/566e836e2fe13a2a3d040ae3fa865d6d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSom i fallet med v\u00e5ra foton, eftersom foton efterfr\u00e5gas oregelbundet, och det p\u00e5verkar deras prestanda avsev\u00e4rt.<\/p>\n<p>\u00c4ven med dagens siffror, om vi har \u00f6ver 500 RPS f\u00f6r foton p\u00e5 den maskin som \u00e4r ansluten till lagringen, b\u00f6rjar problemen redan dyka upp. Och det var ganska d\u00e5ligt f\u00f6r oss eftersom antalet anv\u00e4ndare \u00f6kar, och allt m\u00e5ste bara bli s\u00e4mre. Vi beh\u00f6ver optimera detta p\u00e5 n\u00e5got s\u00e4tt.<\/p>\n<p>F\u00f6r att optimera beslutade vi d\u00e5 att tydligt titta p\u00e5 belastningsprofilen \u2014 vad h\u00e4nder egentligen, vad beh\u00f6ver optimeras.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d67310e6b90c4ee1337065790576c9a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch h\u00e4r spelar allt till v\u00e5r f\u00f6rdel.<\/p>\n<p>Jag n\u00e4mnde redan i den f\u00f6rsta sliden: vi har 80 000 l\u00e4sf\u00f6rfr\u00e5gningar per sekund vid endast 3,5 miljoner uppladdningar per dag. Det vill s\u00e4ga, det \u00e4r en skillnad p\u00e5 tre ordningar. Uppenbart \u00e4r att vi m\u00e5ste optimera l\u00e4sningen och det \u00e4r ganska klart hur.<\/p>\n<p>Det finns ett litet moment till. Specifika tj\u00e4nsten fungerar s\u00e5 att en person registrerar sig, laddar upp ett foto, b\u00f6rjar aktivt titta p\u00e5 andra m\u00e4nniskor, gilla dem, och de visas aktivt f\u00f6r andra. Sedan hittar han eller hon en partner eller inte, det \u00e4r som det \u00e4r, och slutar anv\u00e4nda tj\u00e4nsten ett tag. I det \u00f6gonblicket, n\u00e4r han eller hon anv\u00e4nder det, \u00e4r deras foton mycket heta - de efterfr\u00e5gas, de ses av m\u00e5nga. S\u00e5 fort de slutar g\u00f6ra det, faller de ganska snabbt ut fr\u00e5n de intensiva visningarna f\u00f6r andra, som tidigare, och deras foton efterfr\u00e5gas n\u00e4stan inte.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/dcc7e306055d8f2b0895f24679bfc3e2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet vill s\u00e4ga, vi har en mycket liten het dataset. Men det finns \u00e4nd\u00e5 v\u00e4ldigt m\u00e5nga f\u00f6rfr\u00e5gningar. En uppenbar l\u00f6sning h\u00e4r \u00e4r att l\u00e4gga till cache.<\/p>\n<p>Cache med LRU kommer att l\u00f6sa alla v\u00e5ra problem. Vad g\u00f6r vi?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/2bd0c88a97d928f386db21549fc02500.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi l\u00e4gger till en relativt liten komponent framf\u00f6r v\u00e5r stora lagringskluster, som vi kallar fotocache (photoscache). Detta \u00e4r i grunden bara en cacheproxy.<\/p>\n<p>Hur fungerar det inuti? H\u00e4r \u00e4r v\u00e5r anv\u00e4ndare, h\u00e4r \u00e4r lagringen. Allt som tidigare. Vad l\u00e4gger vi till mellan dem?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7b7b5f102f1c012b2aef8f02ec731fac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDetta \u00e4r bara en maskin med en snabb fysisk lokal disk. Det kan vara med SSD, till exempel. Och p\u00e5 denna disk lagras en lokal cache.<\/p>\n<p>Hur ser detta ut? Anv\u00e4ndaren skickar en f\u00f6rfr\u00e5gan om ett foto. NGINX letar efter det f\u00f6rst i den lokala cachen. Om det inte finns d\u00e4r, g\u00f6r den helt enkelt proxy_pass till v\u00e5r lagring, laddar ner bilden d\u00e4rifr\u00e5n och ger den till anv\u00e4ndaren.<\/p>\n<p>Men det \u00e4r v\u00e4ldigt banalt och oklart vad som h\u00e4nder inuti. Det fungerar ungef\u00e4r s\u00e5 h\u00e4r.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/46be24df171d1008e2a9099b7e4c9be6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCache \u00e4r logiskt uppdelad i tre lager. N\u00e4r jag s\u00e4ger 'tre lager', betyder det inte att det finns n\u00e5got komplicerat system. Nej, det \u00e4r i princip bara tre kataloger i filsystemet:<\/p>\n<ol>\n<li>Detta \u00e4r en buffert d\u00e4r foton som just har laddats upp fr\u00e5n proxy hamnar.<\/li>\n<li>Detta \u00e4r en het cache som lagrar foton som just nu aktivt efterfr\u00e5gas.<\/li>\n<li>Och en kall cache d\u00e4r foton gradvis trycks ut fr\u00e5n den heta cachen n\u00e4r de f\u00e5r f\u00e4rre f\u00f6rfr\u00e5gningar.<\/li>\n<\/ol>\n<p>\nF\u00f6r att detta ska fungera m\u00e5ste vi p\u00e5 n\u00e5got s\u00e4tt hantera denna cache, vi m\u00e5ste flytta foton i den osv. Detta \u00e4r ocks\u00e5 en mycket primitiv process.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/9b16fe3e99a5f88f06169f6e5eedf2b9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNginx skriver helt enkelt till RAMDisken access.log f\u00f6r varje f\u00f6rfr\u00e5gan, d\u00e4r den anger s\u00f6kv\u00e4gen till fotot som den just nu serverar (en relativ s\u00f6kv\u00e4g, f\u00f6rst\u00e5s), samt vilken sektion det serverades fr\u00e5n. Det kan st\u00e5 \"foto 1\" och sedan antingen bufferten, den heta cachen, den kalla cachen eller proxy.<\/p>\n<p>Baserat p\u00e5 detta m\u00e5ste vi p\u00e5 n\u00e5got s\u00e4tt fatta ett beslut om vad vi ska g\u00f6ra med fotot.<\/p>\n<p>Vi har en liten demon som k\u00f6rs p\u00e5 varje maskin, som st\u00e4ndigt l\u00e4ser denna logg och lagrar statistik om anv\u00e4ndningen av olika foton i sitt minne.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0dceda5e5ff432d1609520f0c152f152.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen samlar helt enkelt d\u00e4r, h\u00e5ller r\u00e4kning och g\u00f6r regelbundet f\u00f6ljande. Aktivt beg\u00e4rda foton, som f\u00e5r m\u00e5nga f\u00f6rfr\u00e5gningar, flyttar den till den heta cachen, oavsett var de ligger.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/941c13ecfea88372f3a7eb62d81b0c4e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nFoton som beg\u00e4rs s\u00e4llan och har blivit \u00e4nnu mer s\u00e4llan beg\u00e4rda, trycker den gradvis ut fr\u00e5n den heta cachen till den kalla.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/a07235246995ad2fa4e6aeccae23a629.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch n\u00e4r vi f\u00e5r slut p\u00e5 plats i cacharna b\u00f6rjar vi helt enkelt ta bort fr\u00e5n den kalla cachen utan att g\u00f6ra n\u00e5gra urval. Och detta fungerar f\u00f6r \u00f6vrigt riktigt bra.<\/p>\n<p>F\u00f6r att fotot ska sparas direkt vid proxying i bufferten anv\u00e4nder vi direktivet proxy_store och bufferten \u2014 det \u00e4r ocks\u00e5 RAMDisk, allts\u00e5 fungerar det v\u00e4ldigt snabbt f\u00f6r anv\u00e4ndaren. Det h\u00e4r g\u00e4ller den interna funktionen hos sj\u00e4lva cache-servern.<\/p>\n<p>Fr\u00e5gan kvarst\u00e5r om hur man ska f\u00f6rdela f\u00f6rfr\u00e5gningarna mellan dessa servrar.<\/p>\n<p>Anta att det finns en kluster av tjugo lagringsmaskiner och tre cache-servrar (s\u00e5 blev det).<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6bc970b687701f3b6d57e153e3abed18.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi beh\u00f6ver p\u00e5 n\u00e5got s\u00e4tt definiera vilka f\u00f6rfr\u00e5gningar som g\u00e4ller vilka foton och var de ska landa.<\/p>\n<p>Det mest grundl\u00e4ggande alternativet \u00e4r Round Robin. Eller ska vi g\u00f6ra det slumpm\u00e4ssigt?<\/p>\n<p>Det har uppenbarligen sina nackdelar, eftersom vi i en s\u00e5dan situation kommer att anv\u00e4nda cachen p\u00e5 ett mycket ineffektivt s\u00e4tt. F\u00f6rfr\u00e5gningarna kommer att landa p\u00e5 olika slumpm\u00e4ssiga maskiner: h\u00e4r har den cachats, p\u00e5 grannservern finns den inte l\u00e4ngre. Och allt kommer att fungera, om det ens g\u00f6r det, v\u00e4ldigt d\u00e5ligt. \u00c4ven med ett litet antal maskiner i klustret.<\/p>\n<p>Vi beh\u00f6ver p\u00e5 n\u00e5got s\u00e4tt entydigt best\u00e4mma p\u00e5 vilken server varje f\u00f6rfr\u00e5gan ska landa.<\/p>\n<p>Det finns ett enkelt s\u00e4tt. Vi tar hash fr\u00e5n URL:en eller hash fr\u00e5n v\u00e5r shardnyckel, som finns i URL:en, och delar den helt p\u00e5 antalet servrar. Kommer det att fungera? Ja.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/794a82ac1268b651ab936f0225b802a2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAllts\u00e5, vi har en hundraprocentig beg\u00e4ran, till exempel f\u00f6r en \"example_url\" kommer alltid att hamna p\u00e5 server med index \"2\", och cachen kommer att utnyttjas s\u00e5 bra som m\u00f6jligt.<\/p>\n<p>Men det uppst\u00e5r ett problem med resurshantering i ett s\u00e5dant schema. Resurshantering \u2014 jag menar f\u00f6r\u00e4ndring av antalet servrar.<\/p>\n<p>Anta att v\u00e5r cachekluster har slutat klara av belastningen, och vi har beslutat att l\u00e4gga till en ytterligare maskin.<\/p>\n<p>Vi l\u00e4gger till.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/5f2fcba4c4f267c069811c3677bd0213.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNu delar vi inte l\u00e4ngre upp det i tre, utan i fyra. S\u00e5ledes lever praktiskt taget alla nycklar som vi tidigare hade, praktiskt taget alla URL:er nu p\u00e5 andra servrar. Hela cachen har invalidiserats \u00e5tskilliga g\u00e5nger. Alla beg\u00e4rningar str\u00f6mmade till v\u00e5rt klusterlagring, det m\u00e5dde d\u00e5ligt, misslyckade tj\u00e4nster och missn\u00f6jda anv\u00e4ndare. Det vill vi inte ha.<\/p>\n<p>Det alternativet passar oss inte heller.<\/p>\n<p>Vad ska vi d\u00e5 g\u00f6ra? Vi m\u00e5ste p\u00e5 n\u00e5got s\u00e4tt effektivt anv\u00e4nda cachen, st\u00e4ndigt dirigera en beg\u00e4ran till samma server, men samtidigt vara motst\u00e5ndskraftiga mot resurshantering. Och det finns en s\u00e5dan l\u00f6sning, den \u00e4r inte direkt komplicerad. Den kallas f\u00f6r konsekvent hashning.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/1380758686274df9755a7ebf7d1c8753.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHur ser det ut?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/44f97abfac46fa9f361055548819e8a3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi tar en funktion fr\u00e5n shardnyckeln och sprider ut alla dess v\u00e4rden p\u00e5 en cirkel. Det vill s\u00e4ga, vid punkt 0 m\u00f6ts dess minimala och maximala v\u00e4rden. Vidare placerar vi alla v\u00e5ra servrar p\u00e5 samma cirkel p\u00e5 ungef\u00e4r detta s\u00e4tt:<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d470ec615a789913a6baa2726b05acea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVarje server definieras av en punkt, och sektorn som g\u00e5r till den medurs, betj\u00e4nas av denna v\u00e4rd. N\u00e4r beg\u00e4rningar kommer in ser vi genast att till exempel beg\u00e4ran A \u2014 har en s\u00e5dan hash \u2014 och den betj\u00e4nas av server 2. Beg\u00e4ran B \u2014 av server 3. Och s\u00e5 vidare.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fcdbd1caa9f1162cf02e8b0a1c79cb74.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVad h\u00e4nder i denna situation vid resurshantering?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7386cda826e9419d5f8a9a0d6d6703c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi invalidiserar inte hela cachen, som f\u00f6rut, och flyttar inte alla nycklar, utan vi flyttar varje sektor en liten bit s\u00e5 att den lediga platsen, s\u00e5 att s\u00e4ga, kan rymma v\u00e5r sj\u00e4tte server som vi vill l\u00e4gga till och l\u00e4gger till den d\u00e4r.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8680e0cf023ce911b4d162e9102c0545.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSj\u00e4lvklart, i en s\u00e5dan situation kan nycklarna ocks\u00e5 strula. Men de fungerar mycket b\u00e4ttre \u00e4n tidigare. Vi ser att v\u00e5ra tv\u00e5 f\u00f6rsta nycklar har stannat kvar p\u00e5 sina servrar, och endast den cache-server som f\u00f6r\u00e4ndrats r\u00f6r den senaste nyckeln. Det fungerar tillr\u00e4ckligt effektivt, och om du l\u00e4gger till nya v\u00e4rdar gradvis, finns det inget stort problem. Du l\u00e4gger till lite i taget, v\u00e4ntar tills cachen fylls p\u00e5 igen, och allt fungerar bra.<\/p>\n<p>Den enda fr\u00e5gan som kvarst\u00e5r vid fel \u00e4r vad som h\u00e4nder om n\u00e5gon maskin g\u00e5r s\u00f6nder.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8e3301af782ce8983716c4bc9add79a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch vi skulle inte g\u00e4rna vilja beh\u00f6va regenerera den h\u00e4r kartan, ogiltigf\u00f6rklara en del av cachen och s\u00e5 vidare, om en maskin exempelvis skulle starta om och vi m\u00e5ste hantera f\u00f6rfr\u00e5gningar. Vi har bara en reservfotov\u00e4rd p\u00e5 varje plats som fungerar som en ers\u00e4ttning f\u00f6r vilken maskin som helst som just nu \u00e4r ur funktion. Och om pl\u00f6tsligt n\u00e5gon server blir otillg\u00e4nglig, g\u00e5r trafiken dit. Vi har, naturligtvis, ingen cache d\u00e4r, dvs. den \u00e4r kall, men \u00e5tminstone hanteras anv\u00e4ndarnas f\u00f6rfr\u00e5gningar. Om detta \u00e4r en kort tidsperiod klarar vi det helt enkelt. Det blir bara mer belastning p\u00e5 lagringen. Om det \u00e4r en l\u00e4ngre period kan vi fatta beslut \u2014 att ta bort den servern fr\u00e5n kartan eller inte, eller kanske ers\u00e4tta den med en annan.<\/p>\n<p>Detta g\u00e4ller cachesystemet. L\u00e5t oss titta p\u00e5 resultaten.<\/p>\n<p>Det verkar som om det inte finns n\u00e5got komplicerat h\u00e4r. Men den h\u00e4r metoden f\u00f6r att hantera cachen har gett oss en tr\u00e4ffs\u00e4kerhet p\u00e5 cirka 98%. Det betyder att av de 80 000 f\u00f6rfr\u00e5gningarna per sekund n\u00e5r endast 1 600 lagringarna, och det \u00e4r helt normal belastning, de klarar det lugnt, vi har alltid en buffert.<\/p>\n<p>Vi har placerat dessa servrar i tre av v\u00e5ra datacenter och har f\u00e5tt tre n\u00e4rvaropunkter \u2014 Prag, Miami och Hongkong.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/64eef492b65a014d8ba3c808b6579b41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00e4rmed \u00e4r de mer eller mindre lokaliserade till var och en av v\u00e5ra m\u00e5lmarknader.<\/p>\n<p>Och som en trevlig bonus fick vi den h\u00e4r caching-proxy, d\u00e4r CPU:n faktiskt \u00e4r relativt inaktiv, eftersom den inte beh\u00f6vs i s\u00e5 stor utstr\u00e4ckning f\u00f6r att leverera inneh\u00e5llet. Och d\u00e4r har vi med hj\u00e4lp av NGINX + Lua implementerat mycket anv\u00e4ndbar logik.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b65c609df5e1985240d04ee65a3e4f55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTill exempel kan vi experimentera med webp eller progressive jpeg (detta \u00e4r moderna, effektiva format), se hur det p\u00e5verkar trafiken, fatta vissa beslut, aktivera f\u00f6r vissa l\u00e4nder osv.; g\u00f6ra dynamisk storleks\u00e4ndring eller besk\u00e4rning av bilder i realtid.<\/p>\n<p>Det h\u00e4r \u00e4r ett bra anv\u00e4ndningsfall, n\u00e4r du, till exempel, har en mobilapp som visar bilder, och mobilappen inte vill anv\u00e4nda klientens CPU f\u00f6r att beg\u00e4ra en stor bild och sedan \u00e4ndra dess storlek till en viss storlek f\u00f6r att passa i vyn. Vi kan helt enkelt dynamiskt ange vissa parametrar i URL:en i UPort, och bildcachet kommer automatiskt att \u00e4ndra storlek p\u00e5 bilden. Vanligtvis kommer det att v\u00e4lja den storlek som vi fysiskt har p\u00e5 disken, s\u00e5 n\u00e4ra den beg\u00e4rda storleken som m\u00f6jligt, och downsizza den till de specifika koordinaterna.<\/p>\n<blockquote><p>F\u00f6rresten har vi publicerat videoinspelningar fr\u00e5n de senaste fem \u00e5ren av konferenser f\u00f6r utvecklare av h\u00f6gbelastade system. <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/\">HighLoad++<\/a><\/noindex>. Titta, l\u00e4r er, dela och prenumerera p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/user\/profyclub\">YouTube-kanalen.<\/a><\/noindex>.<\/p><\/blockquote>\n<p>\nVi kan ocks\u00e5 l\u00e4gga till mycket produktlogik d\u00e4r. Till exempel kan vi baserat p\u00e5 URL-parametrarna l\u00e4gga till olika vattenst\u00e4mplar, vi kan sudda bilder, oskarpa eller pixla dem. Detta \u00e4r n\u00e4r vi vill visa en bild av en person men inte vill visa deras ansikte, vilket fungerar bra; allt detta \u00e4r implementerat h\u00e4r.<\/p>\n<p>Vad har vi f\u00e5tt? Vi har f\u00e5tt tre punkter f\u00f6r n\u00e4rvaro, en bra hitrate, och samtidigt st\u00e5r inte CPU:n stilla p\u00e5 dessa maskiner. Den har nu blivit viktigare \u00e4n tidigare. Vi beh\u00f6ver installera kraftfullare maskiner, men det \u00e4r v\u00e4rt det.<\/p>\n<p>Detta handlar om bildutbyte. H\u00e4r \u00e4r allt ganska klart och uppenbart. Jag tror att jag inte har avsl\u00f6jat n\u00e5got nytt - s\u00e5 h\u00e4r fungerar praktiskt taget alla CDN.<\/p>\n<p>Och det \u00e4r troligt att den kr\u00e4sna lyssnaren kan ha undrat: varf\u00f6r inte bara ta och byta allt till CDN? Det skulle vara ungef\u00e4r samma sak, alla moderna CDN kan g\u00f6ra detta. Och h\u00e4r \u00e4r flera orsaker.<\/p>\n<p>F\u00f6rsta \u2014 det handlar om bilder.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/592c10eb74d46191bfcedec120f68556.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDetta \u00e4r en av de nyckelpunkter i v\u00e5r infrastruktur, och vi beh\u00f6ver s\u00e5 mycket kontroll som m\u00f6jligt \u00f6ver dem. Om det \u00e4r en l\u00f6sning fr\u00e5n en extern leverant\u00f6r, och du har ingen makt \u00f6ver det, kommer det att bli ganska sv\u00e5rt att leva med detta n\u00e4r du har en stor datam\u00e4ngd och en mycket h\u00f6g anv\u00e4ndarf\u00f6rfr\u00e5gningsstr\u00f6m.<\/p>\n<p>L\u00e5t mig ge ett exempel. Just nu kan vi p\u00e5 v\u00e5r infrastruktur, till exempel om det uppst\u00e5r n\u00e5gra problem eller underjordiska knackningar, g\u00e5 in p\u00e5 maskinen och debugga d\u00e4r, s\u00e5 att s\u00e4ga. Vi kan l\u00e4gga till insamling av vissa m\u00e4tv\u00e4rden som endast vi beh\u00f6ver, vi kan experimentera och se hur det p\u00e5verkar graferna och s\u00e5 vidare. Just nu samlas det in mycket statistik om denna cache-kluster. Och vi tittar periodiskt p\u00e5 den och unders\u00f6ker l\u00e4nge vissa anomalier. Om det hade varit p\u00e5 CDN-sidan skulle det ha varit mycket sv\u00e5rare att kontrollera. Eller till exempel, om en olycka intr\u00e4ffar, vet vi vad som har h\u00e4nt, vi vet hur vi ska leva med det och hur vi ska \u00f6vervinna det. Det \u00e4r den f\u00f6rsta slutsatsen.<\/p>\n<p>Den andra slutsatsen \u00e4r ocks\u00e5 snarare historisk eftersom systemet har utvecklats l\u00e4nge, och det har funnits m\u00e5nga olika aff\u00e4rskrav vid olika tidpunkter, och de passar s\u00e4llan in i konceptet f\u00f6r CDN.<\/p>\n<p>Och punkten som f\u00f6ljer av den f\u00f6reg\u00e5ende \u2013<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/007cf3aed2f9cc12185fc3865bf9d196.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet \u00e4r att vi har mycket specifik logik i v\u00e5ra foto-cachar som inte alltid kan l\u00e4ggas till p\u00e5 beg\u00e4ran. Det \u00e4r osannolikt att n\u00e5got CDN kommer att l\u00e4gga till n\u00e5gra anpassade funktioner p\u00e5 din beg\u00e4ran. Till exempel, kryptering av URL:er, om du inte vill att kunden ska kunna \u00e4ndra n\u00e5got. Vill du byta URL p\u00e5 servern och kryptera den, och sedan \u00f6verl\u00e4mna vissa dynamiska parametrar h\u00e4r.<\/p>\n<p>Vilken slutsats dras? I v\u00e5rt fall \u00e4r CDN inte en s\u00e4rskilt bra alternativ.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/cfc2963cca2357cf6b0f63419a4dc436.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMen i ert fall, om ni har n\u00e5gra specifika aff\u00e4rskrav, kan ni sj\u00e4lva enkelt genomf\u00f6ra det jag har visat er. Och n\u00e4r det g\u00e4ller en liknande belastningsprofil kommer det att fungera utm\u00e4rkt.<\/p>\n<p>Men om ni har en allm\u00e4n l\u00f6sning, och uppgiften inte \u00e4r s\u00e4rskilt specifik, kan ni lugnt anv\u00e4nda CDN. Eller om tiden och resurserna \u00e4r mycket viktigare f\u00f6r er \u00e4n kontroll.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b76d25404918a5d0d8bf1d6644c8d873.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOch moderna CDN har praktiskt taget allt det jag just har ber\u00e4ttat om. Med undantag f\u00f6r vissa funktioner.<\/p>\n<p>Detta g\u00e4ller fotoleveransen.<\/p>\n<p>L\u00e5t oss nu g\u00e5 fram\u00e5t i v\u00e5r retrospektiv och prata om lagring.<\/p>\n<p>\u00c5r 2013.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f218bfc899512041967842430c02aa9b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCache-servrar har lagts till, prestandaproblem har f\u00f6rsvunnit. Allt \u00e4r bra. Datasetet v\u00e4xer. \u00c5r 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\u00e5 n\u00e4stan ett petabyte totalt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/ef741ba4a9164e6940f55e93dfb46ef0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMed tillv\u00e4xten av datasetet \u00f6kade driftskostnaderna kraftigt. Hur manifesterade detta sig?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6cf5e489a4e97bc6e26fc6d4d16505b5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI den h\u00e4r diagrammet, som visar SAN-systemet med anslutna maskiner och cacher, finns det m\u00e5nga felpunkter. Vi har hanterat problem med cache-servrar tidigare, d\u00e4r \u00e4r allt mer eller mindre f\u00f6ruts\u00e4gbart och klart, men p\u00e5 lagringssidan var det mycket v\u00e4rre.<\/p>\n<p>F\u00f6r det f\u00f6rsta, sj\u00e4lva Storage Area Network (SAN) kan misslyckas.<\/p>\n<p>F\u00f6r det andra \u00e4r den ansluten via fiber till slutmaskinerna. Det kan uppst\u00e5 problem med fiberkorten och switcharna.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/6959b79284c5b1244a70a1d64f191893.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet finns naturligtvis inte s\u00e5 m\u00e5nga felpunkter som med sj\u00e4lva SAN:et, men det \u00e4r \u00e4nd\u00e5 potentiella felpunkter.<\/p>\n<p>Sedan \u00e4r det sj\u00e4lva maskinen som \u00e4r kopplad till lagringssystemet. Den kan ocks\u00e5 g\u00e5 s\u00f6nder.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/1801cb502663a4de14329a5e67dfed79.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 vi har totalt tre felpunkter.<\/p>\n<p>F\u00f6rutom felpunkterna \u00e4r det ocks\u00e5 en tung underh\u00e5llsbelastning av lagringssystemen.<\/p>\n<p>Det \u00e4r en komplex multikomponentsystem, och systemingenj\u00f6rer kan ha det sv\u00e5rt med det.<\/p>\n<p>Och den sista, mest viktiga punkten. Om n\u00e5got av dessa tre punkter misslyckas, finns det en icke-noll sannolikhet att f\u00f6rlora anv\u00e4ndardata, eftersom filsystemet kan skadas.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/4bf8bc1c73a2beef74cb4ee0ee45679b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnta att v\u00e5rt filsystem har skadats. \u00c5terst\u00e4llningen tar, f\u00f6r det f\u00f6rsta, l\u00e5ng tid - det kan ta en vecka vid stora datam\u00e4ngder. F\u00f6r det andra kommer vi troligen att f\u00e5 en massa oklara filer, som p\u00e5 n\u00e5got s\u00e4tt m\u00e5ste matchas med anv\u00e4ndarnas bilder. Och vi riskerar att f\u00f6rlora data. Risken \u00e4r ganska h\u00f6g. Ju oftare s\u00e5dana situationer intr\u00e4ffar och ju fler problem som uppst\u00e5r i hela denna kedja, desto h\u00f6gre blir denna risk.<\/p>\n<p>Vi m\u00e5ste g\u00f6ra n\u00e5got \u00e5t det. Och vi beslutade att helt enkelt s\u00e4kerhetskopiera data. Det \u00e4r faktiskt en uppenbar och bra l\u00f6sning. Vad gjorde vi?<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f80ec2b65003c40bd2fabf88966b3e05.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 h\u00e4r s\u00e5g v\u00e5r server ut som var ansluten till lagringssystemet tidigare. Det \u00e4r en huvudpartition, det \u00e4r helt enkelt en blocenhet som i praktiken representerar en montering p\u00e5 ett avl\u00e4gset lagringssystem via fiber.<\/p>\n<p>Vi lade helt enkelt till en andra partition.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d3dba75ef477269d92145cd69d587527.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi installerade en andra lagring bredvid (lyckligtvis \u00e4r det inte s\u00e5 dyrt), och kallade den f\u00f6r backup-partition. Den \u00e4r ocks\u00e5 ansluten via fiber, samma maskin. Men vi beh\u00f6ver p\u00e5 n\u00e5got s\u00e4tt synkronisera data mellan dem.<\/p>\n<p>H\u00e4r g\u00f6r vi bara en asynkron k\u00f6 bredvid.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/67bced2b45c589009cfb01a1c21398a5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen \u00e4r inte s\u00e5 belastad. Vi vet att vi har f\u00e5 poster. K\u00f6n \u00e4r bara en tabell i MySQL d\u00e4r rader skrivs in som \"beh\u00f6ver s\u00e4kerhetskopiera den h\u00e4r bilden\". Vid vilket \u00e4ndring eller vid uppladdning kopierar vi fr\u00e5n huvudpartitionen till backup med asynkron eller helt enkelt en bakgrundsprocess.<\/p>\n<p>S\u00e5 p\u00e5 detta s\u00e4tt har vi alltid tv\u00e5 konsekventa partitioner. \u00c4ven om en del av systemet g\u00e5r ner kan vi alltid byta huvudsidan med backup, och allt forts\u00e4tter att fungera.<\/p>\n<p>Men p\u00e5 grund av detta \u00f6kar belastningen p\u00e5 l\u00e4sning kraftigt, eftersom f\u00f6rutom kunder som l\u00e4ser fr\u00e5n huvudpartitionen, eftersom de f\u00f6rst ser bilden d\u00e4r (den \u00e4r ju nyare d\u00e4r), och sedan letar p\u00e5 backup om de inte hittade den (men det g\u00f6r NGINX), s\u00e5 l\u00e4ser \u00e4ven v\u00e5rt backupsystem nu fr\u00e5n huvudpartitionen. Det var inte riktigt en flaskhals, men vi ville inte \u00f6ka belastningen, i stort sett, helt i on\u00f6dan.<\/p>\n<p>Och vi lade till en tredje disk, som \u00e4r en liten SSD, och kallade den f\u00f6r buffert.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fd35481822b4170087e5f670bf338dc5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5 h\u00e4r fungerar det nu.<\/p>\n<p>Anv\u00e4ndaren laddar upp en bild till bufferten, sedan skickas en h\u00e4ndelse till k\u00f6n om att den b\u00f6r kopieras till de tv\u00e5 partitionerna. Den kopieras, och bilden lever ett tag (l\u00e5t oss s\u00e4ga en dag) i bufferten, och f\u00f6rst efter det rensas den. Det f\u00f6rb\u00e4ttrar anv\u00e4ndarupplevelsen avsev\u00e4rt, eftersom anv\u00e4ndaren laddar upp en bild, och som regel b\u00f6rjar f\u00f6rfr\u00e5gningar omedelbart komma in, eller att anv\u00e4ndaren uppdaterar sidan, g\u00f6r en refresh. Men allt beror p\u00e5 applikationen som g\u00f6r uppladdningen.<\/p>\n<p>Eller, till exempel, andra personer som b\u00f6rjar se bilden skickar omedelbart f\u00f6rfr\u00e5gningar f\u00f6r den. Den finns \u00e4nnu inte i cachen, den f\u00f6rsta f\u00f6rfr\u00e5gan g\u00e5r v\u00e4ldigt snabbt. I princip \u00e4r det samma som med bildcachen. Den l\u00e5ngsamma lagringen deltar \u00f6verhuvudtaget inte i detta. Och n\u00e4r den rensats efter en dag \u00e4r den antingen cachad p\u00e5 v\u00e5rt cachelager, eller s\u00e5 \u00e4r den antagligen ingen l\u00e4ngre beh\u00f6vlig. Det vill s\u00e4ga att anv\u00e4ndarupplevelsen h\u00e4r har f\u00f6rb\u00e4ttrats kraftigt tack vare s\u00e5dana enkla manipulationer.<\/p>\n<p>Och viktigast av allt: vi har slutat f\u00f6rlora data.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/526f549457dd0c438f32b0adb76df76c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi kan s\u00e4ga att vi har slutat <em>potentiellt<\/em> att f\u00f6rlora data, eftersom vi faktiskt inte f\u00f6rlorade dem. Men risken fanns. Vi ser att en s\u00e5dan l\u00f6sning s\u00e5 klart \u00e4r bra, men den liknar n\u00e5got av en symtomlindring av problemet, snarare \u00e4n att l\u00f6sa det helt. Och vissa problem kvarst\u00e5r h\u00e4r.<\/p>\n<p>F\u00f6r det f\u00f6rsta, det \u00e4r en felpunkt i form av den fysiska v\u00e4rd som all denna maskinvara k\u00f6rs p\u00e5, den har inte f\u00f6rsvunnit.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0eb3d292655a7edf912793ed81e8931c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00f6r det andra, det kvarst\u00e5r problem med SAN, dess tunga underh\u00e5ll etc. Det var inte direkt en kritisk faktor, men vi ville pr\u00f6va att leva utan det p\u00e5 n\u00e5got s\u00e4tt.<\/p>\n<p>Och vi gjorde tredje versionen (i praktiken \u00e4r det egentligen den andra) \u2014 en version f\u00f6r redundans. Hur s\u00e5g det ut?<\/p>\n<p>Det var som f\u00f6ljande \u2014<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/8b1749b6feed200f8a64529ee2316c1a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe st\u00f6rsta problemen vi har \u00e4r med det fysiska v\u00e4rden.<\/p>\n<p>F\u00f6r det f\u00f6rsta tar vi bort SAN, eftersom vi vill experimentera, vi vill f\u00f6rs\u00f6ka med lokala h\u00e5rddiskar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/fd0f5a8627d9179fcbc7097c1c18505f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDetta \u00e4r redan \u00e5r 2014-2015, och vid den tidpunkten hade situationen med h\u00e5rddiskar och deras lagringskapacitet p\u00e5 en v\u00e4rd blivit mycket b\u00e4ttre. Vi beslutade, varf\u00f6r inte prova.<\/p>\n<p>Och d\u00e4refter tar vi helt enkelt v\u00e5r backup-partition och flyttar den fysiskt till en separat maskin.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/456e00bc8557d3340b06efcd1dde8a08.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5ledes f\u00e5r vi en s\u00e5dan schema. Vi har tv\u00e5 maskiner som lagrar identiska dataset. De backar helt upp varandra och synkroniserar data \u00f6ver n\u00e4tverket via en asynkron k\u00f6 i samma MySQL.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/d44cdb7b440ad4c58cc625123306a8c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVarf\u00f6r detta fungerar bra \u2014 eftersom vi har f\u00e5 skrivningar. Dvs. om skrivningen var j\u00e4mf\u00f6rbar med l\u00e4sningen, kanske vi skulle f\u00e5 n\u00e5gon n\u00e4tverks\u00f6verbelastning och problem. F\u00e5 skrivningar, mycket l\u00e4sningar \u2014 denna metod fungerar bra, dvs. vi kopierar relativt s\u00e4llan bilder mellan dessa tv\u00e5 servrar.<\/p>\n<p>Hur detta fungerar, om man tittar lite mer detaljerat.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/071c11abb6ee1d7734c53052139ff04b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUpload. Lastbalanseraren v\u00e4ljer helt enkelt slumpm\u00e4ssiga v\u00e4rdar med ett par och g\u00f6r upload till dem. Under tiden g\u00f6r den sj\u00e4lvklart h\u00e4lsokontroller, 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\u00f6 till dess granne. Med upload \u00e4r det extremt enkelt.<\/p>\n<p>Uppgiften \u00e4r n\u00e5got mer komplex.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f494904aec823456e18b987a8c98bf56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nH\u00e4r hj\u00e4lpte Lua oss, eftersom det \u00e4r ganska sv\u00e5rt att skapa en s\u00e5dan logik med vanilla NGINX. F\u00f6rst g\u00f6r vi en beg\u00e4ran till den f\u00f6rsta servern, kollar om bilden finns d\u00e4r, eftersom den potentiellt kan ha laddats upp till en granne och \u00e4nnu inte n\u00e5tt hit. Om bilden finns d\u00e4r \u00e4r det bra. Vi ger den genast till kunden och kanske cachar den.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/de5f77e997bb049f4cfc1709da0f1788.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOm den inte finns, g\u00f6r vi helt enkelt en beg\u00e4ran till grannen och f\u00e5r den garanterat d\u00e4rifr\u00e5n.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/79aa5592acd28dfbc815261d0276c2e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u00e5ledes kan vi \u00e5terigen s\u00e4ga: det kan uppst\u00e5 problem med prestanda, eftersom st\u00e4ndiga round trips \u2014 bilden som laddades upp, h\u00e4r finns den inte, vi g\u00f6r tv\u00e5 f\u00f6rfr\u00e5gningar ist\u00e4llet f\u00f6r en, detta b\u00f6r fungera l\u00e5ngsamt.<\/p>\n<p>I v\u00e5r situation fungerar det inte l\u00e5ngsamt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/52ca3902d80990f512201672cd5e6441.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi samlar massor av m\u00e4tningar p\u00e5 detta system, och den hypotetiska tr\u00e4fffrekvensen f\u00f6r denna mekanism ligger p\u00e5 ungef\u00e4r 95%. Det vill s\u00e4ga, lagget p\u00e5 denna backup \u00e4r litet, och tack vare detta f\u00e5r vi praktiskt taget garanterat, efter att en bild har laddats upp, den redan vid f\u00f6rsta f\u00f6rs\u00f6ket och g\u00e5r aldrig dit tv\u00e5 g\u00e5nger.<\/p>\n<p>S\u00e5 p\u00e5 s\u00e5 s\u00e4tt, vad har vi ocks\u00e5 f\u00e5tt, och vad \u00e4r verkligen coolt?<\/p>\n<p>Tidigare hade vi en huvudbackup-sektion och l\u00e4ste sekventiellt fr\u00e5n dem. Det vill s\u00e4ga, vi s\u00f6kte alltid f\u00f6rst p\u00e5 huvudservern och sedan p\u00e5 backupen. Det var ett steg.<\/p>\n<p>Nu utnyttjar vi l\u00e4sning fr\u00e5n tv\u00e5 maskiner samtidigt. Vi f\u00f6rdelar beg\u00e4rningarna med Round Robin. I en liten procentandel av fallen g\u00f6r vi tv\u00e5 f\u00f6rfr\u00e5gningar. Men nu har vi helt enkelt dubbelt s\u00e5 mycket kapacitet f\u00f6r l\u00e4sning som vi hade tidigare. Och belastningen har verkligen minskat b\u00e5de p\u00e5 avl\u00e4mningsmaskinerna och p\u00e5 lagringssystemen, som ocks\u00e5 fanns vid den tidpunkten.<\/p>\n<p>N\u00e4r det g\u00e4ller h\u00f6g tillg\u00e4nglighet. I grund och botten var det detta vi k\u00e4mpade mest f\u00f6r. H\u00f6g tillg\u00e4nglighet h\u00e4r har fungerat fantastiskt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/a030a477e60d6e1f3d0b4e3395013df5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn maskin g\u00e5r ner.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/42900b24e340c03ea642fd49f5b410ff.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInga problem! Systemingenj\u00f6ren kan till och med sova vidare p\u00e5 natten, v\u00e4nta till morgonen, ingenting hemskt kommer att h\u00e4nda.<\/p>\n<p>Om \u00e4ven k\u00f6n g\u00e5r ner n\u00e4r denna maskin faller ut, inga problem, loggen kommer f\u00f6rst att samlas p\u00e5 den levande maskinen, och sedan f\u00f6rs\u00f6ka igen till k\u00f6n, och d\u00e4refter till den maskin som kommer att \u00e5terst\u00e4llas efter en tid.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/ef42eadaaf3e3ecbf70847e9f88c1582.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSamma sak med underh\u00e5ll. Vi st\u00e4nger helt enkelt av en av maskinerna, plockar manuellt bort den fr\u00e5n alla pooler, trafiken upph\u00f6r, vi g\u00f6r n\u00e5got underh\u00e5ll, fixar lite d\u00e4r, och efter det s\u00e4tter vi tillbaka den i drift, och den h\u00e4r backupen hinner ifatt ganska snabbt. D.v.s. en nedtid p\u00e5 en maskin hinner ifatt inom n\u00e5gra minuter p\u00e5 ett dygn. Det \u00e4r verkligen v\u00e4ldigt lite. Med h\u00f6g tillg\u00e4nglighet, som jag sagt tidigare, \u00e4r allt riktigt bra h\u00e4r.<\/p>\n<p>Vilka slutsatser kan vi dra fr\u00e5n det h\u00e4r schemat med redundans?<\/p>\n<p>Vi har uppn\u00e5tt h\u00f6g tillg\u00e4nglighet.<\/p>\n<p>Enkel drift. Eftersom maskinerna har lokala h\u00e5rddiskar \u00e4r det mycket mer bekv\u00e4mt ur ett driftsperspektiv f\u00f6r ingenj\u00f6rerna som arbetar med detta.<\/p>\n<p>Vi har f\u00e5tt dubbel marginal f\u00f6r l\u00e4sning.<\/p>\n<p>Detta \u00e4r en mycket bra bonus p\u00e5 pluskontot f\u00f6r h\u00f6g tillg\u00e4nglighet.<\/p>\n<p>Men det finns ocks\u00e5 problem. Nu har vi en betydligt mer komplex utveckling av funktioner kopplade till detta, eftersom systemet nu \u00e4r 100% eventual consistent.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/b650276a41730cc303180e8304c5dabb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVi m\u00e5ste, s\u00e4g, t\u00e4nka st\u00e4ndigt i n\u00e5got background job: \"Vilken server k\u00f6r vi just nu?\", \"Finns det verkligen en aktuell bild h\u00e4r?\" o.s.v. Detta \u00e4r naturligtvis allt inpackat i wrappers, och f\u00f6r programmeraren som skriver aff\u00e4rslogik \u00e4r detta transparent. Men \u00e4nd\u00e5 har ett stort komplext lager tillkommit. Men vi \u00e4r beredda att acceptera detta i utbyte mot de f\u00f6rdelar vi f\u00e5tt.<\/p>\n<p>Och h\u00e4r uppst\u00e5r \u00e5terigen en viss konflikt.<\/p>\n<p>Jag sa tidigare att det var d\u00e5ligt att lagra allt p\u00e5 lokala h\u00e5rddiskar. Nu s\u00e4ger jag att vi gillar det.<\/p>\n<p>Ja, faktiskt, \u00f6ver tid har situationen f\u00f6r\u00e4ndrats avsev\u00e4rt, och nu har denna metod m\u00e5nga f\u00f6rdelar. F\u00f6r det f\u00f6rsta f\u00e5r vi en mycket mer enkel drift.<\/p>\n<p>F\u00f6r det andra \u00e4r det mer effektivt, eftersom vi inte har dessa automatiska kontroller, kopplingar till lagringssystem.<\/p>\n<p>Det finns en enorm maskinpark d\u00e4r, men h\u00e4r handlar det bara om n\u00e5gra h\u00e5rddiskar som \u00e4r samlade i RAID lokalt i maskinen.<\/p>\n<p>Men det finns ocks\u00e5 nackdelar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/3c090e0801f1a686dc0d5fefce697c56.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDet \u00e4r ungef\u00e4r 1,5 g\u00e5nger dyrare \u00e4n att anv\u00e4nda SAN, \u00e4ven enligt dagens priser. D\u00e4rf\u00f6r valde vi att inte s\u00e5 r\u00e5tt konvertera hela v\u00e5r stora kluster till maskiner med lokala h\u00e5rddiskar, utan ist\u00e4llet beh\u00e5lla en hybridl\u00f6sning.<\/p>\n<p>H\u00e4lften av v\u00e5ra maskiner arbetar med h\u00e5rddiskar (n\u00e5ja, inte riktigt h\u00e4lften \u2013 kanske 30 procent). Den resterande delen \u00e4r gamla maskiner d\u00e4r den f\u00f6rsta backup-l\u00f6sningen tidigare var installerad. Vi omkonfigurerade dem, eftersom vi varken beh\u00f6ver n\u00e5gra nya data eller n\u00e5got annat, vi flyttade helt enkelt mounts fr\u00e5n en fysisk v\u00e4rd till tv\u00e5.<\/p>\n<p>Och vi fick en stor kapacitet f\u00f6r l\u00e4sning, och vi gjorde en uppgradering. Tidigare monterade vi en lagring p\u00e5 en maskin, nu monterar vi till exempel fyra p\u00e5 ett par. Och det fungerar bra.<\/p>\n<p>L\u00e5t oss sammanfatta kort vad vi har uppn\u00e5tt, vad vi har k\u00e4mpat f\u00f6r, och hur det har g\u00e5tt.<\/p>\n<h3>Sammanfattning<\/h3>\n<p>\nVi har anv\u00e4ndare \u2013 helt 33 miljoner.<\/p>\n<p>Vi har tre n\u00e4rvaro punkter \u2013 Prag, Miami, Hongkong.<\/p>\n<p>D\u00e4r finns ett cache-lager, best\u00e5ende av maskiner med snabba lokala diskar (SSD), d\u00e4r en enkel l\u00f6sning med NGINX k\u00f6rs, dess access.log och Python-daemoner som hanterar och administrerar cache.<\/p>\n<p>Om du \u00f6nskar kan du i ditt projekt, om dina bilder inte \u00e4r lika kritiska som de \u00e4r f\u00f6r oss, eller om trade-off mellan kontroll och utvecklingshastighet kostnader lutar \u00e5t det andra h\u00e5llet f\u00f6r dig, d\u00e5 kan du enkelt byta ut det mot en CDN, moderna CDN klarar detta bra.<\/p>\n<p>D\u00e4refter kommer lagringsskiktet, d\u00e4r vi har kluster av par av maskiner som s\u00e4kerhetskopierar varandra, asynkront kopieras filer fr\u00e5n en till en annan vid varje \u00e4ndring.<\/p>\n<p>N\u00e5gra av dessa maskiner arbetar med lokala h\u00e5rddiskar.<\/p>\n<p>En del av dessa maskiner \u00e4r anslutna till SAN.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/5ddbc4f73d86aa1f83734885d8c9dea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c5 ena sidan \u00e4r det mer praktiskt att anv\u00e4nda och n\u00e5got mer effektivt, \u00e5 andra sidan \u00e4r det bekv\u00e4mt ur t\u00e4tbyr\u00e5ns och kostnaden per gigabyte.<\/p>\n<p>Detta \u00e4r en kort \u00f6versikt av arkitekturen som vi har f\u00e5tt och hur allt har utvecklats.<\/p>\n<p>H\u00e4r \u00e4r n\u00e5gra ytterligare tips fr\u00e5n chefen, v\u00e4ldigt enkla.<\/p>\n<p>F\u00f6r det f\u00f6rsta, om du pl\u00f6tsligt best\u00e4mmer dig f\u00f6r att du br\u00e5dskande beh\u00f6ver f\u00f6rb\u00e4ttra alla fotoinfrastrukturer, m\u00e4t f\u00f6rst, f\u00f6r kanske beh\u00f6vs det inga f\u00f6rb\u00e4ttringar.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/7770f41d0b190eb78ae0d19f4c8182a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nL\u00e5t mig ge ett exempel. Vi har ett kluster av maskiner som levererar bilder fr\u00e5n bifogningar i chattar, och d\u00e4r fungerar fortfarande en l\u00f6sning fr\u00e5n 2009, och ingen lider av detta. Alla \u00e4r n\u00f6jda, alla gillar det.<\/p>\n<p>F\u00f6r att m\u00e4ta, b\u00f6rja med att s\u00e4tta upp en m\u00e4ngd metrik, titta p\u00e5 dem och avg\u00f6r sedan vad du \u00e4r missn\u00f6jd med och vad som beh\u00f6ver f\u00f6rb\u00e4ttras. F\u00f6r att kunna m\u00e4ta detta har vi ett h\u00e4ftigt verktyg som heter Pinba.<\/p>\n<p>Det g\u00f6r att du kan samla in detaljerad statistik fr\u00e5n NGINX f\u00f6r varje beg\u00e4ran, inklusive svarskoder och tidsf\u00f6rdelningar \u2014 allt du kan t\u00e4nka dig. Det finns bindningar till olika analytiska system, och du kan sedan se allt detta p\u00e5 ett snyggt s\u00e4tt.<\/p>\n<p>M\u00e4t f\u00f6rst \u2014 f\u00f6rb\u00e4ttra sedan.<\/p>\n<p>Vidare. Vi optimerar l\u00e4sningen med cache och skrivningen med sharding, men det \u00e4r en uppenbar punkt.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f53a4777f1a2c7793eba4a72c94263a4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nVidare. Om du just nu b\u00f6rjar bygga ditt system, s\u00e5 \u00e4r det mycket b\u00e4ttre att g\u00f6ra foton som of\u00f6r\u00e4nderliga filer. Eftersom du genast slipper en hel klass av problem med cache-invalidering och hur logiken ska hitta r\u00e4tt version av bilden, och s\u00e5 vidare.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/f345c59681275326cda1320b4f188ce9.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAnta att du laddat upp en hundra, sedan har du roterat den, se till att det blir en fysiskt annan fil. Det vill s\u00e4ga, t\u00e4nk inte: nu sparar jag lite plats genom att spela in i samma fil och \u00e4ndra versionen. Det fungerar alltid d\u00e5ligt, och det blir mycket huvudv\u00e4rk senare.<\/p>\n<p>N\u00e4sta punkt. Om resizing i realtid.<\/p>\n<p>Tidigare, n\u00e4r anv\u00e4ndare laddade upp en bild, skar vi omedelbart upp ett stort antal storlekar f\u00f6r alla t\u00e4nkbara situationer, f\u00f6r olika kunder, och de l\u00e5g alla p\u00e5 disken. Nu har vi \u00f6vergivit detta.<\/p>\n<p>Vi har beh\u00e5llit endast tre grundl\u00e4ggande storlekar: liten, medium och stor. Allt annat downsizas fr\u00e5n den storlek som efterfr\u00e5gades i Uport, vi g\u00f6r helt enkelt downsizing och ger det till anv\u00e4ndaren.<\/p>\n<p>CPU:n i cache-lagret blir mycket billigare \u00e4n om vi st\u00e4ndigt skulle regenerera dessa storlekar p\u00e5 varje lagring. Anta att vi vill l\u00e4gga till en ny, det tar en m\u00e5nad \u2014 att k\u00f6ra ett skript \u00f6verallt som skulle g\u00f6ra detta noggrant utan att krascha klustret. S\u00e5 om det finns m\u00f6jlighet att v\u00e4lja nu, \u00e4r det b\u00e4ttre att g\u00f6ra s\u00e5 f\u00e5 fysiska storlekar som m\u00f6jligt, men \u00e4nd\u00e5 ha n\u00e5gon form av f\u00f6rdelning, s\u00e4g tre. Och allt annat kan bara resizingas i realtid med hj\u00e4lp av f\u00e4rdiga moduler. Det \u00e4r nu v\u00e4ldigt enkelt och tillg\u00e4ngligt.<\/p>\n<p>Och en inkrementell asynkron backup \u00e4r bra.<\/p>\n<p>Som v\u00e5r erfarenhet har visat fungerar en s\u00e5dan schema bra med att skjuta upp kopiering av \u00e4ndrade filer.<\/p>\n<p><img decoding=\"async\" alt=\"Arkitektur f\u00f6r lagring och hantering av foton p\u00e5 Badoo\" src=\"\/wp-content\/uploads\/2020\/01\/0e550721e838654e61e1fa4d08f9bb93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDen sista punkten \u00e4r ocks\u00e5 uppenbar. Om det inte finns n\u00e5gra s\u00e5dana problem i din infrastruktur nu, men det finns n\u00e5got som kan g\u00e5 s\u00f6nder, s\u00e5 kommer det garanterat att g\u00e5 s\u00f6nder n\u00e4r belastningen \u00f6kar lite. D\u00e4rf\u00f6r \u00e4r det b\u00e4st att t\u00e4nka p\u00e5 detta i f\u00f6rv\u00e4g och slippa problem. Det var allt fr\u00e5n min sida.<\/p>\n<h3>Kontakter<\/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\/\">Baddoos f\u00f6retagsblogg<\/a><\/noindex><\/p>\n<blockquote><p>Denna rapport \u00e4r en transkription av en av de b\u00e4sta presentationerna p\u00e5 konferensen f\u00f6r utvecklare av h\u00f6gbelastade system <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>. Det \u00e4r mindre \u00e4n en m\u00e5nad kvar till konferensen HighLoad++ 2017.<\/p>\n<p>Vi har redan f\u00f6rberett <noindex><a rel=\"nofollow\" href=\"http:\/\/www.highload.ru\/2017\/abstracts\">Konferensprogrammet<\/a><\/noindex>, och schemat h\u00e5ller just nu p\u00e5 att f\u00e4rdigst\u00e4llas.<\/p>\n<p>I \u00e5r forts\u00e4tter vi att utforska \u00e4mnet arkitekturer och skalning:<\/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\">Hur man betj\u00e4nar en miljard anv\u00e4ndare och levererar terabittrafik<\/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\">Hur man skriver om databasen f\u00f6r direktmeddelanden i VKontakte fr\u00e5n grunden och migrerar till den utan nedtid<\/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\">D\u00f6den av en utf\u00f6rs\u00e4ljning: hur Yandex.Money f\u00f6rs\u00f6kte \u00f6ka hastigheten inf\u00f6r Black Friday och klara sig<\/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\">Felaktig hantering av den frontala systemarkitekturen f\u00f6r banken<\/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\">Arkitekturen f\u00f6r betalningssystemet: n\u00e4stan enterprise<\/a><\/noindex> \/ \u0424\u0438\u043b\u0438\u043f\u043f \u0414\u0435\u043b\u044c\u0433\u044f\u0434\u043e<\/li>\n<\/ul>\n<p>\n\u00c4ven n\u00e5gra av dessa material anv\u00e4nds av oss i v\u00e5r utbildningskurs online om utveckling av h\u00f6gbelastade system <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> \u00e4r en kedja av noggrant utvalda brev, artiklar, material och videor. Redan nu finns det mer \u00e4n 30 unika material i v\u00e5r l\u00e4robok. Anslut er!\n<\/p><\/blockquote>\n<p>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Arkitektur f\u00f6r lagring och leverans av fotografier i Badoo | ProHoster","description":"Artem Denisov (","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/arhitektura-hraneniya-i-otdachi-fotografij-v-badoo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/55009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=55009"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/55009\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=55009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=55009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=55009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}