Circa u muvimentu da Redis à Redis-cluster

Circa u muvimentu da Redis à Redis-cluster

Venendu à un pruduttu chì hà sviluppatu per più di una dicada, ùn hè micca surprisante per truvà tecnulugia obsolete in questu. Ma chì s'ellu in sei mesi avete a mantene a carica 10 volte più altu, è u costu di cascate aumenterà centinaie di volte? In questu casu, avete bisognu di un ingegnere Highload cool. Ma in l'absenza di una cameriera, m'hà affidatu à risolve u prublema. In a prima parte di l'articulu, vi dicu cumu avemu trasladatu da Redis à Redis-cluster, è in a seconda parte daraghju cunsiglii nantu à cumu cumincià à aduprà u cluster è ciò chì deve esse attentu quandu l'utilizanu.

Selezzione di tecnulugia

Hè cusì male ? Redis separati (redis standalone) in una cunfigurazione di 1 master è N slaves? Perchè u chjamu tecnulugia obsoleta?

Innò, Redis ùn hè micca cusì male... Tuttavia, ci sò qualchi difetti chì ùn ponu esse ignorati.

  • Prima, Redis ùn sustene micca miccanismi di ricuperazione di disastru dopu un fallimentu maestru. Per risolve stu prublema, avemu usatu una cunfigurazione cù trasferimentu automaticu di VIP à un novu maestru, cambiendu u rolu di unu di i schiavi è cambiendu u restu. Stu mekanismu hà travagliatu, ma ùn pudia esse chjamatu una suluzione affidativa. Prima, falsi alarmi sò accaduti, è in segundu, era dispunibile, è dopu l'operazione manuale di l'azzioni eranu necessarii per carica a primavera.

  • Siconda, avè un solu maestru hà purtatu à u prublema di sharding. Avemu avutu à creà parechji clusters indipendenti "1 maestru è N schiavi", poi distribuisce manualmente e basa di dati trà sti machini è sperendu chì dumani una di e basa di dati ùn si gonfiassi tantu chì avissi da esse spustatu in una istanza separata.

Chì sò l'opzioni?

  • A suluzione più caru è più ricca hè Redis-Enterprise. Questa hè una suluzione boxed cù supportu tecnicu cumpletu. Malgradu u fattu chì pare ideale da un puntu di vista tecnicu, ùn ci hè micca adattatu per ragioni ideologiche.
  • Redis-cluster. Fora di a scatula ci hè un supportu per u failover maestru è u sharding. L'interfaccia ùn hè quasi micca sfarente da a versione regulare. Sembra prumessu, parleremu di i pisculi dopu.
  • Tarantool, Memcache, Aerospike è altri. Tutti questi strumenti facenu quasi u listessu. Ma ognunu hà i so difetti. Avemu decisu di ùn mette tutti i nostri ova in una cesta. Avemu aduprà Memcache è Tarantool per altri travaglii, è, guardendu avanti, diceraghju chì in a nostra pratica ci era più prublemi cun elli.

Specificità di usu

Fighjemu un ochju à quali prublemi avemu risoltu storicamente cù Redis è chì funziunalità avemu usatu:

  • Cache prima di dumande à servizii remoti cum'è 2GIS | Golang

    GET SET MGET MSET "SELECT DB"

  • Cache prima di MYSQL | PHP

    GET SET MGET MSET SCAN "CHIAVE PER PATTERN" "SELECT DB"

  • U magazzini principali di u serviziu di u travagliu cù sessione è coordenadas driver | Golang

    GET SET MGET MSET "SELECT DB" "ADD GEO KEY" "GET GEO KEY" SCANSIONE

Comu pudete vede, ùn hè micca una matematica più alta. Chì ghjè allora a difficultà ? Fighjemu ogni metudu separatamente.

Metu
discrizzione
Caratteristiche di Redis-cluster
dicisioni

INFINITI
Scrivite / leghje chjave

MGET MSET
Scrivite / leghje parechje chjave
I chjavi seranu nantu à diversi nodi. Biblioteche pronte ponu eseguisce multi-operazioni solu in un node
Sustituisce MGET cù una pipeline di operazioni N GET

