Cassandra. Cumu ùn mori s'ellu sapete solu Oracle

Hey Habr.

Mi chjamu Misha Butrimov, vogliu dì un pocu di Cassandra. A mo storia serà utile à quelli chì ùn anu mai scontru à e basa di dati NoSQL - hà assai caratteristiche di implementazione è trappule chì avete bisognu di sapè. È s'ellu ùn avete micca vistu nunda altru ch'è Oracle o qualsiasi altra basa di dati relazionale, queste cose salvaranu a vostra vita.

Chì ci hè cusì bellu di Cassandra ? Hè una basa di dati NoSQL cuncepita senza un unicu puntu di fallimentu chì scala bè. Sè avete bisognu di aghjunghje un paru di terabyte per una basa di dati, solu aghjunghje nodi à l'anellu. Espandilu à un altru centru di dati? Aghjunghjite nodi à u cluster. Aumentà l'RPS processatu? Aghjunghjite nodi à u cluster. Funziona ancu in a direzzione opposta.

Cassandra. Cumu ùn mori s'ellu sapete solu Oracle

In chì altru hè bona? Si tratta di trattà parechje dumande. Ma quantu hè assai? 10, 20, 30, 40 mila richieste per seconda ùn hè micca assai. 100 mila richieste per seconda per a registrazione - ancu. Ci sò cumpagnie chì anu dettu chì mantenenu 2 milioni di richieste per seconda. Probabilmente anu da crede.

È in principiu, Cassandra hà una grande diferenza di dati relazionale - ùn hè micca simili à elli. È questu hè assai impurtante per ricurdà.

Micca tuttu ciò chì pare u listessu funziona u listessu

Una volta un cullega hè ghjuntu à mè è m'hà dumandatu: "Eccu una lingua di quistione CQL Cassandra, è hà una dichjarazione selettiva, hà induve, hà è. Scrivu lettere è ùn funziona micca. Perchè?". Trattà Cassandra cum'è una basa di dati relazionale hè u modu perfettu per suicidiu viulente. È ùn sò micca prumove, hè pruibitu in Russia. Solu cuncepisce qualcosa di sbagliatu.

Per esempiu, un cliente vene à noi è dice: "Custruemu una basa di dati per a serie TV, o una basa di dati per un repertoriu di ricette. Averemu piatti alimentari o una lista di serie TV è attori in questu ". Dicemu cun gioia: "Andemu!" Basta à mandà dui bytes, un paru di segni è avete finitu, tuttu hà da travaglià assai rapidamente è affidabile. È tuttu hè bè finu à chì i clienti venenu è dicenu chì e casalinghe sò ancu risolve u prublema oppostu: anu una lista di prudutti, è volenu sapè chì platu volenu cocilu. Siete mortu.

Questu hè chì Cassandra hè una basa di dati hibrida: furnisce simultaneamente un valore chjave è almacena dati in culonni largu. In Java o Kotlin, puderia esse descrittu cusì:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Questu hè, una mappa chì cuntene ancu una mappa ordinata. A prima chjave per questa mappa hè a chjave Row o Partition key - a chjave di partizione. A seconda chjave, chì hè a chjave per una mappa digià ordinata, hè a chjave Clustering.

Per illustrà a distribuzione di a basa di dati, disegnà trè nodi. Avà avete bisognu di capisce cumu si decompone i dati in nodi. Perchè s'ellu ci hè tuttu in unu (per via, pò esse mille, dui mila, cinque - quant'è vo vulete), questu ùn hè micca veramente di distribuzione. Dunque, avemu bisognu di una funzione matematica chì vultà un numeru. Solu un numeru, un longu int chì cascà in qualchì intervallu. È averemu un node rispunsevuli di una gamma, u sicondu per u sicondu, l'nèsimu per u nth.

Cassandra. Cumu ùn mori s'ellu sapete solu Oracle

Stu numeru hè pigliatu cù una funzione hash, chì hè appiicata à ciò chì chjamemu a chjave di Partition. Questa hè a colonna chì hè specificatu in a direttiva di chjave primaria, è questu hè a colonna chì serà a prima chjave è a più basica di a mappa. Determina quale nodu riceverà quale dati. Una tavola hè creata in Cassandra cù quasi a stessa sintassi chì in SQL:

CREATE TABLE users (
	user_id uu id,
	name text,
	year int,
	salary float,
	PRIMARY KEY(user_id)

)

A chjave primaria in questu casu hè custituita da una colonna, è hè ancu a chjave di partizione.

Cumu farà i nostri utilizatori? Qualchidunu andaranu à un nodu, certi à un altru, è certi à un terzu. U risultatu hè una tavula di hash ordinariu, cunnisciuta ancu com'è una mappa, cunnisciuta ancu com'è dizziunariu in Python, o una struttura simplice di valore chjave da quale pudemu leghje tutti i valori, leghje è scrive per chjave.

Cassandra. Cumu ùn mori s'ellu sapete solu Oracle

Selezziunà: quandu permette u filtru si trasforma in scansione cumpleta, o ciò chì ùn deve micca fà

Scrivemu qualchì dichjarazione selettiva: select * from users where, userid = . Risulta cum'è in Oracle: scrivemu selezziunà, specifichi e cundizioni è tuttu funziona, l'utilizatori l'acquistenu. Ma se selezziunate, per esempiu, un utilizatore cù un certu annu di nascita, Cassandra si lamenta chì ùn pò micca cumpiendu a dumanda. Perchè ùn cunnosci micca nunda di quantu avemu distribuitu dati annantu à l'annu di nascita - hà solu una colonna indicata cum'è chjave. Allora ella dice: "Va bè, possu sempre cumpiendu sta dumanda. Aghjunghjite permette u filtru ". Aghjunghjemu a direttiva, tuttu funziona. È in questu mumentu succede qualcosa di terribili.

Quandu corremu nantu à e dati di prova, tuttu hè bè. È quandu eseguite una dumanda in a produzzione, induve avemu, per esempiu, 4 milioni di dischi, allora tuttu ùn hè micca assai bonu per noi. Perchè permette u filtru hè una direttiva chì permette à Cassandra di cullà tutte e dati da questa tavula da tutti i nodi, tutti i centri di dati (se ci sò parechji in questu cluster), è solu dopu filtrà. Questu hè un analogu di Full Scan, è quasi nimu hè piacè cun ellu.

Se avemu solu bisognu di utilizatori per ID, sariamu bè cù questu. Ma qualchì volta avemu bisognu di scrive altre dumande è impone altre restrizioni à a selezzione. Dunque, ricurdamu: questu hè tutta una mappa chì hà una chjave di partizione, ma dentru hè una mappa ordinata.

È hà ancu una chjave, chì chjamemu a Chjave di Clustering. Questa chjave, chì, à u turnu, hè custituita da e culonni chì avemu sceltu, cù l'aiutu di quale Cassandra capisce cumu e so dati sò fisicu è esse situatu nantu à ogni node. Questu hè, per qualchì chjave di Partizione, a chjave di Clustering vi dicerà esattamente cumu per spinghje e dati in questu arbre, chì postu duverà.

Questu hè veramente un arbre, un comparatore hè simplicemente chjamatu quì, à quale passemu un certu settore di culonni in a forma di un ughjettu, è hè ancu specificatu cum'è una lista di colonne.

