Cumu sopravvivemu à l'aumentu di a carica di travagliu x10 remotamente è chì cunclusioni avemu tiratu

Ehi Habr! L'ultimi dui mesi avemu campatu in una situazione assai interessante, è vogliu sparte a nostra storia di scaling infrastruttura. Duranti stu tempu, SberMarket hà quadruplicatu in ordini è hà lanciatu u serviziu in 4 novi cità. A crescita splusiva di a dumanda di spedizioni alimentari ci hà dumandatu à scala a nostra infrastruttura. Leghjite nantu à e cunclusioni più interessanti è utili sottu u cut.

Cumu sopravvivemu à l'aumentu di a carica di travagliu x10 remotamente è chì cunclusioni avemu tiratu

Mi chjamu Dima Bobylev, sò u direttore tecnicu di SberMarket. Siccomu questu hè u primu postu nantu à u nostru blog, diceraghju uni pochi di parolle nantu à mè è a cumpagnia. L'ultimu vaghjimu, aghju participatu à a cumpetizione per i ghjovani dirigenti di Runet. Per u cuncorsu I hà scrittu una piccula storia circa cumu noi à SberMarket vede a cultura interna è avvicinamentu à u sviluppu serviziu. E ancu s'ellu ùn aghju micca riesciutu à vince a cumpetizione, aghju formulatu per mè i principii basi per u sviluppu di l'ecosistema IT.

Quandu gestisce una squadra, hè impurtante capisce è truvà un equilibriu trà ciò chì l'affari hà bisognu è i bisogni di ogni sviluppatore individuale. Avà SberMarket cresce 13 volte à l'annu, è questu affetta u pruduttu, chì esige un aumentu constante di u voluminu è u ritmu di sviluppu. Malgradu questu, assignemu abbastanza tempu à i sviluppatori per analisi preliminari è codificazione di alta qualità. L'approcciu furmatu ùn aiuta micca solu à creà un pruduttu di travagliu, ma ancu in u so scalamentu è u sviluppu ulteriore. In u risultatu di sta crescita, SberMarket hè digià diventatu un capu trà i servizii di spedizioni di l'alimentarii: consegnamu circa 18 3500 ordini à ghjornu, ancu s'ellu ci era circa XNUMX XNUMX à principiu di ferraghju.

Cumu sopravvivemu à l'aumentu di a carica di travagliu x10 remotamente è chì cunclusioni avemu tiratu
Un ghjornu, un cliente hà dumandatu à un corriere di SberMarket per furnisce l'alimentazione senza cuntattu - ghjustu nantu à u balcone.

Ma andemu à i specifichi. In l'ultimi mesi, avemu attivamente scalatu l'infrastruttura di a nostra cumpagnia. Questa necessità hè stata spiegata da fatturi esterni è internu. Simultaneamente cù l'espansione di a basa di i clienti, u numeru di magazzini cunnessi hè cresciutu da 90 à u principiu di l'annu à più di 200 à a mità di maghju. Di sicuru, avemu preparatu, riservatu l'infrastruttura principale, è cuntava a pussibilità di scala verticale è horizontale di tutte e macchine virtuali ospitate in u nuvulu Yandex. In ogni casu, a pratica hà dimustratu: "Tuttu ciò chì pò esse sbagliatu andarà male". È oghje vogliu sparte e situazioni più curiose chì sò accadute in queste settimane. Spergu chì a nostra sperienza vi sarà utile.

Slave in piena prontezza di cumbattimentu

Ancu prima di l'iniziu di a pandemia, avemu statu affruntatu cù un aumentu di u numeru di richieste à i nostri servitori backend. A tendenza à urdinà l'alimentu cù a consegna in casa hà cuminciatu à guadagnà impulsu, è cù l'intruduzione di e prime misure di autoisolamentu in cunnessione cù COVID-19, a carica hè cresciutu drasticamente davanti à i nostri ochji in tuttu u ghjornu. Ci era bisognu di scaricate rapidamente i servitori maestri di a basa di dati principale è di trasfiriri alcune di e dumande di lettura à i servitori di replica (slave).

Avemu preparatu per questu passu in anticipu, è i servitori slave 2 eranu digià in esecuzione per una tale manuvra. Anu travagliatu principalmente nantu à i travaglii batch per a generazione di l'infurmazioni per u scambiu di dati cù i partenarii. Questi prucessi creanu una carica extra è ghjusta sò stati cacciati da i parentesi un paru di mesi prima. 

