Cassandra — katta hajmdagi ma’lumotlarni ko‘p node bo‘ylab taqsimlab, yuqori write throughput va availability bilan saqlashga mo‘ljallangan wide-column distributed database.
Cassandra markaziy primary node’ga qattiq bog‘lanmaydi. Cluster node’lari client requestlarini qabul qilib, partition va replica’lar bilan muvofiqlashtirishi mumkin.
Keyspace
Keyspace relational database’dagi database yoki namespace’ga yaqin tushuncha.
Unda:
- table;
- replication strategy;
- replication factor;
- durable write
sozlamalari mavjud.
Har keyspace data qaysi datacenter va replica sonida saqlanishini belgilaydi.
Table
Table row va columnlardan iborat, ammo data modeli query-driven.
Schema avval qanday querylar bajarilishini hisobga olib tuziladi.
Join va arbitrary aggregation cheklangan bo‘lishi mumkin.
Bir xil data turli querylar uchun bir nechta table’da denormalizatsiya qilinadi.
Partition key
Primary keyning birinchi qismi partition key.
U row qaysi token va replica node’larga tushishini belgilaydi.
- cardinality yetarli;
- loadni teng taqsimlaydi;
- queryda ma’lum;
- partition hajmini cheklaydi.
Clustering column
Partition ichidagi rowlar clustering columnlar bo‘yicha tartiblanadi.
Masalan:
device_id — partition key
event_time — clustering column
Bitta device eventlari vaqt tartibida saqlanadi.
Range query partition ichida samarali.
Primary key
Composite primary key partition va clustering qismlaridan iborat bo‘lishi mumkin.
Soddalashtirilgan:
PRIMARY KEY ((tenant_id, device_id), event_time)
Ikki qavs ichidagi fieldlar combined partition key.
event_time partition ichidagi tartibni belgilaydi.
Coordinator
Client istalgan mos node’ga request yuborishi mumkin.
U node coordinator bo‘lib:
- partitionni topadi;
- replica’larga request yuboradi;
- consistency level bo‘yicha javob kutadi;
- natijani clientga qaytaradi.
Coordinator data’ning doimiy leaderi emas.
Token ring
Partition key hash qilinib token space’dagi nuqtaga tushadi.
Node’lar token range’larini boshqaradi.
Virtual node’lar bitta fizik node’ga ko‘p kichik range beradi.
Bu load balancing va node qo‘shishni soddalashtiradi.
Replication factor
Har partition nechta replica’da saqlanishini belgilaydi.
Masalan, factor 3.
Replica placement datacenter topology’ni hisobga olishi mumkin.
Factor oshsa availability va storage sarfi oshadi.
Consistency level
Har read yoki write uchun nechta replica javobi kerakligi tanlanadi.
Misollar:
- ONE;
- QUORUM;
- ALL;
- LOCAL_QUORUM.
Kuchliroq daraja consistency’ni oshiradi, availability va latencyga ta’sir qiladi.
Tunable consistency
Operationga qarab boshqa consistency tanlanadi.
User session uchun local quorum, analytics counter uchun one ishlatilishi mumkin.
R + W > N modeli read va write quorum kesishishini tushuntiradi, ammo amaliy repair va failure semantikasi ham muhim.
Write path
Write odatda:
bosqichlaridan o‘tadi.
Write sequential va tez.
Eski qiymat joyida update qilinmaydi.
Read path
Read:
orqali eng yangi qiymatni topadi.
Ko‘p SSTable read amplification yaratishi mumkin.
Compaction filelar sonini kamaytiradi.
Tombstone
Delete yoki TTL tugashi tombstone marker yozadi.
Tombstone eski qiymatni read natijasidan chiqaradi.
Compaction xavfsiz bo‘lganda fizik data olib tashlanadi.
Ko‘p tombstone queryni sekinlashtirishi mumkin.
Compaction
SSTable’lar background’da birlashtiriladi.
Strategiyalar workloadga qarab:
- size-tiered;
- leveled;
- time-windowga yaqin
bo‘lishi mumkin.
Compaction disk I/O va temporary space talab qiladi.
Repair
Replica’lar vaqt o‘tishi bilan farqlanishi mumkin.
Repair token range’lar bo‘yicha data’ni solishtirib moslashtiradi.
Repair muntazam ishlamasa eski replica va tombstone interactioni o‘chirilgan data qaytishiga sabab bo‘lishi mumkin.
Hinted handoff
Replica vaqtincha ishlamasa boshqa node unga yetkazilishi kerak bo‘lgan write haqida hint saqlaydi.
Node qaytgach hint yuboriladi.
Hint uzoq downtime uchun to‘liq repair o‘rnini bosmaydi.
Read repair
Read paytida replica javoblari farq qilsa eskirgan nusxa yangilanishi mumkin.
Bu tez-tez o‘qiladigan data’ni moslashtiradi.
Kam o‘qiladigan partitionlar uchun anti-entropy repair kerak.
TTL
Column yoki row ma’lum vaqtdan keyin expire bo‘lishi mumkin.
TTL session, event retention va temporary data uchun qulay.
Expiration tombstone yaratadi.
Juda ko‘p qisqa TTL compaction va tombstone yukini oshiradi.
Lightweight transaction
Compare-and-setga o‘xshash shartli operation consensus protokoli orqali bajarilishi mumkin.
Masalan:
insert if not exists
Bu oddiy write’dan sekinroq.
Faqat uniqueness yoki kritik conditional update uchun ishlatiladi.
Partition hajmi
Bitta partition juda katta bo‘lsa read, compaction, repair va node ko‘chirish qimmatlashadi.
Timeseries data vaqt bucketlari bilan bo‘linishi mumkin:
device_id + month
Bucket juda kichik bo‘lsa esa partitionlar soni va query fan-out oshadi.
Secondary index
Secondary index mavjud bo‘lishi mumkin, ammo yuqori cardinality, cluster hajmi va query patterniga qarab cheklovlarga ega.
Asosiy data model partition key querylariga tayangan holda quriladi.
Search yoki ad-hoc filter uchun alohida tizim ishlatilishi mumkin.
Batch
Cassandra batchi umumiy bulk performance vositasi emas.
U bir nechta bog‘liq mutationni muvofiqlashtirish uchun ishlatiladi.
Turli partitionlarga ulkan batch coordinator va replica’larga katta bosim beradi.
Monitoring
Node bo‘yicha pending compaction, dropped message, read-write latency, disk, tombstone va repair holati kuzatiladi.
Cluster o‘rtachasi sekin bitta node’ni yashirishi mumkin.
Bog‘liq tushunchalar
Wide-column database, Partition key, Clustering column, Token ring, Replication factor, Consistency level, SSTable, Compaction, Tombstone, Repair