
Peterburist
Tere kÔigile! Mina olen Mons Anderson, platvormi arhitekt , rÀÀgin, kuidas me oma S3-salvestust ehitasime, kuidas see töötab, millised lahendused olid edukad ja mida oleks tasunud muuta, kui me oleksime sama projekti nullist alustanud.
Artikkel on koostatud pÔhjal doklist, Mail.ru Cloud Solutions & Tarantool. Artiklis rÀÀgime:
- kuidas Mail.ru salvestus oli ĂŒles ehitatud, mille peal me S3-salvestust ehitasime;
- mida me lisasime, et luua Mail.ru Cloud Storage;
- kuidas objekti salvestusmudel töötab ja milliseid samme oleme teinud toodete turule toomiseks;
- toodete parendustest: failover ja skaleerimine;
- kuidas me shardimist ja reshardimist rakendasime;
- ja samuti SSL-sertifikaatidega töötamiseks.
Kui te ei soovi lugeda, siis vÔite .
Kuidas Mail.ru salvestus oli ĂŒles ehitatud, mille peal me S3-salvestust ehitasime
Meie S3 arendus algas Mail.ru Cloudi salvestusel, seega on esmalt oluline rÀÀkida, kuidas see töötab ja millised on selle vÔimalused.
Mail.ru pilvesalvestus koosneb serveritest, mis on varustatud ketastega. Keskmiselt on kaasaegne salvestusserver 36 ketast, mille maht on 12â14 terabaiti. Varem olid kettad vĂ€iksemad, kuid kolme aasta jooksul on ketaste mahud kasvanud ning tĂ€na on see peaaegu pool petabaiti tooreid andmeid.
Erinevate serverite kettad kombineeritakse nn "paarideks" (pair). Paar on ĂŒksik failide salvestamise ĂŒksus. Sisuliselt on see ketas, mis on kindlasse jaotusse kindlal teel mountitud, kus failid vĂ”ivad olla salvestatud, tuvastatud hash'ide abil.
Paar on ajalooline nimetus, mis on sĂ€ilinud tĂ€napĂ€evani, kuigi nĂŒĂŒd ei pea paaris olema tingimata ainult kaks ketast. Ketaste arv vĂ”ib olla kolm ning vĂ”ivad olla ka erinevad hĂŒbriidsalvestused, nĂ€iteks 3/2.

Paarid (pair) on objektide salvestamise ĂŒksused
KĂ”iki paare hoitakse PairDB-s â see on rakendus, mis on koostatud Tarantooli pĂ”hjal. KĂ”ik andmebaasid meie salves, alustades esimestest, on Tarantooli alusel, teisi andmebaaside ei kasutata.
PairDB hoiab kĂ”iki paare, nende seisundeid, vaba ruumi, tĂ”rketĂ”kestamise vĂ”imalusi, viimaseid vigu. Samuti suudab see ise paare aktiveerida, nende seisundeid ajakohastada, kontrollida, kas need töötavad vĂ”i mitte. Seega on PairDB nagu ĂŒhine ĂŒlevaade meie sĂŒsteemi kĂ”igi ketaste seisundist.

Pair DB: andmebaas paaride seisunditest
SeerumĂ€est hoitakse faile ning et teada, millisel serveril mis fail asub, on vaja veel ĂŒht andmebaasi â FileDB. See salvestab kaardi, mis mÀÀrab vastavuse: see fail asub seal ja seal, ning lisaks mĂ”ned vajalikud atribuudid.
File DB: koht, kus fail asub
Veel ĂŒks oluline lĂŒli on teenus Nylon, andmebaaside kasutamise ruuter. See on ĂŒhtne sisenemispunkt, mis vĂ”imaldab töötada lĂ€bi ĂŒhe liidese nii PairDB kui ka FileDBga. See on stateless teenus, see teostab pĂ€ringute laadimist, mĂ”istab, millisele shardile FileDB-le pöörduda ning teab, millised serverid on aktiivsed ja millised mitte.