Siccomu a replicazione hè stata fatta nantu à u Slave, avemu aderitu à u cuncettu chì l'applicazioni ponu travaglià solu cun elli in modu di sola lettura. U Pianu di Recuperazione di Disastru assume chì in l'eventu di un disastru, pudemu simpricimenti muntà u Slave in u locu di u Maestru è scambià tutte e dumande di scrittura è lettura à u Slave. In ogni casu, avemu ancu vulsutu usà rèpliche per i bisogni di u dipartimentu analiticu, perchè i servitori ùn eranu micca cumplettamente stabiliti per leghje solu statutu, è ogni òspite hà avutu u so propiu set di utilizatori, è certi avianu permessi di scrittura per salvà i risultati di u calculu intermediu.

Finu à un certu livellu di carica, avemu avutu abbastanza maestru sia per scrive sia per leghje quandu processà e richieste http. À a mità di marzu, quandu Sbermarket hà decisu di cambià cumplettamente à u travagliu remoto, avemu cuminciatu à multiplicà a crescita RPS. Sempre più di i nostri clienti sò andati in l'autoisolamentu o u travagliu da casa, chì si riflette in l'indicatori di carica.

U funziunamentu di u "maestru" ùn era più abbastanza, cusì avemu cuminciatu à trasferisce alcune di e richieste di lettura più pesanti à a replica. Per diretta in modu trasparenti e richieste di scrittura à u maestru, è leghje e dumande à u schiavu, avemu usatu a gemma rubina "Pulopiu". Avemu creatu un utilizatore speciale cù _readonly postfix senza permessi di scrittura. Ma a causa di un errore in a cunfigurazione di unu di l'ospiti, una parte di e dumande di scrittura sò andate à u servitore slave in nome di un utilizatore chì avia i diritti appropritati.

U prublema ùn hè micca manifestatu immediatamente, perchè. a carica aumentata hà aumentatu u backlog di i schiavi. L'incongruenza di dati hè stata scuperta in a matina, quandu, dopu à l'impurtazioni di notte, i schiavi ùn "catch up" cù u maestru. Avemu attribuitu questu à una carica alta nantu à u serviziu stessu è l'impurtazioni assuciate cù u lanciu di novi magazzini. Ma era inaccettabile per dà dati cù un ritardu di parechje ore, è avemu cambiatu prucessi à u sicondu schiavu analiticu, perchè aviaоRisorse più grande è ùn era micca carricatu cù e dumande di lettura (chì hè cumu avemu spiegatu à noi stessi a mancanza di ritardo di replicazione).

Quandu avemu scupertu i mutivi di a "diffusione" di u schiavu principalu, l'analiticu avia digià fallutu per a listessa ragione. Malgradu a prisenza di dui servitori supplementari, à quale avemu previstu di trasfirià a carica in casu di un crash maestru, per un errore disgraziatu, hè statu chì ùn ci era micca unu in un mumentu criticu.

Ma postu chì ùn avemu micca solu scaricatu a basa di dati (a restaurazione à quellu tempu era di circa 5 ore), ma ancu una snapshot di u servitore maestru, avemu riesciutu à lancià a replica in 2 ore. True, dopu à quessa, ci eramu previstu di rollu u logu di replicazione per un bellu pezzu (perchè u prucessu hè in modu unicu filatu, ma hè una storia completamente diversa).

Cunsigliu: Dopu un tali incidente, hè diventatu chjaru chì a pratica di restrizzione di scrittura per l'utilizatori deve esse abbandunata è u servitore tutale deve esse dichjarata solu lettura. Cù questu approcciu, pudete esse sicuru chì e repliche seranu dispunibili in un mumentu criticu.

L'ottimisazione ancu una dumanda pesante pò rinvià a basa di dati

Ancu s'è aghjurnà constantemente u catalogu nantu à u situ, e dumande chì avemu fattu à i servitori Slave permettenu un ligeru lag daretu à u Maestru. U tempu durante u quale avemu scupertu è eliminatu u prublema di i schiavi "di colpu fora di strada" era più cà a "barriera psicologica" (in questu tempu, i prezzi puderanu esse aghjurnati, è i clienti vederanu dati obsoleti), è avemu statu obligatu à cambià. tutte e dumande à u servitore di basa di dati principale. In u risultatu, u situ era lentu ... ma almenu hà travagliatu. È mentre chì u Slave si ricuperava, ùn ci era nunda per noi, ma ottimisazione. 

