Cassandra. Kuidas ellu jÀÀda, kui tead ainult Oracle'it

Tere, Habr.

Minu nimi on Misha Butrimov ja ma tahaksin rÀÀkida Cassandra'st. Minu jutt on kasulik neile, kes pole kunagi NoSQL andmebaasidega kokku puutunud — nende eripĂ€ra ja peidetud probleemid, millest tuleks teada, on vĂ€ga olulised. Ja kui oled nĂ€inud ainult Oracle'it vĂ”i mĂ”nda muud relatsioonilist andmebaasi, vĂ”ivad need teadmised sind pÀÀsta.

Milles on Cassandra hea? See on NoSQL andmebaas, mis on projekteeritud ilma ĂŒhegi tĂ”rkepunktita ja mis skaleerub hĂ€sti. Kui vajad mingeid terabaiti andmeid, siis lihtsalt lisad sĂ”lmed ringi. Tahtsid laiendada veel ĂŒhte andmekeskust? Lisad sĂ”lmed klastrisse. Tahad suurendada töödeldavat RPS-i? Lisad sĂ”lmed klastrisse. See töötab ka tagasi.

Cassandra. Kuidas ellu jÀÀda, kui tead ainult Oracle'it

Milles veel on see hea? Sellel on suur vĂ”ime kĂ€sitleda hulgaliselt pĂ€ringuid. Aga kui palju on palju? 10, 20, 30, 40 tuhat pĂ€ringut sekundis — see on vĂ€he. 100 tuhat pĂ€ringut sekundis kirjutamiseks — ka see on vĂ€he. On ettevĂ”tteid, kes ĂŒtlevad, et nad suudavad pidada 2 miljonit pĂ€ringut sekundis. Talle peab vist uskuma.

Ja pĂ”himĂ”tteliselt on Cassandra'l ĂŒks suur erinevus relatsioonilistest andmetest — see ei sarnane neile ĂŒldse. Ja seda on vĂ€ga oluline meeles pidada.

KÔik, mis nÀeb vÀlja sama, ei tööta sama moodi

Kord kĂŒsis minult kolleeg: „Siin on CQL Cassandra pĂ€ringute keel, kus on select lause, kus on where ja kus on and. Ma kirjutan tĂ€hti, ja see ei tööta. Miks?“. Kui suhelda Cassandra'ga nagu relatsioonilise andmebaasiga, siis on see ideaalne viis oma elu lĂ”petamiseks. Ja ma ei propageeri seda, see on Venemaal keelatud. Lihtsalt projekteerid midagi valesti.

NĂ€iteks tuleb meile klient ja ĂŒtleb: „Ehitage andmebaas seriaale vĂ”i andmebaas retseptide kogumikuks. Meil on seal toidud koostisosadega vĂ”i nimekiri seriaalidest ja nende nĂ€itlejatest“. Me vastame rÔÔmsalt: „Teeme!“. See on vaid kaks baitit edasi saata, paar tabelit ja kĂ”ik on valmis, kĂ”ik töötab vĂ€ga kiiresti ja usaldusvÀÀrselt. KĂ”ik on suurepĂ€rane, kuni kliendid ei tule ja ĂŒtle, et koduperenaised lahendavad ka vastupidist ĂŒlesannet: neil on nimekiri koostisosadest ja nad tahavad teada, millise toidu nad saavad valmistada. Siis oled sa hukkunud.

KĂ”ik on tingitud sellest, et Cassandra on hĂŒbriidne andmebaas: see on samal ajal nii key-value kui ka salvestab andmeid laias veergudes. Kui rÀÀkida Java vĂ”i Kotlin keeles, siis saaksime seda kirjeldada nii:

Map<RowKey, SortedMap>

See tĂ€hendab kaarti, mille sees on veel ĂŒks sorteeritud kaart. Esimene vĂ”tmeosa selles kaardis on Row key vĂ”i Partition key — partitsioneerimisvĂ”ti. Teine vĂ”ti, mis on vĂ”tmeosa juba sorteeritud kaardist, on Clustering key.

Jaotuse illustreerimiseks joonistame kolm sĂ”lme. NĂŒĂŒd on vaja mĂ”ista, kuidas andmeid sĂ”lmedesse jaotada. Sest kui me surume kĂ”ik ĂŒhte (neid vĂ”ib olla nĂ€iteks tuhat, kaks tuhat, viis — kuivĂ”rd soovite), siis see ei ole just vĂ€ga jaotuse moodi. SeepĂ€rast on meil vajalik matemaatiline funktsioon, mis tagastab arvu. Lihtsalt arvu, pika int, mis sureb mingisse vahemikku. Ja meil on ĂŒks sĂ”lm, mis vastutab ĂŒhe vahemiku eest, teine — teise, n-nes — n-nda.

