Cassandra. Ki jan yo pa mouri si ou sèlman konnen Oracle

Hey Habr.

Non mwen se Misha Butrimov, mwen ta renmen pale ou yon ti kras sou Cassandra. Istwa mwen an pral itil pou moun ki pa janm rankontre baz done NoSQL - li gen yon anpil nan karakteristik aplikasyon ak enkonvenyans ke ou bezwen konnen sou. Men, si ou pa te wè anyen lòt pase Oracle oswa nenpòt lòt baz done relasyon, bagay sa yo pral sove lavi ou.

Kisa ki bon nan Cassandra? Li se yon baz done NoSQL ki fèt san yon sèl pwen echèk ki balanse byen. Si ou bezwen ajoute yon koup nan teraocte pou kèk baz done, ou tou senpleman ajoute nœuds nan bag la. Elaji li nan yon lòt sant done? Ajoute nœuds nan gwoup la. Ogmante RPS trete? Ajoute nœuds nan gwoup la. Li travay nan direksyon opoze tou.

Cassandra. Ki jan yo pa mouri si ou sèlman konnen Oracle

Nan ki lòt bagay li bon? Li se sou manyen yon anpil nan demann. Men, konbyen se yon anpil? 10, 20, 30, 40 mil demann pou chak segonn se pa anpil. 100 mil demann pou chak segonn pou anrejistreman - tou. Gen konpayi ki te di ke yo kenbe 2 milyon demann pou chak segonn. Yo pral pwobableman oblije kwè li.

Ak nan prensip, Cassandra gen yon gwo diferans ak done relasyon - li pa sanble ak yo ditou. Lè sa a trè enpòtan sonje.

Se pa tout bagay ki sanble menm travay menm jan an

Yon fwa yon kòlèg te vin jwenn mwen epi li te mande: “Men yon lang rekèt CQL Cassandra, epi li gen yon deklarasyon chwazi, li gen kote, li genyen ak. Mwen ekri lèt epi li pa mache. Poukisa?". Trete Cassandra tankou yon baz done relasyon se yon fason pafè pou komèt swisid vyolan. Apre sa, mwen pa ankouraje li, li entèdi nan Larisi. Ou pral jis konsepsyon yon bagay ki mal.

Pa egzanp, yon kliyan vin jwenn nou epi li di: “Ann konstwi yon baz done pou seri televizyon, oswa yon baz done pou yon anyè resèt. Nou pral gen asyèt manje la oswa yon lis seri televizyon ak aktè ladan l." Nou di ak kè kontan: "Ann ale!" Jis voye de byte, yon koup nan siy epi w ap fini, tout bagay pral travay trè vit ak fiable. Ak tout bagay anfòm jiskaske kliyan yo vin di ke madanm marye yo tou rezoud pwoblèm opoze a: yo gen yon lis pwodwi, epi yo vle konnen ki plat yo vle kwit. Ou mouri.

Sa a se paske Cassandra se yon baz done ibrid: li an menm tan bay yon valè kle epi estoke done nan kolòn lajè. Nan Java oswa Kotlin, li ta ka dekri tankou sa a:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Sa vle di, yon kat jeyografik ki genyen tou yon kat jeyografik klase. Premye kle kat sa a se kle Ranje a oswa kle patisyon - kle patisyon an. Dezyèm kle a, ki se kle nan yon kat ki deja klase, se kle nan Clustering.

Pou ilistre distribisyon baz done a, ann desine twa nœuds. Koulye a, ou bezwen konprann ki jan yo dekonpoze done yo nan nœuds. Paske si nou pouse tout bagay nan yon sèl (nan chemen an, ka gen mil, de mil, senk - otan ke ou renmen), sa a se pa reyèlman sou distribisyon. Se poutèt sa, nou bezwen yon fonksyon matematik ki pral retounen yon nimewo. Jis yon nimewo, yon int long ki pral tonbe nan kèk seri. Ak pou nou, yon sèl ne pral responsab pou yon seri, dezyèm lan - pou dezyèm lan, nyèm lan - pou nyèm lan.

Cassandra. Ki jan yo pa mouri si ou sèlman konnen Oracle

Nimewo sa a pran lè l sèvi avèk yon fonksyon hash, ki aplike nan sa nou rele kle patisyon an. Sa a se kolòn ki espesifye nan direktiv kle prensipal la, epi sa a se kolòn ki pral premye ak kle ki pi fondamantal nan kat la. Li detèmine ki ne pral resevwa ki done. Yon tab kreye nan Cassandra ak prèske menm sentaks ak nan SQL:

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

)

