Cumu piantà di preoccupari è cumincià à campà senza un monolitu

Cumu piantà di preoccupari è cumincià à campà senza un monolitu

Tutti amemu e storie. Ci piace à pusà intornu à u focu è parlà di e nostre vittorie passate, battaglie, o simpricimenti a nostra sperienza di travagliu.

Oghje hè solu un ghjornu cusì. È ancu s'ellu ùn site micca à u focu avà, avemu una storia per voi. A storia di cumu avemu cuminciatu à travaglià cù u almacenamiento in Tarantool.

Una volta, a nostra cumpagnia avia un coppiu di "monoliths" è un "ceiling" per tutti, à quale sti monoliths si avvicinavanu lentamente, ma sicuru, limitendu u volu di a nostra cumpagnia, u nostru sviluppu. È ci era un capiscenu chjaru: un ghjornu ci batteremu duramente stu tettu.

Avà hè l'ideulugia prevalente di separà tuttu è tutti, da l'equipaggiu à a logica cummerciale. In u risultatu, avemu, per esempiu, dui DC chì sò praticamenti indipindenti à u livellu di a reta. È tandu tuttu era completamente diversu.

Oghje, ci sò assai arnesi è arnesi per fà cambiamenti in forma di CI / CD, K8S, etc. In u tempu "monoliticu", ùn avemu micca bisognu di tanti paroli stranieri. Bastava solu per correggerà u "almacenamiento" in a basa di dati.

Ma u tempu avanzava, è u numeru di richieste avanzava cun ellu, à volte sparendu RPS oltre e nostre capacità. Cù l'ingressu di i paesi CIS in u mercatu, a carica nantu à u processatore di basa di dati di u primu monolitu ùn hè micca cascatu sottu à u 90%, è RPS hè stata à u nivellu di 2400. E questi ùn eranu micca solu selettori chjuchi, ma dumande forti cù una munzeddu di cuntrolli è JOIN chì pudianu curriri quasi per a mità di i dati in u sfondate di grande IO.

Quandu a vendita di Black Friday cuminciò à apparisce in scena - è Wildberries era unu di i primi à tene in Russia - a situazione hè diventata cumplitamenti tristi. Dopu tuttu, a carica in questi ghjorni aumenta trè volte.
Oh, sti "tempi monoliticu"! Sò sicuru chì avete sperimentatu qualcosa simili, è ùn pudete micca capisce ancu cumu si pò accade à voi.

Chì pudete fà - a moda hè inherente à a tecnulugia. Circa 5 anni fà, avemu avutu à ripensà unu di sti mods in a forma di un situ esistenti in u servitore .NET è MS SQL, chì hà guardatu cù cura tutta a logica di u situ stessu. L'aghju tenutu cusì cun cura chì a serratura di un monolitu cusì hè diventatu un piacè longu è micca faciule.
Una piccula digressione.

À parechji avvenimenti dicu: "se ùn avete micca vistu un monolitu, ùn avete micca crisciutu!" Sò interessatu à a vostra opinione nantu à sta materia, per piacè scrivila in i cumenti.

Un sonu di Thunder

Riturnemu à u nostru "focu". Per distribuisce a carica di funziunalità "monoliticu", avemu decisu di dividisce u sistema in microservizi basati in tecnulugia opensource. Perchè, à u minimu, sò più prezzu di scala. È avemu avutu 100% capiscenu chì duvemu esse scala (è assai). Dopu tuttu, digià in quellu tempu era pussibule entre in i mercati di i paesi vicini, è u nùmeru di registrazioni, è ancu u nùmeru di ordini, cuminciaru à crescenu ancu più forte.

Dopu avè analizatu i primi candidati per a partenza da u monolitu à i microservizi, avemu capitu chì 80% di a scrittura in elli vene da i sistemi di back office, è leghje da u front office. Prima di tuttu, questu cuncernava un paru di sottosistemi impurtanti per noi - dati di l'utilizatori è un sistema per u calculu di u costu finali di e merchenzie basatu annantu à l'infurmazioni nantu à i sconti supplementari di i clienti è i cuponi.

