Cassandra. Kif ma tmutx jekk taf biss Oracle

Ħej Habr.

Jisimni Misha Butrimov, nixtieq ngħidlek ftit dwar Cassandra. L-istorja tiegħi se tkun utli għal dawk li qatt ma ltaqgħu ma 'databases NoSQL - għandha ħafna karatteristiċi ta' implimentazzjoni u nases li trid tkun taf dwarhom. U jekk ma rajt xejn ħlief Oracle jew kwalunkwe database relazzjonali oħra, dawn l-affarijiet se jsalvaw ħajtek.

X'hemm daqshekk tajjeb dwar Cassandra? Hija database NoSQL iddisinjata mingħajr punt wieħed ta 'falliment li tiskala tajjeb. Jekk għandek bżonn iżżid ftit terabytes għal xi database, sempliċement iżżid nodi fiċ-ċirku. Tespandih għal ċentru tad-dejta ieħor? Żid nodi mal-cluster. Iżżid l-RPS ipproċessat? Żid nodi mal-cluster. Taħdem fid-direzzjoni opposta wkoll.

Cassandra. Kif ma tmutx jekk taf biss Oracle

X'iktar hi tajba? Huwa dwar l-immaniġġjar ta 'ħafna talbiet. Imma kemm hu ħafna? 10, 20, 30, 40 elf talba kull sekonda mhix ħafna. 100 elf talba kull sekonda għar-reġistrazzjoni - ukoll. Hemm kumpaniji li qalu li jżommu 2 miljun talba kull sekonda. Probabbilment ikollhom jemmnu.

U fil-prinċipju, Cassandra għandha differenza waħda kbira mid-dejta relazzjonali - mhi simili għalihom xejn. U dan huwa importanti ħafna li wieħed jiftakar.

Mhux dak kollu li jidher l-istess jaħdem l-istess

Darba ġie għandi kollega u staqsieni: “Hawn hemm lingwa ta’ query CQL Cassandra, u għandha dikjarazzjoni magħżula, għandha fejn, għandha u. Nikteb ittri u ma taħdimx. Għaliex?”. It-trattament ta' Cassandra bħal database relazzjonali huwa l-mod perfett biex twettaq suwiċidju vjolenti. U mhux qed nippromwovih, huwa pprojbit fir-Russja. Int ser tiddisinja biss xi ħaġa ħażina.

Pereżempju, klijent jiġi għandna u jgħid: “Ejja nibnu database għal serje televiżiva, jew database għal direttorju taʼ riċetti. Ikollna platti tal-ikel hemmhekk jew lista ta’ serje televiżivi u atturi fiha.” Ngħidu bil-ferħ: “Ejja mmorru!” Ibgħat biss żewġ bytes, ftit sinjali u lest, kollox jaħdem malajr ħafna u b'mod affidabbli. U kollox sew sakemm jiġu l-klijenti u jgħidu li n-nisa tad-dar qed isolvu wkoll il-problema opposta: għandhom lista ta’ prodotti, u jridu jkunu jafu x’platt iridu jsajru. Inti mejjet.

Dan għaliex Cassandra hija database ibrida: fl-istess ħin tipprovdi valur ewlieni u taħżen id-dejta f'kolonni wesgħin. F'Java jew Kotlin, jista 'jiġi deskritt hekk:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Jiġifieri mappa li fiha wkoll mappa magħżula. L-ewwel ċavetta għal din il-mappa hija ċ-ċavetta Row jew Partition key - iċ-ċavetta tal-qsim. It-tieni ċavetta, li hija ċ-ċavetta għal mappa diġà magħżula, hija ċ-ċavetta Clustering.

Biex turi d-distribuzzjoni tad-database, ejja niġbed tliet nodi. Issa trid tifhem kif tiddekomponi d-dejta f'nodi. Għax jekk nimxu kollox f'wieħed (mill-mod, jista 'jkun hemm elf, elfejn, ħamsa - kemm trid), dan mhux verament dwar id-distribuzzjoni. Għalhekk, għandna bżonn funzjoni matematika li tirritorna numru. Just numru, int twil li se jaqa 'f'xi firxa. U se jkollna nodu wieħed responsabbli għal firxa waħda, it-tieni għat-tieni, l-nth wieħed għall-nth.

Cassandra. Kif ma tmutx jekk taf biss Oracle

Dan in-numru jittieħed bl-użu ta 'funzjoni hash, li hija applikata għal dik li nsejħu l-partition key. Din hija l-kolonna li hija speċifikata fid-direttiva taċ-ċavetta Primarja, u din hija l-kolonna li se tkun l-ewwel u l-iktar ċavetta bażika tal-mappa. Jiddetermina liema nodu se jirċievi liema data. Tabella tinħoloq f'Cassandra bi kważi l-istess sintassi bħal fl-SQL:

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

)

Iċ-ċavetta Primarja f'dan il-każ tikkonsisti f'kolonna waħda, u hija wkoll iċ-ċavetta tal-qsim.

