Кассандра. Чӣ тавр набояд мурд, агар шумо танҳо Oracle донед

Салом, Хабр.

Номи ман Миша Бутримов, ман мехостам ба шумо каме дар бораи Кассандра нақл кунам. Ҳикояи ман барои онҳое, ки ҳеҷ гоҳ бо пойгоҳи додаҳои NoSQL дучор нашудаанд, муфид хоҳад буд - он дорои бисёр хусусиятҳои татбиқ ва домҳо мебошад, ки шумо бояд дар бораи онҳо донед. Ва агар шумо чизе ғайр аз Oracle ё ягон махзани дигари релятсионӣ надида бошед, ин чизҳо ҳаёти шуморо наҷот медиҳанд.

Кассандра чӣ чизи хубе дорад? Ин махзани NoSQL мебошад, ки бидуни як нуқтаи нокомӣ тарҳрезӣ шудааст, ки миқёси хуб дорад. Агар ба шумо лозим аст, ки барои баъзе пойгоҳи додаҳо якчанд терабайт илова кунед, шумо танҳо гиреҳҳоро ба ҳалқа илова мекунед. Онро ба дигар маркази додаҳо васеъ кунед? Ба кластер гиреҳҳо илова кунед. RPS-и коркардшударо зиёд кунед? Ба кластер гиреҳҳо илова кунед. Он дар самти муқобил низ кор мекунад.

Кассандра. Чӣ тавр набояд мурд, агар шумо танҳо Oracle донед

Вай боз дар чӣ хуб аст? Ин дар бораи коркарди бисёр дархостҳо мебошад. Аммо чӣ қадар зиёд аст? 10, 20, 30, 40 ҳазор дархост дар як сония зиёд нест. 100 ҳазор дархост дар як сония барои сабт - низ. Ширкатҳое ҳастанд, ки мегӯянд, ки онҳо дар як сония 2 миллион дархостро нигоҳ медоранд. Эҳтимол онҳо бояд ба он бовар кунанд.

Ва аслан, Кассандра аз маълумоти релятсионӣ як фарқияти калон дорад - он ба онҳо тамоман монанд нест. Ва инро дар хотир доштан хеле муҳим аст.

На ҳама чизе, ки якхела аст, якхела кор мекунад

Боре як ҳамкорам назди ман омада пурсид: “Ин ҷо як забони дархости CQL Cassandra аст ва он изҳороти интихобӣ дорад, дар куҷо дорад, дорад ва. Ман мактуб менависам ва он кор намекунад. Чаро?". Муносибати Кассандра ҳамчун пойгоҳи додаҳои муносибатҳо роҳи беҳтарини худкушии зӯроварӣ мебошад. Ва ман онро тарғиб намекунам, он дар Русия манъ аст. Шумо танҳо чизи нодурустро тарҳрезӣ мекунед.

Масалан, мизочон ба назди мо омада мегуяд: «Биёед, базаи маълумотхои сериалхои телевизионй, ё базаи маълумотнома барои рецептхо созем. Мо дар он ҷо таомҳои хӯрокворӣ ва ё рӯйхати сериалҳо ва ҳунармандонро дар он хоҳем дошт”. Мо хурсандона мегуем: «Биёед!». Танҳо ду байт, якчанд аломат фиристед ва шумо иҷро шудед, ҳама чиз хеле зуд ва боэътимод кор мекунад. Ва ҳамааш хуб аст, то он даме, ки муштариён омада гӯянд, ки занҳои хонашин ҳам масъалаи баръаксро ҳал мекунанд: онҳо номгӯи маҳсулот доранд ва мехоҳанд бидонанд, ки кадом таомро пухтан мехоҳанд. Шумо мурдаед.

Сабаб дар он аст, ки Кассандра пойгоҳи додаҳои гибридӣ аст: он ҳамзамон арзиши калидӣ медиҳад ва маълумотро дар сутунҳои васеъ нигоҳ медорад. Дар Java ё Котлин онро метавон чунин тавсиф кард:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Яъне харитае, ки дорои харитаи мураттабшуда низ мебошад. Калиди аввалини ин харита калиди сатр ё калиди тақсимкунӣ - калиди тақсимкунӣ мебошад. Калиди дуюм, ки калиди харитаи аллакай мураттабшуда аст, калиди Clustering аст.