Cassandra. Kuidas ellu jÀÀda, kui tead ainult Oracle'it

See number saadakse hash-funktsiooni abil, mis rakendatakse just sellele, mida me nimetame Partition key. See on see veerg, mis on mÀÀratud Primary key direktiivis, ja see on see veerg, mis on esimene ja kĂ”ige olulisem vĂ”tmeosa kaardis. See mÀÀrab, millised andmed lĂ€hedusse satuvad. Tabel luuakse Cassandrasse peaaegu sama sĂŒntaksiga nagu SQL-is:

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

)

Primary key koosneb antud juhul ĂŒhest veerust, mis on samuti partitsioneerimisvĂ”ti.

Kuidas meil kasutajad jaotuvad? Osa lĂ€heb ĂŒhte sĂ”lmesse, osa teise ja osa kolmandasse. Saame tavalise hash-tabeli, mis on ehk map, vĂ”i siis Pythonis — sĂ”naraamat, aga ka lihtne Key-value struktuur, millest saame lugeda kĂ”iki vÀÀrtusi, lugeda ja kirjutada vĂ”tme jĂ€rgi.

Cassandra. Kuidas ellu jÀÀda, kui tead ainult Oracle'it

Select: kui allow filtering muutub full scaniks, vÔi kuidas mitte teha

Kirjutame mingi select lause: select * from users where userid = . Tundub, et see on midagi sarnast Oracle'iga: kirjutame select, mÀÀrame tingimused ja kĂ”ik töötab, kasutajad tulevad vĂ€lja. Kuid kui valida nĂ€iteks kasutaja kindla sĂŒnniaasta jĂ€rgi, kurdab Cassandra, et ta ei saa pĂ€ringut tĂ€ita. Sest tal ei ole aimugi, kuidas meil sĂŒnniaastaga seotud andmed jaotuvad — tal on vĂ”tmena ainult ĂŒks tegevus. Siis ĂŒtleb ta: "Olgu, ma saan ikkagi selle pĂ€ringu tĂ€ita. Lisage allow filtering." Me lisame direktiivi, kĂ”ik töötab. Ja sel hetkel juhtub midagi kohutavat.

Kui testime testandmetega, siis kÔik on suurepÀrane. Kuid kui teete pÀringu tootmises, kus meil on nÀiteks 4 miljonit kirjet, siis pole meiega hÀsti. Sest allow filtering on direktiiv, mis lubab Cassandral koguda kÔik andmed sellest tabelist kÔigilt sÔlmedelt, kÔikelt andmekeskustes (kui neid on palju selles klastris), ja alles siis filtreerida. See on analoogne Full Scan'iga ja ilmselt pole keegi sellest vaimustuses.

Kui me vajaksime kasutajaid ainult identifikaatorite jÀrgi, siis see sobiks meile. Kuid mÔnikord peame kirjutama teisi pÀringuid ja seadma muud piirangud andmete valikule. Seega meenutame: kÔik see on meile kaart, millel on partitseerimise vÔti, kuid selle sees on sorteeritud kaart.

Ja sellel on ka vĂ”ti, mida me nimetame Clustering Key'iks. See vĂ”ti koosneb omakorda veergudest, mille me valime, mille abil Cassandra mĂ”istab, kuidas tema andmed fĂŒĂŒsiliselt jĂ€rjestatakse ja paigutatakse igasse sĂ”lme. TeisisĂ”nu, mingi Partition key Clustering key ĂŒtleb, kuidas andmed selle puu sisse paigutada, millisesse kohta nad seal asuvad.

See on tÔeliselt puu, seal kutsutakse lihtsalt vÔrdlejate funktsiooni, millele anname teatud veergude komplekti objektina, ja see mÀÀratakse ka veergude loendi kujul.

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

Pöörake tĂ€helepanu Primary key direktiivile, mille esimeseks argumendiks (meie puhul aasta) on alati Partition key. See vĂ”ib koosneda ĂŒhest vĂ”i mitmest veerust, see pole oluline. Kui veerge on mitu, tuleks see uuesti sulgudesse panna, et keele eelprotsessor saaks aru, et see on just Primary key, ja kĂ”ik teised veerud on Clustering key. Samuti edastatakse need vĂ”rdlejana selles jĂ€rjekorras, milles nad on. See tĂ€hendab, et esimene veerg on olulisem, teine - vĂ€hem oluline ja nii edasi. Nagu me data class'ide puhul kirjutame, nĂ€iteks equals vĂ€ljad: loetleme vĂ€ljad ja mÀÀrame, millised on suuremad ja millised vĂ€iksemad. Cassandrases on see hĂŒpoteetiliselt data class'i vĂ€ljad, millele rakendatakse kirjutatud equals.

MÀÀrame sorteerimise, rakendame piiranguid

