Cassandra. Carane ora mati yen mung ngerti Oracle

Hey Habr.

Jenengku Misha Butrimov, aku arep ngomong sethithik babagan Cassandra. Critaku bakal migunani kanggo wong-wong sing durung nate nemoni database NoSQL - duwe akeh fitur implementasine lan pitfalls sing sampeyan kudu ngerti. Lan yen sampeyan durung weruh apa-apa liyane saka Oracle utawa database relasional liyane, iki bakal nylametake urip sampeyan.

Apa sing apik babagan Cassandra? Iki minangka basis data NoSQL sing dirancang tanpa titik kegagalan sing ukurane apik. Yen sampeyan perlu kanggo nambah saperangan terabyte kanggo sawetara database, sampeyan mung nambah simpul ring. Nggedhekake menyang pusat data liyane? Tambah simpul menyang kluster. Tambah RPS sing diproses? Tambah simpul menyang kluster. Kerjane ing arah ngelawan banget.

Cassandra. Carane ora mati yen mung ngerti Oracle

Apa maneh dheweke apik? Iku babagan nangani akeh panjaluk. Nanging pinten kathahipun? 10, 20, 30, 40 ewu panjalukan saben detik ora akeh. 100 ewu panjalukan per detik kanggo ngrekam - banget. Ana perusahaan sing ujar manawa tetep 2 yuta panjaluk saben detik. Dheweke mesthine kudu percaya.

Lan ing asas, Cassandra duwe siji prabédan amba saka data relasional - iku ora padha ing kabeh. Lan iki penting banget kanggo elinga.

Ora kabeh sing katon padha dianggo padha

Sawise rowange teka kula lan takon: "Iki basa query CQL Cassandra, lan wis statement pilih, wis ngendi, wis lan. Aku nulis layang lan ora bisa. Kenapa?" Nambani Cassandra kaya database relasional minangka cara sampurna kanggo bunuh diri kanthi kekerasan. Lan aku ora promosi, iku dilarang ing Rusia. Sampeyan mung bakal ngrancang sing salah.

Contone, ana pelanggan teka lan ujar: "Ayo nggawe database kanggo serial TV, utawa database kanggo direktori resep. Kita bakal duwe sajian panganan ing kana utawa dhaptar serial TV lan aktor. Kita ngomong kanthi bungah: "Ayo!" Mung ngirim loro bita, saperangan saka pratandha lan sampeyan wis rampung, kabeh bakal bisa cepet banget lan andal. Lan kabeh apik nganti pelanggan teka lan ngomong yen ibu rumah tangga uga ngrampungake masalah sing ngelawan: duwe dhaptar produk, lan pengin ngerti sajian apa sing arep dimasak. Kowe mati.

Iki amarga Cassandra minangka basis data hibrida: kanthi bebarengan nyedhiyakake nilai kunci lan nyimpen data ing kolom sing amba. Ing Jawa utawa Kotlin, bisa diterangake kaya mangkene:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Yaiku peta sing uga ngemot peta sing diurutake. Tombol pisanan ing peta iki yaiku tombol Row utawa tombol Partisi - tombol partisi. Tombol kapindho, yaiku kunci peta sing wis diurutake, yaiku tombol Clustering.

Kanggo nggambarake distribusi database, ayo tarik telung simpul. Saiki sampeyan kudu ngerti carane decompose data menyang simpul. Amarga yen kita ngumpulake kabeh dadi siji (kanthi cara, bisa ana sewu, rong ewu, lima - akeh sing dikarepake), iki dudu babagan distribusi. Mulane, kita butuh fungsi matematika sing bakal ngasilake nomer. Mung nomer, int dawa sing bakal tiba ing sawetara sawetara. Lan kita bakal duwe siji simpul tanggung jawab kanggo sawetara, kaloro kanggo kaloro, nth kanggo nth.

Cassandra. Carane ora mati yen mung ngerti Oracle

Nomer iki dijupuk nggunakake fungsi hash, sing ditrapake kanggo apa sing diarani tombol Partisi. Iki minangka kolom sing ditemtokake ing arahan kunci utama, lan iki minangka kolom sing bakal dadi kunci pertama lan paling dhasar ing peta. Iki nemtokake simpul sing bakal nampa data. Tabel digawe ing Cassandra kanthi sintaks sing meh padha karo ing SQL:

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

)

