Kuidas me elasime ĂŒle kaugemate tööde jĂ€rsu koormuse kasvu x10 ja milliseid jĂ€reldusi tegime.

Tere, Habr! Viimased paar kuud oleme elanud vÀga huvitavas olukorras ja tahaksin jagada meie infrastruktuuri skaleerimise lugu. Selle aja jooksul on SberMarket tellimustes kasvanud neljakordseks ja kÀivitanud teenuse 17 uues linnas. Toidu kohaletoimetamise nÔudluse plahvatuslik kasv nÔudis meilt infrastruktuuri skaleerimist. KÔige huvitavamatest ja kasulikest jÀreldustest loe allpool.

Kuidas me elasime ĂŒle kaugemate tööde jĂ€rsu koormuse kasvu x10 ja milliseid jĂ€reldusi tegime.

Minu nimi on Dima Bobylev, olen SberMarketi tehniline direktor. Kuna see on meie blogi esimene postitus, ĂŒtlen paar sĂ”na enda ja ettevĂ”tte kohta. Eelmisel sĂŒgisel osalesin noorte liidrite konkursil Runetis. Konkursi raames kirjutasin vĂ€ikese loo sellest, kuidas me SberMarketis nĂ€eme sisekultuuri ja lĂ€henemist teenuse arendamisele. Ja kuigi konkursil vĂ”ita ei Ă”nnestunud, sĂ”nastasin endale pĂ”hialused IT-ökosĂŒsteemi arendamiseks.

Meeskonna juhtimisel on oluline mĂ”ista ja leida tasakaal selle vahel, mida Ă€ri vajab, ja iga konkreetse arendaja vajadustega. Praegu kasvab SberMarket aastaga 13 korda, mis mĂ”jutab toodet, nĂ”udes pidevat arendustempot ja mahtude suurendamist. Sellegipoolest anname arendajatele piisavalt aega eelanalĂŒĂŒsiks ja kvaliteetse koodi kirjutamiseks. Meie loodud lĂ€henemine aitab mitte ainult töötava toote loomisel, vaid ka selle edasisel skaleerimisel ja arendamisel. Sellise kasvu tulemusena on SberMarket juba muutunud toidukullerite teenuste liidriks: toimetame igapĂ€evaselt umbes 18 000 tellimust, samas kui veel aasta alguses oli neid umbes 3500.

Kuidas me elasime ĂŒle kaugemate tööde jĂ€rsu koormuse kasvu x10 ja milliseid jĂ€reldusi tegime.
Kord palus klient SberMarketi kulleril toidud toimetada kontaktivabalt — otse rĂ”dule.

Kuid liigume konkreetsete asjade juurde. Viimased paar kuud oleme aktiivselt tegelenud meie ettevĂ”tte infrastruktuuri ulatuse suurendamisega. See vajadus tulenes nii vĂ€listest kui ka sisemistest teguritest. Samal ajal kui kliendibaas laienes, kasvas ĂŒhendatud kaupade arv 90-lt aasta alguses rohkem kui 200-ni mai keskel. Me olime muidugi ette valmistunud, broneerides pĂ”histruktuuri ja arvutades vĂ€lja vĂ”imaluse virtuaalmasinate vertikaalseks ja horisontaalseks ulatuseks, mis asuvad Yandexi pilves. Kuid praktika on nĂ€idanud: "KĂ”ik, mis vĂ”ib valesti minna, lĂ€hebki valesti". Ja tĂ€na tahan ma jagada kĂ”ige huvitavamaid olukordi, mis nende nĂ€dalate jooksul juhtusid. Loodan, et meie kogemus on teile kasulik.

Slave on tÀielikult valmis tegevuseks

Eelnevalt, enne pandeemia algust, seisisime silmitsi kasvava nÔudlusega meie backend-serverite jÀrele. Kodukullerteenuste tellimise trend hakkas kasvama, ja COVID-19 esimeste isoleerimismeetmete kehtestamisega kasvas koormus dramaatiliselt pÀevast pÀeva. Tekkinud vajadus oli kiiresti vÀhendada pÔhiraamatupidamise master-serverite koormust ja suunata osa lugemisest tehtud pÀringutest replica-serveritele.

Oliime sellele sammule eelnevalt ette valmistunud ning selleks oli juba kĂ€ivitatud 2 replica-serverit. Need serverid töötlesid peamiselt andmevahetuseks partneritega mĂ”eldud infotoodete genereerimise batch-ĂŒlesandeid. Need protsessid genereerisid liigset koormust ja olid tĂ€iesti Ă”igustatud, et vĂ”eti paar kuud varem „vĂ€lja”. 

