Кассандра. Эгер сиз Oracle гана билсеңиз, кантип өлбөйсүз

Эй Хабр.

Менин атым Миша Бутримов, мен сизге Кассандра жөнүндө бир аз айтып бергим келет. Менин окуям NoSQL маалымат базасын эч качан жолуктурбагандар үчүн пайдалуу болот - анда көптөгөн ишке ашыруу өзгөчөлүктөрү жана сиз билишиңиз керек болгон тузактар ​​бар. Эгер сиз Oracle же башка реляциялык маалымат базасынан башка эч нерсе көргөн эмес болсоңуз, анда бул нерселер сиздин өмүрүңүздү сактап калат.

Кассандранын эмнеси жакшы? Бул NoSQL маалымат базасы, жакшы масштабда бир да катачылыксыз иштелип чыккан. Эгер кээ бир маалыматтар базасына бир нече терабайт кошуу керек болсо, анда сиз жөн гана шакекчеге түйүндөрдү кошосуз. Аны башка маалымат борборуна кеңейтесизби? Кластерге түйүндөрдү кошуңуз. Кайра иштетилген RPS көбөйтүлсүнбү? Кластерге түйүндөрдү кошуңуз. Ал тескери багытта да иштейт.

Кассандра. Эгер сиз Oracle гана билсеңиз, кантип өлбөйсүз

Ал дагы эмнеге жакшы? Бул көп суроо-талаптарды чечүү жөнүндө. Бирок канча көп? Секундасына 10, 20, 30, 40 миң суроо көп эмес. Жазуу үчүн секундасына 100 миң суроо - да. Секундасына 2 миллион суроону сактайбыз деген компаниялар бар. Алар, балким, ишениш керек.

Ал эми негизинен, Кассандранын реляциялык маалыматтардан бир чоң айырмасы бар - бул аларга такыр окшош эмес. Жана бул эстен чыгарбоо абдан маанилүү.

Бирдей көрүнгөндүн баары бирдей иштей бербейт

Бир жолу мага кесиптешим келип: “Бул жерде CQL Cassandra сурам тили, анын тандоо билдирүүсү бар, анын кайда, бар жана бар. Кат жазам, иштебейт. Неге?". Кассандрага реляциялык маалымат базасы сыяктуу мамиле кылуу - зордук-зомбулук менен өзүн-өзү өлтүрүүнүн эң сонун жолу. Ал эми мен аны жайылтып жаткан жокмун, Орусияда тыюу салынган. Сиз жөн гана туура эмес бир нерсени иштеп чыгасыз.

Мисалы, бизге кардар келип: «Келгиле, телесериалдар үчүн маалымат базасын, же рецепттер каталогуна база түзөлү. Ал жерде тамак аштар же сериалдардын жана актёрлордун тизмеси болот”. Кубанып: «Кеттик!» дейбиз. Жөн гана эки байтты, бир нече белгини жөнөтүңүз жана бүттүңүз, баары абдан тез жана ишенимдүү иштейт. Ал эми кардарлар келип, үй кожойкелери да карама-каршы маселени чечип жатканын айтышмайынча баары жакшы: аларда товарлардын тизмеси бар, алар кандай тамак жасагысы келгенин билгиси келет. Сен өлүксүң.

Себеби Кассандра гибрид маалымат базасы болуп саналат: ал бир эле учурда негизги маанини берет жана маалыматтарды кең тилкелерде сактайт. Java же Котлинде муну мындайча сүрөттөсө болот:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

Башкача айтканда, ошондой эле сорттолгон картаны камтыган карта. Бул картанын биринчи ачкычы катар баскычы же Бөлүм ачкычы - бөлүү ачкычы. Экинчи ачкыч, буга чейин сорттолгон картанын ачкычы, Кластердик ачкыч.

Маалыматтар базасынын бөлүштүрүлүшүн көрсөтүү үчүн үч түйүндү тарталы. Эми сиз маалыматты түйүндөргө кантип ажыратуу керектигин түшүнүшүңүз керек. Анткени, эгерде биз бардыгын бир нерсеге тыгып алсак (айтмакчы, миң, эки миң, беш болушу мүмкүн – сиз каалагандай), бул бөлүштүрүү жөнүндө эмес. Демек, бизге санды кайтара турган математикалык функция керек. Жөн гана сан, кандайдыр бир диапазонго түшө турган узун инт. Ал эми бизде бир диапазон үчүн жооптуу бир түйүн болот, экинчиси экинчиси үчүн, nчүсү nчүсү үчүн.