Tombol utami ing kasus iki kasusun saka siji kolom, lan uga tombol partisi.

Kepiye pangguna bakal nindakake? Sawetara bakal pindhah menyang siji simpul, sawetara menyang liyane, lan sawetara menyang katelu. Asil punika Tabel hash biasa, uga dikenal minangka peta, uga dikenal minangka kamus ing Python, utawa struktur Nilai Key prasaja saka kang kita bisa maca kabeh nilai, maca lan nulis dening tombol.

Cassandra. Carane ora mati yen mung ngerti Oracle

Pilih: nalika ngidini nyaring dadi scan lengkap, utawa apa ora kanggo nindakake

Ayo nulis sawetara statement pilih: select * from users where, userid = . Pranyata kaya ing Oracle: kita nulis pilih, nemtokake kahanan lan kabeh bisa digunakake, pangguna entuk. Nanging yen sampeyan milih, contone, pangguna karo taun tartamtu saka lair, Cassandra complains sing ora bisa nepaki panjalukan. Amarga dheweke ora ngerti apa-apa babagan cara nyebarake data babagan taun lair - dheweke mung duwe siji kolom sing dituduhake minangka kunci. Banjur dheweke kandha, "Oke, aku isih bisa ngrampungake panjaluk iki. Tambah ngidini nyaring." Kita nambah arahan, kabeh bisa. Lan ing wektu iki ana kedadeyan sing nggegirisi.

Nalika kita mbukak ing data test, kabeh iku apik. Lan nalika sampeyan nglakokake pitakon ing produksi, ing ngendi kita duwe, contone, 4 yuta cathetan, mula kabeh ora apik kanggo kita. Amarga ngidini nyaring minangka arahan sing ngidini Cassandra ngumpulake kabeh data saka tabel iki saka kabeh kelenjar, kabeh pusat data (yen ana akeh ing kluster iki), lan mung banjur nyaring. Iki minangka analog saka Full Scan, lan meh ora ana sing seneng.

Yen kita mung mbutuhake pangguna kanthi ID, kita bakal bisa nindakake iki. Nanging kadhangkala kita kudu nulis pitakon liyane lan ngetrapake watesan liyane babagan pilihan kasebut. Mulane, kita elinga: iki kabeh peta sing nduweni kunci pemisahan, nanging ing njero ana peta sing diurutake.

Lan dheweke uga duwe kunci, sing diarani Clustering Key. Tombol iki, sing, ing siji, kasusun saka kolom sing kita pilih, karo bantuan kang Cassandra mangertos carane data fisik diurutake lan bakal dumunung ing saben simpul. Yaiku, kanggo sawetara tombol Partisi, tombol Clustering bakal menehi pitutur marang kowe kanthi persis carane nyurung data menyang wit iki, panggonan sing bakal ditindakake ing kana.

Iki pancene wit, komparator mung diarani ana, sing kita ngliwati kolom tartamtu ing wangun obyek, lan uga kasebut minangka dhaptar kolom.

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

Pay manungsa waé menyang Primary key direktif; sawijining argumen pisanan (ing kasus kita, taun) tansah tombol Partisi. Bisa kalebu siji utawa luwih kolom, ora masalah. Yen ana sawetara kolom, iku perlu dibusak ing kurung maneh supaya preprocessor basa mangertos yen iki tombol Primary, lan konco iku kabeh kolom liyane tombol Clustering. Ing kasus iki, padha bakal ditularaké ing comparator ing urutan kang katon. Tegese, kolom pisanan luwih pinunjul, nomer loro kurang pinunjul, lan liya-liyane. Cara nulis, contone, padha karo lapangan kanggo kelas data: kita dhaptar kolom, lan kanggo wong-wong mau kita nulis sing luwih gedhe lan sing luwih cilik. Ing Cassandra, iki, relatif ngandika, kolom saka kelas data, kang padha ditulis kanggo iku bakal Applied.

We nyetel ngurutake lan nemtokke watesan

