Tere, Habr! Viimase paariku jooksul oleme olnud vÀga huvitavas olukorras ja soovin jagada meie infrastruktuuri skaleerimise lugu. Selle aja jooksul kasvas SberMarket tellimustes neljakordselt ja kÀivitas teenuse 17 uues linnas. Toiduainete kohaletoimetamise nÔudluse plahvatuslik kasv nÔudis meie infrastruktuuri skaleerimist. KÔigi kÔige huvitavamate ja kasulikumate jÀrelduste lugemiseks vaata edasi.

Mina olen Dima Bobylev, SberMarketi tehniline direktor. Kuna see on meie blogi esimene postitus, siis ĂŒtlen paar sĂ”na enda ja ettevĂ”tte kohta. Eelmisel sĂŒgisel osalesin noorte liidrite konkursil Runetis. Selle konkursi jaoks kuidas me SberMarketis nĂ€eme sisemist kultuuri ja lĂ€henemist teenuse arendamisele. Kuigi konkursil vĂ”itmiseks ei Ă”nnestunud, suutsin siiski vĂ€lja mĂ”elda peamised pĂ”himĂ”tted IT-ökosĂŒsteemi arendamiseks.
Meeskonna juhtimisel on oluline mĂ”ista ja leida tasakaal selle vahel, mis on vajalik Ă€ri jaoks, ja iga konkreetse arendaja vajaduste vahel. Praegu kasvab SberMarket 13 korda aastas ja see mĂ”jutab toodet, nĂ”udes pidevat mahu ja arendustempo suurendamist. Vaatamata sellele eraldame arendajatele piisavalt aega eelanalĂŒĂŒsiks ja kvaliteetse koodi kirjutamiseks. Moodustatud lĂ€henemine aitab mitte ainult töötava toote loomisel, vaid ka selle edasises skaleerimises ja arendamises. Selle kasvu tulemusena on SberMarket juba saanud toidukullerite teenuste liidriks: me toimetame iga pĂ€ev umbes 18 tuhat tellimust, kuigi veel veebruari alguses oli neid umbes 3500.