Барои тасвир кардани тақсимоти базаи маълумот, биёед се гиреҳро кашем. Акнун шумо бояд фаҳмед, ки чӣ гуна маълумотро ба гиреҳҳо тақсим кардан мумкин аст. Зеро, агар мо ҳама чизро ба як банд кунем (дар омади гап, ҳазор, ду ҳазор, панҷ - ҳар қадаре ки шумо мехоҳед) вуҷуд дорад, ин аслан дар бораи тақсимот нест. Аз ин рӯ, ба мо функсияи математикие лозим аст, ки рақамро баргардонад. Танҳо як адад, як int дароз, ки ба баъзе диапазон афтод. Ва мо як гиреҳе хоҳем дошт, ки барои як диапазон масъул аст, дуюм барои дуюм, nум барои nth.

Кассандра. Чӣ тавр набояд мурд, агар шумо танҳо Oracle донед

Ин рақам бо истифода аз функсияи hash гирифта мешавад, ки ба он чизе ки мо калиди Partition меномем, истифода мешавад. Ин сутунест, ки дар дастури калиди ибтидоӣ муайян шудааст ва ин сутунест, ки калиди аввалин ва асосии харита хоҳад буд. Он муайян мекунад, ки кадом гиреҳ кадом маълумотро қабул мекунад. Дар Кассандра ҷадвал бо тақрибан ҳамон синтаксиси SQL сохта шудааст:

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

)

Калиди ибтидоӣ дар ин ҳолат аз як сутун иборат аст ва он инчунин калиди тақсимкунӣ мебошад.

Корбарони мо чӣ гуна кор хоҳанд кард? Баъзеҳо ба як гиреҳ, баъзеҳо ба дигар ва баъзеҳо ба сеюм хоҳанд рафт. Дар натиҷа як ҷадвали оддии хэш аст, ки онро харита низ меноманд, ки ҳамчун луғат дар Python маъруф аст ё сохтори оддии арзиши Калид, ки мо метавонем ҳамаи арзишҳоро бо калид хонем, хонем ва нависем.

Кассандра. Чӣ тавр набояд мурд, агар шумо танҳо Oracle донед

Интихоб кунед: ҳангоми иҷозат додан ба филтр ба скани пурра табдил меёбад ё чӣ кор кардан лозим нест

Биёед як изҳороти интихобшударо нависед: select * from users where, userid = . Чунин ба назар мерасад, ки дар Oracle: мо интихоб менависем, шартҳоро муайян мекунем ва ҳама чиз кор мекунад, корбарон онро мегиранд. Аммо агар шумо, масалан, корбареро, ки соли таваллудаш дорад, интихоб кунед, Кассандра шикоят мекунад, ки он дархостро иҷро карда наметавонад. Азбаски вай дар бораи чӣ гуна паҳн кардани маълумот дар бораи соли таваллуд чизе намедонад - вай танҳо як сутун дорад, ки ҳамчун калид нишон дода шудааст. Баъд вай мегӯяд: «Хуб, ман метавонам ин дархостро иҷро кунам. Илова кардани филтр иҷозат диҳед." Мо дастурро илова мекунем, ҳама чиз кор мекунад. Ва дар ин лаҳза чизи даҳшатнок рӯй медиҳад.

Вақте ки мо дар бораи маълумоти санҷиш кор мекунем, ҳама чиз хуб аст. Ва вақте ки шумо дархостро дар истеҳсолот иҷро мекунед, ки мо, масалан, 4 миллион сабт дорем, пас ҳама чиз барои мо чандон хуб нест. Зеро иҷозат додани филтр ин дастурест, ки ба Кассандра имкон медиҳад, ки тамоми маълумотро аз ин ҷадвал аз ҳама гиреҳҳо, ҳама марказҳои додаҳо (агар шумораи онҳо дар ин кластер зиёд бошад) ҷамъоварӣ кунад ва танҳо баъд онро филтр кунад. Ин як аналоги Full Scan аст ва базӯр касе аз он хурсанд нест.