Kif se jwettqu l-utenti tagħna? Xi wħud imorru għal nodu wieħed, xi wħud għal ieħor, u xi wħud għal terz. Ir-riżultat huwa tabella hash ordinarja, magħrufa wkoll bħala mappa, magħrufa wkoll bħala dizzjunarju f'Python, jew struttura sempliċi ta 'valur Key li minnha nistgħu naqraw il-valuri kollha, naqraw u niktbu b'ċavetta.

Cassandra. Kif ma tmutx jekk taf biss Oracle

Agħżel: meta jippermettu l-iffiltrar jinbidel fi skan sħiħ, jew x'm'għandekx tagħmel

Ejja niktbu xi stqarrija magħżula: select * from users where, userid = . Jirriżulta bħal f'Oracle: niktbu tagħżel, nispeċifikaw il-kundizzjonijiet u kollox jaħdem, l-utenti jġibuh. Imma jekk tagħżel, pereżempju, utent b'ċerta sena tat-twelid, Cassandra tilmenta li ma tistax tissodisfa t-talba. Minħabba li ma taf xejn dwar kif aħna nqassmu d-dejta dwar is-sena tat-twelid - għandha kolonna waħda biss indikata bħala ċavetta. Imbagħad tgħid, “Tajjeb, xorta nista’ nissodisfa din it-talba. Żid ippermetti l-filtrazzjoni." Inżidu d-direttiva, kollox jaħdem. U f'dan il-mument jiġri xi ħaġa terribbli.