Sampeyan kudu elinga yen urutan urutan (mudhun, munggah, apa wae) disetel ing wektu sing padha nalika tombol digawe, lan ora bisa diganti mengko. Secara fisik nemtokake cara data bakal diurutake lan carane bakal disimpen. Yen sampeyan kudu ngganti tombol Clustering utawa urutan urutan, sampeyan kudu nggawe tabel anyar lan nransfer data menyang. Iki ora bakal bisa digunakake karo sing wis ana.

Cassandra. Carane ora mati yen mung ngerti Oracle

We kapenuhan meja kita karo pangguna lan weruh sing padha ambruk menyang ring, pisanan dening taun lair, lan banjur nang ing saben simpul dening gaji lan ID pangguna. Saiki kita bisa milih kanthi ngetrapake watesan.

Karya kita katon maneh where, and, lan kita njaluk kedhaftar, lan kabeh iku nggoleki maneh. Nanging yen kita nyoba kanggo nggunakake mung bagean saka tombol Clustering, lan kurang pinunjul, Cassandra bakal langsung sambat sing ora bisa nemokake panggonan ing peta kita ngendi obyek iki, kang wis kothak iki kanggo comparator null, lan siji iki. sing mung disetel , - ngendi kang dumunung. Aku kudu narik kabeh data saka simpul iki maneh lan nyaring. Lan iki minangka analog saka Full Scan ing simpul, iki ala.

Ing kahanan sing ora jelas, gawe tabel anyar

Yen kita pengin bisa target pangguna kanthi ID, utawa miturut umur, utawa gaji, apa sing kudu ditindakake? ora ana apa-apa. Mung nggunakake rong tabel. Yen sampeyan kudu nggayuh pangguna kanthi telung cara, bakal ana telung tabel. Ical wis dina nalika kita nyimpen papan ing meneng. Iki minangka sumber daya sing paling murah. Biaya luwih murah tinimbang wektu nanggepi, sing bisa ngrusak pangguna. Iku luwih penake kanggo pangguna kanggo nampa soko ing detik saka ing 10 menit.

Kita perdagangan papan sing ora perlu lan data denormalisasi kanggo kemampuan kanggo skala kanthi apik lan bisa digunakake kanthi andal. Sawise kabeh, nyatane, kluster sing kasusun saka telung pusat data, sing saben duwe limang simpul, kanthi tingkat pengawetan data sing bisa ditampa (nalika ora ana sing ilang), bisa urip mati siji pusat data kanthi lengkap. Lan rong simpul liyane ing saben loro sing isih ana. Lan mung sawise iki masalah diwiwiti. Iki redundansi cantik apik, iku worth saperangan ekstra SSD drive lan prosesor. Mulane, kanggo nggunakake Cassandra, kang tau SQL, kang ora ana hubungan, tombol manca, sampeyan kudu ngerti aturan prasaja.

Kita ngrancang kabeh miturut panyuwunan sampeyan. Sing utama dudu data, nanging kepiye cara aplikasi kasebut bisa digunakake. Yen perlu nampa data sing beda-beda kanthi cara sing beda-beda utawa data sing padha kanthi cara sing beda-beda, kita kudu nyelehake kanthi cara sing trep kanggo aplikasi kasebut. Yen ora, kita bakal gagal ing Full Scan lan Cassandra ora bakal menehi keuntungan.

Data denormalisasi minangka norma. Kita lali babagan wangun normal, kita ora duwe database relasional maneh. Yen kita sijine soko mudhun 100 kaping, iku bakal ngapusi mudhun 100 kaping. Iku isih luwih murah tinimbang mandheg.

Kita milih tombol kanggo partisi supaya bisa disebarake kanthi normal. Kita ora pengin hash kunci kita tiba ing sawetara sing sempit. Tegese, taun lair ing tuladha ing dhuwur minangka tuladha sing ala. Luwih tepate, luwih apik yen pangguna kita biasane disebarake miturut taun lair, lan ala yen kita ngomong babagan siswa kelas 5 - pemisahan ing kono ora bakal apik banget.

Urut dipilih sapisan ing tataran nggawe Clustering Key. Yen perlu diganti, kita kudu nganyari tabel kanthi kunci sing beda.

Lan sing paling penting: yen kita kudu njupuk data sing padha ing 100 cara sing beda, mula kita bakal duwe 100 tabel sing beda.

Source: www.habr.com

Add a comment