Kuna Slave'is toimus replikatsioon, jĂ€rgime pĂ”himĂ”tet, et rakendused saavad nendega töötada ainult lugemisreĆŸiimis. HĂ€daolukorra taastamisplaan nĂ€gi ette, et katastroofi korral saame lihtsalt mountida Slave Master'i kohale ja suunata kĂ”ik kirjutamis- ja lugemisettepanekud Slave'ile. Kuid soovisime ka replikate kasutamist analĂŒĂŒtika osakonna vajadusteks, seetĂ”ttu ei olnud serverid tĂ€ielikult muutunud lugemisreĆŸiimi, vaid igas hostis oli oma kasutajate kogum, kellest mĂ”ned omasid kirjutamisĂ”igusi vahepealsete arvutuste tulemuste salvestamiseks.

Teatud koormustasandini piisab meistrist nii kirjutamiseks kui lugemiseks http-pĂ€ringute töötlemisel. MĂ€rtsi keskel, kui Sbermarketi otsus kaug- tööle tĂ€ielikult ĂŒle minna kehtestati, algas meie RPS-i kiire kasv. Üha rohkem meie kliente lĂ€ks isoleerimisele vĂ”i töötas kodus, mis kajastus koormusnĂ€itajates.

«Meister» jĂ”udlus ei olnud enam piisav, seetĂ”ttu hakkasime osa kĂ”ige raskematest lugemisest pĂ€ringutest replika peale suunama. Kirjutamis pĂ€ringute suunamiseks meistrisse ja lugemiseks slave'ile kasutasime ruby gem'i «Octopus». Loodud eraldi kasutaja koos _readonly postfixiga, kellel ei olnud kirjutamisĂ”igusi. Kuid ĂŒhe hosti konfiguratsiooni vea tĂ”ttu lĂ€ks osa kirjutamis pĂ€ringutest slave-serverisse kasutajana, kellel olid vastavad Ă”igused.

Probleem ei ilmnenud kohe, kuna suurenenud koormus tĂ”i kaasa slave'ide mahajÀÀmust. Andmete ebakĂ”la avastati hommikul, kui pĂ€rast öiseid impordeid ei olnud slave'id meisteriga «jĂ€rgmised». Kirjutasime selle kĂ”rgele koormusele teenusele endale ja impordile, mis oli seotud uute poodide avamisega. Kuid andmete edastamine mitme tunni viivitususega ei olnud vastuvĂ”etav ning suunasime protsessid teisele analĂŒĂŒtilisele slave'ile, kuna tal olid bosuuremad ressursid ja ta ei olnud lugemis pĂ€ringutest koormatud (mida me endale replikatsiooni mahajÀÀmust seletades kinnitasime).

Kui saime selgeks pĂ”hjus, miks pĂ”hja slave oli kokku kukkunud, oli analĂŒĂŒs juba sama pĂ”hjusel töö lĂ”petanud. Kuigi meil oli kaks tĂ€iendavat serverit, kuhu plaanisime koormuse ĂŒle viia, kui meester server peaks ebaĂ”nnestuma, selgus hĂ€iriva vea tĂ”ttu, et kriitilise hetke jooksul ei olnud ĂŒhtegi serverit saadaval.

Kuna tegime mitte ainult andmebaasi dump'i (tagasiveo aeg oli sel hetkel umbes 5 tundi), vaid ka master-serveri snapshot'i, Ă”nnestus replikat kĂ€ivitada kahe tunni jooksul. PĂ€rast seda ootas meid siiski replikatsiooni logi pealekandmine pikka aega (sest protsess toimub ĂŒhesuunaliselt, kuid see on juba hoopis teine lugu).

VÀljund: PÀrast sellist intsidenti oli selge, et peame loobuma kasutajate kirjutamise piiramisest ja kuulutama kogu serveri lugemiseks. Sellise lÀhenemisega ei ole kahtlust, et repliikide kÀttesaadavus kriitiliselt olulistel hetkedel on tagatud.

Isegi ĂŒhe raske pĂ€ringu optimeerimine vĂ”ib andmebaasi "ellu Ă€ratada".

Kuigi uuendame veebilehe katalooge pidevalt, esitati Slave-serveritele tehtud pĂ€ringud Master-serverist vĂ€ikese viivitusega. Aeg, mille jooksul avastasime ja lahendasime probleemi, et "ĂŒksused kaotasid Ă€kitselt ĂŒhenduse", ĂŒletas "psĂŒhholoogilise piiri" (selle aja jooksul vĂ”isid hinnad muutuda ja kliendid oleksid nĂ€inud aegunud andmeid), mistĂ”ttu pidime suunama kĂ”ik pĂ€ringud peamiselt andmebaasiserverile. Tulemuseks oli, et veebileht töötas aeglaselt
 aga vĂ€hemalt töötas. Ja seni, kuni Slave taastus, ei jÀÀnud meil muud kui optimeerida. 