CREATE TABLE users_by_year_salary_id (
	user_id uuid,
	name text,
	year int,
	salary float,
	PRIMARY KEY((year), salary, user_id)

Prestate attenzione à a direttiva di a chjave primaria; u so primu argumentu (in u nostru casu, l'annu) hè sempre a chjave di Partizione. Pò esse cumpostu di una o più colonne, ùn importa micca. Se ci sò parechje culonni, deve esse sguassatu in parentesi di novu in modu chì u preprocessore di lingua capisce chì questu hè a chjave Primaria, è daretu à tutti l'altri culonni sò a chjave Clustering. In questu casu, seranu trasmessi in u comparatore in l'ordine in quale appariscenu. Questu hè, a prima colonna hè più significativa, a seconda hè menu significativa, è cusì. Cumu scrivemu, per esempiu, uguali campi per classi di dati: listemu i campi, è per elli scrivemu quale sò più grande è quali sò più chjuchi. In Cassandra, questi sò, relativamente parlante, i campi di a classa di dati, à quale l'uguali scritti per questu seranu appiicati.

Avemu stabilitu a classificazione è impone restrizioni

Avete bisognu di ricurdà chì l'ordine di sorte (discendente, ascendante, qualunque) hè stabilitu in u stessu mumentu quandu a chjave hè creata, è ùn pò micca esse cambiata dopu. Determina fisicamente cumu e dati seranu ordinati è cumu si saranu guardati. Sè avete bisognu di cambià a chjave di Clustering o l'ordine di sorte, avete da creà una nova tavola è trasfiriri dati in questu. Questu ùn hà micca travagliatu cù un esistente.

Cassandra. Cumu ùn mori s'ellu sapete solu Oracle

Avemu riempitu a nostra tavula cù l'utilizatori è hà vistu chì anu cascatu in un anellu, prima per annu di nascita, è dopu in ogni node per salariu è ID d'utilizatore. Avà pudemu selezziunà imponendu restrizioni.

U nostru travagliu torna torna where, and, è avemu l'utilizatori, è tuttu torna bè. Ma s'è no pruvate d'utilizà solu una parte di a chjave Clustering, è una menu significativa, allora Cassandra si lagnarà subitu chì ùn pò micca truvà u locu in a nostra mappa induve questu ughjettu, chì hà questi campi per u comparatore nulu, è questu. chì era ghjustu stabilitu, - induve si trova. Avaraghju da tirà tutte e dati da questu node di novu è filtrà. È questu hè un analogu di Full Scan in un node, questu hè male.

In ogni situazione pocu chjaru, crea una nova tavola

S'è no vulemu esse in gradu di destinazione utilizatori per ID, o per età, o di salariu, chì duvemu fà? Nunda. Basta aduprà duie tavule. Sè avete bisognu di ghjunghje à l'utilizatori in trè modi diffirenti, ci saranu trè tavule. Sò passati i ghjorni chì avemu salvatu spaziu nantu à a vite. Questa hè a risorsa più economica. Custa assai menu di u tempu di risposta, chì pò esse preghjudiziu per l'utilizatore. Hè assai più piacevule per l'utilizatore per riceve qualcosa in un secondu chè in 10 minuti.

Cummerciamu spaziu innecessariu è dati denormalizzati per a capacità di scala bè è operate in modu affidabile. Dopu tuttu, in fattu, un cluster chì hè custituitu di trè centri di dati, ognunu hà cinque nodi, cù un livellu accettabile di preservazione di dati (quandu nunda hè persu), hè capaci di sopravvive à a morte di un centru di dati cumpletamente. È dui nodi più in ognunu di i dui restanti. È solu dopu à questu i prublemi cumincianu. Questa hè una redundanza abbastanza bona, vale a pena un paru di unità SSD extra è processori. Per quessa, per utilizà Cassandra, chì ùn hè mai SQL, in quale ùn ci sò micca relazioni, chjave straneri, avete bisognu di sapè regule simplici.

Disegnu tuttu secondu a vostra dumanda. A cosa principal ùn hè micca i dati, ma cumu l'applicazione hà da travaglià cun ella. S'ellu ci vole à riceve dati diffirenti in modi diffirenti o i stessi dati in modi diffirenti, ci vole à mette in una manera chì hè cunvene per l'applicazione. Altrimenti, falliremu in Full Scan è Cassandra ùn ci darà alcun vantaghju.

Denormalizing data hè a norma. Ci scurdemu di e forme nurmale, ùn avemu più basa di dati relazionale. Se mettemu qualcosa 100 volte, si metterà 100 volte. Hè sempre più prezzu di piantà.

Selezziunamu i chjavi per a particione in modu chì sò distribuiti nurmale. Ùn vulemu chì l'hash di i nostri chjavi cascà in un intervallu ristrettu. Questu hè, l'annu di nascita in l'esempiu sopra hè un cattivu esempiu. Più precisamente, hè bonu se i nostri utilizatori sò normalment distribuiti per annu di nascita, è male s'ellu si parla di studienti di 5a - a partizione ùn serà micca assai bona.

L'ordinamentu hè sceltu una volta in a tappa di creazione di Clustering Key. Se deve esse cambiatu, avemu da aghjurnà a nostra tavula cù una chjave diversa.

È a cosa più impurtante: s'ellu ci vole à ricuarà i stessi dati in 100 modi diffirenti, allora averemu 100 tabelle diverse.

Source: www.habr.com

Add a comment