Кассандра. Егер сіз тек Oracle-ді білсеңіз, қалай өлмеу керек

Эй Хабр.

Менің атым Миша Бутримов, мен сізге Кассандра туралы аздап айтқым келеді. Менің әңгімем NoSQL дерекқорларын ешқашан кездестірмегендерге пайдалы болады - оның көптеген іске асыру мүмкіндіктері мен сіз білуіңіз керек тұзақтар бар. Егер сіз Oracle немесе басқа реляциялық дерекқордан басқа ештеңе көрмеген болсаңыз, бұл нәрселер сіздің өміріңізді сақтайды.

Кассандраның несі жақсы? Бұл жақсы масштабталатын бір сәтсіздік нүктесінсіз жасалған NoSQL дерекқоры. Кейбір дерекқор үшін бірнеше терабайт қосу қажет болса, сіз жай ғана сақинаға түйіндерді қосасыз. Оны басқа деректер орталығына кеңейту керек пе? Кластерге түйіндерді қосыңыз. Өңделген RPS көбейту керек пе? Кластерге түйіндерді қосыңыз. Ол да қарама-қарсы бағытта жұмыс істейді.

Кассандра. Егер сіз тек Oracle-ді білсеңіз, қалай өлмеу керек

Ол тағы немен айналысады? Бұл көптеген сұраныстарды өңдеу туралы. Бірақ қанша көп? Секундына 10, 20, 30, 40 мың сұраныс көп емес. Жазу үшін секундына 100 мың сұраныс. Секундына 2 миллион сұраныс сақтайтынын айтқан компаниялар бар. Олар сену керек шығар.

Ал, негізінен, Кассандраның реляциялық деректерден бір үлкен айырмашылығы бар – ол оларға мүлдем ұқсамайды. Және бұл есте сақтау өте маңызды.

Бірдей көрінетіннің бәрі бірдей жұмыс істемейді

Бірде маған бір әріптесім келіп сұрады: «Міне, CQL Cassandra сұрау тілі, оның таңдау операторы бар, оның қайда, бар және бар. Мен хат жазамын, ол жұмыс істемейді. Неліктен?". Кассандраға қарым-қатынас деректері ретінде қарау - зорлық-зомбылықпен өзін-өзі өлтірудің тамаша тәсілі. Мен оны насихаттап жатқан жоқпын, Ресейде бұл тыйым салынған. Сіз жай ғана қате жобалайсыз.

Мысалы, бізге тапсырыс беруші келіп: «Телехикаялар үшін мәліметтер базасын, немесе рецепттер каталогының мәліметтер базасын құрастырайық. Онда бізде тағамдық тағамдар немесе онда сериалдар мен актерлер тізімі болады». Біз қуана айтамыз: «Кеттік!» Тек екі байтты, бірнеше белгілерді жіберіңіз және сіз аяқтадыңыз, бәрі өте тез және сенімді жұмыс істейді. Ал тапсырыс берушілер келіп, үй шаруасындағы әйелдер де қарама-қарсы мәселені шешіп жатқанын айтқанша бәрі жақсы: оларда өнімдердің тізімі бар және олар қандай тағам дайындағысы келетінін білгісі келеді. Сен өлдің.

Себебі Кассандра гибридті дерекқор болып табылады: ол бір уақытта негізгі мәнді береді және деректерді кең бағандарда сақтайды. Java немесе Kotlin тілінде оны келесідей сипаттауға болады:

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 миллион жазба бар өндірісте сұранысты орындаған кезде, біз үшін бәрі жақсы емес. Өйткені сүзуге рұқсат беру – Кассандраға осы кестедегі барлық түйіндерден, барлық деректер орталықтарынан (осы кластерде олардың көпшілігі болса) барлық деректерді жинауға, содан кейін ғана сүзуге мүмкіндік беретін директивалар. Бұл толық сканерлеудің аналогы және оны ешкім қуантпайды.

Егер бізге тек идентификаторы бойынша пайдаланушылар қажет болса, біз мұны жақсы болар едік. Бірақ кейде біз басқа сұрауларды жазып, таңдауға басқа шектеулер қоюымыз керек. Сондықтан біз есімізде: мұның бәрі бөлу кілті бар карта, бірақ оның ішінде сұрыпталған карта бар.

