Cassandra. Kumaha teu maot lamun ngan nyaho Oracle

Hejo Habr.

Nami abdi Misha Butrimov, abdi hoyong ngabejaan Anjeun saeutik ngeunaan Cassandra. Carita kuring bakal mangpaat pikeun anu henteu kantos mendakan pangkalan data NoSQL - éta ngagaduhan seueur fitur palaksanaan sareng pitfalls anu anjeun kedah terang. Tur upami Anjeun salah teu katempo nanaon lian ti Oracle atawa database relational séjén, hal ieu bakal ngahemat hirup anjeun.

Naon anu saé ngeunaan Cassandra? Éta mangrupikeun pangkalan data NoSQL anu dirarancang tanpa hiji titik gagal anu skalana saé. Upami anjeun kedah nambihan sababaraha terabyte pikeun sababaraha pangkalan data, anjeun ngan saukur nambihan titik kana ring. Dilegakeun ka puseur data sejen? Tambahkeun titik kana klaster. Ningkatkeun RPS olahan? Tambahkeun titik kana klaster. Gawéna dina arah nu lalawanan teuing.

Cassandra. Kumaha teu maot lamun ngan nyaho Oracle

Naon deui anu anjeunna saé? Ieu ngeunaan nanganan loba requests. Tapi sabaraha loba? 10, 20, 30, 40 sarébu requests per detik teu pira. 100 rébu pamundut per detik pikeun ngarékam - teuing. Aya perusahaan anu nyarios yén aranjeunna tetep 2 juta pamundut per detik. Éta meureun bakal kudu yakin eta.

Jeung prinsipna mah, Cassandra boga hiji bédana badag ti data relational - teu sarupa aranjeunna pisan. Sarta ieu pohara penting pikeun nginget.

Henteu sadayana anu katingalina sami dianggo sami

Sakali batur sapagawean sumping ka kuring jeung nanya: "Di dieu téh basa query CQL Cassandra, sarta mibanda pernyataan pilih, eta boga dimana, boga na. Kuring nulis surat teu jalan. Naha?" Nyampurkeun Cassandra kawas database relational nyaeta cara sampurna bunuh diri telenges. Sareng kuring henteu ngamajukeun éta, éta dilarang di Rusia. Anjeun ngan ukur ngarancang anu salah.

Contona, palanggan datang ka kami sarta ngomong: "Hayu urang ngawangun database pikeun serial TV, atawa database pikeun diréktori resep. Kami bakal ngagaduhan tuangeun tuangeun atanapi daptar séri TV sareng aktor di dinya. Urang ngomong gumbira: "Hayu!" Ngan ngirimkeun dua bait, sababaraha tanda sareng anjeun parantos réngsé, sadayana bakal dianggo gancang pisan sareng dipercaya. Sareng sadayana henteu kunanaon dugi ka palanggan sumping sareng nyarios yén ibu rumah tangga ogé ngarengsekeun masalah anu sabalikna: aranjeunna gaduh daptar produk, sareng aranjeunna hoyong terang naon anu badé masak. Anjeun maot.

Ieu kusabab Cassandra mangrupikeun database hibrida: éta sakaligus nyayogikeun nilai konci sareng nyimpen data dina kolom anu lega. Dina Java atanapi Kotlin, éta tiasa dijelaskeun sapertos kieu:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Hartina, peta nu ogé ngandung peta diurutkeun. Konci munggaran pikeun peta ieu nyaéta konci Baris atanapi konci Partisi - konci partisi. Konci kadua, anu mangrupikeun konci pikeun peta anu parantos diurutkeun, nyaéta konci Clustering.

Pikeun ngagambarkeun distribusi database, hayu urang ngagambar tilu titik. Ayeuna anjeun kudu ngarti kumaha carana decompose data kana titik. Kusabab lamun urang cram sagalana kana hiji (ku jalan kitu, aya tiasa sarébu, dua rébu, lima - saloba anjeun resep), ieu teu bener ngeunaan distribusi. Kituna, urang peryogi fungsi matematik nu bakal balik angka. Ngan hiji angka, int panjang nu bakal digolongkeun kana sababaraha rentang. Sarta kami bakal boga hiji titik jawab hiji rentang, nu kadua pikeun kadua, nu nth pikeun nth nu.

Cassandra. Kumaha teu maot lamun ngan nyaho Oracle

Nomer ieu dicandak nganggo fungsi hash, anu diterapkeun kana anu kami sebut konci Partition. Ieu kolom anu dieusian dina diréktif konci primér, sarta ieu kolom anu bakal jadi konci munggaran tur paling dasar tina peta. Éta nangtukeun titik mana anu bakal nampi data mana. Méja didamel dina Cassandra kalayan sintaksis anu ampir sami sareng dina SQL:

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

)

Konci primér dina hal ieu diwangun ku hiji kolom, sarta eta oge konci partisi.

Kumaha pamaké urang bakal ngalakukeun? Sababaraha bakal angkat ka hiji titik, sababaraha ka anu sanés, sareng sababaraha ka katilu. Hasilna mangrupa tabel hash biasa, ogé katelah peta, ogé katelah kamus di Python, atawa struktur nilai Key basajan ti mana urang bisa maca sagala nilai, maca jeung nulis ku konci.

Cassandra. Kumaha teu maot lamun ngan nyaho Oracle

Pilih: lamun ngidinan nyaring robah jadi scan pinuh, atawa naon teu ngalakukeun

Hayu urang nulis sababaraha pernyataan pilih: select * from users where, userid = . Tétéla kawas dina Oracle: urang nulis pilih, nangtukeun kaayaan jeung sagalana jalan, pamaké meunang eta. Tapi upami anjeun milih, contona, pangguna kalayan taun kalahiran anu tangtu, Cassandra ngawadul yén éta henteu tiasa nyumponan pamenta. Kusabab manehna teu nyaho nanaon tentang kumaha urang ngadistribusikaeun data ngeunaan taun kalahiran - manehna boga ngan hiji kolom dituduhkeun salaku konci a. Lajeng anjeunna nyarios, "Muhun, abdi masih tiasa minuhan pamundut ieu. Tambahkeun ngidinan nyaring." Urang tambahkeun diréktif, sagalana jalan. Sarta dina momen ieu hal dahsyat kajadian.

Nalika kami ngajalankeun data tés, sadayana henteu kunanaon. Sareng nalika anjeun ngalaksanakeun pamundut dina produksi, dimana urang gaduh, contona, 4 juta rékaman, maka sadayana henteu saé pikeun urang. Kusabab ngawenangkeun nyaring mangrupakeun diréktif anu ngamungkinkeun Cassandra pikeun ngumpulkeun sakabeh data tina tabel ieu ti sakabéh titik, kabéh puseur data (lamun aya loba di antarana dina klaster ieu), sarta ngan lajeng nyaring eta. Ieu mangrupikeun analog tina Full Scan, sareng boro saha waé anu resep kana éta.

Lamun urang ngan diperlukeun pamaké ku ID, urang bakal rupa kalawan ieu. Tapi kadang urang kudu nulis queries sejen tur maksakeun larangan sejenna dina pilihan. Kituna, urang émut: ieu sadayana peta anu gaduh konci partisi, tapi di jerona aya peta anu diurutkeun.

Jeung manehna oge boga konci, nu urang nelepon Clustering Key. Konci ieu, anu, kahareupna diwangun ku kolom anu kami pilih, kalayan bantosan anu Cassandra ngartos kumaha datana diurutkeun sacara fisik sareng bakal aya dina unggal titik. Nyaéta, pikeun sababaraha konci Partisi, konci Clustering bakal nyarioskeun ka anjeun kumaha cara nyorong data kana tangkal ieu, tempat dimana éta bakal dilaksanakeun.

Ieu leres-leres tangkal, komparator ngan saukur disebut didinya, dimana urang ngaliwat set kolom anu tangtu dina bentuk obyék, sareng éta ogé ditetepkeun salaku daptar kolom.

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

Nengetan diréktif konci primér; argumen kahijina (dina hal urang, taun) sok Partition konci. Bisa diwangun ku hiji atawa leuwih kolom, teu masalah. Upami aya sababaraha kolom, éta kedah dipiceun dina kurung deui supados preprocessor basa ngartos yén ieu mangrupikeun konci primér, sareng di tukangeun éta sadayana kolom sanésna nyaéta konci Clustering. Dina hal ieu, aranjeunna bakal dikirimkeun dina comparator dina urutan nu maranéhna muncul. Hartina, kolom kahiji leuwih signifikan, kadua kurang signifikan, jeung saterusna. Kumaha urang nulis, contona, sarua widang pikeun kelas data: urang daptar widang, sarta pikeun aranjeunna urang nulis mana nu leuwih badag sarta mana nu leuwih leutik. Dina Cassandra, ieu, rélatif diomongkeun, widang kelas data, nu sarua ditulis pikeun eta bakal dilarapkeun.

Kami nyetél asihan sareng maksakeun larangan

