Cassandra. Sut i beidio â marw os mai dim ond Oracle rydych chi'n ei adnabod

Hei Habr.

Fy enw i yw Misha Butrimov, hoffwn ddweud ychydig wrthych am Cassandra. Bydd fy stori yn ddefnyddiol i'r rhai nad ydynt erioed wedi dod ar draws cronfeydd data NoSQL - mae ganddi lawer o nodweddion gweithredu a pheryglon y mae angen i chi wybod amdanynt. Ac os nad ydych wedi gweld unrhyw beth heblaw Oracle neu unrhyw gronfa ddata berthynol arall, bydd y pethau hyn yn achub eich bywyd.

Beth sydd mor dda am Cassandra? Mae'n gronfa ddata NoSQL a ddyluniwyd heb un pwynt methiant sy'n graddio'n dda. Os oes angen i chi ychwanegu cwpl o terabytes ar gyfer rhywfaint o gronfa ddata, yn syml, rydych chi'n ychwanegu nodau i'r cylch. Ei ehangu i ganolfan ddata arall? Ychwanegu nodau i'r clwstwr. Cynyddu RPS wedi'i brosesu? Ychwanegu nodau i'r clwstwr. Mae'n gweithio i'r cyfeiriad arall hefyd.

Cassandra. Sut i beidio â marw os mai dim ond Oracle rydych chi'n ei adnabod

Beth arall mae hi'n dda yn ei wneud? Mae'n ymwneud ag ymdrin â llawer o geisiadau. Ond faint yw llawer? Nid yw 10, 20, 30, 40 ceisiadau yr eiliad yn llawer. 100 mil o geisiadau yr eiliad am recordio - hefyd. Mae yna gwmnïau a ddywedodd eu bod yn cadw 2 filiwn o geisiadau yr eiliad. Mae'n debyg y bydd yn rhaid iddyn nhw ei gredu.

Ac mewn egwyddor, mae gan Cassandra un gwahaniaeth mawr o ddata perthynol - nid yw'n debyg iddynt o gwbl. Ac mae hyn yn bwysig iawn i'w gofio.

Nid yw popeth sy'n edrych yr un peth yn gweithio'r un peth

Unwaith y daeth cydweithiwr ataf a gofyn: “Dyma iaith ymholiad CQL Cassandra, ac mae ganddi ddatganiad dethol, mae ganddo ble, mae wedi ac. Rwy'n ysgrifennu llythyrau ac nid yw'n gweithio. Pam?". Mae trin Cassandra fel cronfa ddata berthynol yn ffordd berffaith o gyflawni hunanladdiad treisgar. Ac nid wyf yn ei hyrwyddo, mae wedi'i wahardd yn Rwsia. Byddwch yn dylunio rhywbeth o'i le.

Er enghraifft, daw cwsmer atom a dweud: “Gadewch i ni adeiladu cronfa ddata ar gyfer cyfresi teledu, neu gronfa ddata ar gyfer cyfeiriadur ryseitiau. Bydd gennym ni seigiau bwyd yno neu restr o gyfresi teledu ac actorion ynddo.” Rydyn ni'n dweud yn llawen: "Dewch i ni!" Anfonwch ddau beit, ychydig o arwyddion ac rydych chi wedi gorffen, bydd popeth yn gweithio'n gyflym iawn ac yn ddibynadwy. Ac mae popeth yn iawn nes bod y cwsmeriaid yn dod i ddweud bod gwragedd tŷ hefyd yn datrys y broblem arall: mae ganddyn nhw restr o gynhyrchion, ac maen nhw eisiau gwybod pa bryd maen nhw am ei goginio. Rydych chi wedi marw.

Mae hyn oherwydd bod Cassandra yn gronfa ddata hybrid: ar yr un pryd mae'n darparu gwerth allweddol ac yn storio data mewn colofnau eang. Yn Java neu Kotlin, gellid ei ddisgrifio fel hyn:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Hynny yw, map sydd hefyd yn cynnwys map wedi'i ddidoli. Allwedd gyntaf y map hwn yw'r allwedd Row neu'r allwedd Rhaniad - yr allwedd rhannu. Yr ail allwedd, sef yr allwedd i fap sydd eisoes wedi'i ddidoli, yw'r allwedd Clystyru.

I ddangos dosbarthiad y gronfa ddata, gadewch i ni dynnu tri nod. Nawr mae angen i chi ddeall sut i ddadelfennu'r data yn nodau. Oherwydd os ydym yn gwasgu popeth yn un (gyda llaw, gall fod mil, dwy fil, pump - cymaint ag y dymunwch), nid yw hyn yn ymwneud â dosbarthu mewn gwirionedd. Felly, mae angen swyddogaeth fathemategol a fydd yn dychwelyd rhif. Dim ond rhif, int hir a fydd yn disgyn i ryw ystod. A bydd gennym un nod yn gyfrifol am un ystod, yr ail ar gyfer yr ail, yr nfed un am yr nfed.

Cassandra. Sut i beidio â marw os mai dim ond Oracle rydych chi'n ei adnabod

Cymerir y rhif hwn gan ddefnyddio ffwythiant hash, sy'n cael ei gymhwyso i'r hyn a alwn yn allwedd Rhaniad. Dyma'r golofn a nodir yn y gyfarwyddeb bysellau Cynradd, a dyma'r golofn a fydd yn allwedd gyntaf a mwyaf sylfaenol y map. Mae'n pennu pa nod fydd yn derbyn pa ddata. Mae tabl yn cael ei greu yn Cassandra gyda bron yr un gystrawen ag yn SQL:

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

)

Mae'r allwedd Gynradd yn yr achos hwn yn cynnwys un golofn, a dyma'r allwedd rhannu hefyd.

Sut bydd ein defnyddwyr yn perfformio? Bydd rhai yn mynd i un nod, rhai i un arall, a rhai i drydydd. Y canlyniad yw tabl hash cyffredin, a elwir hefyd yn fap, a elwir hefyd yn eiriadur yn Python, neu strwythur gwerth Allwedd syml y gallwn ddarllen yr holl werthoedd ohono, darllen ac ysgrifennu yn ôl allwedd.

Cassandra. Sut i beidio â marw os mai dim ond Oracle rydych chi'n ei adnabod

Dewiswch: pan fydd caniatáu hidlo yn troi'n sgan llawn, neu beth i beidio â'i wneud

Gadewch i ni ysgrifennu datganiad dethol: select * from users where, userid = . Mae'n troi allan fel yn Oracle: rydym yn ysgrifennu dethol, nodi'r amodau a phopeth yn gweithio, mae defnyddwyr yn ei gael. Ond os dewiswch, er enghraifft, ddefnyddiwr â blwyddyn geni benodol, mae Cassandra yn cwyno na all gyflawni'r cais. Gan nad yw hi'n gwybod unrhyw beth o gwbl am sut rydyn ni'n dosbarthu data am flwyddyn geni - dim ond un golofn sydd ganddi wedi'i nodi fel allwedd. Yna mae hi'n dweud, “Iawn, gallaf gyflawni'r cais hwn o hyd. Ychwanegu caniatáu hidlo." Rydyn ni'n ychwanegu'r gyfarwyddeb, mae popeth yn gweithio. Ac ar hyn o bryd mae rhywbeth ofnadwy yn digwydd.

Pan fyddwn yn rhedeg ar ddata prawf, mae popeth yn iawn. A phan fyddwch chi'n gweithredu ymholiad wrth gynhyrchu, lle mae gennym ni, er enghraifft, 4 miliwn o gofnodion, yna nid yw popeth yn dda iawn i ni. Gan fod caniatáu hidlo yn gyfarwyddeb sy'n caniatáu i Cassandra gasglu'r holl ddata o'r tabl hwn o'r holl nodau, yr holl ganolfannau data (os oes llawer ohonynt yn y clwstwr hwn), a dim ond wedyn ei hidlo. Mae hwn yn analog o Full Scan, a phrin fod neb wrth ei fodd ag ef.

Pe bai angen defnyddwyr â ID yn unig arnom, byddem yn iawn â hyn. Ond weithiau mae angen i ni ysgrifennu ymholiadau eraill a gosod cyfyngiadau eraill ar y dewis. Felly, cofiwn: mae hwn i gyd yn fap sydd ag allwedd rhannu, ond y tu mewn iddo mae map wedi'i ddidoli.

Ac mae ganddi hefyd allwedd, yr ydym yn ei galw'r Allwedd Clystyru. Mae'r allwedd hon, sydd, yn ei dro, yn cynnwys y colofnau rydyn ni'n eu dewis, gyda chymorth y mae Cassandra yn deall sut mae ei ddata wedi'i ddidoli'n gorfforol a bydd yn cael ei leoli ar bob nod. Hynny yw, ar gyfer rhai allwedd Rhaniad, bydd yr allwedd Clystyru yn dweud wrthych yn union sut i wthio'r data i'r goeden hon, pa le y bydd yn ei gymryd yno.

Coeden yw hon mewn gwirionedd, a gelwir cymharydd yno, ac rydym yn pasio set benodol o golofnau iddi ar ffurf gwrthrych, ac fe'i nodir hefyd fel rhestr o golofnau.

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

Rhowch sylw i'r brif gyfarwyddeb allweddol; ei dadl gyntaf (yn ein hachos ni, y flwyddyn) yw'r allwedd Rhaniad bob amser. Gall gynnwys un neu fwy o golofnau, does dim ots. Os oes sawl colofn, mae angen ei dynnu mewn cromfachau eto fel bod y rhagbrosesydd iaith yn deall mai dyma'r allwedd Gynradd, a'r allwedd Clystyru yw'r colofnau eraill y tu ôl iddo. Yn yr achos hwn, byddant yn cael eu trosglwyddo yn y cymharydd yn y drefn y maent yn ymddangos. Hynny yw, mae'r golofn gyntaf yn fwy arwyddocaol, mae'r ail yn llai arwyddocaol, ac yn y blaen. Mae sut rydym yn ysgrifennu, er enghraifft, yn hafal i feysydd ar gyfer dosbarthiadau data: rydym yn rhestru'r meysydd, ac ar eu cyfer rydym yn ysgrifennu pa rai sy'n fwy a pha rai sy'n llai. Yn Cassandra, mae'r rhain, yn gymharol siarad, yn feysydd y dosbarth data, y bydd yr hafaliadau a ysgrifennwyd ar ei gyfer yn cael eu cymhwyso atynt.

Rydym yn gosod didoli ac yn gosod cyfyngiadau

Mae angen i chi gofio bod y drefn ddidoli (i lawr, esgynnol, beth bynnag) yn cael ei osod ar yr un funud pan fydd yr allwedd yn cael ei chreu, ac ni ellir ei newid yn ddiweddarach. Mae'n pennu'n ffisegol sut y caiff y data ei ddidoli a sut y caiff ei storio. Os oes angen i chi newid yr allwedd Clystyru neu drefn didoli, bydd yn rhaid i chi greu tabl newydd a throsglwyddo data i mewn iddo. Ni fydd hyn yn gweithio gydag un sy'n bodoli eisoes.

Cassandra. Sut i beidio â marw os mai dim ond Oracle rydych chi'n ei adnabod

Fe wnaethom lenwi ein bwrdd gyda defnyddwyr a gweld eu bod yn syrthio i fodrwy, yn gyntaf yn ôl blwyddyn eu geni, ac yna y tu mewn ar bob nod yn ôl cyflog ac ID defnyddiwr. Nawr gallwn ddewis trwy osod cyfyngiadau.