Kuni Slave-serverid taastusid, venisid minutid aeglaselt, Master oli ĂŒlekoormatud ja panime kĂ”ik jĂ”ud aktiivsete ĂŒlesannete optimeerimisele vastavalt „Pareto printsiibile”: valisime TOP-pĂ€ringud, mis andsid suure osa koormusest, ja alustasime hÀÀlestamist. Seda tehti otse „liikvel olles”.

Huvitav nĂ€htus oli see, et ĂŒlekoormatud MySQL reageerib isegi tavaliste protsesside vĂ€ikeste parenduste peale. Paar pĂ€ringu optimeerimist, mis andsid vaid 5% kogu koormusest, nĂ€itas juba olulist CPU laadimise vĂ€hendamist. Selle tulemusena suutsime tagada Masteri tööks andmebaasis piisava ressursi varu ja saada vajalik taastumisaeg replika jaoks. 

VĂ€ljund: Isegi vĂ€ike optimeerimine vĂ”imaldab „ellu jÀÀda” koormuse all mitu tundi. Just seda meil oli piisavalt serverite replika taastumise ajaks. Muide, pĂ€ringute optimeerimise tehnilist kĂŒlge arutame ĂŒhes jĂ€rgmistest postitustest. Nii et jĂ€lgige meie blogi, kui see teile kasulikuks osutub.

Korrastage partnerite teenuste töövÔime jÀlgimine

Kliendi tellimuste töötlemisega tegelemise tĂ”ttu suhtlevad meie teenused pidevalt kolmandate osapoolte API-dega — need on SMS-i saatmise vĂ€ravad, makseplatvormid, marsruutimissĂŒsteemid, geokooder, FNS teenus ja paljud teised sĂŒsteemid. Ja kui koormus hakkas kiiresti kasvama, sattusime partnerite teenuste API-de piirangutesse, mille ĂŒle me varem isegi ei mĂ”elnud.

Partnerite teenuste kvootide ootamatu ĂŒletamine vĂ”ib pĂ”hjustada teie enda sĂŒsteemi seisakuid. Paljud API-d blokeerivad kliente, kes ĂŒletavad limiite, ja mĂ”nel juhul vĂ”ib liigne pĂ€ringute arv partneri tootmisprotsessi ĂŒle koormata. 

NĂ€iteks, kui kohaletoimetamiste arv kasvas, ei suutnud saateteenused neid ĂŒlesandeid, nagu jaotamine ja marsruutide mÀÀramine, tĂ€ita. Tulemusena oli nii, et tellimused olid tehtud, kuid marsruudi loomise teenus ei töötanud. Tuleb öelda, et meie logistika spetsialistid tegid sellistes tingimustes peaaegu impossibli; meeskonna tĂ€pne koostöö aitas ajutisi teenuste katkestusi tasakaalustada. Kuid sellist tellimuste mahtu ei ole konstantsete kĂ€sitsi töötlemisega vĂ”imalik pidevalt hallata, ja varsti oleksime silmitsi vastuvĂ”etamatu lĂ”hega tellimuste ja nende tĂ€itmise vahel. 

Tegime mitmeid organisatsioonilisi samme ja meeskonna sujuv koostöö aitas meil aega vĂ”ita, kuni leppisime kokku uutel tingimustel ja ootasime mĂ”nedelt partneritelt teenuste uuendamist. On ka teisi API-sid, mis paistavad silma kĂ”rge vastupidavuse ja talumatute hindadega kĂ”rge liikluse korral. NĂ€iteks kasutasime alguses ĂŒhte tuntud kaardistamis-API-d, et mÀÀrata kohaletoimetamise punkti aadress. Kuid kuu lĂ”puks saime ĂŒsna soliidse arve peaaegu 2 miljoni rubla ulatuses. PĂ€rast seda otsustasime selle kiiresti vĂ€lja vahetada. Ma ei hakka reklaamima, aga vĂ”in öelda, et meie kulud on mĂ€rgatavalt vĂ€henenud.
Kuidas me elasime ĂŒle kaugemate tööde jĂ€rsu koormuse kasvu x10 ja milliseid jĂ€reldusi tegime.