Mentre chì i servitori Slave si ricuperanu, i minuti si trascinavanu lentamente, u Maestru fermava sopra, è avemu tiratu tutti i nostri sforzi in l'ottimisazione di i travaglii attivi in ​​cunfurmità cù a Regula Pareto: avemu sceltu i TOP queries chì dà a maiò parte di a carica è cuminciaru à tuning. Questu hè statu fattu ghjustu nantu à a mosca.

Un effettu interessante era chì MySQL, carricu à l'ochji, risponde ancu à una ligera mellura in i prucessi. L'ottimisazione di un paru di dumande chì dete solu 5% di a carica tutale hà digià dimustratu un scaricamentu di CPU notevuli. In u risultatu, pudemu furnisce una riserva accettabile di risorse per u Maestru per travaglià cù a basa di dati è uttene u tempu necessariu per restaurà e rèpliche. 

Cunsigliu: Ancu una piccula ottimisazione permette di "sopravvivà" à sopravvivere per parechje ore. Questu era solu abbastanza per noi per restaurà i servitori cù repliche. Per via, discuteremu u latu tecnicu di l'ottimisazione di e dumande in unu di i seguenti posti. Allora abbonate à u nostru blog si pò esse utile per voi.

Organizà u monitoraghju di a salute di i servizii di i partenarii

Trattamu ordini da i clienti, è dunque i nostri servizii interagiscenu constantemente cù API di terze parti - questi sò gateway per l'invio di SMS, plataforme di pagamentu, sistemi di routing, un geocoder, u Serviziu Fiscale Federale è assai altri sistemi. È quandu a carica hà cuminciatu à cresce rapidamente, avemu cuminciatu à curriri in e limitazioni di l'API di i nostri servizii di i nostri cumpagni, chì ùn avemu mancu pensatu prima.

Un superamentu inesperu di e quote di serviziu di i partenarii pò risultà in u vostru propiu downtime. Parechje APIs bluccanu i clienti chì superanu i limiti, è in certi casi, un eccessu di richieste pò overload a produzzione di u partner. 

Per esempiu, à u mumentu di a crescita in u numeru di spedizioni, i servizii d'accumpagnamentu ùn puderanu micca affruntà i travaglii di a so distribuzione è a determinazione di a strada. Per via di u risultatu, hè statu fattu chì l'ordine sò stati fatti, ma u serviziu chì hà creatu a strada ùn hè micca travagliatu. Devu dì chì i nostri logistichi anu fattu u quasi impussibile in queste cundizioni, è l'interazzione chjara di a squadra hà aiutatu à cumpensà i fallimenti temporali di u serviziu. Ma ùn hè micca realisticu di processà un tali volumi d'applicazioni manualmente tuttu u tempu, è dopu un pocu tempu avemu da scontru cù una distanza inaccettabile trà l'ordini è a so esecuzione. 

Una quantità di misure urganisazione sò state pigliate è u travagliu bè coordinatu di a squadra hà aiutatu à cumprà u tempu mentre avemu accunsentutu nantu à e novi cundizioni è aspittavamu a mudernizazione di i servizii da certi partenarii. Ci sò altre API chì offrenu una alta endurance è tariffi impidi in casu di trafficu altu. Per esempiu, in u principiu, avemu usatu una API di mappatura ben cunnisciuta per determinà l'indirizzu di u puntu di consegna. Ma à a fine di u mese, anu ricivutu una fattura tonda per quasi 2 milioni di rubli. Dopu questu, avemu decisu di rimpiazzà rapidamente. Ùn aghju micca impegnà in publicità, ma diceraghju chì e nostre spese sò diminuite significativamente.
Cumu sopravvivemu à l'aumentu di a carica di travagliu x10 remotamente è chì cunclusioni avemu tiratu

Cunsigliu: Hè imperativu di monitorà e cundizioni di travagliu di tutti i servizii di i partenarii è di mantene in mente. Ancu s'è oghje pare ch'elli sò "cun un grande margine" per voi, questu ùn significa micca chì dumane ùn saranu micca un ostaculu à a crescita. E, sicuru, hè megliu d'accordu nantu à i termini finanziarii di richieste aumentate per u serviziu in anticipu. 