SELEZIONA DB
Selezziunate a basa chì avemu da travaglià
Ùn sustene micca parechje basa di dati
Mettite tuttu in una basa di dati. Aghjunghjite prefissi à e chjave

SCAN
Passà tutte e chjave in a basa di dati
Siccomu avemu una basa di dati, passà per tutte e chjave in u cluster hè troppu caru
Mantene un invariante in una chjave è fate un HSCAN nantu à sta chjave. O ricusate completamente

GEO
Operazioni cù una geokey
U geokey ùn hè micca spargugliatu

CHIAVE PER PATTERN
A ricerca di una chjave per mudellu
Siccomu avemu una basa di dati, cercheremu tutte e chjave in u cluster. Troppu caru
Refuse o mantene l'invariant, cum'è in u casu di SCAN

Redis vs Redis-cluster

Chì perdemu è chì guadagnemu quandu si passa à un cluster?

  • Svantaghji: perdemu a funziunalità di parechje basa di dati.
    • Se vulemu almacenà e dati logicamente senza relazione in un cluster, avemu da fà crutches in forma di prefissi.
    • Perdemu tutte e operazioni "base", cum'è SCAN, DBSIZE, CLEAR DB, etc.
    • Multi-operazioni sò diventate assai più difficili da implementà perchè pò esse bisognu di accessu à parechji nodi.
  • Pluses:
    • Tolleranza à i difetti in forma di failover maestru.
    • Sharding da u latu Redis.
    • Trasferite dati trà i nodi atomically è senza downtime.
    • Aghjunghjite è ridistribuite a capacità è i carichi senza downtime.

Puderaghju cuncludi chì s'ellu ùn hè micca bisognu di furnisce un altu livellu di tolleranza di difetti, allora u muvimentu in un cluster ùn vale a pena, perchè pò esse un compitu micca trivial. Ma s'è vo sceglite inizialmente trà una versione separata è una versione di cluster, allora duvete sceglie un cluster, postu chì ùn hè micca peghju è, in più, vi alleviate da alcuni di i mal di testa.

Preparatu à spustà

Cuminciamu cù i requisiti per u muvimentu:

  • Si deve esse senza cuciture. Una fermata cumpleta di serviziu per 5 minuti ùn ci cunvene micca.
  • Hè da esse u più sicuru è graduali pussibule. Vogliu avè qualchì cuntrollu di a situazione. Ùn vulemu dump tuttu in una volta è pricà nantu à u buttone rollback.
  • Perdita minima di dati quandu si move. Avemu capitu chì serà assai difficiuli di spustà atomically, cusì ci permette una certa desincronizazione trà e dati in Redis regulare è clustered.

Mantenimentu di u cluster

Just prima di u muvimentu, duvemu pensà à se pudemu sustene u cluster:

  • Charts. Utilizemu Prometheus è Grafana per graficà a carica di CPU, l'usu di memoria, u numeru di clienti, u numeru di operazioni GET, SET, AUTH, etc.
  • A sperienza. Imagine chì dumane avete un grande cluster sottu à a vostra rispunsabilità. S'ellu si rompe, nimu ma voi pudete riparà. S'ellu principia à rallentà, tutti correranu versu voi. Sè avete bisognu di aghjunghje risorse o ridistribuite a carica, torna à voi. Per ùn vultà grisgiu à 25, hè cunsigliu per furnisce questi casi è verificate in anticipu cumu si cumportanu a tecnulugia sottu à certi azzioni. Parlemu di questu in più detail in a sezione "Esperienza".
  • Surviglianza è alerti. Quandu un cluster si rompe, vulete esse u primu à sapè. Quì avemu limitatu à una notificazione chì tutti i nodi tornanu a listessa infurmazione nantu à u statu di u cluster (sì, succede in modu diversu). È altri prublemi ponu esse nutati più rapidamente da alerti da i servizii di u cliente Redis.

Moving