VĂ€ljund: On vĂ€ga oluline jĂ€lgida kĂ”igi partnerite teenuste töötingimusi ja neid meeles pidada. Isegi kui tĂ€na tundub, et need on teile „suure varuga”, ei tĂ€henda see, et nad ei saa homme kasvu takistuseks. Ja muidugi on parem eelnevalt kokku leppida teenuse suurenenud nĂ”udmiste rahalistes tingimustes. 

MĂ”nikord selgub, et „on vaja rohkem kulda” (c) ei aita

Oleme harjunud „ummikute“ esinemisega peamises andmebaasis vĂ”i rakendusserverites, kuid skaleerimise ajal vĂ”ivad probleemid ilmuda seal, kus neid ei oodata. TĂ€isteksti otsingu jaoks kasutame Apache Solr mootorit. Koormuse suurenedes oleme mĂ€rganud vastuseaja vĂ€henemist, samas kui serveri protsessori koormus jĂ”udis 100%-ni. Mis vĂ”iks olla lihtsam — anname Solr konteinerile rohkem ressursse.

Oodatud tootlikuse kasvupiiri asemel server lihtsalt „surus Ă€ra“. See laadis kohe 100% ja vastas veel aeglasemalt. Alguses oli meil 2 tuuma ja 2 GB RAM-i. Otsustasime teha seda, mis tavaliselt aitab — andsime serverile 8 tuuma ja 32 GB. KĂ”ik muutus palju halvemaks (kuidas tĂ€pselt ja miks — sellest rÀÀgime eraldi postituses). 

MĂ”ne pĂ€eva jooksul saime aru selle kĂŒsimuse keerukusest ning saavutasime optimaalse tootlikkuse 8 tuuma ja 32 GB korral. See konfiguratsioon vĂ”imaldab ka tĂ€na koormust jĂ€tkuvalt suurendada, mis on vĂ€ga oluline, sest kasv toimub mitte ainult klientide, vaid ka ĂŒhendatud poodide arvu osas — kahe kuuga suurenenud arv on kaks korda. 

VÀljund: Tavalised meetodid nagu "veel riistvara lisamine" ei tööta alati. Seega, teenuse skaleerimisel on oluline aru saada, kui hÀsti see ressursse kasutab ja testida seda ettevalmistavas faasis uutes tingimustes. 

Stateless — lihtsa horisontaalse skaleerimise vĂ”ti

Üldiselt jĂ€rgib meie meeskond tuntud lĂ€henemist: teenused ei peaks omama sisemist olekut (stateless) ja peaksid olema sĂ”ltumatud kĂ€ituskeskkonnast. See on vĂ”imaldanud meil taluda koormuse kasvu lihtsa horisontaalse skaleerimise abil. Kuid meil oli ĂŒks erand — pikaajaliste taustateenuste töötleja. See tegeles e-kirjade ja SMS-ide saatmise, sĂŒndmuste töötlemise, voogude genereerimise, hindade ja varude importimise, piltide töötlemisega. Tekkis olukord, kus see sĂ”ltus kohalikust failide salvestamisest ja oli ainus eksemplar. 

Kuna ĂŒlesannete arv jĂ€rjekorras töötlejat (mis loomulikult juhtus koos tellimuste arvu kasvuga) kasvas, muutus host, millel töötleja ja failide salvestamine asusid, piiravaks teguriks. Selle tulemusena peatus valikute ja hindade uuendamine, kasutajatele teavituste saatmine ja palju muid kriitilisi funktsioone, mis jĂ€id jĂ€rjekorda kinni. Ops meeskond viis kiiresti failide salvestamise S3-sarnasesse vĂ”rgu salvestusse ja see vĂ”imaldas meil tĂ”sta mitmeid vĂ”imsaid masinaid, et laiendada taustatöötluse sĂŒsteemi.

VĂ€ljund: Stateless reeglit tuleb jĂ€rgida kĂ”igi komponentide puhul ilma eranditeta, isegi kui tundub, et siin me kindlasti ei jÀÀ kinni. Olulisem on kulutada veidi aega sĂŒsteemide töö Ă”igele korraldamisele, kui hiljem kiiruselt koodi ĂŒmber kirjutada ja parandada teenust, mis kogeb ĂŒlekoormust.

7 pÔhimÔtet intensiivseks kasvuks

