Äau, Habr.
Mani sauc MiÅ”a Butrimovs, es gribÄtu jums nedaudz pastÄstÄ«t par Kasandru. Mans stÄsts noderÄs tiem, kuri nekad nav saskÄruÅ”ies ar NoSQL datu bÄzÄm ā tajÄ ir daudz ievieÅ”anas funkciju un nepilnÄ«bu, par kurÄm jÄzina. Un, ja jÅ«s neesat redzÄjis neko citu kÄ Oracle vai jebkuru citu relÄciju datu bÄzi, Ŕīs lietas izglÄbs jÅ«su dzÄ«vÄ«bu.
Kas ir tik labs KasandrÄ? TÄ ir NoSQL datu bÄze, kas izstrÄdÄta bez viena kļūmes punkta, un tÄ ir labi mÄrogojama. Ja kÄdai datubÄzei jÄpievieno pÄris terabaiti, gredzenam vienkÄrÅ”i jÄpievieno mezgli. Vai paplaÅ”inÄt to citÄ datu centrÄ? Pievienojiet kopai mezglus. Vai palielinÄt apstrÄdÄto IPS? Pievienojiet kopai mezglus. Tas darbojas arÄ« pretÄjÄ virzienÄ.
Kas vÄl viÅai padodas? Tas attiecas uz daudzu pieprasÄ«jumu apstrÄdi. Bet cik ir daudz? 10, 20, 30, 40 tÅ«kstoÅ”i pieprasÄ«jumu sekundÄ nav daudz. 100 tÅ«kstoÅ”i pieprasÄ«jumu sekundÄ ierakstÄ«Å”anai - arÄ«. Ir uzÅÄmumi, kas teica, ka saglabÄ 2 miljonus pieprasÄ«jumu sekundÄ. ViÅiem droÅ”i vien bÅ«s jÄtic.
Un principÄ Kasandrai ir viena liela atŔķirÄ«ba no relÄciju datiem - tas viÅiem nemaz nav lÄ«dzÄ«gs. Un tas ir ļoti svarÄ«gi atcerÄties.
Ne viss, kas izskatÄs vienÄdi, darbojas tÄpat
Reiz pie manis pienÄca kolÄÄ£is un jautÄja: āÅ eit ir CQL Cassandra vaicÄjumu valoda, un tai ir atlases priekÅ”raksts, ir kur, tai ir un. Es rakstu vÄstules un tas nedarbojas. KÄpÄc?". Cassandra uztverÅ”ana kÄ relÄciju datubÄze ir ideÄls veids, kÄ izdarÄ«t vardarbÄ«gu paÅ”nÄvÄ«bu. Un es to nereklamÄju, KrievijÄ tas ir aizliegts. JÅ«s vienkÄrÅ”i izstrÄdÄsit kaut ko nepareizi.
PiemÄram, pie mums pienÄk klients un saka: āVeidosim datubÄzi seriÄliem vai datubÄzi recepÅ”u direktorijai. Mums tur bÅ«s Ädiena Ädieni vai seriÄlu un aktieru saraksts tajÄ. MÄs priecÄ«gi sakÄm: "Ejam!" VienkÄrÅ”i nosÅ«tiet divus baitus, pÄris zÄ«mes un esat pabeidzis, viss darbosies ļoti Ätri un uzticami. Un viss ir kÄrtÄ«bÄ, lÄ«dz atnÄk klienti un saka, ka saimnieces risina arÄ« pretÄju problÄmu: viÅÄm ir produktu saraksts, un viÅas grib zinÄt, kÄdu Ädienu grib pagatavot. Tu esi miris.
Tas ir tÄpÄc, ka Cassandra ir hibrÄ«da datu bÄze: tÄ vienlaikus nodroÅ”ina atslÄgas vÄrtÄ«bu un saglabÄ datus plaÅ”Äs kolonnÄs. Java vai Kotlin to varÄtu aprakstÄ«t Å”Ädi:
Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
Tas ir, karte, kurÄ ir arÄ« sakÄrtota karte. PirmÄ Å”Ä«s kartes atslÄga ir rindas atslÄga vai nodalÄ«juma atslÄga ā sadalÄ«Å”anas atslÄga. OtrÄ atslÄga, kas ir atslÄga uz jau sakÄrtotu karti, ir klasterizÄcijas atslÄga.
Lai ilustrÄtu datu bÄzes sadalÄ«jumu, uzzÄ«mÄsim trÄ«s mezglus. Tagad jums ir jÄsaprot, kÄ sadalÄ«t datus mezglos. Jo, ja mÄs visu sabÄzam vienÄ (starp citu, var bÅ«t tÅ«kstotis, divi tÅ«kstoÅ”i, pieci - cik vien vÄlaties), Å”eit nav runa par izplatÄ«Å”anu. TÄpÄc mums ir nepiecieÅ”ama matemÄtiska funkcija, kas atgriezÄ«s skaitli. Tikai skaitlis, garÅ” int, kas ietilps kÄdÄ diapazonÄ. Un mums bÅ«s viens mezgls, kas atbild par vienu diapazonu, otrs par otro, n-tais par n-to.
Å is numurs tiek Åemts, izmantojot jaucÄjfunkciju, kas tiek piemÄrota tam, ko mÄs saucam par nodalÄ«juma atslÄgu. Å Ä« ir kolonna, kas norÄdÄ«ta primÄrÄs atslÄgas direktÄ«vÄ, un Ŕī ir kolonna, kas bÅ«s pirmÄ un visvienkÄrÅ”ÄkÄ kartes atslÄga. Tas nosaka, kurÅ” mezgls saÅems kÄdus datus. Cassandra tiek izveidota tabula ar gandrÄ«z tÄdu paÅ”u sintaksi kÄ SQL:
CREATE TABLE users (
user_id uu id,
name text,
year int,
salary float,
PRIMARY KEY(user_id)
)
PrimÄrÄ atslÄga Å”ajÄ gadÄ«jumÄ sastÄv no vienas kolonnas, un tÄ ir arÄ« nodalÄ«juma atslÄga.
KÄ mÅ«su lietotÄji veiksies? Daži nokļūs vienÄ mezglÄ, daži uz citu un daži uz treÅ”o. RezultÄts ir parasta hash tabula, kas pazÄ«stama arÄ« kÄ karte, kas pazÄ«stama arÄ« kÄ vÄrdnÄ«ca Python, vai vienkÄrÅ”a atslÄgas vÄrtÄ«bu struktÅ«ra, no kuras mÄs varam lasÄ«t visas vÄrtÄ«bas, lasÄ«t un rakstÄ«t pÄc atslÄgas.
IzvÄlieties: kad atļaut filtrÄÅ”anu pÄrvÄrÅ”as par pilnu skenÄÅ”anu vai ko nedarÄ«t
UzrakstÄ«sim dažus atlasÄ«tus paziÅojumus: select * from users where, userid =
. IznÄk kÄ Oracle: rakstÄm select, norÄdÄm nosacÄ«jumus un viss strÄdÄ, lietotÄji to saÅem. Bet, ja izvÄlaties, piemÄram, lietotÄju ar noteiktu dzimÅ”anas gadu, Kasandra sÅ«dzas, ka nevar izpildÄ«t pieprasÄ«jumu. TÄ kÄ viÅa vispÄr neko nezina par to, kÄ mÄs izplatÄm datus par dzimÅ”anas gadu - viÅai kÄ atslÄga ir norÄdÄ«ta tikai viena kolonna. Tad viÅa saka: āLabi, es joprojÄm varu izpildÄ«t Å”o pieprasÄ«jumu. Pievienot atļaut filtrÄÅ”anu." Pievienojam direktÄ«vu, viss darbojas. Un Å”ajÄ brÄ«dÄ« notiek kaut kas Å”ausmÄ«gs.
Kad mÄs izmantojam testa datus, viss ir kÄrtÄ«bÄ. Un, kad jÅ«s izpildÄt vaicÄjumu ražoÅ”anÄ, kur mums ir, piemÄram, 4 miljoni ierakstu, tad mums viss nav Ä«paÅ”i labi. Jo atļaut filtrÄÅ”anu ir direktÄ«va, kas ļauj Cassandra savÄkt visus datus no Ŕīs tabulas no visiem mezgliem, visiem datu centriem (ja to Å”ajÄ klasterÄ« ir daudz) un tikai pÄc tam tos filtrÄt. Å is ir Full Scan analogs, un gandrÄ«z neviens ar to nav sajÅ«smÄ.
Ja mums bÅ«tu nepiecieÅ”ami tikai lietotÄji ar ID, mÄs ar to bÅ«tu labi. Bet dažreiz mums ir jÄraksta citi vaicÄjumi un jÄuzliek citi atlases ierobežojumi. TÄpÄc mÄs atceramies: Ŕī ir visa karte, kurai ir sadalÄ«Å”anas atslÄga, bet tÄs iekÅ”pusÄ ir sakÄrtota karte.
Un viÅai ir arÄ« atslÄga, ko mÄs saucam par klasteru atslÄgu. Å Ä« atslÄga, kas, savukÄrt, sastÄv no mÅ«su atlasÄ«tajÄm kolonnÄm, ar kuru palÄ«dzÄ«bu Kasandra saprot, kÄ tÄs dati tiek fiziski sakÄrtoti un atradÄ«sies katrÄ mezglÄ. Tas nozÄ«mÄ, ka kÄdai nodalÄ«juma atslÄgai klasterizÄcijas atslÄga precÄ«zi pateiks, kÄ ievietot datus Å”ajÄ kokÄ, kÄdu vietu tie tur ieÅems.
Tas tieÅ”Äm ir koks, tur vienkÄrÅ”i tiek izsaukts salÄ«dzinÄjums, kuram objekta formÄ nododam noteiktu kolonnu kopu, un tas ir norÄdÄ«ts arÄ« kÄ kolonnu saraksts.
CREATE TABLE users_by_year_salary_id (
user_id uuid,
name text,
year int,
salary float,
PRIMARY KEY((year), salary, user_id)
PievÄrsiet uzmanÄ«bu primÄrÄs atslÄgas direktÄ«vai; tÄs pirmais arguments (mÅ«su gadÄ«jumÄ gads) vienmÄr ir nodalÄ«juma atslÄga. Tas var sastÄvÄt no vienas vai vairÄkÄm kolonnÄm, tas nav svarÄ«gi. Ja ir vairÄkas kolonnas, tÄ ir vÄlreiz jÄnoÅem iekavÄs, lai valodas priekÅ”apstrÄdÄtÄjs saprastu, ka Ŕī ir primÄrÄ atslÄga, un aiz tÄs visas pÄrÄjÄs kolonnas ir klasterizÄcijas atslÄga. Å ajÄ gadÄ«jumÄ tie tiks pÄrsÅ«tÄ«ti salÄ«dzinÄtÄjÄ tÄdÄ secÄ«bÄ, kÄdÄ tie parÄdÄs. Tas ir, pirmÄ kolonna ir nozÄ«mÄ«gÄka, otrÄ ir mazÄk nozÄ«mÄ«ga utt. PiemÄram, tas, kÄ mÄs rakstÄm, ir vienÄds ar laukiem datu klasÄm: mÄs uzskaitÄm laukus, un tiem rakstÄm, kuri no tiem ir lielÄki un kuri mazÄki. KasandrÄ tie, nosacÄ«ti runÄjot, ir datu klases lauki, kuriem tiks piemÄroti tai rakstÄ«tie vienÄdi.
NosakÄm ŔķiroÅ”anu un uzliekam ierobežojumus
JÄatceras, ka kÄrtoÅ”anas secÄ«ba (dilstoÅ”Ä, augoÅ”Ä, jebkas) tiek iestatÄ«ta atslÄgas izveides brÄ«dÄ«, un vÄlÄk to nevar mainÄ«t. Tas fiziski nosaka, kÄ dati tiks kÄrtoti un kÄ tie tiks uzglabÄti. Ja jums ir jÄmaina klasterizÄcijas atslÄga vai kÄrtoÅ”anas secÄ«ba, jums bÅ«s jÄizveido jauna tabula un jÄpÄrsÅ«ta tajÄ dati. Tas nedarbosies ar esoÅ”u.
MÄs piepildÄ«jÄm savu tabulu ar lietotÄjiem un redzÄjÄm, ka viÅi iekrita gredzenÄ, vispirms pÄc dzimÅ”anas gada un pÄc tam katrÄ mezglÄ pÄc algas un lietotÄja ID. Tagad mÄs varam izvÄlÄties, uzliekot ierobežojumus.
Atkal parÄdÄs mÅ«su strÄdÄjoÅ”ais where, and
, un mÄs iegÅ«stam lietotÄjus, un viss atkal ir kÄrtÄ«bÄ. Bet, ja mÄs mÄÄ£inÄsim izmantot tikai daļu no klasterizÄcijas atslÄgas un mazÄk nozÄ«mÄ«gu, tad Kasandra uzreiz sÅ«dzÄsies, ka nevar atrast vietu mÅ«su kartÄ, kur Å”is objekts, kuram ir Å”ie lauki nulles salÄ«dzinÄtÄjam, un Å”is. kas tikko tika uzstÄdÄ«ts , - kur viÅÅ” guļ. Man bÅ«s vÄlreiz jÄizÅem visi dati no Ŕī mezgla un jÄfiltrÄ. Un tas ir pilnas skenÄÅ”anas analogs mezglÄ, tas ir slikti.
JebkurÄ neskaidrÄ situÄcijÄ izveidojiet jaunu tabulu
Ja mÄs vÄlamies, lai lietotÄji varÄtu atlasÄ«t mÄrÄ·auditoriju pÄc ID, vecuma vai algas, kas mums jÄdara? Nekas. VienkÄrÅ”i izmantojiet divas tabulas. Ja vÄlaties sasniegt lietotÄjus trÄ«s dažÄdos veidos, bÅ«s trÄ«s tabulas. Ir pagÄjuÅ”i tie laiki, kad mÄs ietaupÄ«jÄm vietu uz skrÅ«ves. Å is ir lÄtÄkais resurss. Tas maksÄ daudz mazÄk nekÄ reakcijas laiks, kas var kaitÄt lietotÄjam. LietotÄjam ir daudz patÄ«kamÄk kaut ko saÅemt sekundÄ nekÄ 10 minÅ«tÄs.
MÄs tirgojam nevajadzÄ«gu vietu un denormalizÄtus datus, lai varÄtu labi mÄrogot un darboties uzticami. Galu galÄ klasteris, kas sastÄv no trim datu centriem, no kuriem katrÄ ir pieci mezgli, ar pieÅemamu datu saglabÄÅ”anas lÄ«meni (kad nekas netiek zaudÄts), spÄj pilnÄ«bÄ pÄrdzÄ«vot viena datu centra nÄvi. Un vÄl divi mezgli katrÄ no atlikuÅ”ajiem diviem. Un tikai pÄc tam sÄkas problÄmas. Å Ä« ir diezgan laba atlaiÅ”ana, ir vÄrts iegÄdÄties pÄris papildu SSD diskus un procesorus. TÄpÄc, lai izmantotu Cassandra, kas nekad nav SQL, kurÄ nav attiecÄ«bu, ÄrÄjÄs atslÄgas, jums jÄzina vienkÄrÅ”i noteikumi.
IzstrÄdÄjam visu pÄc JÅ«su pieprasÄ«juma. Galvenais nav dati, bet gan tas, kÄ lietojumprogramma ar tiem strÄdÄs. Ja tai ir jÄsaÅem dažÄdi dati dažÄdos veidos vai tie paÅ”i dati dažÄdos veidos, mums tie ir jÄievieto lietojumprogrammai ÄrtÄ veidÄ. PretÄjÄ gadÄ«jumÄ mÄs cietÄ«sim neveiksmi Full Scan, un Cassandra mums nedos nekÄdas priekÅ”rocÄ«bas.
Datu denormalizÄcija ir norma. MÄs aizmirstam par parastajÄm formÄm, mums vairs nav relÄciju datu bÄzes. Ja mÄs kaut ko noliksim 100 reizes, tas noguls 100 reizes. Tas joprojÄm ir lÄtÄk nekÄ apstÄÅ”anÄs.
MÄs izvÄlamies sadalÄ«Å”anas atslÄgas, lai tÄs tiktu izplatÄ«tas normÄli. MÄs nevÄlamies, lai mÅ«su atslÄgu sajaukums nonÄktu vienÄ Å”aurÄ diapazonÄ. Tas ir, dzimÅ”anas gads iepriekÅ” minÄtajÄ piemÄrÄ ir slikts piemÄrs. PrecÄ«zÄk sakot, ir labi, ja mÅ«su lietotÄji ir normÄli sadalÄ«ti pÄc dzimÅ”anas gadiem, un slikti, ja mÄs runÄjam par 5. klases skolÄniem - nodalÄ«jums tur nebÅ«s Ä«paÅ”i labs.
KlasterizÄcijas atslÄgas izveides posmÄ kÄrtoÅ”ana tiek atlasÄ«ta vienreiz. Ja tas ir jÄmaina, mums bÅ«s jÄatjaunina tabula ar citu atslÄgu.
Un pats galvenais: ja mums ir nepiecieÅ”ams izgÅ«t vienus un tos paÅ”us datus 100 dažÄdos veidos, tad mums bÅ«s 100 dažÄdas tabulas.
Avots: www.habr.com