{"id":91090,"date":"2020-08-08T13:42:11","date_gmt":"2020-08-08T11:42:11","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage"},"modified":"2020-08-08T13:42:11","modified_gmt":"2020-08-08T11:42:11","slug":"arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","title":{"rendered":"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/a53775776b3fc969cc15c9d13a64039d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em><noindex><a rel=\"nofollow\" href=\"https:\/\/www.deviantart.com\/st-pete\/art\/Storage-Corridor-408874509\">Lagr\u00e4dd korridor<\/a><\/noindex> av St-Pete<\/em><\/p>\n<p><\/p>\n<p>Hej alla! Jag heter Mons Anderson, plattformsarkitekt <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.ru Cloud Solutions<\/a><\/noindex>, och jag kommer att ber\u00e4tta hur vi byggde v\u00e5rt S3-lagring, hur det fungerar, vilka l\u00f6sningar som var framg\u00e5ngsrika och vilka vi skulle ha \u00e4ndrat om vi skulle starta ett liknande projekt fr\u00e5n b\u00f6rjan idag.<\/p>\n<p><\/p>\n<p>Artikeln \u00e4r baserad p\u00e5 en presentation p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Databases Meetup<\/a><\/noindex> av Mail.ru Cloud Solutions &amp; Tarantool. I artikeln kommer vi att diskutera:<\/p>\n<p><\/p>\n<ul>\n<li>hur lagringen p\u00e5 Mail.ru var organiserad, som vi byggde v\u00e5rt S3-lagring p\u00e5;<\/li>\n<li>vad vi lade till f\u00f6r att skapa Mail.ru Cloud Storage;<\/li>\n<li>hur objektlagringsmodellen fungerar och vilka steg som har tagits f\u00f6r att komma till produktion;<\/li>\n<li>om f\u00f6rb\u00e4ttringar av produktionssystemet: failover och skalning;<\/li>\n<li>hur vi implementerade shardning och resharding;<\/li>\n<li>samt om hantering av SSL-certifikat.<\/li>\n<\/ul>\n<p><\/p>\n<p>Om du inte vill l\u00e4sa kan du <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/NEgm1nsv-qg\">titta<\/a><\/noindex>.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"kak-bylo-ustroeno-hranilische-mailru-poverh-kotorogo-my-stroili-s3-hranilische\">Hur lagringen p\u00e5 Mail.ru var organiserad, som vi byggde v\u00e5rt S3-lagring p\u00e5<\/h2>\n<p><\/p>\n<p>Utvecklingen av v\u00e5rt S3 b\u00f6rjade \u00f6ver Mail.ru Cloud-lagringen, d\u00e4rf\u00f6r \u00e4r det viktigt att f\u00f6rst ber\u00e4tta hur det \u00e4r organiserat och vad det kan g\u00f6ra.<\/p>\n<p><\/p>\n<p>Mail.ru:s molnlagring best\u00e5r av servrar med diskar. I genomsnitt \u00e4r en modern lagringsserver 36 diskar p\u00e5 12\u201314 terabyte. Tidigare var diskarna mindre, men under de senaste tre \u00e5ren har diskstorlekarna \u00f6kat och idag \u00e4r det n\u00e4stan en halv petabyte r\u00e5data. <\/p>\n<p><\/p>\n<p>Disken fr\u00e5n olika servrar i lagringen kombineras i s\u00e5 kallade \"par\". Ett par \u00e4r en enhet f\u00f6r lagring av filer. I grund och botten \u00e4r det en disk som \u00e4r monterad i en viss partition p\u00e5 en viss v\u00e4g, d\u00e4r filer som identifieras med hashar kan lagras. <\/p>\n<p><\/p>\n<p>Par \u00e4r en historisk ben\u00e4mning som har kvarst\u00e5tt till idag, \u00e4ven om det nu inte n\u00f6dv\u00e4ndigtvis bara \u00e4r tv\u00e5 diskar i ett par. Det kan finnas tre diskar, och det kan \u00e4ven finnas olika hybrida lagringar, till exempel 3\/2. <\/p>\n<p>\n<img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/544ab79846539262e2d4dff6ab95ffff.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Par (pair) \u2014 enheter f\u00f6r objektlagring<\/em><\/p>\n<p><\/p>\n<p>Alla par lagras i PairDB \u2014 en applikation baserad p\u00e5 Tarantool. Alla databaser i v\u00e5rt lagringssystem, fr\u00e5n de allra f\u00f6rsta, \u00e4r Tarantool; vi anv\u00e4nder inga andra databaser.<\/p>\n<p><\/p>\n<p>PairDB lagrar alla par, deras tillst\u00e5nd, ledigt utrymme, fel\u00f6verskridande m\u00f6jligheter och senaste fel. Det kan ocks\u00e5 sj\u00e4lv kontrollera paren, uppdatera deras status och verifiera om de fungerar eller inte. S\u00e5 PairDB \u00e4r en allm\u00e4n \u00f6versikt \u00f6ver tillst\u00e5ndet f\u00f6r alla diskar i v\u00e5rt system.<\/p>\n<p>\n<img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/d50781b8b51ed5fe126bc84e19c934d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Pair DB: databas med tillst\u00e5ndet hos par<\/em><\/p>\n<p><\/p>\n<p>I systemet lagras filer, och f\u00f6r att veta vilken fil som finns p\u00e5 vilken enhet, beh\u00f6vs en annan databas \u2013 FileDB. Den lagrar en mappning som definierar kopplingen: filen lagras p\u00e5 denna enhet, samt ett litet antal n\u00f6dv\u00e4ndiga attribut.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/b1a64737cf7f916bff446c10c1f01d4c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><em>File DB: platsen d\u00e4r filen lagras<\/em><\/p>\n<p>En annan viktig del \u00e4r tj\u00e4nsten Nylon, en router f\u00f6r att arbeta med databaser. Den fungerar som en enda ing\u00e5ngspunkt och g\u00f6r det m\u00f6jligt att arbeta via ett enhetligt gr\u00e4nssnitt med b\u00e5de PairDB och FileDB. Det \u00e4r en stateless-tj\u00e4nst, den utf\u00f6r belastningsbalansering av f\u00f6rfr\u00e5gningar, f\u00f6rst\u00e5r vilken shard FileDB som ska anv\u00e4ndas, och vet vilka enheter som \u00e4r aktiva och vilka som inte \u00e4r det.<\/p>\n<p>\n<img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/3e2225f229c8cfa462d620d2b5fb581e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Nylon: router f\u00f6r arbete med databaser<\/em><\/p>\n<p><\/p>\n<p>Inneh\u00e5ll m\u00e5ste ocks\u00e5 p\u00e5 n\u00e5got s\u00e4tt l\u00e4ggas till i lagringen. F\u00f6r detta finns en tj\u00e4nst \u2013 Streamer. Den tillhandah\u00e5ller tv\u00e5 HTTP-metoder: PUT-metoden f\u00f6r att ladda upp inneh\u00e5ll till lagringen och GET-metoden f\u00f6r att h\u00e4mta det d\u00e4rifr\u00e5n. HTTP \u00e4r ett ganska popul\u00e4rt och bekv\u00e4mt protokoll f\u00f6r datatransfer. <\/p>\n<p><\/p>\n<p>N\u00e4r vi kontaktar Streamer\u2019y, g\u00e5r han via Nylon till PairDB, tar reda p\u00e5 vilken par som kan ta emot filen, och \u00f6verf\u00f6r sedan data via WebDAV till den paren. <\/p>\n<p><\/p>\n<p>I grunden \u00e4r varje lagringsserver nginx plus diskar som \u00e4r monterade enligt angivna s\u00f6kv\u00e4gar. Vi kan ladda upp en fil till lagringen fr\u00e5n Streamer, ta bort den, d\u00f6pa om den eller kontrollera dess integritet. Det \u00e4r ett bekv\u00e4mt gr\u00e4nssnitt f\u00f6r l\u00e5g-niv\u00e5 interaktion med lagringen. <\/p>\n<p>\n<img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/3722a89ed44cace36e9cb1f8bee4bd1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Streamer: ing\u00e5ngspunkt till lagringen<\/em><\/p>\n<p><\/p>\n<h2 id=\"chto-my-dobavili-chtoby-sdelat-s3-hranilische\">Vad vi har lagt till f\u00f6r att skapa S3-lagring<\/h2>\n<p><\/p>\n<p>S\u00e5 vi har granskat den allm\u00e4nna baskonstruktionen av lagringen vid tidpunkten d\u00e5 vi planerade att lansera S3-lagringen. Med PUT-metoden kunde vi l\u00e4gga in godtyckligt inneh\u00e5ll d\u00e4r och f\u00e5 en hash som identifierare f\u00f6r dessa data. Med denna identifierare kunde vi senare \u00e5terv\u00e4nda och h\u00e4mta den ursprungliga filen. Men detta r\u00e4cker inte f\u00f6r att implementera S3. I S3-protokollet, f\u00f6rutom sj\u00e4lva lagringen av objekt, finns:<\/p>\n<p><\/p>\n<ul>\n<li>lagring av metadata \u2013 ytterligare egenskaper hos objekten;<\/li>\n<li>organisation av \u00e5tkomst till objekten via HTTP;<\/li>\n<li>gruppering av objekt i samlingar \u2013 buckets;<\/li>\n<li>HTTP-S3 Endpoint. S3 organiserar data i specifika strukturer \u2013 buckets, d\u00e4r varje bucket fungerar som en ing\u00e5ngspunkt f\u00f6r lagring av filer.<\/li>\n<\/ul>\n<p><\/p>\n<p>F\u00f6r att implementera denna logik beh\u00f6vdes en separat tj\u00e4nst. Vi ville ocks\u00e5 omedelbart ta h\u00e4nsyn till arkitekturen f\u00f6r vidare tillv\u00e4xt av tj\u00e4nsten med linj\u00e4r skalbarhet.<\/p>\n<p><\/p>\n<h2 id=\"pervye-komponenty\">De f\u00f6rsta komponenterna<\/h2>\n<p><\/p>\n<p>Demon som implementerar S3 API. Detta \u00e4r det standardiserade S3 API fr\u00e5n Amazon som st\u00f6der arbete med XML f\u00f6r metadata och m\u00f6jligg\u00f6r direkt \u00f6verf\u00f6ring av inneh\u00e5ll. Vi beh\u00f6vde inte uppfinna n\u00e5got, allt \u00e4r beskrivits och dokumenterat.<\/p>\n<p><\/p>\n<p>Vi st\u00e4llde ocks\u00e5 Nginx framf\u00f6r tj\u00e4nsten. Vi anv\u00e4nde det f\u00f6r SSL-termering, belastningsbalansering samt f\u00f6r viss logik i Lua (metrik, loggning och sp\u00e5rning).<\/p>\n<p><\/p>\n<p>F\u00f6r lagring av S3-metadata valde vi ocks\u00e5 Tarantool. I den f\u00f6rsta versionen h\u00e4mtade S3-demon metadata fr\u00e5n denna databas, medan inneh\u00e5llet lagrades i ett stort lagringsutrymme via Streamer.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/03dddec282b5bb41eb63748ccfb6c9a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Nginx + S3 API + metadata<\/em><\/p>\n<p><\/p>\n<h2 id=\"obektnaya-model-hraneniya\">Objektschema f\u00f6r lagring<\/h2>\n<p><\/p>\n<p>L\u00e5t oss se hur S3 fungerar. Anv\u00e4ndaren kan skapa en bucket - en samling av objekt. Buckets adresseras med hj\u00e4lp av v\u00e4rdnamnet och \u00e4r en underdom\u00e4n av tj\u00e4nsten. Inom en bucket kan anv\u00e4ndaren skapa objekt. Objektets identifierare kommer att vara URL:en. Inneh\u00e5llet i objektet \u00e4r en blob, en m\u00e4ngd bin\u00e4rdata som vi kommer att lagra i lagringsutrymmet. Varje objekt har ocks\u00e5 attribut: namn - samma URL, ACL (\u00e5tkomstkontrollista), och andra till\u00e4ggs- eller godtyckliga attribut - allt detta sparas i metadata. <\/p>\n<p><\/p>\n<p>Det normaliserade schemat f\u00f6r dessa data kan se ut s\u00e5 h\u00e4r: det finns projekt som \u00e4ger buckets, som innehar objekt, och objekten kan vara sammansatta. Eftersom ett s\u00e4tt att ladda upp objekt \u00e4r i delar, finns det tv\u00e5 hj\u00e4lptabeller f\u00f6r uppladdning: uploads och chunks. Projekten har ocks\u00e5 autentiseringsuppgifter f\u00f6r \u00e5tkomst och fakturering. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/e2bede45ba4044f658b47a9840fd5224.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Dataschema<\/em><\/p>\n<p><\/p>\n<p>Eftersom vi skapade en B2B-tj\u00e4nst med betalabonnemang beh\u00f6vdes det en faktureringsmodul i detta schema.<br \/>\nFaktureringssystemet implementerade vi ocks\u00e5 p\u00e5 Tarantool. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/d5b1a63e2273e933c95deecdb054bfe6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"dorabotki-s3-hranilischa-shagi-k-prodakshenu\">F\u00f6rb\u00e4ttringar av S3-lagring: steg mot produktion<\/h2>\n<p><\/p>\n<p>Vi har redan skapat en fungerande modell som kan anv\u00e4ndas: objekt och metadata lagrades, men f\u00f6r att g\u00e5 i produktion saknades n\u00e5gra punkter.<\/p>\n<p><\/p>\n<p>F\u00f6r det f\u00f6rsta \u00e4r det fr\u00e5ga om ett ratbegr\u00e4nsningssystem. Om vi k\u00f6r tj\u00e4nsten utan den, kunde vi vid h\u00f6g belastning oavsiktligt \u00f6verbelasta en del av systemet. Ratbegr\u00e4nsningen b\u00f6r fungera s\u00e5 h\u00e4r: varje S3-f\u00f6rfr\u00e5gan kommer till en specifik v\u00e4rd, den h\u00e4r v\u00e4rden \u00e4r identifieraren f\u00f6r en bucket, och bucketen tillh\u00f6r en viss kund. Vi beh\u00f6ver definiera en funktion f\u00f6r bucketen som skulle m\u00f6jligg\u00f6ra ber\u00e4kning av ratbegr\u00e4nsningen. <\/p>\n<p><\/p>\n<p>Dessutom b\u00f6r ratbegr\u00e4nsningssystemet vara tillr\u00e4ckligt effektivt f\u00f6r att hantera den belastning som kommer till S3.<\/p>\n<p><\/p>\n<p>H\u00e4r anv\u00e4nde vi \u00e5terigen Tarantool. Ratbegr\u00e4nsningarna \u00e4r en kluster av 21 instanser, instanserna \u00e4r uppdelade i grupper, f\u00f6rdelade \u00f6ver tre fysiska noder och sammanfogade i ett stort topologiskt kluster. Konfigurations\u00e4ndringar sprids automatiskt \u00f6ver klustret: ratbegr\u00e4nsningar, standardv\u00e4rden och konfiguration. Varje bucket hanteras strikt av en instans. N\u00e4r en f\u00f6rfr\u00e5gan kommer till en specifik bucket ber\u00e4knas den ansvariga instansen f\u00f6r den bucketen. Inom denna nod g\u00f6rs en r\u00e4kning av den aktuella beg\u00e4ran baserat p\u00e5 en algoritm som liknar Token Bucket. D\u00e4refter, baserat p\u00e5 aktuella belastningsm\u00e5tt och egenskaper som har st\u00e4llts in f\u00f6r den specifika bucketen, avg\u00f6r ratbegr\u00e4nsningssystemet om f\u00f6rfr\u00e5gan kan utf\u00f6ras eller inte. Kontroll av begr\u00e4nsningarna g\u00f6rs i det tidigaste skedet av S3-f\u00f6rfr\u00e5gan, vilket skyddar alla andra delar av systemet fr\u00e5n \u00f6verbelastning. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/1b91e5d1fe067c859ba9b36d58827579.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det \u00e4r ocks\u00e5 ganska sv\u00e5rt att klara sig utan cache under belastning. I S3 f\u00f6ruts\u00e4tts upprepade f\u00f6rfr\u00e5gningar av samma objekt, det vill s\u00e4ga det \u00e4r ett varmt lagringsutrymme. I normala fall hanteras f\u00f6rfr\u00e5gningar till enstaka filer av hela kedjan: Streamer, FileDB, PairDB, Storage. Men vid upprepade f\u00f6rfr\u00e5gningar till en fil optimerar vi \u00e5tkomsten till detta inneh\u00e5ll med hj\u00e4lp av en lokal cache.<\/p>\n<p><\/p>\n<p>Cachen \u00e4r flerskiktad och implementerad med hj\u00e4lp av nginx, lokala, SSD- och RAM-diskar. H\u00e4r anv\u00e4nde vi inte Tarantool, eftersom det \u00e4r mer praktiskt att leverera objekt fr\u00e5n filsystemet, vilket g\u00f6r det m\u00f6jligt att g\u00f6ra cache-tiering. Dessutom har vi stora objekt med en maximal storlek p\u00e5 32 gigabyte, och i Tarantool kan endast sm\u00e5 objekt cachas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/faa02bd52a1d70642589d775f22c5e75.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det h\u00e4r var det f\u00f6rsta systemet vi lanserade, som hade en viss ber\u00e4knad kapacitet, som r\u00e4ckte f\u00f6r att utforska och f\u00f6rst\u00e5 produkten, samt att den skulle fungera. <\/p>\n<p><\/p>\n<h2 id=\"dorabotki-boevoy-sistemy-feylover-i-masshtabirovanie\">F\u00f6rb\u00e4ttringar av stridsystemet: failover och skalning<\/h2>\n<p><\/p>\n<p>Systemet var redan i drift, men vi missade n\u00e5got i b\u00f6rjan \u2014 vi beh\u00f6vde l\u00e4gga till failover och skalning. <\/p>\n<p><\/p>\n<p>V\u00e5r S3-demont hade h\u00e4mtat metadata via Tarantool-protokollet. Vi ersatte den ursprungliga databasen med Tarantool, som fungerade som en proxy-router f\u00f6r beg\u00e4rningar om metadata. Ur applikationens perspektiv, som implementerade API:t, f\u00f6r\u00e4ndrades inget \u2014 den fortsatte att kommunicera med databasen via Tarantool-protokollet, men routern kunde erbjuda aktiv failover. Det betyder att vi kunde kontrollera nodens tillg\u00e4nglighet, ha en paus vid omkopplingar och fel, och s\u00e5 vidare. Sj\u00e4lva applikationen modifierade vi inte. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/978ff8a458f8d48b98672121cf6eca5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"podrobnee-o-tom-kak-my-realizovali-shardirovanie\">Mer information om hur vi genomf\u00f6rde sharding<\/h2>\n<p><\/p>\n<p>N\u00e4sta fr\u00e5ga som beh\u00f6vde \u00e5tg\u00e4rdas var sharding. Systemet v\u00e4xte, antalet objekt \u00f6kade och vi beh\u00f6vde s\u00e4kerst\u00e4lla m\u00f6jligheter f\u00f6r vidare tillv\u00e4xt.<\/p>\n<p><\/p>\n<p>L\u00e5t oss \u00e5terv\u00e4nda till datamodellen: det finns projekt, det finns buckets, krediter och fakturering. Det h\u00e4r \u00e4r objekt som med stor sannolikhet inte kommer v\u00e4xa utanf\u00f6r en enskild instans varken i volym eller i beg\u00e4rningar inom \u00f6versk\u00e5dlig framtid. S\u00e5 det finns ingen anledning att sharda dem, och vi flyttade dem till en separat instans som f\u00f6rblir of\u00f6rdelad. Det g\u00f6r det m\u00f6jligt att hantera projekt och buckets mer konsekvent, eftersom det finns en enhetlig of\u00f6rdelad punkt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/c5a1c1a875e756e3dceb5f885fbda2c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det finns ocks\u00e5 objekt i schemat som v\u00e4xer linj\u00e4rt \u2014 f\u00f6rst var det hundratusentals, nu m\u00e4ts deras antal i flera miljarder. S\u00e5dana objekt, tillsammans med deras delar, beh\u00f6vde flyttas till en shardad kluster. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/00bb418cc61ad2e3e8797caf5d1ab202.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vi delade upp schemat, men objekten beh\u00f6ver arbeta med buckets: varje objekt tillh\u00f6r alltid en specifik bucket, plus det finns en ACL som k\u00f6rs p\u00e5 bucketen. D\u00e4rf\u00f6r har vi f\u00f6r varje shard med objekt en skugga kopia av varje bucket. Dessutom, under modifiering av objekt och utf\u00f6rande av beg\u00e4rningar, m\u00e5ste vi r\u00e4kna volymen f\u00f6r fakturering, s\u00e5 p\u00e5 varje shard finns det r\u00e4kneverk f\u00f6r fakturering.<\/p>\n<p><\/p>\n<p>Vi har ocks\u00e5 lagt till ytterligare n\u00e5gra tabeller och komponenter:<\/p>\n<p><\/p>\n<ul>\n<li>en papperskorg, f\u00f6r att ta bort gamla projekt som tas bort eller fryses;<\/li>\n<li>k\u00f6n p\u00e5 bakgrundsuppgifter, det vill s\u00e4ga det prim\u00e4ra lagret kan utf\u00f6ra bakgrundsuppgifter som m\u00e5ste g\u00f6ras i klustret;<\/li>\n<li>livscykelst\u00f6d \u2014 en mekanism som m\u00f6jligg\u00f6r arbete med objekt och hantering av deras livscykel.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/933e98dc559eb8e6bac14003215a6836.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eftersom en del av datan har delats upp p\u00e5 shards beh\u00f6vde vi en sharding-proxy. Man skulle kunna \u00e5teranv\u00e4nda routern f\u00f6r denna roll, men en separat sharding-proxy, som endast ansvarar f\u00f6r datasharding, g\u00f6r att routern kan h\u00e4mta data i sin helhet utan att t\u00e4nka p\u00e5 sharding.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/4b181ed4629180e15558f25b1e4d5718.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag kommer att ber\u00e4tta varf\u00f6r vi inte valde en f\u00e4rdig l\u00f6sning utan ville skapa en anpassad sharding-funktion. <\/p>\n<p><\/p>\n<p>L\u00e5t oss se hur den \u00e4r uppbyggd. Vi har 256 tillg\u00e4ngliga shards. F\u00f6r varje bucket tilldelar vi ett intervall med hj\u00e4lp av en konsistent funktion. Det \u00e4r enkelt \u2014 p\u00e5 samma s\u00e4tt som du med en konsistent funktion best\u00e4mmer tillh\u00f6righeten till en shard, s\u00e5 best\u00e4mmer du den startande shard och tilldelar intervallet:<\/p>\n<p><\/p>\n<p><code>f(bucket, shards) = subset<\/code><\/p>\n<p><\/p>\n<p>Det vill s\u00e4ga, om vi tar en bucket kan vi s\u00e4ga att den och dess data alltid kommer att ligga p\u00e5 en specifik delm\u00e4ngd av alla shards. Detta minskar p\u00e5verkan mellan olika buckets och f\u00f6renklar hanteringen av map-reduce-fr\u00e5gor, n\u00e4r man till exempel beh\u00f6ver lista objekten i en bucket. F\u00f6r detta m\u00e5ste man fr\u00e5ga alla shards d\u00e4r dessa objekt lagras. Om objekten l\u00e5g p\u00e5 alla shards skulle varje lista p\u00e5verka systemet som helhet, medan den nu endast p\u00e5verkar en specifik delm\u00e4ngd.<\/p>\n<p><\/p>\n<p>Vidare \u2014 varje objekt tillh\u00f6r en specifik bucket, s\u00e5 n\u00e4r vi beg\u00e4r ett objekt s\u00e5 beg\u00e4r vi det efter namn i en specifik bucket. Det betyder att vi kan definiera en funktion f\u00f6r objektet inte fr\u00e5n hela det tillg\u00e4ngliga intervallet av shards, utan bara fr\u00e5n delm\u00e4ngden av sin bucket:<\/p>\n<p><\/p>\n<p><code>f(object, subset) = shard<\/code><\/p>\n<p><\/p>\n<p>Vi tar ett specifikt objekt och som argument f\u00f6r funktionen skickar vi inte alla shards utan delm\u00e4ngden av sin bucket \u2014 och f\u00e5r en specifik shard. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/10480ad2430c228c511ff3cdc5071596.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>S\u00e5, sharding \u00e4r genomf\u00f6rt, vi har en sharding-proxy. Det som \u00e5terst\u00e5r \u00e4r att f\u00e5 routern och databasen med metadata att kommunicera med sharding-proxyn. Till exempel f\u00f6r att skapa skuggbilder av objekt \u2014 n\u00e4r vi skapar en bucket m\u00e5ste det prim\u00e4ra lagret skapa en representant f\u00f6r denna bucket p\u00e5 alla shards d\u00e4r den ska finnas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/bb34d1f747903a3c2f08f582e4424787.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"kak-my-realizovali-resharding\">Hur vi genomf\u00f6rde resharding<\/h2>\n<p><\/p>\n<p>Det st\u00f6rsta problemet med shardning \u00e4r reshadering. Det var viktigt f\u00f6r oss att g\u00f6ra detta utan nedtid, eftersom systemet redan var i produktion. Jag kommer att visa hur vi l\u00f6ste problemet med ett exempel fr\u00e5n en liknande uppgift med live-migrering av data fr\u00e5n ett projekt till ett annat.<\/p>\n<p><\/p>\n<p>Nedan \u00e4r schemat f\u00f6r v\u00e5r klusterkonfiguration som blev resultatet av att vi implementerade shardning. Vi har nginx, S3 API, en router, en prim\u00e4r databas med projekt, en sharderande proxy och sj\u00e4lva shardarna.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/0e6bd16c7fc47437b3b7d96b6d9809a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jag n\u00e4mnde tidigare att det under ett visst stadium av projektet fanns en produktuppgift: \"Starta \u00e4nnu ett lagringsutrymme, Icebox, \u2013 som Hotbox, men f\u00f6r kalla data\". I praktiken handlar det om ett liknande lagringsutrymme, men med olika URL:er och utan cache.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/9ce9085e1d03e9a99b6b8ccc0717c653.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Icebox anv\u00e4ndes mindre \u00e4n Hotbox, s\u00e5 det klarade sig ganska l\u00e4nge utan n\u00e5got sharding. Till slut beslutade vi att avveckla det och kombinera Hotbox och Icebox till en tj\u00e4nst genom att helt enkelt dela upp lagringsklasserna. <\/p>\n<p><\/p>\n<p>Basken i lagringarna \u00f6verlappar inte, de kunde l\u00e4tt sl\u00e5s samman och flyttas, men kunderna anv\u00e4nde b\u00e5de det ena och det andra lagringsutrymmet, vilket \u00e5terspeglar behovet av att l\u00f6sa problemet med att g\u00f6ra detta utan nedtid. Vi kunde inte bara st\u00e4nga av och kopiera. Vi gjorde migreringen i flera steg.<\/p>\n<p><\/p>\n<p>F\u00f6rst synkroniserade vi de prim\u00e4ra lagringarna. Vi hade Tarantool och vi kunde vid skapandet av ett objekt g\u00f6ra s\u00e5 h\u00e4r: <\/p>\n<p><\/p>\n<ul>\n<li>en beg\u00e4ran kommer till databasen f\u00f6r att skapa en bask, till exempel i Hotbox;<\/li>\n<li>Tarantool kontrollerar i en annan databas (i det h\u00e4r fallet \u2013 i Icebox) att det inte finns n\u00e5gon s\u00e5dan bask;<\/li>\n<li>om basken finns, meddelar databasen att den inte kan skapas, och den synkroniseras som en existerande.<br \/>\n<img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/6694c9804f09942416c1717b455b9fd3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Synkronisering av baskar<\/em><\/li>\n<\/ul>\n<p><\/p>\n<p>I det lagringsutrymme som skulle ta emot all data introducerades en egenskap f\u00f6r projekt och baskar som indikerar var detta objekt lagras. Det kunde lagras lokalt, det vill s\u00e4ga i Hotbox, i Icebox \u2013 d\u00e5 finns det inga data i det nya lagringsutrymmet, eller det kunde vara i migrering.<\/p>\n<p><\/p>\n<p>Om ett projekt eller bask hade egenskapen Migrating, utf\u00f6rdes beg\u00e4ran under migreringen f\u00f6rst i det nya lagringsutrymmet d\u00e4r data b\u00f6r finnas, och om de inte fanns d\u00e4r, dirigerades beg\u00e4rningarna till lagringsutrymmet d\u00e4refter.<\/p>\n<p><\/p>\n<p>D\u00e4refter v\u00e4xlade vi trafik. Eftersom API:et kunde hantera b\u00e5de Icebox- och Hotbox-beg\u00e4rningar, kunde vi v\u00e4xla trafiken utan nedtid genom att bara flytta v\u00e4rdar och l\u00e4gga till motsvarande poster i Nginx. <\/p>\n<p><\/p>\n<p>Efter att trafiken omdirigerades kunde vi ta bort Nginx och API fr\u00e5n Icebox.<br \/>\nD\u00e4refter tog vi bort Icebox nginx och S3 API \u2013 och allt fungerade:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/62d9f960fc1f11b875a8f8a5aa8e8152.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00e4refter startade vi en bakgrundsprocess f\u00f6r migrering som arbetar inuti databasen \u2013 den g\u00e5r igenom alla projekt och deras buckets element f\u00f6r element, s\u00e4tter dem i statusen Migrating, flyttar data och efter att flytten \u00e4r klar s\u00e4tter den statusen Local.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/1a3129136f7ccacfdcff260f10cb0605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Efter datamigreringen beh\u00f6ver vi inte l\u00e4ngre det gamla lagret, och vi tar bort de kvarvarande delarna av det gamla systemet, samt tar bort st\u00f6d f\u00f6r migreringsstatus fr\u00e5n koden.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/13b6f11add40c21a3b9afc05dd0dfea9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De samma principerna f\u00f6ljdes f\u00f6r resharding fr\u00e5n det gamla lagret till det shardade:<\/p>\n<p><\/p>\n<ul>\n<li>Vi markerade alla buckets som <code>Non-sharded<\/code>. Alla f\u00f6rfr\u00e5gningar till dem gick till det ursprungliga, icke-shardade lagret.<\/li>\n<li>Nya buckets skapades direkt med statusen <code>Sharded<\/code>.<\/li>\n<li>Vi tog en bucket i taget, satte statusen <code>Migrating<\/code> och flyttade data.<\/li>\n<\/ul>\n<p><\/p>\n<p>F\u00f6rfr\u00e5gningar betj\u00e4nades enligt principen:<\/p>\n<p><\/p>\n<ul>\n<li>Vi l\u00e4ser i de nya, sedan i de gamla.<\/li>\n<li>Vi skapar endast i de nya.<\/li>\n<li>Vi uppdaterar i tv\u00e5 faser: om det inte finns i de nya, flyttar vi fr\u00e5n de gamla till de nya, och sedan uppdaterar vi.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"rabota-s-ssl-sertifikatami\">Arbete med SSL-certifikat<\/h2>\n<p><\/p>\n<blockquote><p>P\u00e5 frontend anv\u00e4nder vi Nginx. I v\u00e5rt fall \u00e4r det inte vanlig Nginx, utan OpenResty, Nginx med st\u00f6d f\u00f6r LuaJIT.<\/p><\/blockquote>\n<p>En annan del av systemet \u2013 hantering av SSL-certifikat. I S3-lagret kan du st\u00e4lla in en egen dom\u00e4n f\u00f6r att f\u00e5 \u00e5tkomst till en specifik bucket, bara med hj\u00e4lp av <code>CNAME<\/code>. Men utan HTTPS g\u00e5r det inte idag: en egen dom\u00e4n inneb\u00e4r en egen SSL-certifikat. <\/p>\n<p><\/p>\n<p>Som jag redan n\u00e4mnt, ansvarar Nginx f\u00f6r lastbalansering och terminering av SSL. I v\u00e5rt fall \u00e4r det inte vanlig Nginx, utan OpenResty, Nginx med st\u00f6d f\u00f6r LuaJIT.<\/p>\n<p><\/p>\n<p>Detta gjorde att vi ganska enkelt kunde l\u00e4ra v\u00e5rt Nginx att leverera godtyckliga certifikat. Dessutom beh\u00f6vde vi ge ut certifikat dynamiskt (utan att beh\u00f6va ange dem i konfigurationsfilen). Vi anv\u00e4nde till\u00e4gget <code>ssl_certificate_by_lua<\/code>, som g\u00f6r det m\u00f6jligt att l\u00e4sa certifikatet fr\u00e5n valfri k\u00e4lla direkt under TLS-handshake. Som certifikatslagring anv\u00e4nde vi ocks\u00e5 Tarantool: detta g\u00f6r att vi kan hantera certifikat utanf\u00f6r och ger en extremt snabb leverans.<\/p>\n<p><\/p>\n<p>En separat demon har ocks\u00e5 implementerats, vars uppgift \u00e4r att regelbundet uppdatera certifikat som utf\u00e4rdats med hj\u00e4lp av Let\u2019s Encrypt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3-arkitektur: 3 \u00e5rs evolution av Mail.ru Cloud Storage\" src=\"\/wp-content\/uploads\/2020\/08\/8d61c1cb3084d9eb4eb8faa745e212db.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"chto-by-ya-sohranil-a-chto-sdelal-po-drugomu-esli-razrabatyvat-hranilische-zanovo\">Vad jag skulle beh\u00e5lla och vad jag skulle g\u00f6ra annorlunda om jag skulle utveckla lagring p\u00e5 nytt<\/h2>\n<p><\/p>\n<h3 id=\"chto-nuzhno-bylo-ispolzovat-s-samogo-nachala\">Vad som beh\u00f6vde anv\u00e4ndas fr\u00e5n b\u00f6rjan<\/h3>\n<p><\/p>\n<p><strong>Sharding direkt<\/strong>. Ganska m\u00e5nga problem orsakades av resharding. Det \u00e4r l\u00e4tt att g\u00f6ra, men om man startar projekt som beh\u00f6ver skalas, \u00e4r det b\u00e4ttre att anv\u00e4nda en sharded kluster fr\u00e5n b\u00f6rjan, \u00e4ven om det bara har ett minimum av noder. Implementeringen av sharding i b\u00f6rjan \u00e4r n\u00e4stan gratis i j\u00e4mf\u00f6relse med att inf\u00f6ra sharding i ett fungerande system.<\/p>\n<p><\/p>\n<p><strong>Arbete med Tarantool genom lastbalanserare<\/strong>. Nu kopplar vi alla nya databaser direkt till arbete genom lastbalanserare. Det g\u00f6r det m\u00f6jligt att ut\u00f6ka funktionaliteten och uppn\u00e5 h\u00f6gre redundans. <\/p>\n<p><\/p>\n<p><strong>Auto-failover<\/strong>. Jag skulle installera alla verktyg som kr\u00e4vs f\u00f6r auto-failover, eftersom de f\u00f6rsta misslyckandena efter lanseringen var kopplade till avsaknaden av det. Efter erfarenheten med S3 lanserades alla f\u00f6ljande produkter med h\u00e4nsyn till detta.<\/p>\n<p><\/p>\n<p><strong>Funktionen S3 \"Versionering\"<\/strong>. Det verkade fr\u00e5n b\u00f6rjan som en funktion som inte var s\u00e4rskilt efterfr\u00e5gad. Att integrera den h\u00e4r m\u00f6jligheten i arkitekturen av ett fungerande system \u00e4r extremt sv\u00e5rt.<\/p>\n<p><\/p>\n<p><strong>Separat fakturering<\/strong>. Det s\u00e4tt p\u00e5 vilket vi integrerade faktureringen i v\u00e5rt system fungerade bra i b\u00f6rjan, men s\u00e5 sm\u00e5ningom b\u00f6rjade det st\u00f6ra, det skulle ha varit b\u00e4ttre att ha det som en helt separat tj\u00e4nst.<\/p>\n<p><\/p>\n<h3 id=\"chto-bylo-udachnym-resheniem\">Vad som var en bra l\u00f6sning<\/h3>\n<p><\/p>\n<p><strong>Datamodell<\/strong>. Historien har visat att i takt med att tj\u00e4nsten utvecklades s\u00e5 \u00f6verensst\u00e4mde vi ganska v\u00e4l med datamodellen fr\u00e5n Amazon, s\u00e5 vi kan implementera de funktioner som finns d\u00e4r.<\/p>\n<p><\/p>\n<p><strong>Schema f\u00f6r sharding<\/strong>. Jag skulle st\u00f6dja samma typ av intervallsharding f\u00f6r buckets, eftersom det g\u00f6r det m\u00f6jligt att f\u00f6rdela f\u00f6rfr\u00e5gningar fr\u00e5n olika buckets \u00f6ver ett stort kluster.<\/p>\n<p><\/p>\n<p><strong>Anv\u00e4ndning av Tarantool<\/strong>. Tarantool har hj\u00e4lpt mycket vid utvecklingen av tj\u00e4nsten och dess modifiering, vi arbetade enkelt med data, transformerade och shardade lagret utan att beh\u00f6va g\u00e5 upp p\u00e5 applikationslagret. <\/p>\n<p><\/p>\n<blockquote><p>Denna presentation h\u00f6rdes f\u00f6rst p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Databases Meetup<\/a><\/noindex> by Mail.ru Cloud Solutions&amp;Tarantool. Se <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=jM4hL2u6JM0&amp;list=PLQzTaxmOHjntyNRPWhaWHqlHp8UN_wgQ3\">video<\/a><\/noindex> andra f\u00f6rel\u00e4sningar och f\u00f6lj anm\u00e4lningarna till evenemang p\u00e5 Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Runt Kubernetes i Mail.ru Group<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Du kan ocks\u00e5 titta p\u00e5 min gamla presentation om S3 eller l\u00e4sa artikeln fr\u00e5n min kollega om blocklagring.<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=O0iIADHgBVc\">Reverse engineering av Amazon S3:s arkitektur och hur S3-lagringen s\u00e5g ut f\u00f6r MCS f\u00f6r 3 \u00e5r sedan<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/472694\/\">Mer \u00e4n Ceph: blocklagring av MCS-molnet<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>K\u00e4lla: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/513356\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Storage Corridor by St-Pete \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u042f Mons Anderson, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Mail.ru Cloud Solutions, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043d\u0430\u0448\u0435 S3-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0443\u0434\u0430\u0447\u043d\u044b\u043c\u0438, \u0430 \u043a\u0430\u043a\u0438\u0435 \u0441\u0442\u043e\u0438\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043d\u0430\u0447\u0430\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043d\u0443\u043b\u044f \u0441\u0435\u0439\u0447\u0430\u0441. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430 @Databases Meetup by Mail.ru Cloud Solutions &amp; Tarantool. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91091,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91090","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\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-s3-3-goda-evolyuczii-mail-ru-cloud-storage\" \/>\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 S3: 3 \u0433\u043e\u0434\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Mail.ru Cloud Storage | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage\" \/>\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-08-08T11:42:11+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-08T11:42:11+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 S3: 3 \u00e5rs evolution av Mail.ru Cloud Storage | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","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 S3: 3 \u0433\u043e\u0434\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Mail.ru Cloud Storage | ProHoster","og:url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","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-08-08T11:42:11+00:00","article:modified_time":"2020-08-08T11:42:11+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91090","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:34:25","updated":"2022-10-02 13:27:50","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\/91090","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=91090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/91090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/91091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=91090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=91090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=91090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}