Meta nħaddmu fuq id-dejta tat-test, kollox huwa tajjeb. U meta tesegwixxi mistoqsija fil-produzzjoni, fejn għandna, pereżempju, 4 miljun rekord, allura kollox ma jkunx tajjeb ħafna għalina. Minħabba li jippermettu filtrazzjoni hija direttiva li tippermetti lil Cassandra li tiġbor id-dejta kollha minn din it-tabella min-nodi kollha, iċ-ċentri tad-dejta kollha (jekk hemm ħafna minnhom f'dan il-cluster), u mbagħad biss tiffiltraha. Dan huwa analogu ta 'Scan sħiħ, u kważi ħadd huwa kuntent bih.

Jekk kellna bżonn utenti biss bl-ID, inkunu tajbin b'dan. Imma xi drabi għandna bżonn niktbu mistoqsijiet oħra u nimponu restrizzjonijiet oħra fuq l-għażla. Għalhekk, niftakru: din hija kollha mappa li għandha ċavetta ta 'qsim, iżda ġewwa fiha hemm mappa magħżula.

U hi għandha wkoll ċavetta, li nsejħu ċ-Ċavetta tal-Clustering. Din iċ-ċavetta, li, min-naħa tagħha, tikkonsisti mill-kolonni li nagħżlu, li bl-għajnuna tagħhom Cassandra tifhem kif id-dejta tagħha hija magħżula fiżikament u se tkun tinsab fuq kull node. Jiġifieri, għal xi Partition key, iċ-ċavetta Clustering tgħidlek eżattament kif timbotta d-dejta f'din is-siġra, liema post se tieħu hemmhekk.

Din hija verament siġra, komparatur huwa sempliċement imsejjaħ hemm, li għaliha ngħaddu ċertu sett ta 'kolonni fil-forma ta' oġġett, u huwa wkoll speċifikat bħala lista ta 'kolonni.

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

Oqgħod attent għad-direttiva taċ-ċavetta Primarja; l-ewwel argument tagħha (fil-każ tagħna, is-sena) hija dejjem iċ-ċavetta tal-partizzjoni. Jista 'jikkonsisti minn kolonna waħda jew aktar, ma jimpurtax. Jekk ikun hemm diversi kolonni, jeħtieġ li terġa 'titneħħa fil-parentesi sabiex il-preproċessur tal-lingwa jifhem li din hija ċ-ċavetta Primarja, u warajha l-kolonni l-oħra kollha huma ċ-ċavetta ta' Clustering. F'dan il-każ, se jiġu trażmessi fil-komparatur fl-ordni li fiha jidhru. Jiġifieri, l-ewwel kolonna hija aktar sinifikanti, it-tieni hija inqas sinifikanti, eċċ. Kif niktbu, pereżempju, huwa ugwali għal oqsma għall-klassijiet tad-dejta: aħna niżżlu l-oqsma, u għalihom niktbu liema huma akbar u liema huma iżgħar. F'Cassandra, dawn huma, relattivament, l-oqsma tal-klassi tad-dejta, li għalihom se jiġu applikati l-ugwali miktuba għaliha.

Nissettjaw issortjar u nimponu restrizzjonijiet

Trid tiftakar li l-ordni tal-għażla (dixxendenti, axxendenti, tkun xi tkun) hija stabbilita fl-istess mument meta tinħoloq iċ-ċavetta, u ma tistax tinbidel aktar tard. Jiddetermina fiżikament kif id-dejta se tiġi magħżula u kif se tinħażen. Jekk għandek bżonn tibdel iċ-ċavetta tal-Clustering jew issortja, ikollok toħloq tabella ġdida u tittrasferixxi d-data fiha. Dan mhux se jaħdem ma 'waħda eżistenti.

Cassandra. Kif ma tmutx jekk taf biss Oracle

Imlejna t-tabella tagħna bl-utenti u rajna li waqgħu f'ċirku, l-ewwel bis-sena tat-twelid, u mbagħad ġewwa fuq kull node skont is-salarju u l-ID tal-utent. Issa nistgħu nagħżlu billi nimponu restrizzjonijiet.

Il-ħidma tagħna terġa tidher where, and, u nġibu utenti, u kollox jerġa 'jkun tajjeb. Imma jekk nippruvaw nużaw biss parti taċ-ċavetta Clustering, u waħda inqas sinifikanti, allura Cassandra immedjatament tilmenta li ma tistax issib il-post fil-mappa tagħna fejn dan l-oġġett, li għandu dawn l-oqsma għall-komparatur null, u dan. li kien biss stabbilit , - fejn jinsab . Ikolli niġbed id-dejta kollha minn dan in-node mill-ġdid u niffiltraha. U dan huwa analogu ta 'Scan Sħiħ fi ħdan node, dan huwa ħażin.

Fi kwalunkwe sitwazzjoni mhux ċara, oħloq tabella ġdida

Jekk irridu nkunu nistgħu nimmiraw lill-utenti skont l-ID, jew skont l-età, jew skont is-salarju, x’għandna nagħmlu? Xejn. Uża biss żewġ tabelli. Jekk għandek bżonn tilħaq lill-utenti fi tliet modi differenti, se jkun hemm tliet tabelli. Għaddew il-ġranet meta ffrankajna spazju fuq il-kamin. Din hija l-orħos riżors. Tiswa ħafna inqas mill-ħin tar-rispons, li jista 'jkun ta' detriment għall-utent. Huwa ħafna aktar pjaċevoli għall-utent li jirċievi xi ħaġa f'sekonda milli f'10 minuti.

Aħna nnegozjaw spazju mhux meħtieġ u dejta denormalizzata għall-abbiltà li niskala tajjeb u nopera b'mod affidabbli. Wara kollox, fil-fatt, cluster li jikkonsisti fi tliet ċentri tad-dejta, li kull wieħed minnhom għandu ħames nodi, b'livell aċċettabbli ta 'preservazzjoni tad-dejta (meta ma jintilef xejn), huwa kapaċi jgħix mill-mewt ta' ċentru tad-dejta wieħed kompletament. U żewġ nodi oħra f'kull wieħed mit-tnejn li jifdal. U wara dan biss jibdew il-problemi. Din hija redundancy pjuttost tajba, ta 'min koppja ta' drives u proċessuri SSD żejda. Għalhekk, sabiex tuża Cassandra, li qatt ma hija SQL, li fiha m'hemmx relazzjonijiet, ċwievet barranin, trid tkun taf regoli sempliċi.

Aħna niddisinjaw kollox skont it-talba tiegħek. Il-ħaġa prinċipali mhix id-dejta, iżda kif l-applikazzjoni se taħdem magħha. Jekk jeħtieġ li tirċievi data differenti b'modi differenti jew l-istess data b'modi differenti, irridu npoġġuha b'mod li jkun konvenjenti għall-applikazzjoni. Inkella, aħna se jonqsu fil-Full Scan u Cassandra ma tagħtina l-ebda vantaġġ.

Id-denormalizzazzjoni tad-dejta hija n-norma. Ninsew dwar forom normali, m'għadniex għandna databases relazzjonali. Jekk inpoġġu xi ħaġa 100 darba, timtedd 100 darba. Għadu irħas milli tieqaf.

Aħna nagħżlu ċ-ċwievet għall-qsim sabiex ikunu mqassma b'mod normali. Ma rridux li l-hash taċ-ċwievet tagħna jaqa 'f'firxa waħda dejqa. Jiġifieri, is-sena tat-twelid fl-eżempju ta 'hawn fuq hija eżempju ħażin. B'mod aktar preċiż, huwa tajjeb jekk l-utenti tagħna huma normalment imqassma skond is-sena tat-twelid, u ħażin jekk qed nitkellmu dwar studenti tal-grad 5 - il-qsim hemm ma jkunx tajjeb ħafna.

L-issortjar jintgħażel darba fl-istadju tal-ħolqien tal-Clustering Key. Jekk jeħtieġ li tinbidel, ikollna naġġornaw it-tabella tagħna b'ċavetta differenti.

U l-iktar ħaġa importanti: jekk irridu nġibu l-istess data b'100 mod differenti, allura jkollna 100 tabella differenti.

Sors: www.habr.com

Żid kumment