Kle Prensipal la nan ka sa a konsiste de yon kolòn, epi li se tou kle patisyon an.

Ki jan itilizatè nou yo pral fè? Gen kèk pral ale nan yon ne, kèk nan yon lòt, ak kèk nan yon twazyèm. Rezilta a se yon tablo hash òdinè, konnen tou kòm yon kat jeyografik, konnen tou kòm yon diksyonè nan Python, oswa yon senp estrikti valè kle ki soti nan ki nou ka li tout valè yo, li ak ekri pa kle.

Cassandra. Ki jan yo pa mouri si ou sèlman konnen Oracle

Chwazi: lè pèmèt filtraj vire nan eskanè konplè, oswa sa ki pa dwe fè

Ann ekri kèk deklarasyon chwazi: select * from users where, userid = . Li sanble tankou nan Oracle: nou ekri chwazi, presize kondisyon yo ak tout bagay ap travay, itilizatè yo jwenn li. Men, si ou chwazi, pou egzanp, yon itilizatè ki gen yon sèten ane nesans, Cassandra plenyen ke li pa ka satisfè demann lan. Paske li pa konnen anyen ditou sou fason nou distribye done sou ane nesans la - li gen sèlman yon kolòn ki endike kòm yon kle. Apre sa, li di, “Oke, mwen ka toujou satisfè demann sa a. Ajoute filtraj pèmèt." Nou ajoute direktiv la, tout bagay ap mache. Ak nan moman sa a yon bagay terib k ap pase.

Lè nou kouri sou done tès yo, tout bagay anfòm. Ak lè ou egzekite yon rechèch nan pwodiksyon, kote nou gen, pou egzanp, 4 milyon dosye, Lè sa a, tout bagay pa trè bon pou nou. Paske pèmèt filtraj se yon direktiv ki pèmèt Cassandra kolekte tout done ki nan tablo sa a soti nan tout nœuds, tout sant done (si gen anpil ladan yo nan gwoup sa a), epi sèlman Lè sa a, filtre li. Sa a se yon analogue nan Full Scan, ak diman nenpòt moun ki kontan ak li.

Si nou sèlman bezwen itilizatè pa ID, nou ta byen ak sa a. Men pafwa nou bezwen ekri lòt demann epi enpoze lòt restriksyon sou seleksyon an. Se poutèt sa, nou sonje: sa a se tout yon kat ki gen yon kle patisyon, men andedan li se yon kat ki klase.

Epi li tou gen yon kle, ke nou rele Clustering Key la. Kle sa a, ki, nan vire, konsiste de kolòn yo ke nou chwazi, avèk èd nan ki Cassandra konprann ki jan done li yo se fizikman klase epi yo pral lokalize sou chak ne. Sa vle di, pou kèk kle patisyon, kle Clustering la pral di w egzakteman ki jan yo pouse done yo nan pye bwa sa a, ki kote li pral pran la.

Sa a se reyèlman yon pye bwa, se yon konparezon tou senpleman rele la, nan ki nou pase yon seri sèten nan kolòn nan fòm lan nan yon objè, epi li se tou espesifye kòm yon lis kolòn.

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

Peye atansyon sou direktiv kle prensipal la; premye agiman li (nan ka nou an, ane a) se toujou kle patisyon. Li ka konpoze de youn oswa plizyè kolòn, li pa gen pwoblèm. Si gen plizyè kolòn, li bezwen retire li an parantèz ankò pou preprocesseur lang lan konprann ke sa a se kle prensipal la, epi dèyè li tout lòt kolòn yo se kle Clustering la. Nan ka sa a, yo pral transmèt nan konparezon a nan lòd yo parèt. Sa vle di, premye kolòn nan pi enpòtan, dezyèm lan se mwens enpòtan, ak sou sa. Ki jan nou ekri, pou egzanp, egal jaden pou klas done: nou lis jaden yo, epi pou yo nou ekri kiyès ki pi gwo ak kiyès ki pi piti. Nan Cassandra, sa yo se, relativman pale, jaden yo nan klas la done, nan ki egal yo ekri pou li yo pral aplike.

Nou mete klasman ak enpoze restriksyon