Indentatu. Avà hè paura di imaginà, ma in più di i sottosistemi sopra citati, i cataloghi di i prudutti, un carrettu di shopping d'utilizatori, un sistema di ricerca di produttu, un sistema di filtrazione per i cataloghi di i prudutti, è parechji tipi di sistemi di ricunniscenza sò stati ancu eliminati da u nostru monolitu. Per u funziunamentu di ognuna di elli, ci sò classi separati di sistemi strettamente adattati, ma una volta tutti campavanu in una "casa".

Avemu immediatamente prughjettatu di trasfiriri dati nantu à i nostri clienti à u sistema sharded. L'eliminazione di e funziunalità per u calculu di u costu finali di e merchenzie necessitava una bona scalabilità per a lettura, perchè hà creatu a più grande carica RPS è era u più difficiuli di implementà per a basa di dati (assai dati sò implicati in u prucessu di calculu).

In u risultatu, avemu ghjuntu cun un schema chì si adatta bè cù Tarantool.

À quellu tempu, per u funziunamentu di i microservizi, i schemi per travaglià cù parechji centri di dati nantu à e macchine virtuali è hardware sò stati scelti. Cum'è mostratu in e figure, l'opzioni di replicazione di Tarantool sò state applicate in i modi maestru-maestru è maestru-slave.

Cumu piantà di preoccupari è cumincià à campà senza un monolitu
Architettura. Opzione 1. U serviziu d'utilizatori

À l'ora attuale, ci sò 24 shards, ognunu di i quali hà 2 istanze (una per ogni DC), tutti in modu maestru-maestru.

In cima di a basa di dati sò l'applicazioni chì accede à e rèpliche di basa di dati. L'applicazioni travaglianu cù Tarantool attraversu a nostra biblioteca persunalizata, chì implementa l'interfaccia di driver Tarantool Go. Ella vede tutte e rèpliche è pò travaglià cù u maestru per leghje è scrive. Essenzialmente, implementa u mudellu di repliche, chì aghjusta a logica per selezziunà e repliche, eseguisce tentativi, un interruttore di circuitu è ​​un limitu di tariffu.

In questu casu, hè pussibule cunfigurà a pulitica di selezzione di replica in u cuntestu di shards. Per esempiu, roundrobin.

Cumu piantà di preoccupari è cumincià à campà senza un monolitu
Architettura. Opzione 2. Serviziu per calculà u costu finali di merchenzie

Uni pochi mesi fà, a maiò parte di e dumande per u calculu di u costu finali di e merchenzie andonu à un novu serviziu, chì, in principiu, travaglia senza basa di dati, ma qualchì tempu fà tuttu hè statu processatu 100% da un serviziu cù Tarantool sottu u cappucciu.

A basa di dati di serviziu hè custituita da 4 maestri in quale u sincronizatore raccoglie dati, è ognunu di questi maestri di replicazione distribuisce dati à repliche di sola lettura. Ogni maestru hà circa 15 tali repliche.

Sia in u primu o in u sicondu schema, se un DC ùn hè micca dispunibule, l'applicazione pò riceve dati in u sicondu.

Hè da nutà chì a replicazione in Tarantool hè abbastanza flexible è pò esse cunfigurata in runtime. In altri sistemi, i difficultà sò ghjunti. Per esempiu, cambià i paràmetri max_wal_senters è max_replication_slots in PostgreSQL esige un reiniciu di l'assistente, chì in certi casi pò purtà à a severing of connections between the application and the DBMS.

Cercate è truverete !

Perchè ùn avemu micca fattu "cum'è a ghjente normale", ma hà sceltu un modu atipicu? Hè dipende di ciò chì hè cunsideratu normale. Parechje persone generalmente facenu un cluster da Mongo è si sparghje in trè DCs geo-distribuiti.

À quellu tempu, avemu digià avutu dui prughjetti Redis. U primu era un cache, è u sicondu era un almacenamiento persistente per dati micca troppu critichi. Era abbastanza difficiule cun ellu, in parte per a nostra culpa. A volte, volumi abbastanza grandi eranu in a chjave, è da u tempu à u tempu u situ hè diventatu malatu. Avemu usatu stu sistema in a versione master-slave. È ci era parechji casi induve qualcosa hè accadutu à u maestru è a replicazione s'hè rotta.