Calchì volta risulta chìAvete bisognu di più oru"(c) ùn aiuta micca

Semu abituati à "gags" in a basa di dati principale o in i servitori di l'applicazioni, ma quandu u scaling, i prublemi ponu appare induve ùn eranu micca previsti. Per a ricerca di testu in u situ, usemu u mutore Apache Solr. Quandu a carica aumentava, avemu nutatu una diminuzione di u tempu di risposta, è a carica di CPU di u servitore hà righjuntu 100%. Chì puderia esse più simplice - dà u containeru Solr più risorse.

Invece di l'aumentu previstu di u rendiment, u servitore simpricimenti "mortu". Immediatamente hà caricatu 100% è hà rispostu ancu più lentamente. In principiu, avemu avutu 2 core è 2 GB di RAM. Avemu decisu di fà ciò chì di solitu aiuta - avemu datu u servitore 8 core è 32 GB. Tuttu hè diventatu assai peghju (vi diceremu esattamente cumu è perchè in un postu separatu). 

In uni pochi di ghjorni, avemu capitu l'intricacies di sta questione, è ottenutu un rendiment ottimali cù 8 core è 32 GB. Sta cunfigurazione ci permette di cuntinuà à aumentà a carica oghje, chì hè assai impurtante, perchè a crescita ùn hè micca solu in termini di clienti, ma ancu in u nùmeru di magazzini cunnessi - in 2 mesi u so numeru hà radduppiatu. 

Cunsigliu: I metudi standard cum'è "aghjunghje più ferru" ùn funziona micca sempre. Allora quandu scaling ogni serviziu, avete bisognu à avè una bona capiscitura di cumu si usa risorse è pruvà in anticipu, u so travagliu in novi cundizioni. 

Stateless hè a chjave per a scala horizontale simplice

In generale, a nostra squadra aderisce à un approcciu ben cunnisciutu: i servizii ùn deve micca avè un statu internu (stateless) è deve esse indipindenti di l'ambiente runtime. Questu ci hà permessu di sopravvive à l'aumentu di a carica per una scala horizontale simplice. Ma avemu avutu una eccezzioni di serviziu - un gestore per i travaglii di fondo longu. Hè stata implicata in l'invio di e-mail è sms, processà l'avvenimenti, generà feed, importà prezzi è stocks, è trasfurmà l'imaghjini. Hè accadutu chì dipende da u almacenamentu di u schedariu locale è era in una sola copia. 

Quandu u nùmeru di travaglii in a fila di u processatore hà aumentatu (è questu naturalmente hè accadutu cù un aumentu di u numeru di ordini), u rendiment di l'ospiti chì ospitu u processatore è l'almacenamiento d'archivi diventenu un fattore limitante. In u risultatu, l'aghjurnà a gamma è i prezzi, l'inviu di notificazioni à l'utilizatori è parechje altre funzioni critiche appiccicate in a fila si ferma. U squadra Ops hà migratu rapidamente l'almacenamiento di fugliali à l'almacenamiento di rete S3-like, è questu ci hà permessu di elevà parechje macchine putenti per scala u gestore di u travagliu di fondo.

Cunsigliu: A regula Stateless deve esse osservata per tutti i cumpunenti senza eccezzioni, ancu s'ellu pare "chì certamenti ùn avemu micca riposu quì". Hè megliu di passà un pocu di tempu nantu à l'urganizazione curretta di u travagliu di tutti i sistemi chì di riscriviri u codice in fretta è riparà un serviziu sopracargatu.

7 Principii per a Crescita Intensiva