Ou bezwen sonje ke lòd la sòt (desandan, monte, kèlkeswa sa) mete nan menm moman an lè yo kreye kle a, epi li pa ka chanje pita. Li fizikman detèmine kijan done yo pral klase ak ki jan yo pral estoke. Si ou bezwen chanje kle Clustering la oswa lòd sòt, w ap gen pou kreye yon nouvo tab epi transfere done nan li. Sa a pa pral travay ak yon sèl ki deja egziste.

Cassandra. Ki jan yo pa mouri si ou sèlman konnen Oracle

Nou ranpli tab nou an ak itilizatè yo ak wè ke yo te tonbe nan yon bag, premye pa ane nesans, ak Lè sa a, andedan sou chak ne pa salè ak ID itilizatè. Koulye a, nou ka chwazi pa enpoze restriksyon.

Moun k ap travay nou an parèt ankò where, and, epi nou jwenn itilizatè yo, ak tout bagay anfòm ankò. Men, si nou eseye sèvi ak sèlman yon pati nan kle a Clustering, ak yon sèl mwens enpòtan, Lè sa a, Cassandra pral imedyatman plenyen ke li pa ka jwenn plas la nan kat jeyografik nou an kote objè sa a, ki gen jaden sa yo pou konparezon a nil, ak yon sèl sa a. ki te jis mete , - kote li kouche. Mwen pral oblije rale tout done ki soti nan ne sa a ankò epi filtre li. Ak sa a se yon analogue nan Full Scan nan yon ne, sa a se move.

Nan nenpòt sitiyasyon ki pa klè, kreye yon nouvo tab

Si nou vle kapab sib itilizatè yo pa ID, oswa pa laj, oswa pa salè, ki sa nou ta dwe fè? Pa gen anyen. Jis sèvi ak de tab. Si ou bezwen jwenn itilizatè yo nan twa fason diferan, pral gen twa tab. Gone jou yo lè nou te sove espas sou vis la. Sa a se resous ki pi bon mache. Li koute anpil mwens pase tan repons, ki ka prejidis itilizatè a. Li pi bèl pou itilizatè a resevwa yon bagay nan yon segonn pase nan 10 minit.

Nou komès espas ki pa nesesè ak done denormalize pou kapasite nan echèl byen ak opere seryezman. Apre yo tout, an reyalite, yon gwoup ki konsiste de twa sant done, chak nan yo ki gen senk nœuds, ak yon nivo akseptab nan prezèvasyon done (lè pa gen anyen ki pèdi), se kapab siviv lanmò nan yon sant done nèt. Ak de plis nœuds nan chak nan de ki rete yo. Epi sèlman apre sa pwoblèm yo kòmanse. Sa a se yon redondance trè bon, li vo yon koup nan kondui SSD siplemantè ak processeurs. Se poutèt sa, yo nan lòd yo sèvi ak Cassandra, ki pa janm SQL, nan ki pa gen okenn relasyon, kle etranje, ou bezwen konnen règ senp.

Nou desine tout bagay selon demann ou an. Bagay pwensipal lan se pa done yo, men ki jan aplikasyon an pral travay avèk li. Si li bezwen resevwa done diferan nan diferan fason oswa menm done yo nan diferan fason, nou dwe mete li nan yon fason ki pratik pou aplikasyon an. Sinon, nou pral echwe nan Full Scan ak Cassandra pa pral ba nou okenn avantaj.

Denormalize done se nòmal la. Nou bliye fòm nòmal, nou pa gen baz done relasyon ankò. Si nou mete yon bagay desann 100 fwa, li pral kouche 100 fwa. Li toujou pi bon mache pase kanpe.

Nou chwazi kle yo pou patisyon pou yo distribye nòmalman. Nou pa vle hash kle nou yo tonbe nan yon seri etwat. Sa vle di, ane nesans la nan egzanp ki anwo a se yon move egzanp. Plis jisteman, li bon si itilizatè nou yo nòmalman distribye pa ane nesans, ak move si nou ap pale de elèv klas 5yèm ane - patisyon an pa pral trè bon.

Yo chwazi klasman yon fwa nan etap kreyasyon Clustering Key. Si li bezwen chanje, nou pral oblije mete ajou tab nou an ak yon kle diferan.

Ak bagay ki pi enpòtan: si nou bezwen rekipere menm done yo nan 100 fason diferan, Lè sa a, nou pral gen 100 tab diferan.

Sous: www.habr.com

Add nouvo kòmantè