Mae ein un gweithredol yn ymddangos eto where, and, ac rydym yn cael defnyddwyr, ac mae popeth yn iawn eto. Ond os byddwn yn ceisio defnyddio dim ond rhan o'r allwedd Clystyru, ac un llai arwyddocaol, yna bydd Cassandra yn cwyno ar unwaith na all ddod o hyd i'r man ar ein map lle mae'r gwrthrych hwn, sydd â'r meysydd hyn ar gyfer y cymharydd null, a'r un hwn dyna oedd newydd osod , - lle mae'n gorwedd . Bydd yn rhaid i mi dynnu'r holl ddata o'r nod hwn eto a'i hidlo. Ac mae hwn yn analog o Scan Llawn o fewn nod, mae hyn yn ddrwg.

Mewn unrhyw sefyllfa aneglur, crëwch dabl newydd

Os ydym am allu targedu defnyddwyr yn ôl ID, neu yn ôl oedran, neu yn ôl cyflog, beth ddylem ni ei wneud? Dim byd. Defnyddiwch ddau dabl yn unig. Os oes angen i chi gyrraedd defnyddwyr mewn tair ffordd wahanol, bydd tri thabl. Mae'r dyddiau pan wnaethom arbed lle ar y sgriw wedi mynd. Dyma'r adnodd rhataf. Mae'n costio llawer llai nag amser ymateb, a all fod yn niweidiol i'r defnyddiwr. Mae'n llawer mwy dymunol i'r defnyddiwr dderbyn rhywbeth mewn eiliad nag mewn 10 munud.

Rydym yn masnachu gofod diangen a data dadnormaleiddio ar gyfer y gallu i raddfa dda a gweithredu'n ddibynadwy. Wedi'r cyfan, mewn gwirionedd, mae clwstwr sy'n cynnwys tair canolfan ddata, ac mae gan bob un ohonynt bum nod, gyda lefel dderbyniol o gadw data (pan nad oes dim yn cael ei golli), yn gallu goroesi marwolaeth un ganolfan ddata yn llwyr. A dau nod arall ym mhob un o'r ddau sy'n weddill. A dim ond ar ôl hyn mae'r problemau'n dechrau. Mae hwn yn ddiswyddiad eithaf da, mae'n werth cwpl o yriannau a phroseswyr SSD ychwanegol. Felly, er mwyn defnyddio Cassandra, nad yw byth yn SQL, lle nad oes perthnasoedd, allweddi tramor, mae angen i chi wybod rheolau syml.

Rydym yn dylunio popeth yn ôl eich cais. Nid y data yw'r prif beth, ond sut mae'r cais yn mynd i weithio gydag ef. Os oes angen iddo dderbyn data gwahanol mewn ffyrdd gwahanol neu'r un data mewn gwahanol ffyrdd, rhaid inni ei roi mewn ffordd sy'n gyfleus ar gyfer y cais. Fel arall, byddwn yn methu yn Sgan Llawn ac ni fydd Cassandra yn rhoi unrhyw fantais i ni.

Dadnormaleiddio data yw'r norm. Rydym yn anghofio am ffurflenni arferol, nid oes gennym gronfeydd data perthynol mwyach. Os byddwn yn rhoi rhywbeth i lawr 100 gwaith, bydd yn gorwedd i lawr 100 gwaith. Mae'n dal yn rhatach na stopio.

Rydyn ni'n dewis yr allweddi ar gyfer rhannu fel eu bod yn cael eu dosbarthu'n normal. Nid ydym am i'r hash o'n allweddi ddisgyn i un ystod gyfyng. Hynny yw, mae blwyddyn geni yn yr enghraifft uchod yn enghraifft wael. Yn fwy manwl gywir, mae'n dda os yw ein defnyddwyr yn cael eu dosbarthu fel arfer yn ôl blwyddyn geni, ac yn ddrwg os ydym yn sôn am fyfyrwyr gradd 5 - ni fydd y rhaniad yno yn dda iawn.

Dewisir didoli unwaith yn y cam creu Allwedd Clystyru. Os oes angen ei newid, bydd yn rhaid i ni ddiweddaru ein tabl gydag allwedd wahanol.

A'r peth pwysicaf: os oes angen i ni adfer yr un data mewn 100 o wahanol ffyrdd, yna bydd gennym ni 100 o wahanol dablau.

Ffynhonnell: hab.com

Ychwanegu sylw