Vale à dì, Redis hè bonu per i travaglii senza statu, micca stati. In principiu, hà permessu di risolve a maiò parte di i prublemi, ma solu s'ellu eranu suluzioni chjave-valore cù un paru d'indici. Ma Redis à quellu tempu era abbastanza triste cù persistenza è replicazione. Inoltre, ci sò state lagnanze nantu à u rendiment.

Avemu pensatu à MySQL è PostgreSQL. Ma u primu in qualchì manera ùn hà micca pigliatu cun noi, è u sicondu hè un pruduttu abbastanza sofisticatu in sè stessu, è ùn saria micca adattatu per custruisce servizii simplici nantu à questu.
Avemu pruvatu RIAK, Cassandra, ancu una basa di dati gràfica. Quessi sò tutti solu solu solu niche chì ùn sò micca adattati per u rolu di un strumentu universale generale per creà servizii.

Infine, avemu stallatu nantu à Tarantool.

Avemu vultatu à questu quandu era in a versione 1.6. Ci eramu interessatu da a simbiosi di chjave-valore è a funziunalità di una basa di dati relazionale. Ci sò indici secundarii, transazzione è spazii, questi sò cum'è tavule, ma micca simplici, pudete almacenà parechji numeri di colonne in elli. Ma a caratteristica assassina di Tarantool era l'indici secundarii cumminati cù u valore chjave è a transazzione.

A cumunità di lingua russa responsiva, pronta à aiutà in chat, hà ancu ghjucatu un rolu. Avemu attivamente utilizatu questu è vive direttamente in u chat. È ùn vi scurdate di decente persistente senza sbagghiati evidenti è sbagli. Se guardate a nostra storia cù Tarantool, avemu avutu assai dulore è fallimenti cù a replicazione, ma ùn avemu mai persu dati per via di a so culpa!

L'implementazione hà iniziatu à pocu pressu

À quellu tempu, a nostra pila di sviluppu principale era .NET, à quale ùn ci era micca cunnessu per Tarantool. Avemu immediatamente cuminciatu à fà qualcosa in Go. Hà travagliatu bè ancu cù Lua. U prublema principali in quellu tempu era cù debugging: in .NET tuttu hè grande cù questu, ma dopu chì era difficiule di immersi in u mondu di Lua incrustatu, quandu ùn avete micca debugging eccettu logs. In più, per qualchì mutivu, a replicazione periòdicament s'hè cascata, cusì aghju avutu a sfondate in a struttura di u mutore Tarantool. U chat hà aiutatu cù questu, è in una minore misura, a documentazione; qualchì volta avemu vistu u codice. À quellu tempu, a documentazione era cusì cusì.

Allora, in u corsu di parechji mesi, aghju sappiutu per piglià a mo testa è ottene risultati decenti da travaglià cù Tarantool. Avemu cumpilatu sviluppi di riferimentu in git chì aiutavanu cù a furmazione di novi microservizi. Per esempiu, quandu un compitu hè ghjuntu: per creà un altru microserviziu, u sviluppatore hà guardatu u codice fonte di a suluzione di riferimentu in u repository, è ùn hà pigliatu più di una settimana per creà un novu.

Eranu tempi speciali. Convenzionalmente, pudete andà à l'amministratore à u tavulu vicinu è dumandà: "Datemi una macchina virtuale". Circa trenta minuti dopu a vittura era digià cun voi. Avete cunnessu sè stessu, installatu tuttu, è u trafficu hè statu mandatu à voi.

Oghje questu ùn funzionerà più: avete bisognu di aghjustà u monitoraghju è u logu à u serviziu, copre a funziunalità cù teste, urdinate una macchina virtuale o consegna à Kuber, etc. In generale, serà megliu questu modu, ancu s'ellu duverà più longu è esse più fastidioso.

Divide è regula. Chì ghjè l'affare cù Lua ?

Ci era un dilema seriu: alcune squadre ùn anu micca pussutu mette in modu affidabile i cambiamenti à un serviziu cù assai logica in Lua. Questu hè spessu accumpagnatu da u serviziu chì ùn funziona micca.