Кассандра. Эгер сиз Oracle гана билсеңиз, кантип өлбөйсүз

Бул сан хэш функциясынын жардамы менен алынат, ал биз Бөлүм ачкычы деп атаган нерсеге колдонулат. Бул Негизги ачкыч директивасында көрсөтүлгөн тилке жана бул картанын биринчи жана эң негизги ачкычы боло турган тилке. Ал кайсы түйүн кайсы маалыматтарды алаарын аныктайт. Таблица Кассандрада 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 боюнча колдонуучулар гана керек болсо, анда биз муну менен жакшы болмок. Бирок кээде биз башка суроолорду жазып, тандоого башка чектөөлөрдү киргизишибиз керек. Ошондуктан, биз эсибизде: мунун баары бөлүүчү ачкычы бар карта, бирок анын ичинде сорттолгон карта бар.

Анын дагы ачкычы бар, аны биз Кластердик ачкыч деп атайбыз. Бул ачкыч, өз кезегинде, биз тандаган тилкелерден турат, анын жардамы менен Кассандра анын маалыматтары физикалык жактан кандайча иреттелгенин түшүнөт жана ар бир түйүндө жайгаштырылат. Башкача айтканда, кээ бир Бөлүм ачкычтары үчүн, Кластердик ачкыч бул даракка маалыматтарды кантип түртүүнү, ал жерде кайсы жерди ээлешин так айтып берет.

Бул чындап эле дарак, компаратор ошол жерде жөн гана деп аталат, ага биз объект түрүндө тилкелердин белгилүү бир топтомун өткөрүп беребиз жана ал тилкелердин тизмеси катары да көрсөтүлөт.

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

Негизги ачкыч директивасына көңүл буруңуз; анын биринчи аргументи (биздин учурда, жыл) ар дайым Бөлүм ачкычы болуп саналат. Ал бир же бир нече тилкеден турушу мүмкүн, бул маанилүү эмес. Эгерде бир нече мамычалар болсо, тилдин препроцессору бул Негизги ачкыч, ал эми анын артында калган бардык мамычалар Кластерлөө ачкычы экенин түшүнүшү үчүн аны кайра кашаанын ичинде алып салуу керек. Бул учурда, алар пайда болгон тартипте компаратордо берилет. Башкача айтканда, биринчи тилке олуттуураак, экинчиси анча маанилүү эмес ж.б.у.с. Кантип жазганыбыз, мисалы, маалымат класстары үчүн талааларга барабар: биз талааларды тизмектеп, алар үчүн кайсынысы чоңураак, кайсынысы кичине экенин жазабыз. Кассандрада бул, салыштырмалуу түрдө айтканда, маалымат классынын талаалары, ага жазылган бирдейликтер колдонулат.

Биз сорттоп, чектөөлөрдү киргизебиз

Сиз сорттоо тартиби (төмөн, өсүү, кандай болбосун) ачкыч түзүлгөн учурда орнотулат жана аны кийинчерээк өзгөртүү мүмкүн эмес экенин эстен чыгарбоо керек. Ал физикалык жактан берилиштер кандай иреттелип, кантип сакталаарын аныктайт. Кластерлөө ачкычын же сорттоо тартибин өзгөртүү керек болсо, анда жаңы таблица түзүп, ага маалыматтарды өткөрүп беришиңиз керек болот. Бул учурдагы менен иштебейт.

Кассандра. Эгер сиз Oracle гана билсеңиз, кантип өлбөйсүз

Биз үстөлүбүздү колдонуучулар менен толтурдук жана алар шакекчеге түшүп калганын көрдүк, алгач туулган жылы боюнча, андан кийин ар бир түйүндөн ичинде айлык акы жана колдонуучунун идентификатору боюнча. Эми биз чектөөлөрдү киргизүү менен тандай алабыз.