Агар ба мо танҳо корбарон аз рӯи ID лозим мешуд, мо бо ин хуб мешудем. Аммо баъзан ба мо лозим меояд, ки дархостҳои дигар нависем ва дар интихоби дигар маҳдудиятҳо ҷорӣ кунем. Аз ин рӯ, мо дар хотир дорем: ин ҳама харитаест, ки калиди тақсимкунӣ дорад, аммо дар дохили он харитаи мураттабшуда аст.

Ва вай инчунин як калид дорад, ки мо онро Калиди кластерӣ меномем. Ин калид, ки дар навбати худ аз сутунҳое иборат аст, ки мо интихоб мекунем ва бо ёрии онҳо Кассандра мефаҳмад, ки чӣ тавр маълумотҳои он аз ҷиҳати ҷисмонӣ мураттаб карда мешаванд ва дар ҳар як гиреҳ ҷойгир мешаванд. Яъне, барои баъзе калиди Partition, калиди Clustering ба шумо аниқ мегӯяд, ки чӣ гуна маълумотро ба ин дарахт тела додан лозим аст, ки он дар куҷо ҷойгир аст.

Ин воқеан дарахт аст, муқоисакунандаро дар он ҷо ба таври оддӣ меноманд, ки мо ба он маҷмӯи муайяни сутунҳоро дар шакли объект мегузорем ва он ҳамчун рӯйхати сутунҳо низ муайян карда мешавад.

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

Ба дастури калиди ибтидоӣ диққат диҳед; далели аввалини он (дар ҳолати мо, сол) ҳамеша калиди тақсимот аст. Он метавонад аз як ё якчанд сутун иборат бошад, муҳим нест. Агар якчанд сутун вуҷуд дошта бошад, онро аз нав дар қавс хориҷ кардан лозим аст, то протсессори забон фаҳмад, ки ин калиди ибтидоӣ аст ва дар паси он ҳамаи сутунҳои дигар калиди Clustering мебошанд. Дар ин ҳолат, онҳо дар муқоиса бо тартиби пайдоиши онҳо интиқол дода мешаванд. Яъне, сутуни якум назаррастар аст, дуюм камтар аҳамият дорад ва ғайра. Чӣ тавр мо менависем, масалан, майдонҳоро барои синфҳои додаҳо баробар мекунад: мо майдонҳоро номбар мекунем ва барои онҳо менависем, ки кадомашон калонтар ва кадомашон хурдтаранд. Дар Кассандра, инҳо, нисбатан гӯем, майдонҳои синфи маълумот мебошанд, ки ба онҳо баробарҳои барои он навишташуда татбиқ карда мешаванд.

Мо ҷудокунӣ муқаррар карда, маҳдудиятҳо ҷорӣ мекунем

Шумо бояд дар хотир дошта бошед, ки тартиби навъбандӣ (камшаванда, болоравӣ, ҳар чизе) дар ҳамон лаҳзае, ки калид сохта мешавад, муқаррар карда мешавад ва онро баъдтар тағир додан мумкин нест. Он аз ҷиҳати ҷисмонӣ муайян мекунад, ки маълумот чӣ гуна ба тартиб дароварда мешавад ва чӣ гуна нигоҳ дошта мешавад. Агар ба шумо лозим аст, ки калиди кластер ё тартиби ҷудокуниро тағир диҳед, шумо бояд ҷадвали нав эҷод кунед ва маълумотро ба он интиқол диҳед. Ин бо як мавҷуда кор намекунад.

Кассандра. Чӣ тавр набояд мурд, агар шумо танҳо Oracle донед

Мо ҷадвали худро бо корбарон пур кардем ва дидем, ки онҳо аввал аз рӯи соли таваллуд ба ҳалқа афтоданд ва баъд дар дохили ҳар як гиреҳ аз рӯи маош ва ID корбар. Акнун мо метавонем бо гузоштани маҳдудиятҳо интихоб кунем.

Кори мо боз пайдо мешавад where, and, ва мо корбаронро мегирем ва ҳама чиз боз хуб аст. Аммо агар мо кӯшиш кунем, ки танҳо як қисми калиди Clustering ва калиди камтар муҳимро истифода барем, он гоҳ Кассандра дарҳол шикоят мекунад, ки дар харитаи мо ҷойеро пайдо карда наметавонад, ки ин объект, ки ин майдонҳо барои муқоисаи нул дорад ва ин як ки навакак гузошта шуда буд , - дар куҷо хобидааст. Ман бояд тамоми маълумотро аз ин гиреҳ дубора бардорам ва онро филтр кунам. Ва ин аналоги пурраи Scan дар дохили гиреҳ аст, ин бад аст.

