4.1 Tavsif
Apache Cassandra - bu NoSQL sinfiga kiruvchi tarqatilgan ma'lumotlar bazasi tizimi. U ishonchli va kengaytiriladigan xesh shaklidagi ma'lumotlarni saqlash uchun yaratilgan.
Ilk loyihani Facebook yaratgan va 2009 yilda Apache Software Foundation nazoratiga topshirilgan. Bu tashkilot loyihani rivojlantirishni davom ettiradi. Cassandra asosida Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter va Spotify kabi kompaniyalar uchun sanoat yechimlari yaratilgan. 2011 yilda eng katta server klasteri, bir ma'lumotlar bazasini boshqaruvchi, 400 dan ortiq mashinadan iborat bo'lgan va 300 TB dan ortiq ma'lumotlar saqlagan.
Java tarqatilgan xesh tizimini amalga oshirish uchun yozilgan bo'lib, u DynamoDB ga o'xshaydi. Bu ma'lumotlar hajmi oshganda deyarli chiziqli kengaytirilinishni ta'minlaydi. Ma'lumotlarni saqlash uchun ustunlar oilasi ishlatiladi, MemcacheDB ga o'xshab, faqat kalit-qiymat saqlamaydi. Shuningdek, bir nechta darajadagi ichki xeshlarni saqlash imkoniyati mavjud.
Bu DBMS xavfsizlikga chidamli kategorialarga kiradi. Ma'lumotlar avtomatik ravishda bir nechta tugunlar yoki bir nechta ma'lumot markazlariga teng taqsimlanadi. Bir tugun ishdan chiqqanda, boshqa tugunlar uning funksiyalarini o'z zimmasiga oladi. Tugunlarni qo'shish va yangilash qo'shimcha aralashuvni talab qilmaydi.
Tugunlar soni bir necha marta ko'paygan bo'lsa ham, barcha tugunlar uchun kalitlarni qayta yaratish tavsiya etiladi.
4.2 Ma'lumotlar modeli
Kassandrada dastur kalitlar maydoni (keyspace) bilan ishlaydi, bu esa nisbiy modeldagi ma'lumotlar bazasi sxemasiga (database schema) mos keladi. Ushbu maydonda bir nechta ustunlar oilalari (column family) bo'lishi mumkin, bu nisbiy modeldagi jadvalga mos keladi.
Ustunlar oilalari ustunlarni (columns) o'z ichiga oladi va ular qator kaliti (row key) yordamida yozuvlar (row) da birlashtiriladi. Har bir ustun uch qismdan iborat: nom (column name), vaqt belgisi (timestamp) va qiymat (value). Yozuvdagi ustunlar tartibli. Nisbiy BD dan farqli o'laroq, kassandrada yozuvlar (qatorlar) bir xil nomdagi ustunlarni o'z ichiga olishi shart emas.
Kassandraning so'nggi versiyalarida ma'lumotlar aniqlash va o'zgartirish so'rovlarini bajarish (DDL, DML) va ikkilamchi indekslarni (secondary indices) yaratish uchun CQL tilidan foydalanish imkoniyati paydo bo'ldi.
Kassandrada aniq qiymat saqlanadi, uni aniqlash mumkin.
- kalitlar maydoni — bu dastur bilan bog'lanish (mavzu maydoni). Bu turli dasturlar ma'lumotlarini bitta klasterda joylashtirish imkonini beradi.
- ustunlar oilasi — bu so'rov bilan bog'liq;
- kalit — bu klaster tuguni bilan bog'lanish. Kalit qaysi tugunlar saqlangan ustunlarga kirish huquqiga ega ekanini aniqlaydi.
- ustun nomi — bu yozuvdagi atributga bog'lanish, bu bir nechta qiymatlarni bitta yozuvda saqlash imkonini beradi.
Har bir qiymatga foydalanuvchi belgilagan vaqt belgisi mos keladi. Son qancha katta bo'lsa, ustun shuncha yangi bo'ladi. Solishtirishda eski ustunlar almashtiriladi.
4.3 Ma'lumotlar turlari
Ma'lumotlar turlari haqida: kalitlar maydoni va ustunlar oilasi - bu qatorlar (nomlar); vaqt belgisi - bu 64-bitli son; kalit, ustun nomi va ustun qiymati - bu baytlar massivi. Shuningdek, Kassandra ma'lumotlar turlarini (data type) belgilash imkonini beradi. Bu ustunlar oilasini yaratishda amalga oshirilishi mumkin.
Ustunlar nomi uchun bu taqqoslovchi (comparator), qiymatlar va kalitlar uchun esa validator (validator) deb ataladi. Taqqoslovchi ustunlar nomlari uchun qanday bayt qiymatlariga ruxsat berilganligini va ularni qanday tartiblash lozimligini belgilaydi. Validator ustunlar qiymatlari va kalitlar uchun qanday bayt qiymatlariga ruxsat berilganligini belgilaydi.
Agar ma'lumotlar turlari ko'rsatilmagan bo'lsa, Kassandra ularni bayt qatorlari (BytesType) sifatida saqlaydi va solishtiradi, chunki ular ichkarida shunday saqlanadi.
Ma'lumotlar turlari quyidagicha bo'ladi:
- BytesType: har qanday bayt qatorlari (valiatsiyasiz)
- AsciiType: ASCII qatori
- UTF8Type: UTF-8 qatori
- IntegerType: har qanday o'lchamdagi son
- Int32Type: 4-baytli son
- LongType: 8-baytli son
- UUIDType: 1 yoki 4-tipli UUID
- TimeUUIDType: 1-tipli UUID
- DateType: 8-baytli vaqt belgisi qiymati
- BooleanType: ikki qiymat: true = 1 yoki false = 0
- FloatType: 4-baytli o'zgaruvchan nuqtali son
- DoubleType: 8-baytli o'zgaruvchan nuqtali son
- DecimalType: har qanday o'lchamdagi o'zgaruvchan nuqtali son
- CounterColumnType: 8-baytli hisoblagich
Kassandrada ma'lumotlarni yozish qayta yozish demakdir. Agar bir xil nomdagi va kalitli ustun ustunlar oilasiga kelsa va vaqt belgisi saqlanganidan katta bo'lsa, qiymat qayta yoziladi. Yozilgan qiymatlar o'zgartirilmaydi, faqat yangi qiymatlar keladi.
Kassandraga yozish vaqtni kamroq oladi, chunki o'qish. Bu dizaynerlar boshqa yondashuvdan foydalanishi kerakligini anglatadi. Agar ma'lumotlar modelini loyihalash nuqtai nazaridan ustunlar oilasini ko'rib chiqilsa, uni modellashtirilgan ko'rinish (materialized view) sifatida tasavvur etish osonroq - bu ma'lum bir so'rov ma'lumotlarini ko'rsatadi, lekin ularni diskda saqlaydi.
Hech qanday qo'shimcha hisob-kitoblar qilmaslik uchun, so'rovni qayta ishlash uchun kerak bo'lgan barcha ma'lumotlarni ustunlar oilasiga yozish ma'qul bo'ladi. Bu dizaynerlar masalani obyektlar orasidagi munosabatlar yoki aloqalar tomonidan emas, balki so'rovlar tomonidan ko'rib chiqishlari kerakligini anglatadi: qaysi maydonlar tanlanishi kerak, yozuvlar qanday tartibda bo'lishi kerak va asosiy ma'lumotlar bilan bog'liq bo'lgan qaysi ma'lumotlar olinishi kerak.
Bir yozuvdagi ustunlar soni 2 milliardgacha cheklangan. Buni loyihalash va optimallashtirish texnikasiga bag'ishlangan maqolada batafsilroq o'qishingiz mumkin. Dastlab, kassandraga ma'lumotlarni saqlash va o'qish jarayonini ko'rib chiqamiz.
GO TO FULL VERSION