Оның да кілті бар, оны біз Кластер кілті деп атаймыз. Бұл кілт, ол, өз кезегінде, біз таңдайтын бағандардан тұрады, оның көмегімен Кассандра оның деректерінің физикалық сұрыпталғанын түсінеді және әрбір түйінде орналасады. Яғни, кейбір Бөлім кілті үшін Кластерлеу кілті деректерді осы ағашқа қалай итеру керектігін, оның қай жерде болатынын нақты айтады.

Бұл шын мәнінде ағаш, компаратор сол жерде жай ғана шақырылады, оған біз белгілі бір бағандар жинағын объект түрінде береміз және ол бағандар тізімі ретінде де көрсетіледі.

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, және біз пайдаланушыларды аламыз және бәрі қайтадан жақсы. Бірақ егер біз Кластерлеу кілтінің бір бөлігін ғана қолдануға тырыссақ, онда Кассандра біздің картадан нөлдік компараторға арналған өрістері бар бұл нысанды және осы бір орынды таба алмайтынына бірден шағымданады. бұл жай ғана орнатылған , - ол қайда жатыр. Мен осы түйіннен барлық деректерді қайтадан шығарып, оны сүзгілеуім керек. Және бұл түйіндегі толық сканерлеудің аналогы, бұл нашар.

Кез келген түсініксіз жағдайда жаңа кесте жасаңыз

Пайдаланушыларды идентификаторы, жасы немесе жалақысы бойынша мақсатты болғымыз келсе, не істеуіміз керек? Ештеңе. Тек екі кестені пайдаланыңыз. Пайдаланушыларға үш түрлі жолмен жету қажет болса, үш кесте болады. Біз бұрандадағы орынды үнемдейтін күндер артта қалды. Бұл ең арзан ресурс. Бұл жауап беру уақытынан әлдеқайда аз тұрады, бұл пайдаланушыға зиян келтіруі мүмкін. Пайдаланушы үшін 10 минуттан гөрі секундта бір нәрсені алу әлдеқайда жағымды.

Біз жақсы масштабтау және сенімді жұмыс істеу мүмкіндігі үшін қажетсіз кеңістік пен нормадан тыс деректерді сатамыз. Өйткені, шын мәнінде, әрқайсысында бес түйіні бар, деректерді сақтаудың қолайлы деңгейі бар (ештеңе жоғалмаған кезде) үш деректер орталығынан тұратын кластер бір деректер орталығының өлімінен толықтай аман қалуға қабілетті. Ал қалған екеуінің әрқайсысында тағы екі түйін. Осыдан кейін ғана проблемалар басталады. Бұл өте жақсы артықшылық, оған бірнеше қосымша SSD дискілері мен процессорлары қажет. Сондықтан ешқашан SQL болып табылмайтын, қатынасы, сыртқы кілттері жоқ Кассандраны пайдалану үшін қарапайым ережелерді білу керек.

Барлығын сіздің сұранысыңыз бойынша жобалаймыз. Ең бастысы деректер емес, қолданба онымен қалай жұмыс істейтіні. Егер ол әртүрлі деректерді әртүрлі жолдармен немесе бірдей деректерді әртүрлі жолмен алу қажет болса, біз оны қолданбаға ыңғайлы етіп қоюымыз керек. Әйтпесе, біз толық сканерлеуде сәтсіздікке ұшыраймыз және Кассандра бізге ешқандай артықшылық бермейді.

Деректерді нормадан шығару қалыпты жағдай. Біз қалыпты пішіндерді ұмытып кетеміз, енді бізде реляциялық деректер базасы жоқ. Бір нәрсені 100 рет қойсақ, ол 100 рет жатады. Бұл тоқтаудан гөрі арзанырақ.

Бөлу үшін кілттерді олар қалыпты түрде таратылатындай етіп таңдаймыз. Біз кілттеріміздің хэшінің бір тар диапазонға түскенін қаламаймыз. Яғни, жоғарыдағы мысалдағы туған жылы жаман мысал. Дәлірек айтсақ, біздің қолданушыларымыз туған жылдары бойынша қалыпты түрде таралса жақсы, ал егер 5-сынып оқушылары туралы айтатын болсақ, жаман - ондағы бөлу онша жақсы болмайды.

Сұрыптау Кластерлеу кілтін жасау кезеңінде бір рет таңдалады. Егер оны өзгерту қажет болса, біз кестені басқа кілтпен жаңартуымыз керек.

Ең бастысы: егер бір деректерді 100 түрлі жолмен алу қажет болса, онда бізде 100 түрлі кесте болады.

Ақпарат көзі: www.habr.com

пікір қалдыру