Modeliranje podataka u Cassandri

1. Pregled

Cassandra je NoSQL baza podataka koja pruža visoku dostupnost i horizontalnu skalabilnost bez ugrožavanja performansi.

Da bismo Cassandru izvukli najbolje, moramo pažljivo dizajnirati shemu oko obrazaca upita specifičnih za trenutni poslovni problem.

U ovom ćemo članku pregledati neke od ključnih pojmova kako pristupiti modeliranju podataka u Cassandri.

Prije nego što nastavite, možete pregledati naš članak Cassandra with Java da biste razumjeli osnove i kako se povezati s Cassandrom pomoću Jave.

2. Particijski ključ

Cassandra je distribuirana baza podataka u kojoj se podaci dijele i pohranjuju na više čvorova unutar klastera.

Particijski ključ sastoji se od jednog ili više podatkovnih polja i jest koristi ga particioner za generiranje tokena putem raspršivanja za ravnomjernu distribuciju podataka kroz klaster.

3. Ključ za klasteriranje

Ključ klasteriranja sastoji se od jednog ili više polja i pomaže u grupiranju ili grupiranju redaka s istim particijskim ključem i njihovom spremanju u poredani redoslijed.

Recimo da podatke o vremenskim serijama pohranjujemo u Cassandru i želimo ih dobiti kronološkim redoslijedom. Ključ klasterizacije koji uključuje polja podataka vremenskih serija bit će vrlo koristan za učinkovito pronalaženje podataka za ovaj slučaj upotrebe.

Napomena: Kombinacija particijskog ključa i ključa klastera čini primarni ključ i jedinstveno identificira bilo koji zapis u klasteru Cassandra.

4. Smjernice oko obrazaca upita

Prije početka modeliranja podataka u Cassandri, trebali bismo identificirati obrasce upita i osigurati da se pridržavaju sljedećih smjernica:

  1. Svaki upit treba dohvatiti podatke s jedne particije
  2. Trebali bismo pratiti koliko se podataka sprema u particiju, jer Cassandra ima ograničenja oko broja stupaca koji se mogu pohraniti u jednu particiju
  3. U redu je denormalizirati i duplicirati podatke kako bi podržavali različite vrste obrazaca upita nad istim podacima

Na temelju gornjih smjernica, pogledajmo neke slučajeve stvarne upotrebe i kako bismo za njih modelirali modele podataka Cassandra.

5. Primjeri modeliranja podataka iz stvarnog svijeta

5.1. Facebook postovi

Pretpostavimo da na Cassandri pohranjujemo objave različitih korisnika na Facebooku. Jedan od uobičajenih uzoraka upita bit će dohvaćanje vrha "N‘Postovi koje je dao dati korisnik.

Tako, moramopohraniti sve podatke za određenog korisnika na jednoj particiji prema gornjim smjernicama.

Također, upotreba vremenske oznake posta kao ključa klasteriranja bit će korisna za dohvaćanje vrha 'N'Objavljuje učinkovitije.

Definirajmo shemu Cassandrine tablice za ovaj slučaj upotrebe:

IZRADI TABLICU posts_facebook (user_id uuid, post_id timeuuid, tekst sadržaja, PRIMARNI KLJUČ (user_id, post_id)) KLASTERIRANIM NARUDŽBOM PO (post_id DESC);

Sada, napišite upit za pronalaženje 20 najpopularnijih postova za korisnika Anna:

ODABERITE sadržaj IZ posts_facebook WHERE user_id = "Anna_id" LIMIT 20

5.2. Teretane širom zemlje

Pretpostavimo da pohranjujemo detalje različitih partnerskih teretani u različitim gradovima i državama mnogih zemalja i željeli bismo dohvatiti teretane za određeni grad.

Također, recimo da moramo vratiti rezultate koji imaju teretane poredane po datumu otvaranja.

Na temelju gornjih smjernica, teretane smještene u određenom gradu određene države i države trebali bismo pohraniti na jednu particiju i kao ključ klastera koristiti datum otvaranja i naziv teretane.

Definirajmo shemu Cassandrine tablice za ovaj primjer:

IZRADI TABELU gyms_by_city (tekst_zemlje, tekst države, tekst grada, tekst imena_ teretane, vremenska oznaka datuma otvaranja, PRIMARNI KLJUČ ((kôd_ države, država_province, grad), (datum_otvaranja, ime_ teretane)) KLASTERIRANIM REDOSLIJEDOM (datum otvaranja ASC, naziv_ teretane ASC);

Pogledajmo sada upit koji donosi prvih deset teretani do datuma njihovog otvaranja za grad Phoenix u američkoj saveznoj državi Arizona:

ODABERITE * IZ gyms_by_city GDJE country_code = "us" I država = "Arizona" I grad = "Phoenix" OGRANIČITE 10

Dalje, pogledajmo upit koji preuzima deset nedavno otvorenih teretani u gradu Phoenixu u američkoj saveznoj državi Arizoni:

ODABERITE * IZ gyms_by_city GDJE country_code = "us" i state = "Arizona" i city = "Phoenix" NARUČI PO datumu otvaranja DESC LIMIT 10

Napomena: Kako je redoslijed sortiranja zadnjeg upita suprotan redoslijedu sortiranja definiranom tijekom stvaranja tablice, upit će se izvoditi sporije jer će Cassandra prvo dohvatiti podatke, a zatim ih sortirati u memoriji.

5.3. Kupci i proizvodi za e-trgovinu

Recimo da vodimo trgovinu e-trgovine i da pohranjujemo Kupac i Proizvod informacije unutar Cassandre. Pogledajmo neke od uobičajenih obrazaca upita oko ovog slučaja upotrebe:

  1. Dobiti Kupac info
  2. Dobiti Proizvod info
  3. Uzmi sve Kupci koji vole datost Proizvod
  4. Uzmi sve Proizvodi datost Kupac sviđanja

Za početak ćemo koristiti zasebne tablice za spremanje datoteke Kupac i Proizvod informacija. Međutim, moramo uvesti priličnu količinu denormalizacije kako bismo podržali gore navedeni 3. i 4. upit.

Stvorit ćemo još dvije tablice da bismo to postigli - “Customer_by_Product"I"Product_by_Customer“.

Pogledajmo shemu tablice Cassandra za ovaj primjer:

STVORI TABLICU Kupac (text_id_čuve, tekst_prezime, tekst_prezime_, registrirani_na vremenskoj oznaci, PRIMARNI KLJUČ (cust_id)); IZRADI TABELU Proizvod (prdt_id tekst, tekst naslova, PRIMARNI KLJUČ (prdt_id)); STVORI TABELU Customer_By_Liked_Product (svidjeni_prdt_id tekst, svidjena_on vremenska oznaka, tekst naslova, cust_id tekst, prvo ime, tekst, prezime, PRIMARNI KLJUČ (prdt_id, svidjeni_on)); IZRADI TABELU Product_Liked_By_Customer (custom_id text, first_name text, last_name text, liked_prdt_id text, likes_on timestamp, title title, PRIMARY KEY (cust_id, liked_on));

Napomena: Da bismo podržali upite, nedavno svidjene proizvode određenog kupca i kupce koji su nedavno svidjeli neki proizvod, koristili smo "like_on”Kao stupac za klasteriranje.

Pogledajmo upit kako bismo pronašli deset kupaca kojima se proizvod nedavno svidio “Pepsi“:

ODABERITE * IZ Customer_By_Liked_Product WHERE title = "Pepsi" LIMIT 10

I da vidimo upit koji pronalazi nedavno svidjene proizvode (do deset) od strane kupca pod nazivom „Anna“:

ODABERITE * FROM Product_Liked_By_Customer WHERE first_name = "Anna" LIMIT 10

6. Učinkoviti uzorci upita

Zbog načina na koji Cassandra pohranjuje podatke, neki obrasci upita nisu nimalo učinkoviti, uključujući sljedeće:

  • Dohvaćanje podataka s više particija - ovo će zahtijevati koordinatora da preuzme podatke iz više čvorova, privremeno ih pohrani u hrpu, a zatim objedini podatke prije vraćanja rezultata korisniku
  • Upiti temeljeni na pridruživanju - zbog svoje distribuirane prirode, Cassandra ne podržava spajanje tablica u upitima na isti način kao što to čini relacijska baza podataka, i kao rezultat toga, upite sapridruživanja će biti sporija, a također mogu dovesti do nedosljednosti i problema s dostupnošću

7. Zaključak

U ovom smo tutorijalu pokrili nekoliko najboljih primjera iz prakse kako pristupiti modeliranju podataka u Cassandri.

Razumijevanje temeljnih koncepata i unaprijed identificiranje obrazaca upita neophodno je za dizajniranje ispravnog modela podataka koji najbolje performanse dobiva od klastera Cassandra.


$config[zx-auto] not found$config[zx-overlay] not found