{"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\/et\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","title":{"rendered":"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" 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\">Salvestuskoridor<\/a><\/noindex> Peterburist<\/em><\/p>\n<p><\/p>\n<p>Tere k\u00f5igile! Mina olen Mons Anderson, platvormi arhitekt <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\/\">Mail.ru Pilve Lahendused<\/a><\/noindex>, r\u00e4\u00e4gin, kuidas me oma S3-salvestust ehitasime, kuidas see t\u00f6\u00f6tab, millised lahendused olid edukad ja mida oleks tasunud muuta, kui me oleksime sama projekti nullist alustanud.<\/p>\n<p><\/p>\n<p>Artikkel on koostatud p\u00f5hjal doklist, <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Andmebaasid Meetup<\/a><\/noindex> Mail.ru Cloud Solutions &amp; Tarantool. Artiklis r\u00e4\u00e4gime:<\/p>\n<p><\/p>\n<ul>\n<li>kuidas Mail.ru salvestus oli \u00fcles ehitatud, mille peal me S3-salvestust ehitasime;<\/li>\n<li>mida me lisasime, et luua Mail.ru Cloud Storage;<\/li>\n<li>kuidas objekti salvestusmudel t\u00f6\u00f6tab ja milliseid samme oleme teinud toodete turule toomiseks;<\/li>\n<li>toodete parendustest: failover ja skaleerimine;<\/li>\n<li>kuidas me shardimist ja reshardimist rakendasime;<\/li>\n<li>ja samuti SSL-sertifikaatidega t\u00f6\u00f6tamiseks.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kui te ei soovi lugeda, siis v\u00f5ite <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/NEgm1nsv-qg\">vaadata<\/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\">Kuidas Mail.ru salvestus oli \u00fcles ehitatud, mille peal me S3-salvestust ehitasime<\/h2>\n<p><\/p>\n<p>Meie S3 arendus algas Mail.ru Cloudi salvestusel, seega on esmalt oluline r\u00e4\u00e4kida, kuidas see t\u00f6\u00f6tab ja millised on selle v\u00f5imalused.<\/p>\n<p><\/p>\n<p>Mail.ru pilvesalvestus koosneb serveritest, mis on varustatud ketastega. Keskmiselt on kaasaegne salvestusserver 36 ketast, mille maht on 12\u201314 terabaiti. Varem olid kettad v\u00e4iksemad, kuid kolme aasta jooksul on ketaste mahud kasvanud ning t\u00e4na on see peaaegu pool petabaiti tooreid andmeid. <\/p>\n<p><\/p>\n<p>Erinevate serverite kettad kombineeritakse nn \"paarideks\" (pair). Paar on \u00fcksik failide salvestamise \u00fcksus. Sisuliselt on see ketas, mis on kindlasse jaotusse kindlal teel mountitud, kus failid v\u00f5ivad olla salvestatud, tuvastatud hash'ide abil. <\/p>\n<p><\/p>\n<p>Paar on ajalooline nimetus, mis on s\u00e4ilinud t\u00e4nap\u00e4evani, kuigi n\u00fc\u00fcd ei pea paaris olema tingimata ainult kaks ketast. Ketaste arv v\u00f5ib olla kolm ning v\u00f5ivad olla ka erinevad h\u00fcbriidsalvestused, n\u00e4iteks 3\/2. <\/p>\n<p>\n<img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/544ab79846539262e2d4dff6ab95ffff.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Paarid (pair) on objektide salvestamise \u00fcksused<\/em><\/p>\n<p><\/p>\n<p>K\u00f5iki paare hoitakse PairDB-s \u2013 see on rakendus, mis on koostatud Tarantooli p\u00f5hjal. K\u00f5ik andmebaasid meie salves, alustades esimestest, on Tarantooli alusel, teisi andmebaaside ei kasutata.<\/p>\n<p><\/p>\n<p>PairDB hoiab k\u00f5iki paare, nende seisundeid, vaba ruumi, t\u00f5rket\u00f5kestamise v\u00f5imalusi, viimaseid vigu. Samuti suudab see ise paare aktiveerida, nende seisundeid ajakohastada, kontrollida, kas need t\u00f6\u00f6tavad v\u00f5i mitte. Seega on PairDB nagu \u00fchine \u00fclevaade meie s\u00fcsteemi k\u00f5igi ketaste seisundist.<\/p>\n<p>\n<img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/d50781b8b51ed5fe126bc84e19c934d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Pair DB: andmebaas paaride seisunditest<\/em><\/p>\n<p><\/p>\n<p>Seerum\u00e4est hoitakse faile ning et teada, millisel serveril mis fail asub, on vaja veel \u00fcht andmebaasi \u2014 FileDB. See salvestab kaardi, mis m\u00e4\u00e4rab vastavuse: see fail asub seal ja seal, ning lisaks m\u00f5ned vajalikud atribuudid.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/b1a64737cf7f916bff446c10c1f01d4c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><em>File DB: koht, kus fail asub<\/em><\/p>\n<p>Veel \u00fcks oluline l\u00fcli on teenus Nylon, andmebaaside kasutamise ruuter. See on \u00fchtne sisenemispunkt, mis v\u00f5imaldab t\u00f6\u00f6tada l\u00e4bi \u00fche liidese nii PairDB kui ka FileDBga. See on stateless teenus, see teostab p\u00e4ringute laadimist, m\u00f5istab, millisele shardile FileDB-le p\u00f6\u00f6rduda ning teab, millised serverid on aktiivsed ja millised mitte.<\/p>\n<p>\n<img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/3e2225f229c8cfa462d620d2b5fb581e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Nylon: andmebaaside kasutamise ruuter<\/em><\/p>\n<p><\/p>\n<p>Samuti peab sisu hoiustama kuidagi. Selleks on olemas teenus \u2014 Streamer. See pakub kahte HTTP meetodit: PUT meetod, et sisu hoiusesse laadida ja GET meetod, et sealt sisu saada. HTTP on \u00fcsna populaarne ja mugav protokoll andmete edastamiseks. <\/p>\n<p><\/p>\n<p>Kui me p\u00f6\u00f6rdume Streamer&#8217;y poole, siis see suunab Nyloni kaudu PairDB-le, et selgitada v\u00e4lja, millisele paarile v\u00f5ib faili laadida, seej\u00e4rel edastab andmed WebDAV kaudu sellele paarile. <\/p>\n<p><\/p>\n<p>Sisuliselt on iga storage server \u2014 see on nginx pluss kettad, mis on \u00fchendatud kindlate teede kaudu. Me v\u00f5ime Streamer\u2019ist faili hoiusesse laadida, kustutada, \u00fcmber nimetada v\u00f5i selle t\u00fckisust kontrollida. See t\u00e4hendab, et see on mugav liides madala taseme \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f jaoks hoiusega. <\/p>\n<p>\n<img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/3722a89ed44cace36e9cb1f8bee4bd1e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><em>Streamer: p\u00e4\u00e4supunkt hoiusesse<\/em><\/p>\n<p><\/p>\n<h2 id=\"chto-my-dobavili-chtoby-sdelat-s3-hranilische\">Mida me lisasime, et teha S3-hoidla<\/h2>\n<p><\/p>\n<p>Nii oleme vaadanud, milline on hoiustamise \u00fcldine struktuur hetkel, kui me olime valmis S3-hoidla k\u00e4ivitama. T\u00e4nu PUT meetodile saime sinna paigutada suvalist sisu ja meil oli selle andmehalduse identifikaator, mis on hash. Selle identifikaatoriga oli hiljem v\u00f5imalik tulla ja algne fail tagasi saada. Kuid see ei piisa S3 rakendamiseks. S3 protokollis, peale objektide hoidmisest, on:<\/p>\n<p><\/p>\n<ul>\n<li>metainfo salvestamine \u2014 objektide lisav\u00e4\u00e4rtused;<\/li>\n<li>objektide ligip\u00e4\u00e4su korraldamine HTTP kaudu;<\/li>\n<li>objektide r\u00fchmitamine kollektiividesse \u2014 bucketeid;<\/li>\n<li>HTTP-S3 Endpoint. S3 korraldab andmed kindlates struktuurides \u2014 bucketeid, millest iga\u00fchel on faili hoidmiseks p\u00e4\u00e4supunkt.<\/li>\n<\/ul>\n<p><\/p>\n<p>Selle loogika rakendamiseks oli vajalik eraldi teenus. Soovisime ka kohe ette n\u00e4ha arhitektuuri teenuse edasiseks kasvuks, tagades lineaarsuse skaleeritavuses.<\/p>\n<p><\/p>\n<h2 id=\"pervye-komponenty\">Esimese komponendid<\/h2>\n<p><\/p>\n<p>Demon, mis rakendab S3 API. See on Amazoni standardne S3 API, mis toetab XML-i kasutamist metaandmete jaoks ja v\u00f5imaldab sisu otse edastada. Me ei pidanud midagi v\u00e4lja m\u00f5tlema, k\u00f5ik on kirjeldatud ja dokumenteeritud.<\/p>\n<p><\/p>\n<p>Samuti paigaldasime teenuse ette Nginxi. Kasutasime seda SSL-i l\u00f5petamiseks, koormuse tasakaalustamiseks ja m\u00f5ne loogika jaoks Lua's (m\u00f5\u00f5dikud, logimine ja j\u00e4lgimine).<\/p>\n<p><\/p>\n<p>S3 metaandmete salvestamiseks valisime ka Tarantooli. Esimeses versioonis l\u00e4ks S3 demon nende metaandmete j\u00e4rele sellesse andmebaasi, sisu ise salvestati suuremasse salvestusse Streameri kaudu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/03dddec282b5bb41eb63748ccfb6c9a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Nginx + S3 API + metaandmed<\/em><\/p>\n<p><\/p>\n<h2 id=\"obektnaya-model-hraneniya\">Objektide salvestusmudel<\/h2>\n<p><\/p>\n<p>Vaadakem, kuidas S3 t\u00f6\u00f6tab. Kasutaja v\u00f5ib luua \u00e4mber \u2014 objektide kogumi. \u00c4mber adresseeritakse hosti nime kaudu ja on teenuse alamdomeen. \u00c4mbri raames saab kasutaja luua objekte. Objekti identifikaatoriks on URL. Objekti sisu on blob, binaarandmete massiiv, mida me salvestaime salvestuses. Objektil on ka atribuute: nimi \u2014 see sama URL, ACL (juurdep\u00e4\u00e4su kontrollimise nimekiri), muud lisandid v\u00f5i vabatahtlikud atribuudid \u2014 k\u00f5ik see salvestatakse metaandmetesse. <\/p>\n<p><\/p>\n<p>Nende andmete normeeritud skeem v\u00f5ib v\u00e4lja n\u00e4ha nii: on projektid, millele kuuluvad \u00e4mbrit, millele kuuluvad objektid ja objektid v\u00f5ivad olla koostisosad. Kuna \u00fcks viis objektide \u00fcleslaadimiseks on osade kaupa, on \u00fcleslaadimiseks kaks abita tabelit: uploads ja chunks. Samuti on projektidel juurdep\u00e4\u00e4suandmed ja arveldamine. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/e2bede45ba4044f658b47a9840fd5224.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Andmeskeem<\/em><\/p>\n<p><\/p>\n<p>Kuna tegime b2b teenuse tasulise juurdep\u00e4\u00e4suga, oli selles skeemis vajalik arveldamine.<br \/>\nArvelduse teenuse realiseerime samuti Tarantoolis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" 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\">S3 salvestuse t\u00e4iustamine: sammud tootmisese suunas<\/h2>\n<p><\/p>\n<p>Me oleme juba loonud toimiva mudeli, mida saab kasutada: objektid ja metaandmed oli salvestatud, kuid tootmisse minekuks j\u00e4i puudu m\u00f5ned aspektid.<\/p>\n<p><\/p>\n<p>Esiteks on reitingute s\u00fcsteem. Kui k\u00e4ivitada teenus ilma selleta, v\u00f5ime tipnakkumise ajal ettearvamatult \u00fcle koormata m\u00f5ne s\u00fcsteemi ala. Reitingu limiit peab toimima j\u00e4rgmiselt: iga S3-p\u00e4ring tuleb konkreetsele hostile, see host on \u00e4mber, ja \u00e4mber kuulub mingile kliendile. Peame m\u00e4\u00e4rama teatud funktsiooni \u00e4mberest, mis v\u00f5imaldaks arvutada reitingu limiidi. <\/p>\n<p><\/p>\n<p>Lisaks peab reitingute s\u00fcsteem olema piisavalt j\u00f5uline, et taluda S3-le tulevat koormust.<\/p>\n<p><\/p>\n<p>Siin kasutasime j\u00e4lle Tarantooli. Reitingud on 21 instantsist koosnev klaster, instantsid on jagatud gruppidesse, laiali kolme f\u00fc\u00fcsilise s\u00f5lme vahel ja \u00fchendatud suureks topoloogiliseks klastriks. Sellele levitatakse automaatselt konfigureerimis muudatused: m\u00e4\u00e4ratakse reitingu limiidid, vaikeseaded ja konfiguratsioon. Iga \u00e4mber teenindatakse rangelt \u00fche instantsiga. Kui konkreetsele \u00e4mbrile saadetakse p\u00e4ring, arvutatakse v\u00e4lja instants, mis vastutab selle \u00e4mber eest. Selle s\u00f5lme raames toimub p\u00e4ringute praeguse reitingu arvestamine algoritmi abil, mis sarnaneb Token Bucket'ile. Edasi teatab reitingute s\u00fcsteem, tuginedes praegusele koormuse n\u00e4itajale ja konkreetse \u00e4mber jaoks seatud omadustele, kas p\u00e4ringut saab t\u00e4ita v\u00f5i mitte. Limiteerimise kontroll toimub S3-p\u00e4ringu t\u00e4itmise k\u00f5ige varasemas etapis, kaitstes k\u00f5iki s\u00fcsteemi teisi elemente liigse koormuse eest. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/1b91e5d1fe067c859ba9b36d58827579.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samuti on koormuse all \u00fcsna keeruline hakkama saada ilma vahem\u00e4luta. S3 eeldab, et sama objektiga p\u00f6\u00f6rdutakse mitu korda, see t\u00e4hendab, et tegemist on kuuma salvestusruumiga. Tavalises olukorras teenindatakse \u00fcksik faili p\u00e4ring kogu ahela kaudu: Streamer, FileDB, PairDB, Storage. Kuid failile mitu korda p\u00f6\u00f6rdudes optimeerime juurdep\u00e4\u00e4su sellele sisule kohaliku vahem\u00e4lu abil.<\/p>\n<p><\/p>\n<p>Vahem\u00e4lu on mitmekihiline ja rakendatud nginx'i, kohalike SSD ja RAM-kettade abil. Siin me Tarantool'i ei kasutanud, sest objekte on mugavam edastada failis\u00fcsteemist, nii saame teha vahem\u00e4lu kihtimist. Lisaks on meil suured objektid maksimaalse suurusega 32 gigabaiti, samas kui Tarantool'is saab vahem\u00e4luda ainult v\u00e4ikesi objekte.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/faa02bd52a1d70642589d775f22c5e75.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See esimene s\u00fcsteem, millega me alustasime, omas teatud arvutatud mahutavust, mis oli piisav, et toote uurimiseks ja m\u00f5istmiseks ning selle toimimise kinnitamiseks. <\/p>\n<p><\/p>\n<h2 id=\"dorabotki-boevoy-sistemy-feylover-i-masshtabirovanie\">S\u00f5jalise s\u00fcsteemi t\u00e4iustused: failide \u00fcleandmine ja skaaleerimine<\/h2>\n<p><\/p>\n<p>S\u00fcsteem oli juba kasutuses, kuid alguses j\u00e4tsime me midagi olulist t\u00e4helepanuta \u2014 oleks pidanud lisama failide \u00fcleandmise ja skaaleerimise. <\/p>\n<p><\/p>\n<p>Meie S3-deemon kogus metaandmeid protokolli Tarantool kaudu. Originaalse andmebaasi asemele paigaldasime Tarantooli, mis toimis metaandmete p\u00e4ringute proxy-suunajana. Rakenduse poolest, mis realiseerib API-d, ei muutunud midagi \u2014 see j\u00e4tkas andmebaasi p\u00f6\u00f6rdumist Tarantooli protokolli kaudu, kuid suunaja suutis tagada aktiivse failide \u00fcleandmise. See t\u00e4hendab, et saime kontrollida s\u00f5lme k\u00e4ttesaadavust, taluda pause \u00fcleminekute ja t\u00f5rgete ajal jne. Samas me rakendust ei modifitseerinud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" 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\">Rohkem teavet selle kohta, kuidas me shardingut rakendasime<\/h2>\n<p><\/p>\n<p>J\u00e4rgmine k\u00fcsimus, millega tuli tegeleda \u2014 sharding. S\u00fcsteem kasvas, objektide arv suurenes ja pidime tagama v\u00f5imalused edasiseks kasvuks.<\/p>\n<p><\/p>\n<p>Naaseme andmeskeemi juurde: on projektid, on koppad, \u00f5igused ja arveldamine. Need on objektid, mis t\u00f5en\u00e4oliselt ei \u00fcleta l\u00e4hitulevikus \u00fche instantsi mahutavust ega p\u00e4ringute arvu. Seega ei ole m\u00f5tet neid shardeerida, ning me t\u00f5stsime need eraldi instantsile, mis j\u00e4\u00e4b mitte-sharditud. See v\u00f5imaldab projektide ja koppade haldamist konsistendsemalt, kuna on olemas \u00fcks mitte-sharditud punkt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/c5a1c1a875e756e3dceb5f885fbda2c8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Samuti on skeemis objekte, mis kasvavad lineaarselt \u2014 alguses oli neid sadu tuhandeid, n\u00fc\u00fcd m\u00f5\u00f5detakse arvu mitmete miljarditega. Sellised objektid koos oma osadega tuli viia sharded klastrisse. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/00bb418cc61ad2e3e8797caf5d1ab202.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Me jagasime skeemi, kuid objektid peavad t\u00f6\u00f6tama koppadega: objekt kuulub alati konkreetsele koppale, lisaks t\u00f6\u00f6tab kopa peal ACL. Seet\u00f5ttu hoiame iga objekti jaoks, mis on sharditud, iga kopa varukoopia. Lisaks tuleb objektide modifitseerimise ja p\u00e4ringute t\u00e4itmise ajal arvestada mahtu arveldamiseks, seet\u00f5ttu on igas shardis arvestid arveldamise jaoks.<\/p>\n<p><\/p>\n<p>Lisaks lisasime veel paar tabelit ja komponenti:<\/p>\n<p><\/p>\n<ul>\n<li>pr\u00fcgikasti, et h\u00e4vitada vanu projekte, mis kustutatakse v\u00f5i k\u00fclmutatakse;<\/li>\n<li>taustaprotsesside j\u00e4rjekord, see t\u00e4hendab, et peamine salvestus v\u00f5ib t\u00e4ita taustaprotsesse, mida on vaja klastris teha;<\/li>\n<li>eluts\u00fckli toetamine \u2014 mehhanism, mis v\u00f5imaldab t\u00f6\u00f6tada objektidega ja hallata nende eluts\u00fcklit.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/933e98dc559eb8e6bac14003215a6836.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kuna osa andmeid transportisime sharde, vajasime shardimisproksi. Oleks olnud v\u00f5imalik kasutada ruuterit selle \u00fclesande t\u00e4itmiseks, kuid eraldi shardimisproksi, mis vastutab ainult andmete shardimise eest, v\u00f5imaldab ruuteril andmeid tervikuna otsida, mitte m\u00f5elda shardimisele.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/4b181ed4629180e15558f25b1e4d5718.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selgitan eraldi, miks me ei valinud valmis lahendust, vaid soovisime luua kohandatud shardimise funktsiooni. <\/p>\n<p><\/p>\n<p>Vaadakem, kuidas see on \u00fcles ehitatud. Meil on 256 saadaval olevat shard'i. Iga baketi jaoks eraldame vahemiku mingi j\u00e4rjepideva funktsiooni abil. See on lihtne \u2014 nagu j\u00e4rjepideva funktsiooni abil m\u00e4\u00e4rate kuuluvuse \u00fche shard'i alla, m\u00e4\u00e4rate ka algse shard'i ja eraldate vahemiku:<\/p>\n<p><\/p>\n<p><code>f(bucket, shards) = subset<\/code><\/p>\n<p><\/p>\n<p>Seega, kui v\u00f5tta baket, siis v\u00f5ib \u00f6elda, et see ja selle andmed paiknevad alati konkreetses alamkogus k\u00f5igist shard'idest. See v\u00e4hendab \u00fche baketi m\u00f5ju teistele ja lihtsustab map-reduce p\u00e4ringute t\u00f6\u00f6d, kui on vaja n\u00e4iteks koostada baketi objektide loend. Selleks tuleb k\u00fcsitleda k\u00f5iki sharde, kus need objektid asuvad. Kui objektid asuksid k\u00f5igis shard'ides, m\u00f5jutaks iga loetelu s\u00fcsteemi tervikuna, aga siin m\u00f5jutab see ainult konkreetset alamkogust.<\/p>\n<p><\/p>\n<p>Lisaks kuulub iga objekt konkreetsele baketile, seet\u00f5ttu, kui me p\u00f6\u00f6rdume objekti poole, p\u00f6\u00f6rdume objekti poole nime kaudu konkreetse baketi sees. See t\u00e4hendab, et saame m\u00e4\u00e4rata objekti funktsiooni mitte k\u00f5igist saadaval olevatest shard'idest, vaid ainult tema baketi alamkogust:<\/p>\n<p><\/p>\n<p><code>f(object, subset) = shard<\/code><\/p>\n<p><\/p>\n<p>V\u00f5tame konkreetsed objektid, funktsiooni argumentidena edastame mitte k\u00f5ik shard'id, vaid ainult tema baketi alamkoguse \u2014 ja saame konkreetse shard'i. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/10480ad2430c228c511ff3cdc5071596.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nii et shardimine on rakendatud, on olemas shardimisproksi. Edasi j\u00e4\u00e4b ruuterist ja metainfobaasist minna shardimisproksisse. N\u00e4iteks varjuka lubade loomiseks \u2014 kui me loome baketi, peab peamine salvestus looma selle baketi esindaja k\u00f5igis shard'ides, kus see peab olema.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" 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\">Kuidas me rakendasime uuesti shardimist<\/h2>\n<p><\/p>\n<p>Suurim probleem shardimis on \u00fcmbershardimine. Meile oli oluline selle teostamine ilma seisakuteta, kuna s\u00fcsteem oli juba tootmises. N\u00e4itan, kuidas me lahendasime probleemi sarnase \u00fclesande n\u00e4itel, kus andmete elu migreerimine toimus \u00fchelt projektilt teisele.<\/p>\n<p><\/p>\n<p>Allpool on meie klastriskeem, mis kujunes p\u00e4rast shardimise rakendamist. Meil on nginx, S3 API, marsruuter, peamine andmebaas projektidega, shardiva proksi ja ise shardid.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/0e6bd16c7fc47437b3b7d96b6d9809a4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eelnevalt j\u00e4tsin mainimata, et projekti teatud etapis oli toote\u00fclesanne: \"K\u00e4ivitada veel \u00fcks salvestus, Icebox, mis toimiks nagu Hotbox, aga k\u00fclmade andmete jaoks.\" Tegelikult on see sama salvestus, kuid erinevate URL-ide ja ilma vahem\u00e4ludeta.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/9ce9085e1d03e9a99b6b8ccc0717c653.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Iceboxi kasutati v\u00e4hem kui Hotboxi, seet\u00f5ttu toimumas ei toimunud mingit shardingut \u00fcsna pikalt. L\u00f5puks otsustasime sellest loobuda ja \u00fchendada Hotbox ja Icebox \u00fcheks teenuseks, jagades lihtsalt salvestusklassid. <\/p>\n<p><\/p>\n<p>Salvestustes ei kattunud baketid, neid sai h\u00f5lpsasti \u00fchte liita ja \u00fcmber liigutada, kuid kliendid kasutasid nii \u00fchte kui teist salvestust, seega oli vaja lahendada probleem, et mitte tekkida seisakut. Ei olnud v\u00f5imalik lihtsalt v\u00e4lja l\u00fclitada ja kopeerida. Raeime migreerimise mitme etapi jooksul.<\/p>\n<p><\/p>\n<p>Esiteks s\u00fcnkroniseerisime peamised salvestused. Meil oli Tarantool ja saime objekti loomisel teha j\u00e4rgmist: <\/p>\n<p><\/p>\n<ul>\n<li>andmebaas saab baketi loomise p\u00e4ringu, n\u00e4iteks Hotboxis;<\/li>\n<li>Tarantool kontrollib teises andmebaasis (antud juhul Iceboxis), et sellist baketi ei ole;<\/li>\n<li>kui baket on olemas, teatab andmebaas, et seda ei saa luua, ja see s\u00fcnkroniseeriti olemasolevana.<br \/>\n<img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/6694c9804f09942416c1717b455b9fd3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<em>Bakettide s\u00fcnkroniseerimine<\/em><\/li>\n<\/ul>\n<p><\/p>\n<p>Sel salvestusel, mis pidid vastu v\u00f5tma k\u00f5ik andmed, lisati projektide ja bakettide jaoks tunnus, mis n\u00e4itas, kus see objekt paikneb. See v\u00f5is asuda lokaalselt, st Hotboxis, Iceboxis \u2014 siis ei olnud uues salvestuses selle kohta mingeid andmeid, v\u00f5i siis v\u00f5is see olla migreerimise olekus.<\/p>\n<p><\/p>\n<p>Kui projektil v\u00f5i baketil oli m\u00e4\u00e4ratud Migrating, siis migreerimise ajal tehti p\u00e4ring algselt uude salvestusse, kuhu andmed pidid minema, ja kui seal ei olnud, siis suunati p\u00e4ringud alternatiivsele salvestusele.<\/p>\n<p><\/p>\n<p>Seej\u00e4rel suunasime liikluse. Kuna API suutis teenindada nii Iceboxi kui ka Hotboxi p\u00e4ringuid, suudame liikluse suunata ilma seisaku, lihtsalt hostide \u00fcmberkolimise ja sobivate kirjeid lisamisega Nginxisse. <\/p>\n<p><\/p>\n<p>P\u00e4rast liikluse suunamist saime eemaldada Nginxi ja Iceboxi API.<br \/>\nSeej\u00e4rel eemaldasime Iceboxi Nginxi ja S3 API \u2014 ja k\u00f5ik toimis:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/62d9f960fc1f11b875a8f8a5aa8e8152.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Edasi k\u00e4ivitasime taustaprotsessi migreerimiseks, mis t\u00f6\u00f6tab andmebaasis \u2014 l\u00e4bib k\u00f5ik projektid ja nende baketid elemendi kaupa, m\u00e4\u00e4rab neile staatuse Migrating, kannab andmed \u00fcle ja l\u00f5petamisel m\u00e4\u00e4rab staatuse Local.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/1a3129136f7ccacfdcff260f10cb0605.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00e4rast andmete \u00fclekandmist ei vajanud me enam vana salvestusruumi ning eemaldasime allesj\u00e4\u00e4nud osad vanast s\u00fcsteemist ning eemaldame koodist ka migreerimise staatuse toe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" src=\"\/wp-content\/uploads\/2020\/08\/13b6f11add40c21a3b9afc05dd0dfea9.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sarnaste p\u00f5him\u00f5tete alusel viidi l\u00e4bi ka reharding vana salvestusruumi ja sharded-i vahel:<\/p>\n<p><\/p>\n<ul>\n<li>M\u00e4rgistasime k\u00f5ik baketid kui <code>Non-sharded<\/code>. K\u00f5ik p\u00e4ringud suundusid algsesse, mitte sharded salvestusruumi.<\/li>\n<li>Uued baketid loodi kohe staatusega <code>Sharded<\/code>.<\/li>\n<li>. \u00dcksikuid baketeid v\u00f5eti, seadistati nende staatuseks <code>Migrating<\/code> ja andmed kanti \u00fcle.<\/li>\n<\/ul>\n<p><\/p>\n<p>P\u00e4ringud teenindati j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>Lugesime uuest, seej\u00e4rel vanast.<\/li>\n<li>Loome ainult uuest.<\/li>\n<li>Uuendame kahefoolselt: kui uuest ei ole, kanname vanast uude, seej\u00e4rel uuendame.<\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"rabota-s-ssl-sertifikatami\">T\u00f6\u00f6 SSL-sertifikaatidega<\/h2>\n<p><\/p>\n<blockquote><p>Eesliideses kasutame Nginxi. Meie puhul ei ole see tavap\u00e4rane Nginx, vaid OpenResty, Nginx LuaJIT toega.<\/p><\/blockquote>\n<p>Veel \u00fcks s\u00fcsteemi osa \u2014 t\u00f6\u00f6 SSL-sertifikaatidega. S3 salvestusruumis saate m\u00e4\u00e4rata oma domeeni konkreetse baketi juurdep\u00e4\u00e4suks, lihtsalt kasutades <code>CNAME<\/code>. Kuid t\u00e4nap\u00e4eval ei saa ilma HTTPS-ita: oma domeen t\u00e4hendab oma SSL-sertifikaati. <\/p>\n<p><\/p>\n<p>Nagu ma juba \u00fctlesin, vastutab Nginx meie jaoks tasakaalustamise ja SSL-i terminaatori eest. Meie puhul ei ole see tavaline Nginx, vaid OpenResty, Nginx LuaJIT toega.<\/p>\n<p><\/p>\n<p>See v\u00f5imaldas meil \u00fcsna lihtsalt \u00f5petada meie Nginx-i jagama juhuslikke sertifikaate. Samuti oli meil vajalik sertifikaate anda d\u00fcnaamiliselt (ilma vajaduseta neid konfigureerimisfailidesse kirjutada). Kasutasime laiendust <code>ssl_certificate_by_lua<\/code>, mis v\u00f5imaldab sertifikaati lugeda juhuslikust allikast otse TLS-k\u00e4epigistuse ajal. Sertifikaatide hoidmiseks kasutasime ka Tarantool-i: see v\u00f5imaldab hallata sertifikaate v\u00e4ljastpoolt ja tagab \u00e4\u00e4rmiselt kiire edastamise.<\/p>\n<p><\/p>\n<p>Samuti on rakendatud eraldi demon, mille \u00fclesanne on regulaarne sertifikaatide uuendamine, mis on v\u00e4lja antud Let&#8217;s Encrypt abil.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"S3 arhitektuur: 3 aastat Mail.ru pilve salvestuse arengut\" 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\">Mida ma s\u00e4ilitaksin ja mida teeksin teisiti, kui arendada salvestust uuesti?<\/h2>\n<p><\/p>\n<h3 id=\"chto-nuzhno-bylo-ispolzovat-s-samogo-nachala\">Mida oleks pidanud algusest peale kasutama<\/h3>\n<p><\/p>\n<p><strong>Shardimine kohe<\/strong>. \u00dcsna palju probleeme p\u00f5hjustas shardi \u00fcmberpaigutamine. Seda on lihtne teha, kuid kui alustada projekte, mis vajavad skaleerimist, on parem kohe v\u00f5tta sharditud klaster, isegi kui node'e on minimaalselt. Shardimise rakendamine alguses on peaaegu tasuta v\u00f5rreldes shardimise rakendamisega t\u00f6\u00f6tavas s\u00fcsteemis.<\/p>\n<p><\/p>\n<p><strong>Tarantooliga t\u00f6\u00f6tamine l\u00e4bi koormuse tasakaalustajate<\/strong>. Hetkel \u00fchendame k\u00f5ik uued andmebaasid kohe koormuse tasakaalustajate kaudu. See v\u00f5imaldab laiendada funktsionaalsust ja saavutada suuremat t\u00f5rkekindlust. <\/p>\n<p><\/p>\n<p><strong>Automaalne t\u00f5rke taastumine<\/strong>. Oleksin paigaldanud k\u00f5ik vajalikud t\u00f6\u00f6riistad automaatse t\u00f5rke taastumise jaoks, kuna esimesed eba\u00f5nnestumised k\u00e4ivitamise ajal olid seotud selle puudumisega. P\u00e4rast kogemust S3-ga k\u00e4ivitati k\u00f5ik j\u00e4rgnevad tooted arvesse v\u00f5ttes.<\/p>\n<p><\/p>\n<p><strong>S3 funktsioon \u201eVersioonimine\u201d<\/strong>. Alguses tundus, et see pole v\u00e4ga n\u00f5utud funktsionaalsus. Selle v\u00f5imaluse integreerimine t\u00f6\u00f6tava s\u00fcsteemi arhitektuuri on \u00e4\u00e4rmiselt keeruline.<\/p>\n<p><\/p>\n<p><strong>Eraldiseisev arveldamine<\/strong>. See, kuidas integraator arveldamise meie s\u00fcsteemi, j\u00e4i alguses h\u00e4sti t\u00f6\u00f6le, kuid hiljem hakkas see segama, oleks parem, kui see oleks t\u00e4iesti eraldi teenusena.<\/p>\n<p><\/p>\n<h3 id=\"chto-bylo-udachnym-resheniem\">Mis oli \u00f5ige otsus<\/h3>\n<p><\/p>\n<p><strong>Andmemudel<\/strong>. Ajalugu n\u00e4itab, et teenuse arengu jooksul \u00fctleme \u00fcsna t\u00e4pselt Amazon'i andmemudeli, seet\u00f5ttu suudame ellu viia samu funktsioone, mis seal eksisteerivad.<\/p>\n<p><\/p>\n<p><strong>Shardimise skeem<\/strong>. Toetaksin samalaadseid vahemikud shardeid kottide j\u00e4rgi, kuna see v\u00f5imaldab h\u00e4sti jaotada p\u00e4ringud erinevatest kottidest suurele klastrile.<\/p>\n<p><\/p>\n<p><strong>Tarantooli kasutamine<\/strong>. Tarantool aitas oluliselt teenuse arendamisel ja muutmisel, suudame lihtsalt andmetega t\u00f6\u00f6tada, andmeid transformeerida ja salvestust shardida, samas ei pidanud me rakenduse tasemele t\u00f5usma. <\/p>\n<p><\/p>\n<blockquote><p>See ettekande kuulutati esmakordselt <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/databases-2\/\">@Andmebaasid Meetup<\/a><\/noindex> by Mail.ru Cloud Solutions&amp;Tarantool. Vaata <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=jM4hL2u6JM0&amp;list=PLQzTaxmOHjntyNRPWhaWHqlHp8UN_wgQ3\">video<\/a><\/noindex> teisi ettekandeid ja j\u00e4lgi \u00fcrituste teadaandeid Telegramis <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Kubernetesest Mail.ru Groupis<\/a><\/noindex>.<\/p><\/blockquote>\n<p>Samuti saate vaadata minu vana ettekannet S3-st v\u00f5i lugeda minu kolleegi artiklit plokksalvestuse kohta.<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=O0iIADHgBVc\">Amazon S3 arhitektuuri tagasiviimine ja kuidas n\u00e4gi v\u00e4lja S3-salvestus MCS kolm aastat tagasi<\/a><\/noindex>.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/472694\/\">Rohkem kui Ceph: MCS pilveplokkide salvestus<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>Allikas: <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.1.1 - 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\/et\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 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\/et\/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\udd47 S3 arhitektuur: 3 aastat Mail.ru Cloud Storage'i evolutsioonist | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/arhitektura-s3-3-goda-evolyuczii-mail-ru-cloud-storage","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 S3: 3 \u0433\u043e\u0434\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 Mail.ru Cloud Storage | ProHoster","og:url":"https:\/\/prohoster.info\/et\/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\/et\/wp-json\/wp\/v2\/posts\/91090","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=91090"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/91090\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/91091"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=91090"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=91090"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=91090"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}