Cumu ci moveremu:

  • Prima di tuttu, avete bisognu di preparà una biblioteca per travaglià cù u cluster. Avemu pigliatu go-redis cum'è a basa per a versione Go è cambiatu un pocu per adattà à noi. Avemu implementatu Multi-metudu attraversu pipelines, è ancu corrette ligeramente e regule per ripetiri richieste. A versione PHP hà avutu più prublemi, ma avemu eventualmente stallatu nantu à php-redis. Recentemente anu introduttu u supportu di cluster è pare bè in u nostru parè.
  • Dopu avete bisognu di implementà u cluster stessu. Questu hè fattu literalmente in dui cumandamenti basati nantu à u schedariu di cunfigurazione. Discuteremu u paràmetru in più detail sottu.
  • Per u muvimentu graduale usemu u modu seccu. Siccomu avemu duie versioni di a biblioteca cù a listessa interfaccia (una per a versione regulare, l'altra per u cluster), ùn custa nunda per creà un wrapper chì travaglià cù una versione separata è in parallelu duplicà tutte e dumande à u cluster. paragunate e risposte è scrive discrepanzi in i logs (in u nostru casu in NewRelic). Cusì, ancu se a versione di cluster si rompe durante u rollout, a nostra pruduzzione ùn serà micca affettata.
  • Dopu avè sbulicatu u cluster in modu seccu, pudemu fighjà tranquillamente u graficu di discrepanzi di risposta. Se a rata d'errore lentamente ma sicuramenti si move versu una piccula constante, allora tuttu va bè. Perchè ci sò sempre discrepanze ? Perchè a registrazione in una versione separata hè un pocu prima di u cluster, è per via di microlag, i dati ponu diverge. Tuttu ciò chì resta hè di guardà i logs di discrepancy, è s'ellu sò tutti spiegati da a non-atomicità di u record, allora pudemu passà.
  • Avà pudete cambià u modu seccu in a direzzione opposta. Scriveremu è leghje da u cluster, è duplicà in una versione separata. Perchè? A settimana dopu, vogliu osservà u travagliu di u cluster. S'ellu si trova di colpu chì ci sò prublemi à a carica di punta, o ùn avemu micca pigliatu qualcosa in contu, avemu sempre un rollback d'urgenza à u vechju codice è e dati attuali grazia à u modu seccu.
  • Tuttu ciò chì resta hè di disattivà u modalità secca è dismantellà a versione separata.

A sperienza

Prima, brevemente nantu à u disignu di u cluster.

Prima di tuttu, Redis hè una tenda di chjave-valore. Corde arbitrarie sò usate cum'è chjave. Numeri, corde è strutture intere ponu esse usatu cum'è valori. Ci hè una grande quantità di l'ultimi, ma per capiscenu a struttura generale ùn hè micca impurtante per noi.
U prossimu livellu di astrazione dopu à e chjave hè slots (SLOTS). Ogni chjave appartene à unu di i slot 16. Ci pò esse un numeru di chjave in ogni slot. Cusì, tutti i chjavi sò spartuti in 383 gruppi disjoint.
Circa u muvimentu da Redis à Redis-cluster

Dopu, deve esse N nodi maestri in u cluster. Ogni nodu pò esse pensatu cum'è una istanza Redis separata chì sapi tuttu di l'altri nodi in u cluster. Ogni nodu maestru cuntene una quantità di slot. Ogni slot appartene à un solu node maestru. Tutti i slots anu da esse distribuitu trà i nodi. Se certi slot ùn sò micca attribuiti, allora e chjave guardate in elli seranu inaccessibili. Hè sensu per eseguisce ogni nodu maestru in una macchina logica o fisica separata. Hè ancu vale a pena ricurdà chì ogni nodu corre solu nantu à un core, è se vulete eseguisce parechje istanze Redis nantu à a listessa macchina logica, assicuratevi ch'elli correnu nantu à nuclei diffirenti (ùn avemu micca pruvatu questu, ma in teoria duverebbe travaglià) . Essenzialmente, i nodi maestri furniscenu sharding regularmente, è più nodi maestri permettenu di scrive è leghje richieste à scala.

Dopu chì tutti i chjavi sò distribuiti trà i slots, è i slots sò spargugliati trà i nodi maestri, un numeru arbitrariu di nodi slave pò esse aghjuntu à ogni nodu maestru. Dentru ogni tali ligame maestru-slave, a replicazione normale funzionerà. I schiavi sò necessarii per scala e richieste di lettura è per fallu in casu di fallimentu maestru.
Circa u muvimentu da Redis à Redis-cluster

Avà parlemu di l'operazioni chì saria megliu di pudè fà.

Avemu da accede à u sistema via Redis-CLI. Siccomu Redis ùn hà micca un puntu d'entrata unicu, pudete fà e seguenti operazioni nantu à qualsiasi di i nodi. In ogni puntu, aghju attiratu separatamente l'attenzione à a pussibilità di fà l'operazione sottu carica.

  • U primu è più impurtante chì avemu bisognu hè l'operazione di i nodi di cluster. Ritorna u statu di u cluster, mostra una lista di nodi, i so roli, a distribuzione di slot, etc. Più infurmazione pò esse ottenuta usendu l'infurmazioni di cluster è i slots di cluster.
  • Saria bellu di pudè aghjunghje è sguassà nodi. Per questu scopu, ci sò operazioni di cluster meet è cluster forget. Per piacè nutate chì u cluster forget deve esse appiicatu à OGNI nodu, sia maestri sia rèplichi. È u cluster meet solu deve esse chjamatu nantu à un node. Sta diffarenza pò esse disconcertante, cusì hè megliu amparà prima di andà in diretta cù u vostru cluster. L'aghjunghje un node hè fattu in modu sicuru in battaglia è ùn affetta micca l'operazione di u cluster in ogni modu (chì hè logicu). Sè vo site per sguassà un node da u cluster, duvete assicuratevi chì ùn ci sò micca slots lasciati nantu à questu (altrimenti risicate di perde l'accessu à tutte e chjave di stu node). Inoltre, ùn sguassate micca un maestru chì hà schiavi, altrimenti un votu innecessariu per un novu maestru serà realizatu. Se i nodi ùn anu più slots, allora questu hè un picculu prublema, ma perchè avemu bisognu di scelte extra se pudemu sguassà i schiavi prima.
  • Sè avete bisognu di scambià forzamente e pusizioni maestru è schiavu, allora u cumandamentu di failover di cluster farà. Quandu chjamà in battaglia, avete bisognu di capisce chì u maestru ùn serà micca dispunibule durante l'operazione. Di genere, u cambiamentu si faci in menu di un secondu, ma ùn hè micca atomicu. Pudete aspittà chì alcune dumande à u maestru fallenu durante stu tempu.
  • Prima di sguassà un node da u cluster, ùn deve esse micca slots lasciati nantu à questu. Hè megliu di ridistribuisce cù l'ordine di cluster reshard. I slots seranu trasferiti da un maestru à l'altru. Tuttu u funziunamentu pò piglià parechji minuti, dipende da u voluminu di dati chì sò trasferiti, ma u prucessu di trasferimentu hè sicuru è ùn affetta micca u funziunamentu di u cluster in ogni modu. Cusì, tutti i dati ponu esse trasferiti da un node à l'altru direttamente sottu a carica, è senza preoccupari di a so dispunibilità. Tuttavia, ci sò ancu suttilità. Prima, u trasferimentu di dati hè assuciatu cù una certa carica nantu à i nodi di u destinatariu è di u mittente. Se u node di u destinatariu hè digià assai caricatu nantu à u processatore, allora ùn deve micca carricà cù riceve novi dati. Siconda, quandu ùn ci hè micca un unicu slot lasciatu nantu à u maestru di l'inviu, tutti i so schiavi andaranu immediatamente à u maestru à quale sti slot sò stati trasferiti. È u prublema hè chì tutti questi schiavi volenu sincronizà e dati in una volta. È sarete furtunatu s'ellu hè una sincronizazione parziale invece di cumpleta. Pigliate questu in contu è combina l'operazioni di trasferimentu di slots è disattivà / trasferimentu di schiavi. O speru chì avete un margine di salvezza abbastanza.
  • Chì duvete fà se, durante u trasferimentu, truvate chì avete persu i vostri slot in un locu? Spergu chì stu prublema ùn vi affetta micca, ma s'ellu hè, ci hè una operazione di correzione di cluster. À u minimu, sparghjerà i slot in i nodi in un ordine aleatoriu. Aghju ricumandemu di verificà u so funziunamentu per prima sguassate u node cù slots distribuiti da u cluster. Siccomu i dati in i slots micca allocati ùn sò digià dispunibili, hè troppu tardi per preoccupassi di prublemi cù a dispunibilità di questi slot. In turnu, l'operazione ùn affetterà micca i slots distribuiti.
  • Un'altra operazione utile hè u monitor. Permette di vede in tempu reale tutta a lista di e dumande chì vanu à u node. Inoltre, pudete grep it è scopre s'ellu ci hè u trafficu necessariu.

Hè vale a pena menzionate ancu a prucedura di failover maestru. In corta, esiste, è, in u mo parè, funziona assai. Tuttavia, ùn pensate micca chì, s'è vo unplug the power cord in una macchina cù un node maestru, Redis cambia immediatamente è i clienti ùn anu micca a perdita. In a mo pratica, u cambiamentu si faci in pochi seconde. Duranti stu tempu, alcune di e dati ùn saranu micca dispunibuli: a indisponibilità di u maestru hè rilevata, i nodi votanu per un novu, i schiavi sò cambiati, i dati sò sincronizati. U megliu modu per assicurà per sè stessu chì u schema funziona hè di fà esercizii lucali. Elevate u cluster in u vostru laptop, dà una carica minima, simulate un crash (per esempiu, bluccà i porti), è evaluate a velocità di cambiamentu. In u mo parè, solu dopu à ghjucà in questu modu per un ghjornu o dui pudete esse cunfidenza in u funziunamentu di a tecnulugia. Ebbè, o speru chì u software chì a mità di l'Internet usa probabilmente travaglia.

Cunfigurazione

Spessu, a cunfigurazione hè a prima cosa chì avete bisognu di cumincià à travaglià cù l'uttellu, è quandu tuttu funziona, ùn vulete mancu toccu a cunfigurazione. Ci vole un pocu di sforzu per furzà à vultà à i paràmetri è passà per elli cù cura. In a mo memoria, avemu avutu almenu dui fallimenti serii per inattenzione à a cunfigurazione. Prestate una attenzione particulare à i seguenti punti:

  • timeout 0
    Tempu dopu chì e cunnessione inattivu sò chjusi (in seconde). 0 - ùn chjude micca
    Micca ogni biblioteca di a nostra hè stata capace di chjude e cunnessione currettamente. Per disattivà stu paràmetru, risichemu di chjappà u limitu di u numeru di clienti. Per d 'altra banda, s'ellu ci hè un tale prublema, allora a terminazione automatica di e cunnessione perse a mascherarà, è ùn pudemu micca avvistà. Inoltre, ùn deve micca attivà sta paràmetra quandu utilizate cunnessione persistente.
  • Salvà xy è appendu solu sì
    Salvà una snapshot RDB.
    Discuteremu i prublemi RDB / AOF in dettagliu quì sottu.
  • stop-writes-on-bgsave-error no & slave-serve-stale-data sì
    Se attivatu, se l'istantanea RDB si rompe, u maestru cesserà di accettà richieste di cambiamentu. Se a cunnessione cù u maestru hè persa, u schiavu pò cuntinuà à risponde à e dumande (sì). O smetterà di risponde (nè)
    Ùn simu cuntenti di a situazione in quale Redis si trasforma in una zucca.
  • repl-ping-slave-periodu 5
    Dopu à stu piriudu di tempu, avemu da principià à preoccupari chì u maestru s'hè rottu è hè u tempu di fà a prucedura failover.
    Duverete truvà manualmente un equilibriu trà falsi pusitivi è attivà un failover. In a nostra pratica, questu hè 5 seconde.
  • repl-backlog-size 1024mb & epl-backlog-ttl 0
    Pudemu almacenà esattamente questa quantità di dati in un buffer per una replica falluta. Se u buffer si esaurisce, vi tuccherà à sincronizà cumplettamente.
    A pratica suggerisce chì hè megliu stabilisce un valore più altu. Ci hè parechje ragioni per chì una replica puderia cumincià à ritarda. S'ellu si ritarda, u più prubabile chì u vostru maestru hè digià a lotta per affruntà, è a sincronizazione completa serà l'ultima paglia.
  • maxclients 10000
    U numeru massimu di clienti una volta.
    In a nostra sperienza, hè megliu stabilisce un valore più altu. Redis gestisce 10k cunnessione bè. Solu assicuratevi chì ci sò abbastanza sockets in u sistema.
  • maxmemory-policy volatile-ttl
    A regula per quale e chjave sò sguassate quandu u limitu di memoria dispunibule hè righjuntu.
    Ciò chì hè impurtante quì ùn hè micca a regula stessa, ma a cunniscenza di cumu questu succede. Redis pò esse elogiatu per a so capacità di travaglià nurmale quandu u limitu di memoria hè righjuntu.

Problemi RDB è AOF

Ancu Redis stessu guarda tutte l'infurmazioni in RAM, ci hè ancu un mecanismu per salvà dati à u discu. Più precisamente, trè meccanismi:

  • RDB-snapshot - un snapshot cumpletu di tutti i dati. Stabilite cù a cunfigurazione SAVE XY è leghje "Salvà una snapshot cumpleta di tutti i dati ogni X seconde se almenu Y chjave sò cambiate".
  • Append-only file - una lista di operazioni in l'ordine chì sò realizati. Aghjunghje novi operazioni entranti à u schedariu ogni X seconde o ogni Y operazione.
  • RDB è AOF sò una cumminazione di i dui precedenti.

Tutti i metudi anu i so vantaghji è disadvantages, ùn aghju micca listatu tutti, solu attirà l'attenzione à i punti chì, in my opinion, ùn sò micca evidenti.

Prima, salvà una snapshot RDB richiede di chjamà FORK. Se ci hè assai di dati, questu pò impiccà tutti i Redis per un periudu di pochi millisecondi à un secondu. Inoltre, u sistema hà bisognu di assignà memoria per una tale snapshot, chì porta à a necessità di mantene una doppia fornitura di RAM in a macchina logica: se 8 GB sò attribuiti per Redis, allora 16 GB deve esse dispunibule nantu à a macchina virtuale cù lu.

Siconda, ci sò prublemi cù a sincronizazione parziale. In u modu AOF, quandu u schiavu hè ricollegatu, invece di a sincronizazione parziale, a sincronizazione completa pò esse realizata. Perchè questu succede, ùn pudia capisce. Ma vale a pena ricurdà questu.

Sti dui punti dighjà ci facenu pensà s'ellu avemu veramente bisognu di sti dati nantu à u discu se tuttu hè digià duplicatu da i schiavi. I dati ponu esse persu solu se tutti i schiavi fallenu, è questu hè un prublema di livellu "incendiu in DC". Cum'è un cumprumissu, pudete prupone di salvà e dati solu nantu à i schiavi, ma in questu casu avete bisognu di assicurà chì questi schiavi ùn diventeranu mai un maestru durante a ricuperazione di disastru (per questu ci hè un paràmetru di priorità schiavu in a so cunfigurazione). Per noi stessi, in ogni casu specificu pensemu s'ellu hè necessariu di salvà dati à u discu, è più spessu a risposta hè "nè".

cunchiusioni

In cunclusioni, spergu chì aghju pussutu dà una idea generale di cumu funziona redis-cluster per quelli chì ùn anu micca intesu parlà di questu, è ancu attiratu l'attenzione à certi punti micca evidenti per quelli chì anu utilizatu. per un bellu pezzu.
Grazie per u vostru tempu è, cum'è sempre, i cumenti nantu à u tema sò benvenuti.

Source: www.habr.com

Add a comment