Дар ҳама ҳолатҳои норавшан ҷадвали нав созед

Агар мо хоҳем, ки корбаронро аз рӯи ID, ё синну сол ё аз рӯи маош ҳадаф гирифта тавонем, мо бояд чӣ кор кунем? Ҳеҷ чиз. Танҳо ду ҷадвалро истифода баред. Агар ба шумо лозим аст, ки ба корбарон бо се роҳи гуногун муроҷиат кунед, се ҷадвал вуҷуд дорад. Рӯзе, ки мо дар винт ҷойро сарфа кардем, гузаштанд. Ин арзонтарин захира аст. Он назар ба вақти посух хеле камтар арзиш дорад, ки метавонад ба корбар зарар расонад. Барои корбар дар як сония гирифтани чизе назар ба 10 дақиқа хеле гуворотар аст.

Мо фазои нолозим ва маълумоти ғайримуқаррариро барои қобилияти миқёси хуб ва боэътимод кор мекунем. Дар ниҳоят, дар асл, кластере, ки аз се маркази додаҳо иборат аст, ки ҳар яки онҳо панҷ гиреҳ доранд, бо сатҳи қобили қабули нигоҳдории маълумот (вақте ки ҳеҷ чиз гум намешавад) метавонад аз марги як маркази додаҳо комилан наҷот ёбад. Ва ду гиреҳи дигар дар ҳар дуи боқимонда. Ва танҳо пас аз ин мушкилот оғоз меёбад. Ин як зиёдатӣ хеле хуб аст, он ба маблағи якчанд дискҳои иловагӣ SSD ва протсессори аст. Аз ин рӯ, барои истифодаи Кассандра, ки ҳеҷ гоҳ SQL нест, ки дар он муносибатҳо, калидҳои хориҷӣ вуҷуд надоранд, шумо бояд қоидаҳои оддиро донед.

Мо ҳама чизро мувофиқи дархости шумо тарҳрезӣ мекунем. Чизи асосӣ ин маълумот нест, балки чӣ гуна барнома бо он кор мекунад. Агар ба он лозим бошад, ки маълумоти гуногунро бо роҳҳои гуногун ё як маълумотро бо роҳҳои гуногун қабул кунад, мо бояд онро тавре гузорем, ки барои барнома мувофиқ бошад. Дар акси ҳол, мо дар Scan пурра ноком мешавем ва Кассандра ба мо ягон бартарӣ намедиҳад.

Денормативизатсияи маълумот меъёр аст. Мо шаклҳои муқаррариро фаромӯш мекунем, мо дигар пойгоҳи додаҳои релятсионӣ надорем. Агар мо чизеро 100 маротиба гузорем, он 100 маротиба мехобад. Он ҳанӯз ҳам арзонтар аз таваққуф аст.

Мо калидҳоро барои тақсимкунӣ интихоб мекунем, то онҳо ба таври муқаррарӣ тақсим карда шаванд. Мо намехоҳем, ки хэши калидҳои мо ба як доираи танг афтад. Яъне соли таваллуд дар мисоли боло мисоли бад аст. Аниқтараш, хуб аст, ки корбарони мо одатан аз рӯи соли таваллуд тақсим карда шаванд ва бад аст, агар сухан дар бораи хонандагони синфи 5 бошад - тақсимот он ҷо чандон хуб нахоҳад буд.

Мураттабсозӣ як маротиба дар марҳилаи эҷоди калиди кластерӣ интихоб карда мешавад. Агар он тағир дода шавад, мо бояд ҷадвали худро бо калиди дигар навсозӣ кунем.

Ва чизи аз ҳама муҳим: агар ба мо лозим аст, ки ҳамон як маълумотро бо 100 роҳҳои гуногун дарёфт кунем, пас мо 100 ҷадвали гуногун дорем.

Манбаъ: will.com

Илова Эзоҳ