Vale à dì, i sviluppatori preparanu qualchì tipu di cambiamentu. Tarantool cumencia à fà a migrazione, ma a replica hè sempre cù u vechju codice; Qualchidunu DDL o qualcosa d'altru ghjunghje quì via a replicazione, è u codice si sparghje solu perchè ùn hè micca cunsideratu. In u risultatu, a prucedura d'aghjurnamentu per l'amministratori hè stata disposta nantu à un fogliu A4: cessà a replicazione, aghjurnà questu, attivate a replicazione, disattivate quì, aghjurnà quì. Nightmare !

In u risultatu, avà più spessu pruvate à fà nunda in Lua. Basta aduprà iproto (un protokollu binariu per interagisce cù u servitore), è questu hè. Forsi questu hè una mancanza di cunniscenza trà i sviluppatori, ma da questu puntu di vista u sistema hè cumplessu.

Ùn avemu micca sempre seguitu cecu stu script. Oghje ùn avemu micca biancu è neru : o tuttu hè in Lua, o tuttu hè in Go. Avemu digià capitu cumu pudemu cumminà elli per ùn finisce micca cù prublemi di migrazione dopu.

Induve hè Tarantool avà ?
Tarantool hè utilizatu in u serviziu per u calculu di u costu finali di merchenzie in cunsiderà i cuponi di sconto, cunnisciutu ancu "Promutore". Cumu l'aghju dettu prima, avà si ritirata: hè rimpiazzatu da un novu serviziu di catalogu cù prezzi pre-calculati, ma sei mesi fà tutti i calculi sò stati fatti in Promotizer. Nanzu, a mità di a so logica era scritta in Lua. Dui anni fà, u serviziu hè statu trasfurmatu in una facilità di almacenamento, è a logica hè stata riscritta in Go, perchè a meccanica di sconti hà cambiatu pocu è u serviziu mancava di prestazione.

Unu di i servizii più critichi hè u prufilu d'utilizatore. Questu hè, tutti l'utilizatori di Wildberries sò guardati in Tarantool, è ci sò circa 50 milioni d'elli.Un sistema sharded by user ID, distribuitu in parechji DC cunnessi à i servizii Go.
Sicondu RPS, u Promotore era una volta u capu, righjunghjendu 6 mila richieste. À un puntu avemu avutu 50-60 copie. Avà u capimachja in RPS hè i prufili d'utilizatori, circa 12 mila. Stu serviziu usa sharding customizati, divisu da e varieghja di ID d'utilizatori. U serviziu serve più di 20 machini, ma questu hè troppu; avemu pensatu à riduce e risorse attribuite, perchè a capacità di 4-5 macchine hè abbastanza per questu.

U serviziu di sessione hè u nostru primu serviziu nantu à vshard è Cartridge. L'installazione di vshard è l'aghjurnamentu di Cartuccia ci hà bisognu di qualchì sforzu, ma à a fine tuttu hà travagliatu.

U serviziu per vede diverse banners nantu à u situ web è in l'applicazione mobile hè unu di i primi à esse liberatu direttamente nantu à Tarantool. Stu serviziu hè notu per u fattu chì hè 6-7 anni, hè sempre in operazione è ùn hè mai statu rebooted. A replicazione maestru-maestru hè stata utilizata. Nunda ùn hà mai rottu.

Ci hè un esempiu di utilizà Tarantool per a funziunalità di riferimentu rapidu in un sistema di magazzinu per verificà rapidamente l'infurmazioni in certi casi. Avemu pruvatu à utilizà Redis per questu, ma i dati in memoria occupanu più spaziu di Tarantool.

I servizii di una lista d'attesa, l'abbonamenti di i clienti, i storii di moda attualmente è i beni diferiti travaglianu ancu cù Tarantool. L'ultimu serviziu in memoria occupa circa 120 GB. Questu hè u serviziu più cumpletu di u sopra.

cunchiusioni

Grazie à l'indici secondari cumminati cù u valore chjave è a transazzione, Tarantool hè bè adattatu per l'architetture basate in microservizi. Tuttavia, avemu scontru difficultà quandu rolling out cambiamenti à i servizii cù assai logica in Lua - i servizii spessu cessatu di travaglià. Ùn pudemu micca superà questu, è cù u tempu avemu ghjuntu à diverse cumminazzioni di Lua è Go: sapemu induve aduprà una lingua è induve aduprà una altra.

Chì altru à leghje nantu à u tema

Source: www.habr.com

Add a comment