Nylon: andmebaaside kasutamise ruuter
Samuti peab sisu hoiustama kuidagi. Selleks on olemas teenus â Streamer. See pakub kahte HTTP meetodit: PUT meetod, et sisu hoiusesse laadida ja GET meetod, et sealt sisu saada. HTTP on ĂŒsna populaarne ja mugav protokoll andmete edastamiseks.
Kui me pöördume Streamerâi, siis see pöördub Nylonâi kaudu PairDB poole, selgitab vĂ€lja, millisele serverile saab faili laadida ja edastab seejĂ€rel andmed WebDAVi kaudu sellele serverile.
Sisuliselt on iga storage server â see on nginx pluss kettad, mis on ĂŒhendatud kindlate teede kaudu. Me vĂ”ime Streamerâist faili hoiusesse laadida, kustutada, ĂŒmber nimetada vĂ”i selle tĂŒkisust kontrollida. See tĂ€hendab, et see on mugav liides madala taseme ĐČĐ·Đ°ĐžĐŒĐŸĐŽĐ”ĐčŃŃĐČĐžŃ jaoks hoiusega.

Streamer: pÀÀsupunkt hoiusesse
Mida me lisasime, et teha S3-hoidla
Nii oleme vaadanud, milline on hoiustamise ĂŒldine struktuur hetkel, kui me olime valmis S3-hoidla kĂ€ivitama. TĂ€nu PUT meetodile saime sinna paigutada suvalist sisu ja meil oli selle andmehalduse identifikaator, mis on hash. Selle identifikaatoriga oli hiljem vĂ”imalik tulla ja algne fail tagasi saada. Kuid see ei piisa S3 rakendamiseks. S3 protokollis, peale objektide hoidmisest, on:
- metainfo salvestamine â objektide lisavÀÀrtused;
- objektide ligipÀÀsu korraldamine HTTP kaudu;
- objektide rĂŒhmitamine kollektiividesse â bucketeid;
- HTTP-S3 Endpoint. S3 korraldab andmed kindlates struktuurides â bucketeid, millest igaĂŒhel on faili hoidmiseks pÀÀsupunkt.
Selle loogika rakendamiseks oli vajalik eraldi teenus. Soovisime ka kohe ette nÀha arhitektuuri teenuse edasiseks kasvuks, tagades lineaarsuse skaleeritavuses.
Esimese komponendid
Demon, mis rakendab S3 API. See on Amazoni standardne S3 API, mis toetab XML-i kasutamist metaandmete jaoks ja vÔimaldab sisu otse edastada. Me ei pidanud midagi vÀlja mÔtlema, kÔik on kirjeldatud ja dokumenteeritud.
Samuti paigaldasime teenuse ette Nginxi. Kasutasime seda SSL-i lÔpetamiseks, koormuse tasakaalustamiseks ja mÔne loogika jaoks Lua's (mÔÔdikud, logimine ja jÀlgimine).
S3 metaandmete salvestamiseks valisime ka Tarantooli. Esimeses versioonis lÀks S3 demon nende metaandmete jÀrele sellesse andmebaasi, sisu ise salvestati suuremasse salvestusse Streameri kaudu.

Nginx + S3 API + metaandmed
Objektide salvestusmudel
Vaadakem, kuidas S3 töötab. Kasutaja vĂ”ib luua Ă€mber â objektide kogumi. Ămber adresseeritakse hosti nime kaudu ja on teenuse alamdomeen. Ămbri raames saab kasutaja luua objekte. Objekti identifikaatoriks on URL. Objekti sisu on blob, binaarandmete massiiv, mida me salvestaime salvestuses. Objektil on ka atribuute: nimi â see sama URL, ACL (juurdepÀÀsu kontrollimise nimekiri), muud lisandid vĂ”i vabatahtlikud atribuudid â kĂ”ik see salvestatakse metaandmetesse.
Nende andmete normeeritud skeem vĂ”ib vĂ€lja nĂ€ha nii: on projektid, millele kuuluvad Ă€mbrit, millele kuuluvad objektid ja objektid vĂ”ivad olla koostisosad. Kuna ĂŒks viis objektide ĂŒleslaadimiseks on osade kaupa, on ĂŒleslaadimiseks kaks abita tabelit: uploads ja chunks. Samuti on projektidel juurdepÀÀsuandmed ja arveldamine.