Hoolimata tĂ€iendavate ressursside olemasolust oleme kasvu kĂ€igus kokkupĂ”rganud mitmete probleemidega. Selle aja jooksul on tellimuste arv kasvanud rohkem kui neli korda. Praegu toimetame juba rohkem kui 17 000 tellimust pĂ€evas 62 linnas ning plaanime oma tegevust veelgi laiendada — 2020. aasta esimeses pooles on plaanis teenuse kĂ€ivitamine kogu Venemaal. Selleks, et hakkama saada kasvava koormusega, arvestades juba saadud kogemusi, oleme vĂ€lja töötanud 7 pĂ”hieesmĂ€rki pideva kasvu tingimustes:

  1. Juhtimine. Oleme loonud Jira-sse tahvli, kus iga juhtum peegeldub pileti nĂ€ol. See aitab tĂ”eliselt prioriseerida ja tegeleda juhtu puudutavate ĂŒlesannetega. Sest sisuliselt ei ole hirmus eksida — hirmus on eksida kaks korda sama asja pĂ€rast. Nende juhtumite puhul, kus probleemid korduvad kiiremini, kui suudame pĂ”hjusest vabaneda, peaks olema valmis tegevusjuhend, sest suurte koormuste ajal on oluline reageerida viivitamatult.
  2. JĂ€lgimine see all sides of the infrastructure. Thanks to this, we were able to forecast the growth of load and correctly identify the bottlenecks to prioritize their resolution. Most likely, under heavy load, everything you didn't expect will break or start lagging. Therefore, it's best to create new alerts right after the first incidents occur, to monitor and anticipate them.
  3. Correct alerts are essential during a sudden increase in load. Firstly, they must report exactly what has broken. Secondly, there shouldn't be too many alerts, as an abundance of non-critical alerts leads to the ignoring of all notifications altogether.
  4. 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 is to follow the rules. https://12factor.net. Äkilise kasvu korral pole aega koodi optimeerida ja koormuse eest tuleb hoolitseda lihtsalt arvutusressursside otsese suurendamise ja horisontaalse skaleerimise abil.
  5. VÀliste teenuste kvotid ja jÔudlus. Kiire kasvu korral vÔib probleem tekkida mitte ainult teie infrastruktuuris, vaid ka vÀlises teenuses. KÔige masendavam on see, kui see juhtub mitte rikke tÔttu, vaid kvotide vÔi piiride saavutamise tÔttu. Seega peavad ka vÀlised teenused skaleeruma sama hÀsti nagu teie ise. 
  6. Jagage protsesse ja jĂ€rjekordi. See aitab vĂ€ga palju, kui ĂŒhes vĂ€ravas tekib ummik. Me ei oleks andmeedastuses viivitustega silmitsi, kui SMS-ide saatmise tĂ€isjĂ€rjekorrad ei segaks teavituste vahetust infosĂŒsteemide vahel. Jah, ja töötajate arvu oleks lihtsam suurendada, kui nad töötaksid eraldi.
  7. Finantsreaalsused. Kui andmete voogude plahvatuslik kasv toimub, pole aega hinnaplaanide ja tellimuste ĂŒle jĂ€rele mĂ”elda. Kuid neid tuleb meeles pidada, eriti kui olete vĂ€ike ettevĂ”te. Suure arve vĂ”ib esitada iga API omanik, samuti teie hostimise teenusepakkuja. Seega tuleb lepingud hoolikalt lĂ€bi lugeda.

KokkuvÔte

Kuigi kaotusi oli, oleme sellest etapis ĂŒle saanud ja tĂ€na pĂŒĂŒame jĂ€rgiselt kĂ”iki leitud pĂ”himĂ”tteid, kusjuures iga masin on suuteline lihtsaks jĂ”udluse neljakordseks suurendamiseks, et toime tulla ootamatustega. 

JÀrgnevates postitustes jagame oma kogemusi Apache Solri jÔudluse languse uurimisel, rÀÀgime pÀringute optimeerimisest ning sellest, kuidas suhe FNS-iga aitab ettevÔttel raha sÀÀsta. Liituge meie blogiga, et mitte midagi vahele jÀtta, ja kirjutage kommentaaridesse, kas teil on olnud sarnaseid probleeme liikluse kasvamisel.

Kuidas me elasime ĂŒle kaugemate tööde jĂ€rsu koormuse kasvu x10 ja milliseid jĂ€reldusi tegime.

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Kas teil on olnud teenuse aeglustumist vÔi langemist jÀrsu koormuse suurenemise tÔttu:

  • 55,6%VĂ”imetus kiiresti arvutusressursse lisada

  • 16,7%Hostimise teenusepakkuja infrastruktuuri piirangud

  • 33,3%Kolmandate osapoolte API piirangud

  • 27,8%Stateless-printsiipide rikkumine oma rakendustes

  • 88,9%Koodi mitteoptimaalsus oma teenustes

HÀÀletas 18 kasutajat. 6 kasutajat jÀi erapooletuks.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster