Cassandra. Jinsi ya kutokufa ikiwa unajua Oracle tu

Habari Habr.

Jina langu ni Misha Butrimov, ningependa kukuambia kidogo kuhusu Cassandra. Hadithi yangu itakuwa muhimu kwa wale ambao hawajawahi kukutana na hifadhidata za NoSQL - ina vipengele vingi vya utekelezaji na mitego ambayo unahitaji kujua kuhusu. Na ikiwa haujaona chochote isipokuwa Oracle au hifadhidata nyingine yoyote ya uhusiano, mambo haya yataokoa maisha yako.

Ni nini kizuri kuhusu Cassandra? Ni hifadhidata ya NoSQL iliyoundwa bila nukta moja ya kutofaulu ambayo inakua vizuri. Ikiwa unahitaji kuongeza terabaiti kadhaa kwa hifadhidata fulani, unaongeza tu nodi kwenye pete. Uipanue hadi kituo kingine cha data? Ongeza nodi kwenye nguzo. Ungependa kuongeza RPS iliyochakatwa? Ongeza nodi kwenye nguzo. Inafanya kazi katika mwelekeo tofauti pia.

Cassandra. Jinsi ya kutokufa ikiwa unajua Oracle tu

Ni nini kingine anachoweza kufanya? Ni juu ya kushughulikia maombi mengi. Lakini ni ngapi nyingi? Maombi 10, 20, 30, 40 elfu kwa sekunde sio mengi. Maombi elfu 100 kwa sekunde kwa kurekodi - pia. Kuna makampuni ambayo yalisema yanaweka maombi milioni 2 kwa sekunde. Labda itabidi waamini.

Na kimsingi, Cassandra ana tofauti moja kubwa kutoka kwa data ya uhusiano - haifanani nao hata kidogo. Na hii ni muhimu sana kukumbuka.

Sio kila kitu kinachoonekana kuwa sawa hufanya kazi sawa

Wakati mmoja mwenzangu alinijia na kuniuliza: "Hapa kuna lugha ya maswali ya CQL Cassandra, na ina taarifa iliyochaguliwa, ina wapi, ina na. Ninaandika barua na haifanyi kazi. Kwa nini?". Kumtendea Cassandra kama hifadhidata ya uhusiano ndiyo njia mwafaka ya kujiua kwa jeuri. Na siikuza, ni marufuku nchini Urusi. Utabuni tu kitu kibaya.

Kwa mfano, mteja anakuja kwetu na kusema: “Hebu tutengeneze hifadhidata ya mfululizo wa TV, au hifadhidata ya saraka ya mapishi. Tutakuwa na sahani za chakula huko au orodha ya mfululizo wa TV na waigizaji ndani yake. Tunasema kwa furaha: "Twende!" Tuma tu ka mbili, ishara kadhaa na umemaliza, kila kitu kitafanya kazi haraka sana na kwa uhakika. Na kila kitu ni sawa mpaka wateja waje na kusema kwamba mama wa nyumbani pia wanatatua tatizo kinyume: wana orodha ya bidhaa, na wanataka kujua ni sahani gani wanataka kupika. Umekufa.

Hii ni kwa sababu Cassandra ni hifadhidata ya mseto: wakati huo huo hutoa thamani muhimu na huhifadhi data katika safu wima pana. Katika Java au Kotlin, inaweza kuelezewa kama hii:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Hiyo ni, ramani ambayo pia ina ramani iliyopangwa. Ufunguo wa kwanza wa ramani hii ni ufunguo wa safu mlalo au ufunguo wa kugawa - ufunguo wa kugawa. Ufunguo wa pili, ambao ni ufunguo wa ramani iliyopangwa tayari, ni ufunguo wa Kuunganisha.

Ili kuonyesha usambazaji wa hifadhidata, wacha tuchore nodi tatu. Sasa unahitaji kuelewa jinsi ya kutenganisha data kwenye nodi. Kwa sababu ikiwa tunaweka kila kitu kwa moja (kwa njia, kunaweza kuwa na elfu, elfu mbili, tano - nyingi kama unavyopenda), hii sio kweli kuhusu usambazaji. Kwa hivyo, tunahitaji kazi ya hisabati ambayo itarudisha nambari. Nambari tu, int ndefu ambayo itaanguka katika safu fulani. Na tutakuwa na nodi moja inayohusika na safu moja, ya pili kwa pili, ya nth kwa nth.

Cassandra. Jinsi ya kutokufa ikiwa unajua Oracle tu

Nambari hii inachukuliwa kwa kutumia kipengele cha kukokotoa cha heshi, ambacho kinatumika kwa kile tunachokiita kitufe cha Kugawa. Hii ndiyo safu wima ambayo imebainishwa katika maagizo ya ufunguo wa Msingi, na hii ndiyo safu wima ambayo itakuwa ufunguo wa kwanza na msingi zaidi wa ramani. Inaamua ni nodi gani itapokea data gani. Jedwali limeundwa huko Cassandra na karibu syntax sawa na katika SQL:

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

)

Kitufe cha Msingi katika kesi hii kina safu wima moja, na pia ni ufunguo wa kugawa.

Watumiaji wetu watafanyaje? Wengine wataenda kwenye nodi moja, wengine hadi nyingine, na wengine hadi tatu. Matokeo yake ni jedwali la kawaida la heshi, linalojulikana pia kama ramani, pia inajulikana kama kamusi katika Python, au muundo rahisi wa Ufunguo ambao tunaweza kusoma maadili yote, kusoma na kuandika kwa ufunguo.

Cassandra. Jinsi ya kutokufa ikiwa unajua Oracle tu

Chagua: unaporuhusu uchujaji hugeuka kuwa tambazo kamili, au nini usichofanya

Wacha tuandike kauli fulani iliyochaguliwa: select * from users where, userid = . Inageuka kama katika Oracle: tunaandika chagua, taja hali na kila kitu hufanya kazi, watumiaji wanaipata. Lakini ukichagua, kwa mfano, mtumiaji aliye na mwaka fulani wa kuzaliwa, Cassandra analalamika kwamba hawezi kutimiza ombi. Kwa sababu hajui chochote kuhusu jinsi tunavyosambaza data kuhusu mwaka wa kuzaliwa - ana safu moja tu iliyoonyeshwa kama ufunguo. Kisha anasema, “Sawa, bado ninaweza kutimiza ombi hili. Ongeza kuruhusu uchujaji." Tunaongeza maagizo, kila kitu kinafanya kazi. Na kwa wakati huu kitu cha kutisha kinatokea.

Tunapotumia data ya majaribio, kila kitu ni sawa. Na unapofanya swali katika uzalishaji, ambapo tuna, kwa mfano, rekodi milioni 4, basi kila kitu si nzuri sana kwetu. Kwa sababu kuruhusu kuchuja ni maagizo ambayo huruhusu Cassandra kukusanya data zote kutoka kwa jedwali hili kutoka kwa nodi zote, vituo vyote vya data (ikiwa kuna vingi katika kundi hili), na kisha tu kuichuja. Hii ni analog ya Full Scan, na hakuna mtu anayefurahishwa nayo.

Ikiwa tungehitaji watumiaji kwa kitambulisho tu, tungekuwa sawa na hili. Lakini wakati mwingine tunahitaji kuandika maswali mengine na kuweka vikwazo vingine kwenye uteuzi. Kwa hivyo, tunakumbuka: hii yote ni ramani ambayo ina ufunguo wa kugawa, lakini ndani yake kuna ramani iliyopangwa.

Na pia ana ufunguo, ambao tunauita Ufunguo wa Kuunganisha. Ufunguo huu, ambao, kwa upande wake, unajumuisha safu ambazo tunachagua, kwa msaada ambao Cassandra anaelewa jinsi data yake inavyopangwa kimwili na itakuwa iko kwenye kila nodi. Hiyo ni, kwa ufunguo fulani wa Kuhesabu, kitufe cha Kuunganisha kitakuambia jinsi ya kusukuma data kwenye mti huu, itachukua mahali gani hapo.

Kwa kweli huu ni mti, mlinganisho anaitwa tu hapo, ambayo tunapitisha safu fulani ya safu katika mfumo wa kitu, na pia imeainishwa kama orodha ya safu.

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

Zingatia agizo kuu la Msingi; hoja yake ya kwanza (kwa upande wetu, mwaka) huwa ni ufunguo wa Kugawa. Inaweza kujumuisha safu wima moja au zaidi, haijalishi. Ikiwa kuna safu wima kadhaa, inahitaji kuondolewa kwenye mabano tena ili mtayarishaji wa lugha aelewe kuwa huu ndio ufunguo wa Msingi, na nyuma yake safu wima zingine zote ni ufunguo wa Kuunganisha. Katika kesi hii, watapitishwa kwa kulinganisha kwa mpangilio ambao wanaonekana. Hiyo ni, safu ya kwanza ni muhimu zaidi, ya pili haina maana, na kadhalika. Jinsi tunavyoandika, kwa mfano, ni sawa na nyanja za madarasa ya data: tunaorodhesha sehemu, na kwao tunaandika ni zipi kubwa na ambazo ni ndogo. Katika Cassandra, hizi ni, kwa kusema, nyanja za darasa la data, ambazo sawa zilizoandikwa kwa ajili yake zitatumika.

Tunaweka upangaji na kuweka vikwazo

Unahitaji kukumbuka kuwa utaratibu wa aina (kushuka, kupanda, chochote) umewekwa wakati huo huo wakati ufunguo unapoundwa, na hauwezi kubadilishwa baadaye. Huamua jinsi data itapangwa na jinsi itahifadhiwa. Ikiwa unahitaji kubadilisha kitufe cha Kuunganisha au mpangilio wa kupanga, utalazimika kuunda jedwali mpya na kuhamisha data ndani yake. Hii haitafanya kazi na iliyopo.

Cassandra. Jinsi ya kutokufa ikiwa unajua Oracle tu

Tulijaza meza yetu na watumiaji na kuona kwamba walianguka kwenye pete, kwanza kwa mwaka wa kuzaliwa, na kisha ndani ya kila nodi kwa mshahara na kitambulisho cha mtumiaji. Sasa tunaweza kuchagua kwa kuweka vikwazo.

Yetu inayofanya kazi inaonekana tena where, and, na tunapata watumiaji, na kila kitu kiko sawa tena. Lakini ikiwa tutajaribu kutumia tu sehemu ya ufunguo wa Kuunganisha, na isiyo muhimu sana, basi Cassandra atalalamika mara moja kwamba haiwezi kupata mahali kwenye ramani yetu ambapo kitu hiki, ambacho kina sehemu hizi za kulinganisha null, na hii. hiyo ilikuwa tu kuweka , - ambapo yeye uongo. Nitalazimika kuvuta data yote kutoka kwa nodi hii tena na kuichuja. Na hii ni analog ya Full Scan ndani ya nodi, hii ni mbaya.

Katika hali yoyote isiyo wazi, tengeneza meza mpya

Ikiwa tunataka kuwa na uwezo wa kulenga watumiaji kwa kitambulisho, au kwa umri, au kwa mshahara, tufanye nini? Hakuna kitu. Tumia tu meza mbili. Ikiwa unahitaji kufikia watumiaji kwa njia tatu tofauti, kutakuwa na meza tatu. Siku zimepita tulipohifadhi nafasi kwenye skrubu. Hii ndio rasilimali ya bei nafuu zaidi. Inagharimu kidogo sana kuliko wakati wa kujibu, ambayo inaweza kuwa na madhara kwa mtumiaji. Inapendeza zaidi kwa mtumiaji kupokea kitu katika sekunde moja kuliko katika dakika 10.

Tunauza nafasi isiyo ya lazima na data isiyo ya kawaida kwa uwezo wa kupima vizuri na kufanya kazi kwa uhakika. Baada ya yote, kwa kweli, kikundi ambacho kinajumuisha vituo vitatu vya data, ambayo kila moja ina nodes tano, na kiwango cha kukubalika cha kuhifadhi data (wakati hakuna kitu kinachopotea), kinaweza kuishi kifo cha kituo kimoja cha data kabisa. Na nodi mbili zaidi katika kila moja iliyobaki. Na tu baada ya hii matatizo huanza. Hii ni upungufu mzuri sana, inafaa viendeshi kadhaa vya ziada vya SSD na wasindikaji. Kwa hiyo, ili kutumia Cassandra, ambayo sio SQL kamwe, ambayo hakuna mahusiano, funguo za kigeni, unahitaji kujua sheria rahisi.

Tunatengeneza kila kitu kulingana na ombi lako. Jambo kuu sio data, lakini jinsi programu itafanya kazi nayo. Ikiwa inahitaji kupokea data tofauti kwa njia tofauti au data sawa kwa njia tofauti, lazima tuiweke kwa njia ambayo ni rahisi kwa programu. Vinginevyo, tutashindwa katika Uchanganuzi Kamili na Cassandra hatatupa faida yoyote.

Kurekebisha data ni jambo la kawaida. Tunasahau kuhusu fomu za kawaida, hatuna tena hifadhidata za uhusiano. Ikiwa tutaweka kitu chini mara 100, kitalala mara 100. Bado ni nafuu kuliko kuacha.

Tunachagua funguo za kugawanya ili zisambazwe kawaida. Hatutaki heshi ya funguo zetu ianguke katika safu moja finyu. Hiyo ni, mwaka wa kuzaliwa katika mfano hapo juu ni mfano mbaya. Kwa usahihi zaidi, ni vizuri ikiwa watumiaji wetu kawaida husambazwa kwa mwaka wa kuzaliwa, na mbaya ikiwa tunazungumza juu ya wanafunzi wa darasa la 5 - ugawaji huko hautakuwa mzuri sana.

Upangaji huchaguliwa mara moja katika hatua ya kuunda Ufunguo wa Kuunganisha. Ikiwa inahitaji kubadilishwa, tutalazimika kusasisha jedwali letu na ufunguo tofauti.

Na jambo muhimu zaidi: ikiwa tunahitaji kurejesha data sawa kwa njia 100 tofauti, basi tutakuwa na meza 100 tofauti.

Chanzo: mapenzi.com

Kuongeza maoni