Andmeskeem
Kuna tegime b2b teenuse tasulise juurdepÀÀsuga, oli selles skeemis vajalik arveldamine.
Arvelduse teenuse realiseerime samuti Tarantoolis.

S3 salvestuse tÀiustamine: sammud tootmisese suunas
Me oleme juba loonud toimiva mudeli, mida saab kasutada: objektid ja metaandmed oli salvestatud, kuid tootmisse minekuks jÀi puudu mÔned aspektid.
Esiteks on reitingute sĂŒsteem. Kui kĂ€ivitada teenus ilma selleta, vĂ”ime tipnakkumise ajal ettearvamatult ĂŒle koormata mĂ”ne sĂŒsteemi ala. Reitingu limiit peab toimima jĂ€rgmiselt: iga S3-pĂ€ring tuleb konkreetsele hostile, see host on Ă€mber, ja Ă€mber kuulub mingile kliendile. Peame mÀÀrama teatud funktsiooni Ă€mberest, mis vĂ”imaldaks arvutada reitingu limiidi.
Lisaks peab reitingute sĂŒsteem olema piisavalt jĂ”uline, et taluda S3-le tulevat koormust.
Siin kasutasime jĂ€lle Tarantooli. Reitingud on 21 instantsist koosnev klaster, instantsid on jagatud gruppidesse, laiali kolme fĂŒĂŒsilise sĂ”lme vahel ja ĂŒhendatud suureks topoloogiliseks klastriks. Sellele levitatakse automaatselt konfigureerimis muudatused: mÀÀratakse reitingu limiidid, vaikeseaded ja konfiguratsioon. Iga Ă€mber teenindatakse rangelt ĂŒhe instantsiga. Kui konkreetsele Ă€mbrile saadetakse pĂ€ring, arvutatakse vĂ€lja instants, mis vastutab selle Ă€mber eest. Selle sĂ”lme raames toimub pĂ€ringute praeguse reitingu arvestamine algoritmi abil, mis sarnaneb Token Bucket'ile. Edasi teatab reitingute sĂŒsteem, tuginedes praegusele koormuse nĂ€itajale ja konkreetse Ă€mber jaoks seatud omadustele, kas pĂ€ringut saab tĂ€ita vĂ”i mitte. Limiteerimise kontroll toimub S3-pĂ€ringu tĂ€itmise kĂ”ige varasemas etapis, kaitstes kĂ”iki sĂŒsteemi teisi elemente liigse koormuse eest.

Samuti on koormuse all ĂŒsna keeruline hakkama saada ilma vahemĂ€luta. S3 eeldab, et sama objektiga pöördutakse mitu korda, see tĂ€hendab, et tegemist on kuuma salvestusruumiga. Tavalises olukorras teenindatakse ĂŒksik faili pĂ€ring kogu ahela kaudu: Streamer, FileDB, PairDB, Storage. Kuid failile mitu korda pöördudes optimeerime juurdepÀÀsu sellele sisule kohaliku vahemĂ€lu abil.
VahemĂ€lu on mitmekihiline ja rakendatud nginx'i, kohalike SSD ja RAM-kettade abil. Siin me Tarantool'i ei kasutanud, sest objekte on mugavam edastada failisĂŒsteemist, nii saame teha vahemĂ€lu kihtimist. Lisaks on meil suured objektid maksimaalse suurusega 32 gigabaiti, samas kui Tarantool'is saab vahemĂ€luda ainult vĂ€ikesi objekte.

See esimene sĂŒsteem, millega me alustasime, omas teatud arvutatud mahutavust, mis oli piisav, et toote uurimiseks ja mĂ”istmiseks ning selle toimimise kinnitamiseks.
SĂ”jalise sĂŒsteemi tĂ€iustused: failide ĂŒleandmine ja skaaleerimine
SĂŒsteem oli juba kasutuses, kuid alguses jĂ€tsime me midagi olulist tĂ€helepanuta â oleks pidanud lisama failide ĂŒleandmise ja skaaleerimise.
Meie S3-deemon kogus metaandmeid protokolli Tarantool kaudu. Originaalse andmebaasi asemele paigaldasime Tarantooli, mis toimis metaandmete pĂ€ringute proxy-suunajana. Rakenduse poolest, mis realiseerib API-d, ei muutunud midagi â see jĂ€tkas andmebaasi pöördumist Tarantooli protokolli kaudu, kuid suunaja suutis tagada aktiivse failide ĂŒleandmise. See tĂ€hendab, et saime kontrollida sĂ”lme kĂ€ttesaadavust, taluda pause ĂŒleminekute ja tĂ”rgete ajal jne. Samas me rakendust ei modifitseerinud.

Rohkem teavet selle kohta, kuidas me shardingut rakendasime
JĂ€rgmine kĂŒsimus, millega tuli tegeleda â sharding. SĂŒsteem kasvas, objektide arv suurenes ja pidime tagama vĂ”imalused edasiseks kasvuks.
Naaseme andmeskeemi juurde: on projektid, on koppad, Ă”igused ja arveldamine. Need on objektid, mis tĂ”enĂ€oliselt ei ĂŒleta lĂ€hitulevikus ĂŒhe instantsi mahutavust ega pĂ€ringute arvu. Seega ei ole mĂ”tet neid shardeerida, ning me tĂ”stsime need eraldi instantsile, mis jÀÀb mitte-sharditud. See vĂ”imaldab projektide ja koppade haldamist konsistendsemalt, kuna on olemas ĂŒks mitte-sharditud punkt.

Samuti on skeemis objekte, mis kasvavad lineaarselt â alguses oli neid sadu tuhandeid, nĂŒĂŒd mÔÔdetakse arvu mitmete miljarditega. Sellised objektid koos oma osadega tuli viia sharded klastrisse.

Me jagasime skeemi, kuid objektid peavad töötama koppadega: objekt kuulub alati konkreetsele koppale, lisaks töötab kopa peal ACL. SeetÔttu hoiame iga objekti jaoks, mis on sharditud, iga kopa varukoopia. Lisaks tuleb objektide modifitseerimise ja pÀringute tÀitmise ajal arvestada mahtu arveldamiseks, seetÔttu on igas shardis arvestid arveldamise jaoks.
Lisaks lisasime veel paar tabelit ja komponenti:
- prĂŒgikasti, et hĂ€vitada vanu projekte, mis kustutatakse vĂ”i kĂŒlmutatakse;
- taustaprotsesside jÀrjekord, see tÀhendab, et peamine salvestus vÔib tÀita taustaprotsesse, mida on vaja klastris teha;
- elutsĂŒkli toetamine â mehhanism, mis vĂ”imaldab töötada objektidega ja hallata nende elutsĂŒklit.

Kuna osa andmeid transportisime sharde, vajasime shardimisproksi. Oleks olnud vĂ”imalik kasutada ruuterit selle ĂŒlesande tĂ€itmiseks, kuid eraldi shardimisproksi, mis vastutab ainult andmete shardimise eest, vĂ”imaldab ruuteril andmeid tervikuna otsida, mitte mĂ”elda shardimisele.

Selgitan eraldi, miks me ei valinud valmis lahendust, vaid soovisime luua kohandatud shardimise funktsiooni.
Vaadakem, kuidas see on ĂŒles ehitatud. Meil on 256 saadaval olevat shard'i. Iga baketi jaoks eraldame vahemiku mingi jĂ€rjepideva funktsiooni abil. See on lihtne â nagu jĂ€rjepideva funktsiooni abil mÀÀrate kuuluvuse ĂŒhe shard'i alla, mÀÀrate ka algse shard'i ja eraldate vahemiku:
f(bucket, shards) = subset
Seega, kui vĂ”tta baket, siis vĂ”ib öelda, et see ja selle andmed paiknevad alati konkreetses alamkogus kĂ”igist shard'idest. See vĂ€hendab ĂŒhe baketi mĂ”ju teistele ja lihtsustab map-reduce pĂ€ringute tööd, kui on vaja nĂ€iteks koostada baketi objektide loend. Selleks tuleb kĂŒsitleda kĂ”iki sharde, kus need objektid asuvad. Kui objektid asuksid kĂ”igis shard'ides, mĂ”jutaks iga loetelu sĂŒsteemi tervikuna, aga siin mĂ”jutab see ainult konkreetset alamkogust.
Lisaks kuulub iga objekt konkreetsele baketile, seetÔttu, kui me pöördume objekti poole, pöördume objekti poole nime kaudu konkreetse baketi sees. See tÀhendab, et saame mÀÀrata objekti funktsiooni mitte kÔigist saadaval olevatest shard'idest, vaid ainult tema baketi alamkogust:
f(object, subset) = shard
VĂ”tame konkreetsed objektid, funktsiooni argumentidena edastame mitte kĂ”ik shard'id, vaid ainult tema baketi alamkoguse â ja saame konkreetse shard'i.

Nii et shardimine on rakendatud, on olemas shardimisproksi. Edasi jÀÀb ruuterist ja metainfobaasist minna shardimisproksisse. NĂ€iteks varjuka lubade loomiseks â kui me loome baketi, peab peamine salvestus looma selle baketi esindaja kĂ”igis shard'ides, kus see peab olema.

Kuidas me rakendasime uuesti shardimist
Suurim probleem shardimis on ĂŒmbershardimine. Meile oli oluline selle teostamine ilma seisakuteta, kuna sĂŒsteem oli juba tootmises. NĂ€itan, kuidas me lahendasime probleemi sarnase ĂŒlesande nĂ€itel, kus andmete elu migreerimine toimus ĂŒhelt projektilt teisele.
Allpool on meie klastriskeem, mis kujunes pÀrast shardimise rakendamist. Meil on nginx, S3 API, marsruuter, peamine andmebaas projektidega, shardiva proksi ja ise shardid.

Eelnevalt jĂ€tsin mainimata, et projekti teatud etapis oli tooteĂŒlesanne: "KĂ€ivitada veel ĂŒks salvestus, Icebox, mis toimiks nagu Hotbox, aga kĂŒlmade andmete jaoks." Tegelikult on see sama salvestus, kuid erinevate URL-ide ja ilma vahemĂ€ludeta.

Iceboxi kasutati vĂ€hem kui Hotboxi, seetĂ”ttu toimumas ei toimunud mingit shardingut ĂŒsna pikalt. LĂ”puks otsustasime sellest loobuda ja ĂŒhendada Hotbox ja Icebox ĂŒheks teenuseks, jagades lihtsalt salvestusklassid.
Salvestustes ei kattunud baketid, neid sai hĂ”lpsasti ĂŒhte liita ja ĂŒmber liigutada, kuid kliendid kasutasid nii ĂŒhte kui teist salvestust, seega oli vaja lahendada probleem, et mitte tekkida seisakut. Ei olnud vĂ”imalik lihtsalt vĂ€lja lĂŒlitada ja kopeerida. Raeime migreerimise mitme etapi jooksul.
Esiteks sĂŒnkroniseerisime peamised salvestused. Meil oli Tarantool ja saime objekti loomisel teha jĂ€rgmist:
- andmebaas saab baketi loomise pÀringu, nÀiteks Hotboxis;
- Tarantool kontrollib teises andmebaasis (antud juhul Iceboxis), et sellist baketi ei ole;
- kui baket on olemas, teatab andmebaas, et seda ei saa luua, ja see sĂŒnkroniseeriti olemasolevana.

Bakettide sĂŒnkroniseerimine
Sel salvestusel, mis pidid vastu vĂ”tma kĂ”ik andmed, lisati projektide ja bakettide jaoks tunnus, mis nĂ€itas, kus see objekt paikneb. See vĂ”is asuda lokaalselt, st Hotboxis, Iceboxis â siis ei olnud uues salvestuses selle kohta mingeid andmeid, vĂ”i siis vĂ”is see olla migreerimise olekus.
Kui projektil vÔi baketil oli mÀÀratud Migrating, siis migreerimise ajal tehti pÀring algselt uude salvestusse, kuhu andmed pidid minema, ja kui seal ei olnud, siis suunati pÀringud alternatiivsele salvestusele.
SeejĂ€rel suunasime liikluse. Kuna API suutis teenindada nii Iceboxi kui ka Hotboxi pĂ€ringuid, suudame liikluse suunata ilma seisaku, lihtsalt hostide ĂŒmberkolimise ja sobivate kirjeid lisamisega Nginxisse.
PĂ€rast liikluse suunamist saime eemaldada Nginxi ja Iceboxi API.
SeejĂ€rel eemaldasime Iceboxi Nginxi ja S3 API â ja kĂ”ik toimis:

Edasi kĂ€ivitasime taustaprotsessi migreerimiseks, mis töötab andmebaasis â lĂ€bib kĂ”ik projektid ja nende baketid elemendi kaupa, mÀÀrab neile staatuse Migrating, kannab andmed ĂŒle ja lĂ”petamisel mÀÀrab staatuse Local.

PĂ€rast andmete ĂŒlekandmist ei vajanud me enam vana salvestusruumi ning eemaldasime allesjÀÀnud osad vanast sĂŒsteemist ning eemaldame koodist ka migreerimise staatuse toe.

Sarnaste pÔhimÔtete alusel viidi lÀbi ka reharding vana salvestusruumi ja sharded-i vahel:
- MÀrgistasime kÔik baketid kui
Non-sharded. KÔik pÀringud suundusid algsesse, mitte sharded salvestusruumi. - Uued baketid loodi kohe staatusega
Sharded. - . Ăksikuid baketeid vĂ”eti, seadistati nende staatuseks
Migratingja andmed kanti ĂŒle.
PÀringud teenindati jÀrgmiselt:
- Lugesime uuest, seejÀrel vanast.
- Loome ainult uuest.
- Uuendame kahefoolselt: kui uuest ei ole, kanname vanast uude, seejÀrel uuendame.
Töö SSL-sertifikaatidega
Eesliideses kasutame Nginxi. Meie puhul ei ole see tavapÀrane Nginx, vaid OpenResty, Nginx LuaJIT toega.
Veel ĂŒks sĂŒsteemi osa â töö SSL-sertifikaatidega. S3 salvestusruumis saate mÀÀrata oma domeeni konkreetse baketi juurdepÀÀsuks, lihtsalt kasutades CNAME. Kuid tĂ€napĂ€eval ei saa ilma HTTPS-ita: oma domeen tĂ€hendab oma SSL-sertifikaati.
Nagu ma juba ĂŒtlesin, vastutab Nginx meie jaoks tasakaalustamise ja SSL-i terminaatori eest. Meie puhul ei ole see tavaline Nginx, vaid OpenResty, Nginx LuaJIT toega.
See vĂ”imaldas meil ĂŒsna lihtsalt Ă”petada meie Nginx-i jagama juhuslikke sertifikaate. Samuti oli meil vajalik sertifikaate anda dĂŒnaamiliselt (ilma vajaduseta neid konfigureerimisfailidesse kirjutada). Kasutasime laiendust ssl_certificate_by_lua, mis vĂ”imaldab sertifikaati lugeda juhuslikust allikast otse TLS-kĂ€epigistuse ajal. Sertifikaatide hoidmiseks kasutasime ka Tarantool-i: see vĂ”imaldab hallata sertifikaate vĂ€ljastpoolt ja tagab ÀÀrmiselt kiire edastamise.
Samuti on rakendatud eraldi deemon, mille ĂŒlesanne on regulaarselt uuendada sertifikaate, mis on vĂ€ljastatud Letâs Encrypt-i kaudu.

Mida ma sÀilitaksin ja mida teeksin teisiti, kui arendada salvestust uuesti?
Mida oleks pidanud algusest peale kasutama
Shardimine kohe. Ăsna palju probleeme pĂ”hjustas shardi ĂŒmberpaigutamine. Seda on lihtne teha, kuid kui alustada projekte, mis vajavad skaleerimist, on parem kohe vĂ”tta sharditud klaster, isegi kui node'e on minimaalselt. Shardimise rakendamine alguses on peaaegu tasuta vĂ”rreldes shardimise rakendamisega töötavas sĂŒsteemis.
Tarantooliga töötamine lĂ€bi koormuse tasakaalustajate. Hetkel ĂŒhendame kĂ”ik uued andmebaasid kohe koormuse tasakaalustajate kaudu. See vĂ”imaldab laiendada funktsionaalsust ja saavutada suuremat tĂ”rkekindlust.
Automaalne tÔrke taastumine. Oleksin paigaldanud kÔik vajalikud tööriistad automaatse tÔrke taastumise jaoks, kuna esimesed ebaÔnnestumised kÀivitamise ajal olid seotud selle puudumisega. PÀrast kogemust S3-ga kÀivitati kÔik jÀrgnevad tooted arvesse vÔttes.
S3 funktsioon âVersioonimineâ. Alguses tundus, et see pole vĂ€ga nĂ”utud funktsionaalsus. Selle vĂ”imaluse integreerimine töötava sĂŒsteemi arhitektuuri on ÀÀrmiselt keeruline.
Eraldiseisev arveldamine. See, kuidas integraator arveldamise meie sĂŒsteemi, jĂ€i alguses hĂ€sti tööle, kuid hiljem hakkas see segama, oleks parem, kui see oleks tĂ€iesti eraldi teenusena.
Mis oli Ôige otsus
Andmemudel. Ajalugu nĂ€itab, et teenuse arengu jooksul ĂŒtleme ĂŒsna tĂ€pselt Amazon'i andmemudeli, seetĂ”ttu suudame ellu viia samu funktsioone, mis seal eksisteerivad.
Shardimise skeem. Toetaksin samalaadseid vahemikud shardeid kottide jÀrgi, kuna see vÔimaldab hÀsti jaotada pÀringud erinevatest kottidest suurele klastrile.
Tarantooli kasutamine. Tarantool aitas oluliselt teenuse arendamisel ja muutmisel, suudame lihtsalt andmetega töötada, andmeid transformeerida ja salvestust shardida, samas ei pidanud me rakenduse tasemele tÔusma.
See ettekande kuulutati esmakordselt by Mail.ru Cloud Solutions&Tarantool. Vaata teisi ettekandeid ja jĂ€lgi ĂŒrituste teadaandeid Telegramis .
Samuti saate vaadata minu vana ettekannet S3-st vÔi lugeda minu kolleegi artiklit plokksalvestuse kohta.
- .
- .
Allikas: habr.com