Ăks kord palus klient SberMarketi kulleril toimetada tooted talle kontaktivabalt â otse rĂ”dule.
Aga liigume konkreetsemate asjade juurde. Viimased paar kuud oleme aktiivselt tegelenud meie ettevĂ”tte infrastruktuuri suurendamisega. Selle vajadus sai seletatud nii vĂ€listest kui ka sisemistest teguritest. Samal ajal, kui kliendibaas laienes, kasvas ĂŒhendatud kaupluste arv algusaasta 90-st kuni rohkem kui 200-ni mai keskpaigaks. Loomulikult olime ette valmistunud, reserveerides pĂ”h infrastruktuuri, pluss lootes vertikaalse ja horisontaalse skaleerimise vĂ”imalusele kĂ”igis Yandexi pilves asuvates virtuaalmasinates. Kuid praktika nĂ€itas: "KĂ”ik, mis vĂ”ib valesti minna, lĂ€heb ka valesti". Ja tĂ€na tahan jagada kĂ”ige huvitavamaid olukordi, mis on nendel nĂ€dalatel aset leidnud. Loodan, et meie kogemus osutub teile kasulikuks.
Slave on tÀielikus sÔjalises valmiduses
Juba enne pandeemia algust kohtasime tÔusu meie backend serverite pÀringutes. Tooted koju tellimise trend hakkas kiiresti kasvama ning COVID-19 esimeste eneseisolatsiooni meetmete sisseviimisega kasvas koormus dramaatiliselt pÀeva jooksul. Tekkis vajadus kiiresti vabastada master-serverid pÔhiteabe andmebaasist ja suunata osa lugemispÀringutest replikaserveritele (slave).
Oli juba ette valmistatud sellele sammale, ja sellise manöövri jaoks olid juba kĂ€ivitatud 2 slave-serverit. Nendel töötasid peamiselt andmevahetuse infovood partneritega genereerimise batch-ĂŒlesanded. Need protsessid genereerisid liigset koormust ja olid tĂ€iesti Ă”igustatult paar kuud varem "kĂ”rvadest vĂ€lja viidud".Â
Kuna Slave'is toimus replikatsioon, jĂ€rgnesime pĂ”himĂ”ttele, et rakendused vĂ”ivad nendega töötada ainult read only reĆŸiimis. HĂ€daolukorra taastamise plaan eeldas, et tĂ”sise probleemi korral saame lihtsalt monteerida Slave Masteri kohale ja suunata kĂ”ik kirjutamis- ja lugemispĂ€ringud Slave'ile. Kuid soovisime kasutada replikaid ka analĂŒĂŒsi osakonna vajadusteks, seetĂ”ttu ei olnud serverid tĂ€ielikult viidud read only staatusele ning igal hostil oli oma kasutajatute komplekt ja mĂ”nedel olid kirjutamisĂ”igused vahepealsete arvutuste tulemuste salvestamiseks.
Teatud koormuse tasemeni piisavalt, et meistril oli piisavalt nii kirjutamiseks kui ka lugemiseks http-pĂ€ringute töötlemisel. MĂ€rtsi keskpaiku, just kui SberMarket otsustas tĂ€ielikult ĂŒle minna kaugtööle, algas meil RPS-i jĂ€rsk kasv. Ăha rohkem meie kliente lĂ€ks isolatsiooni vĂ”i töötama kodust, mis kajastus koormuse nĂ€itajates.
Meistri tootlikkus lĂ”petas piisavuse, seega hakkasime osa raskemaid lugemisepĂ€ringuid viisama replikale. KirjutamisekspĂ€ringute suunamiseks meistrisse ja lugemiseks orja, kasutasime ruby gem "". Loomasime spetsiaalse kasutaja postfixiga _readonly, kellel ei olnud kirjutamisĂ”igust. Kuid ĂŒhe hosti konfiguratsiooni vea tĂ”ttu lĂ€ks osa kirjutamisepĂ€ringutest orjaserverile kasutaja nimel, kellel olid vastavad Ă”igused.
Probleem ei ilmunud kohe vĂ€lja, kuna suurenenud koormus tĂ”i endaga kaasa orjade viibimise. Andmete jĂ€rjepidevuse probleem ilmnes hommikul, kui öiste importide jĂ€rel ei olnud orjad meistrile jĂ€rele jĂ”udnud. Kandsime selle kĂ”rge koormuse ja teenuse enda ĂŒhitamise arvele, mis oli seotud uute kaupluste avamisega. Kuid andmete edastamine mitme tunni viivitusega ei olnud aktsepteeritav ning suunatud protsessid teisele analĂŒĂŒtilise orjale, kuna sellel olid bilotkasuuremad ressursid ja see ei olnud lugemisepĂ€ringutega koormatud (mida me ka ise seletamiseks kasutasime, et replikatsiooni lag'i puudumine).
Kui olime vĂ€lja uurinud peamise orja "lagunemise" pĂ”hjused, oli analĂŒĂŒtiline juba sama pĂ”hjuse tĂ”ttu töölt vĂ€ljas. Vaatamata kahe tĂ€iendava serveri olemasolule, kuhu plaanisime koormuse viia meistri rikke korral, selgus, et kriitilisel hetkel ei olnud ĂŒhtegi.
Kuid kuna me tegime mitte ainult andmebaasi dump'i (taastamine tooks tollal umbes 5 tundi), vaid ka meistri serveri snapshot'i, Ă”nnestus replika kĂ€ivitada kahe tunni jooksul. TĂ”si, pĂ€rast seda ootas meid replikatsiooni logi pealekandmine pika aja jooksul (sest protsess toimub ĂŒhe lĂ”ime reĆŸiimis, kuid see on juba hoopis teine lugu).
KokkuvÔte: PÀrast sellist intsidenti sai selgeks, et tuleb loobuda kasutajate kirjutamise piirangute rakendamisest ja kuulutada server tÀielikult ainult lugemiseks. Sellise lÀhenemisega vÔib olla kindel, et koopiad on kriitilisel hetkel kergesti kÀttesaadavad.
Isegi ĂŒhe raske pĂ€ringu optimeerimine vĂ”ib andmebaasi "elule tagasi tuua".
Kuigi me uuendame kodulehe katalooge pidevalt, olid pĂ€ringud, mida viisime ĂŒle Slave-serveritele, veidi jĂ€rel Master-serverist. Aeg, mille jooksul avastasime ja kĂ”rvaldasime "Ă€kitselt eemaldunud" slave-serverite probleemi, oli pikem kui "psĂŒhholoogiline barjÀÀr" (sel ajal vĂ”isid hinnad muutuda ning kliendid nĂ€eksid aegunud andmeid), ja me olime sunnitud suunama kĂ”ik pĂ€ringud peamise andmebaasi serveri peale. Tulemuseks töötas veebisait aeglaselt⊠kuid vĂ€hemalt töötas. Ja seni, kuni Slave taastustöid tegime, polnud meil muud teha, kui optimeerida.Â
Kuni Slave-serverid taastusid, venisid minutid aeglaselt, Master oli ĂŒlekoormatud ja suunasin oma jĂ”ud aktiivsete ĂŒlesannete optimeerimisele "Pareto reegli" kohaselt: valisime kĂ”rgeima koormuse andvad TOP-pĂ€ringud ja alustasime hÀÀlestamist. See toimus otse "lennul".
Huvi pakkus see, et ĂŒlevoolav MySQL reageerib isegi vĂ€ikesele protsesside paranemisele. Paar pĂ€ringu optimeerimist, mis andis vaid 5% kogukoormusest, nĂ€itas juba selget CPU koormuse vĂ€henemist. Tulemuseks suutsime tagada piisava ressursivarustuse Masteri andmebaasi tööks ja saada vajalik aeg koopiate taastamiseks.Â
KokkuvĂ”te: Isegi vĂ€ike optimeerimine vĂ”imaldab "ellujÀÀmist" ĂŒlekoormuse korral mitme tunni vĂ€ltel. Meil oli selleks just piisavalt aega serverite taastamiseks, kus olid koopiad. Muide, arutame pĂ€ringute optimeerimise tehnilist kĂŒlge ĂŒhes jĂ€rgmises postituses. Niisiis, tellige meie blogi, kui see vĂ”ib teile kasulik olla.
Korraldage partnerite teenuste töömonitoring.
KĂ€sitleme klientide tellimusi ning meie teenused suhtlevad pidevalt kolmandate osapoolte API-dega â need on SMS-i saatmise vĂ€ravad, makseplatvormid, marsruutimise sĂŒsteemid, geokodeerija, FNS-i teenus ja paljusid teisi sĂŒsteeme. Ja kui koormus hakkas kiiresti suurenema, hakkasime me jĂ”udma meie partnerite teenuste API-de piiranguteni, millest me varem isegi mitte ei mĂ”elnud.
Ootamatu partnerite teenuste kvotide ĂŒletamine vĂ”ib viia teie enda teenuse töökatkestuseni. Paljud API-d blokeerivad kliente, kes ĂŒletavad limiite, ja mĂ”nel juhul vĂ”ib liigne pĂ€ringute arv partneri tootmist ĂŒle koormata.Â
NĂ€iteks, kui kohaletehtud pakke hakkas kiiresti suurenema, ei suutnud saatmise teenused ĂŒlesandeid jaotada ning marsruute kindlaks mÀÀrata. Tulemuseks oli see, et tellimused olid esitatud, kuid marsruudi genereerimise teenus ei töötanud. Tuleb mĂ€rkida, et meie logistika meeskond tegi sellistes oludes praktiliselt vĂ”imatut ning meeskonna selge koostöö aitas kompenseerida ajutisi teenuse katkemisi. Kuid sellist tellimuste hulka ei ole pidevalt vĂ”imalik kĂ€sitsi hallata ja mĂ”ne aja pĂ€rast oleksime silmitsi vastuvĂ”etamatute viivitustega tellimuste ja nende tĂ€itmise vahel.Â
VĂ”eti vastu mitmeid organisatsioonilisi meetmeid ja ĂŒhtne meeskonna töö aitas kokku hoida aega, kuni me lepime uute tingimuste ĂŒle ja ootame mĂ”nede partnerite teenuste moderniseerimist. On ka teisi API-sid, mis pakuvad suurepĂ€raseid vastupidavuse tasemeid ja palju soodsaid tariife suurte liiklustasemetega. NĂ€iteks alguses kasutasime ĂŒht tuntud kaardistamise API-d, et mÀÀrata kohaletoimetamise aadress. Kuid kuu lĂ”puks saime peaaegu 2 miljoni rubla suuruse arve. PĂ€rast seda otsustasime selle kiiresti asendada. Ei hakka reklaamima, aga ĂŒtleksin, et meie kulud vĂ€henesid mĂ€rkimisvÀÀrselt.

KokkuvĂ”te: Oluline on jĂ€lgida vĂ”imaluste töötingimusi kĂ”igi partnerite teenuste osas ja arvesse vĂ”tta neid. Isegi kui tĂ€na tundub, et need on teile 'suure varuga', ei tĂ€henda see, et need ei takistaks teid kasvu hommikul. Ja loomulikult on parem eelnevalt kokku leppida teenusele suurenenud pĂ€ringute finants tingimustes.Â
MĂ”nikord selgub, et ââ (c) ei aita
Me oleme harjunud âummikutegaâ peamises andmebaasis vĂ”i rakenduste serverites, kuid skaleerimise korral vĂ”ivad probleemid ilmneda seal, kus neid ei oodata. TĂ€isteksti otsimiseks veebilehel kasutame Apache Solr mootorit. Koormuse kasvu tĂ”ttu oleme mĂ€rganud reageerimise aja vĂ€henemist ning serveri protsessori koormus jĂ”udis juba 100%ni. Mis vĂ”iks olla lihtsam - anname Solr konteinerile rohkem ressursse.
Oodatud jĂ”udluse kasvu asemel tĂ”mmati server lihtsalt âkinnijÀÀmiseleâ. See laadis kohe 100% ja vastas veel aeglasemalt. Alguses oli meil 2 sĂŒdamikku ja 2 GB RAM-i. Otsustasime teha seda, mis tavaliselt aitab - andsime serverile 8 sĂŒdamikku ja 32 GB. KĂ”ik muutus palju halvemaks (kuidas tĂ€pselt ja miks - sellest rÀÀgime eraldi postituses).Â
MĂ”ne pĂ€eva jooksul saime selle kĂŒsimuse nĂŒanssidest aru ning saavutasime optimaalse jĂ”udluse 8 sĂŒdamiku ja 32 GB juures. See konfiguratsioon vĂ”imaldab meil ka tĂ€na koormust suurendada, mis on vĂ€ga oluline, kuna kasv ei toimu mitte ainult klientide arvu, vaid ka ĂŒhendatud poodide arvu osas - kahe kuu jooksul on nende arv kahekordistunud.Â
KokkuvĂ”te: Tavalised meetodid nagu âlihtsalt lisa rohkem raudaâ ei tööta alati. Niisiis tuleb igasuguste teenuste skaleerimise juures hĂ€sti mĂ”ista, kuidas need ressursse kasutavad ja eelnevalt testida nende tööd uutes tingimustes.Â
Stateless - vÔti lihtsaks horisontaalseks skaleerimiseks.
Ăldiselt jĂ€rgib meie meeskond tuntud lĂ€henemist: teenustel ei peaks olema sisemist seisundit (stateless) ja nad peaksid olema sĂ”ltumatud töötamisest. See vĂ”imaldas meil taluda koormuse kasvu lihtsa horisontaalse skaleerimise abil. Kuid meil oli ĂŒks teenus-erand - pikaajaliste taustategevuste töötleja. See tegeles e-kirjade ja SMS-ide saatmise, sĂŒndmuste töötlemise, feedide genereerimise, hindade ja varude importimise ning piltide töötlemisega. Nii kujunes, et see sĂ”ltus kohalikust failide salvestamisest ja oli ainus eksemplar.Â
Kui jĂ€rjekorras olevate ĂŒlesannete arv kasvas (ja see juhtus loomulikult koos tellimuste arvu kasvuga), muutus host, millel töötasid töötleja ja failide salvestamine, piiravaks teguriks. Tulemusena peatus tootevaliku ja hindade vĂ€rskendamine, kasutajatele teavituste saatmine ja palju muid kriitilisi funktsioone, mis jĂ€id jĂ€rjekorda kinni. Ops meeskond migreeris kiiresti failide salvestamise S3-taolisse vĂ”rgu salvestusse, mis vĂ”imaldas meil tĂ”sta mitu vĂ”imsat masinat, et skaleerida taustatöötlajat.
KokkuvĂ”te: Reeglit Stateless tuleb jĂ€rgida kĂ”igi komponentide puhul, isegi kui tundub, et "siin me kindlasti ei komista". Paremini on kulutada natuke aega kĂ”igi sĂŒsteemide töö korraldamiseks, kui hiljem kiirustades koodi ĂŒmber kirjutada ja teenust, mis kogeb ĂŒlemÀÀrast koormust, parandada.
7 pÔhimÔtet intensiivseks kasvuks
Hoolimata tĂ€iendavate vĂ”imsuste kĂ€ttesaadavusest, puutusime kasvamise kĂ€igus mitmete probleemide otsa. Selle aja jooksul on tellimuste arv kasvanud rohkem kui 4 korda. Praegu toimetame juba ĂŒle 17 000 tellimuse pĂ€evas 62 linnas ja kavatseme geograafiat veelgi laiendada â 2020. aasta esimeses pooles on oodata teenuse kĂ€ivitamist kogu Venemaa ulatuses. Kuidas toime tulla kasvava koormusega, arvestades juba saadud Ă”petusi, oleme vĂ€lja töötanud 7 pĂ”hise pĂ”himĂ”tte, kuidas pideva kasvu tingimustes töötada:
- Incidendi juhtimine. Oleme loonud Jira-s tahvli, kus iga juhtum kajastub piletina. See aitab tegelikult prioriseerida ja tĂ€ita juhtumiga seotud ĂŒlesandeid. LĂ”ppude lĂ”puks ei ole viga teha viga - hirmutav on teha sama viga kaks korda. Juhtudel, kui juhtumid korduvad enne, kui suudame pĂ”hjuse kĂ”rvaldada, peab olema valmis tegevusjuhend, sest suure koormuse ajal on oluline reageerida kiiresti.
- JĂ€lgimine see all elements of infrastructure without exception. It is precisely thanks to this that we were able to predict the increase in load and correctly identify "bottlenecks" for prioritization of resolution. Most likely, under high load, everything you didn't think would fail or start to lag behind. Therefore, it is best to create new alerts immediately after the first incidents occur to monitor and anticipate them.
- Correct alerts are simply essential with a sharp increase in load. Firstly, they must accurately report what exactly has broken. Secondly, there shouldn't be too many alerts, as an abundance of non-critical alerts leads to all notifications being ignored.
- Applications must be stateless. We have confirmed that there should be no exceptions to this rule. Complete independence from the runtime environment is necessary. For this, you can store shared data in a database or, for example, directly in S3. Even better, follow the rules. During a sharp increase in time, optimizing code is simply not an option, and handling the load will have to be done by directly increasing computational resources and horizontal scaling.
- Quotas and performance of external services. With rapid growth, problems can arise not only in your infrastructure but also in external services. The most frustrating thing is when this happens not due to a failure but because of reaching quotas or limits. Therefore, external services must scale as well as you do.Â
- Separate processes and queues. This greatly helps when there is a bottleneck on one of the gateways. We wouldn't have encountered delays in data transmission if the filled SMS sending queues hadnât interfered with the exchange of notifications between information systems. Moreover, increasing the number of workers would have been easier if they operated separately.
- Financial realities. When there is an explosive growth in data streams, thereâs no time to think about tariffs and subscriptions. However, one must remember them, especially if you are a small company. A hefty bill can be issued by any API owner as well as your hosting provider. So, it is important to read agreements carefully.
KokkuvÔte
Kaotiliste kaotustega, kuid me oleme selle etapi ĂŒle saanud ja tĂ€na pĂŒĂŒame jĂ€rgida kĂ”iki leidunud pĂ”himĂ”tteid, samas kui iga masin omab vĂ”imalust kergelt tĂ”sta jĂ”udlust kuni 4 korda, et toime tulla ootamatustega.Â
JÀrgmistes postitustes jagame oma kogemusi Apache Solr'i jÔudluse vÀhenemise uurimisel ning rÀÀgime pÀringute optimeerimisest ja sellest, kuidas suhtlemine FNS-iga aitab ettevÔttel raha sÀÀsta. Tellige meie blogi, et mitte midagi vahele jÀtta, ning rÀÀkige kommentaarides, kas olete sarnaseid ebameeldivusi kogenud liikluse kasvu ajal.

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. , palun.
Kas olete kogenud teenuse aeglustumist/vajadust suure koormuse korral, kuna:
55,6%Arvutusressursside kiire lisamise vÔimaluse puudumine10
16,7%Haldaja infrastruktuuri piirangud3
33,3%Kolmandate osapoolte API piirangud6
27,8%Oma rakenduste stateless pÔhimÔtete rikkumine5
88,9%Oma teenuste koodi mitteoptimeeritus16
HÀÀletanud 18 kasutajat. 6 kasutajat ei soovinud hÀÀletada.
Allikas: habr.com