Биздин жумушчу кайра пайда болот where, and, жана биз колдонуучуларды алабыз, жана баары кайра жакшы. Бирок, эгерде биз Кластердик ачкычтын бир бөлүгүн гана колдонууга аракет кылсак, анда Кассандра дароо биздин картадан нөлдүк компаратор үчүн талаалары бар бул объекттин ордун таба албаганына нааразы болот. Бул жаңы эле коюлган , - ал кайда жатат. Мен бул түйүндөгү бардык маалыматтарды кайрадан чыгарып, чыпкалашым керек болот. Жана бул түйүн ичиндеги Full Scan аналогу, бул жаман.

Кандайдыр бир түшүнүксүз кырдаалда жаңы таблица түзүңүз

Эгерде биз колдонуучуларды идентификатору, жашы же эмгек акысы боюнча максаттуу кыла алгыбыз келсе, эмне кылышыбыз керек? Эч нерсе. Жөн гана эки үстөлдү колдонуңуз. Эгер колдонуучуларга үч түрдүү жол менен кайрылышыңыз керек болсо, анда үч таблица болот. Бурамада орун үнөмдөгөн күндөр артта калды. Бул эң арзан ресурс. Бул колдонуучуга зыян келтириши мүмкүн болгон жооп берүү убактысынан алда канча азыраак турат. Колдонуучуга 10 мүнөткө караганда бир нерсени секунданын ичинде алуу алда канча жагымдуу.

Биз керексиз мейкиндикти жана нормадан ажыратылган маалыматтарды жакшы масштабдоо жана ишенимдүү иштөө үчүн соодалайбыз. Чынында, үч маалымат борборунан турган кластер, алардын ар биринде беш түйүн бар, маалыматтарды сактоонун алгылыктуу деңгээли (эч нерсе жоголбогондо) бир маалымат борборунун өлүмүнө толугу менен туруштук бере алат. Ал эми калган экөөнүн ар биринде дагы эки түйүн. Ошондон кийин гана көйгөйлөр башталат. Бул абдан жакшы ашыкча, ал бир нече кошумча SSD дисктерин жана процессорлорун талап кылат. Ошондуктан, эч качан SQL болбогон, эч кандай мамилелери, тышкы ачкычтары жок Кассандраны колдонуу үчүн жөнөкөй эрежелерди билишиңиз керек.

Биз бардыгын сиздин сурооңуз боюнча долбоорлойбуз. Эң негизгиси маалыматтар эмес, колдонмо аны менен кантип иштей турганы. Эгерде ал ар кандай маалыматтарды ар кандай жолдор менен же бир эле маалыматтарды ар кандай жолдор менен алуу керек болсо, биз аны колдонмо үчүн ыңгайлуу кылып коюшубуз керек. Болбосо, биз Толук Скандоодо ийгиликсиз болуп калабыз жана Кассандра бизге эч кандай артыкчылык бербейт.

Берилиштерди нормалдаштыруу норма болуп саналат. Биз кадимки формаларды унутуп калдык, бизде реляциялык маалымат базалары жок. Бир нерсени 100 жолу жерге койсок, 100 жолу жатып калат. Бул дагы эле токтогондон арзаныраак.

Бөлүү үчүн баскычтарды алар кадимкидей бөлүштүрүлө тургандай кылып тандайбыз. Биз ачкычтарыбыздын хэшинин бир тар диапазонго түшүшүн каалабайбыз. Башкача айтканда, жогорудагы мисалдагы туулган жылы жаман мисал. Тагыраак айтканда, биздин колдонуучулар туулган жылы боюнча кадимкидей бөлүштүрүлсө жакшы, ал эми 5-класстын окуучулары жөнүндө сөз болсо жаман - ал жердеги бөлүү анча деле жакшы болбойт.

Сорттоо Кластердик ачкычты түзүү баскычында бир жолу тандалат. Эгер аны өзгөртүү керек болсо, анда биз столубузду башка ачкыч менен жаңыртышыбыз керек болот.

Жана эң негизгиси: эгерде биз бир эле маалыматтарды 100 түрдүү жол менен алуу керек болсо, анда бизде 100 түрдүү таблица болот.

Source: www.habr.com

Комментарий кошуу