Anjeun kudu inget yén urutan diurutkeun (turun, naek, naon) diatur dina momen anu sarua nalika konci dijieun, sarta eta teu bisa dirobah engké. Éta sacara fisik nangtukeun kumaha data bakal diurutkeun sareng kumaha éta bakal disimpen. Upami anjeun kedah ngarobih konci Clustering atanapi nyusun urutan, anjeun kedah nyiptakeun méja énggal sareng nransfer data kana éta. Ieu moal tiasa dianggo sareng anu tos aya.

Cassandra. Kumaha teu maot lamun ngan nyaho Oracle

Urang ngeusi tabel kami kalawan pamaké sarta nempo yén maranéhna murag kana cingcin, mimitina ku taun kalahiran, lajeng di jero unggal titik ku gaji sarta ID pamaké. Ayeuna urang tiasa milih ku maksakeun larangan.

Karya urang muncul deui where, and, sarta kami meunang pamaké, jeung sagalana geus rupa deui. Tapi upami urang nyobian nganggo ngan ukur bagian tina konci Clustering, sareng anu kirang signifikan, Cassandra bakal langsung ngawadul yén éta henteu tiasa mendakan tempat dina peta urang dimana objék ieu, anu ngagaduhan widang ieu pikeun komparator null, sareng anu ieu. nu ieu ngan disetel , - dimana anjeunna perenahna. Kuring kedah narik sadaya data tina titik ieu deui sareng nyaring. Sareng ieu mangrupikeun analog tina Pinuh Pinuh dina hiji titik, ieu goréng.

Dina kaayaan anu teu jelas, jieun tabel énggal

Upami urang hoyong tiasa nargétkeun pangguna ku ID, atanapi ku umur, atanapi ku gaji, naon anu kedah urang laksanakeun? Euweuh nanaon. Ngan make dua tabel. Upami anjeun kedah ngahontal pangguna dina tilu cara anu béda, bakal aya tilu tabel. Isro anu poé nalika urang simpen spasi dina screw nu. Ieu sumberdaya cheapest. Éta langkung murah tibatan waktos réspon, anu tiasa ngarugikeun pangguna. Éta langkung pikaresepeun pikeun pangguna pikeun nampi sadetik tibatan dina 10 menit.

Urang dagangan spasi teu perlu jeung data denormalized pikeun kamampuhan pikeun skala ogé sarta beroperasi reliably. Barina ogé, kanyataanna, klaster anu diwangun ku tilu pusat data, anu masing-masing ngagaduhan lima titik, kalayan tingkat pelestarian data anu ditampi (nalika teu aya anu leungit), tiasa salamet maotna hiji pusat data lengkep. Sareng dua deui titik dina unggal dua sésana. Sarta ngan sanggeus ieu masalah dimimitian. Ieu mangrupikeun redundansi anu saé, éta patut sababaraha drive sareng prosesor SSD tambahan. Ku alatan éta, dina raraga ngagunakeun Cassandra, nu pernah SQL, nu teu aya hubungan, konci asing, anjeun kudu nyaho aturan basajan.

Urang ngarancang sagalana nurutkeun pamundut anjeun. Hal utama sanes data, tapi kumaha aplikasi bakal dianggo sareng éta. Upami éta kedah nampi data anu béda dina cara anu béda atanapi data anu sami dina cara anu béda, urang kedah nempatkeun éta dina cara anu cocog pikeun aplikasina. Upami teu kitu, urang bakal gagal dina Scan Pinuh sareng Cassandra moal masihan kami kauntungan.

Denormalizing data nyaéta norma. Urang poho ngeunaan bentuk normal, urang geus euweuh database relational. Upami urang nempatkeun hiji hal 100 kali, éta bakal ngagolér 100 kali. Masih langkung mirah tibatan eureun.

Kami milih konci pikeun ngabagi supados disebarkeun sacara normal. Kami henteu hoyong hash konci kami digolongkeun kana hiji rentang anu sempit. Hartina, taun kalahiran dina conto di luhur mangrupa conto goréng. Langkung tepatna, langkung saé upami pangguna urang disebarkeun sacara normal dumasar kana taun kalahiran, sareng goréng upami urang nyarioskeun murid kelas 5 - partisi di dinya moal saé pisan.

Asihan dipilih sakali dina tahap kreasi Key Clustering. Lamun perlu dirobah, urang kudu ngamutahirkeun tabel urang ku konci béda.

Sareng anu paling penting: upami urang kedah nyandak data anu sami dina 100 cara anu béda, maka urang bakal ngagaduhan 100 tabel anu béda.

sumber: www.habr.com

Tambahkeun komentar