Malgradu a dispunibilità di capacità supplementu, in u prucessu di crescita, avemu passatu uni pochi razzii. Duranti stu tempu, u numeru di ordini cresce da più di 4 volte. Avà avemu digià consegnatu più di 17 ordini per ghjornu in 000 cità è pianificemu di espansione ulteriormente a geografia - in a prima mità di 62, u serviziu hè previstu per esse lanciatu in tutta a Russia. Per affruntà a carica di travagliu crescente, tenendu in contu i bumps digià pienu, avemu derivatu per noi stessi 2020 principii basi per travaglià in un ambiente di crescita constante:

  1. Gestione di incidenti. Avemu creatu un bordu in Jira, induve ogni incidente hè riflessu in a forma di un bigliettu. Questu vi aiuterà veramente à prioritizà è compie i travaglii incidenti. Infatti, in essenza, ùn hè micca terribili per sbaglià - hè terribili per sbaglià duie volte in a listessa occasione. Per quelli casi quandu l'incidentu si ripresentanu prima chì a causa pò esse corretta, l'istruzzioni per l'azzione deve esse preparatu, perchè durante una carica pesante hè impurtante per reagisce cù a velocità di u lampu.
  2. Monitoramentu necessaria per tutti gli elementi infrastrutturali senza eccezioni. Hè grazia à ellu chì pudemu predichendu a crescita di a carica è sceglite currettamente i "bottlenecks" per priorità l'eliminazione. Hè assai prubabile, sottu una carica alta, tuttu ciò chì ùn avete mancu pensatu si romperà o cumincià à rallentà. Per quessa, hè megliu di creà novi alerti immediatamente dopu à l'iniziu di i primi incidenti per monitorizà è anticipà.
  3. Avvisi curretti solu bisognu cù un forte aumentu di a carica. Prima, anu da rapportà esattamente ciò chì hè rottu. Siconda, ùn deve esse micca assai alerti, perchè l'abbundanza di alerti micca critichi porta à ignurà tutte l'alerta in generale.
  4. L'applicazioni devenu esse senza statu. Avemu assicuratu chì ùn deve esse micca eccezzioni à sta regula. Avete bisognu di una indipendenza completa da l'ambiente di runtime. Per fà questu, pudete almacenà e dati spartuti in una basa di dati o, per esempiu, direttamente in S3. Megliu, seguitate e regule. https://12factor.net. Duranti un forte aumentu di u tempu, ùn ci hè solu manera di ottimisà u codice, è avete da affruntà a carica aumentendu direttamente i risorse di l'informatica è a scala horizontale.
  5. Quotes è prestazioni di servizii esterni. Cù crescita rapida, u prublema pò esse micca solu in a vostra infrastruttura, ma ancu in un serviziu esternu. A cosa più fastidiosa hè quandu questu succede micca per un fallimentu, ma per ghjunghje à quote o limiti. Allora i servizii esterni duveranu scala cum'è voi stessu. 
  6. Separate prucessi è file. Questu aiuta assai quandu un plug si trova in una di e porte. Ùn averiamu micca scontru ritardi in a trasmissione di dati se e fila cumpleta per l'invio di SMS ùn interferiscenu micca cù u scambiu di notificazioni trà i sistemi d'infurmazione. È saria più faciule d'aumentà u numeru di travagliadori si travagliavanu separatamente.
  7. realità finanziarie. Quandu ci hè una crescita splussiva in i flussi di dati, ùn ci hè micca tempu per pensà à e tariffi è abbonamenti. Ma deve esse ricordati, soprattuttu s'è vo site una piccula cumpagnia. Un big bill pò esse stabilitu da u pruprietariu di qualsiasi API, è ancu u vostru fornitore di hosting. Allora leghjite attentamente i cuntratti.

cunchiusioni

Micca senza pèrdite, ma avemu sopravvissutu à sta tappa, è oghje pruvemu à aderisce à tutti i principii truvati, è ogni macchina hà a capacità di aumentà facilmente a prestazione x4 per affruntà alcune sorprese. 

In i seguenti posti, sparteremu a nostra sperienza di investigà u sagging di u rendiment in Apache Solr, è ancu parlemu di l'ottimisazione di e dumande è cumu l'interazzione cù u Serviziu Fiscale Federale aiuta a cumpagnia à risparmià soldi. Abbonate à u nostru blog per ùn mancà nunda, è diteci in i cumenti s'ellu avete avutu prublemi simili durante a crescita di u trafficu.

Cumu sopravvivemu à l'aumentu di a carica di travagliu x10 remotamente è chì cunclusioni avemu tiratu

Solu l'utilizatori registrati ponu participà à l'indagine. Firmà lu, per piacè.

Avete mai avutu un rallentamentu / calata di serviziu per via di un forte aumentu di a carica per:

  • 55,6%Incapacità di aghjunghje rapidamente risorse informatiche10

  • 16,7%Limiti di l'infrastruttura di u fornitore di hosting3

  • 33,3%Limiti API6 di terze parti

  • 27,8%Violazioni di i principii di apatridia e so applicazioni5

  • 88,9%Codice micca ottimali di servizii propiu16

18 utilizatori anu vutatu. 6 utilizatori si sò astenuti.

Source: www.habr.com

Add a comment