Peame meeles pidama, et sorteerimise jĂ€rjekord (kahanev, kasvav, ei ole oluline) mÀÀratakse samal hetkel, kui vĂ”ti luuakse, ja hiljem seda muuta ei saa. See mÀÀrab fĂŒĂŒsiliselt, kuidas andmed sorteeritakse ja kus nad asuvad. Kui Clustering key vĂ”i sorteerimise jĂ€rjekorda tuleb muuta, tuleb luua uus tabel ja, ĂŒle kanda andmed. Praeguse tabeli puhul pole see vĂ”imalik.

Cassandra. Kuidas ellu jÀÀda, kui tead ainult Oracle'it

Me oleme tĂ€itnud meie tabeli kasutajatega ja nĂ€inud, et nad on esialgu jĂ€rjestatud sĂŒnniaasta jĂ€rgi, ja siis iga sĂ”lme sees palga ja kasutaja ID jĂ€rgi. NĂŒĂŒd saame valida, rakendades piiranguid.

Meie töötav where, ja, ja kasutajad jÀÀvad meile kĂ€tte, ja kĂ”ik on jĂ€lle hĂ€sti. Kuid kui proovime kasutada ainult osa Clustering key'st, veel vĂ€hem olulist, siis Cassandra annab kohe teada, et ei leia meie mapis kohta, kus see objekt, millel need vĂ€ljad vĂ”rreldes on null, ja see, mille just mÀÀrasime - kus see asub. Pean jĂ€lle kĂ”ik andmed sellelt sĂ”lmelt ĂŒles tooma ja filtreerima. See on analoogne Full Scan'iga sĂ”lmes, see on halb.

Igas segaduses olukorras loo uus tabel

Kui soovime kasutajaid hankida ID, vanuse vĂ”i palga jĂ€rgi, siis mida teha? Mitte midagi. Lihtsalt kasutage kahte tabelit. Kui on vaja hankida kasutajaid kolme erineva meetodi jĂ€rgi, siis tabelite arv on kolm. Need ajad, mil me itahtsid ruumi kĂ”vakettal sÀÀsta, on möödas. See on kĂ”ige odavam ressurss. See maksab palju vĂ€hem kui vastusaeg, mis vĂ”ib kasutajale saatuslik olla. Kasutajale on palju meeldivam saada midagi sekundi jooksul kui kĂŒmne minutiga.

Vahetame liigse ruumi, denormaliseeritud andmete vastu vĂ”imaluse hĂ€sti skaleeruda ja usaldusvÀÀrselt töötada. Tegelikult suudab klaster, mis koosneb kolmest andmekeskusest, milles igas on viis nodi, taluda ĂŒhe andmekeskuse tĂ€ielikku kadumist, sĂ€ilitades andmete vastuvĂ”etava taseme (kui midagi ei kao kindlalt). Ja veel kaks nodi igas kahes ĂŒlejÀÀnud. Ainult siis hakkavad probleemid ilmuma. See on ĂŒsna hea varundamine, see maksab paar-kolm liigset SSD-d ja protsessorit. SeetĂ”ttu, et kasutada Cassandra't, mis ei ole kunagi SQL ja kus pole suhteid ega vĂ€lisvĂ”tmeid, tuleb teada lihtsaid reegleid.

Kujundame kÔik pÀringu jÀrgi. Peamine ei ole andmed, vaid see, kuidas rakendus nendega töötama hakkab. Kui tal on vaja erinevaid andmeid erinevate meetodite kaudu vÔi samu andmeid erinevate meetodite kaudu saada, peame need panema niimoodi, et see sobiks rakendusele. Vastasel juhul lÀheme Full Scan'i ja Cassandra ei too meile mingit eelist.

Denormaliseeritud andmete kasutamine on norm. Unustame normaalsed vormid, meil ei ole enam relatsionaalseid baase. Paneme midagi 100 korda, see on 100 korda seal. See on ikkagi odavam kui lÔksu jÀÀda.

Valime partitsioneerimise vĂ”tmed nii, et need jaotuksid normaalselt. Me ei vaja, et meie vĂ”tmete hulk satuks kitsasse vahemikku. Niisiis, sĂŒnniaasta eespooltoodud nĂ€ites on halb nĂ€ide. Tegelikult on see hea, kui meie kasutajad on sĂŒnniaasta jĂ€rgi normaalselt jaotunud, ja halb, kui rÀÀgime 5. klassi Ă”pilastest - seal ei toimi partitsioneerimine vĂ€ga hĂ€sti.

Sorteerimine valitakse kord ĂŒhel Clustering Key loomise etapil. Kui seda on vaja muuta, tuleb meie tabel teise vĂ”tmega ĂŒle kanda.

Ja kÔige olulisem: kui meil on vaja 100 erinevat viisi samade andmete saamiseks, tÀhendab see, et meil on 100 erinevat tabelit.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster