Druid — katta hajmdagi vaqtga bog‘liq event ma’lumotlarini tez ingest qilish va past latency bilan slice, filter hamda aggregation querylarini bajarishga mo‘ljallangan distributed analytical database.
Druid monitoring, clickstream, telemetry, advertising, product analytics va real vaqtli dashboardlar uchun ishlatiladi.
Event modeli
Druid rowlari ko‘pincha quyidagi qismlarga ega:
- timestamp;
- dimensions;
- metrics.
Timestamp vaqt o‘lchovi.
Dimensions filter va group uchun ishlatiladigan kategorik fieldlar.
Metrics aggregation qilinadigan sonli qiymatlar.
Timestamp
Har event asosiy timestampga ega.
Data vaqt bo‘yicha partition va segmentlarga ajratiladi.
Querylar odatda ma’lum intervalni ko‘rsatadi.
Timestamp parsing noto‘g‘ri bo‘lsa event xato vaqt segmentiga tushishi mumkin.
Dimension
Dimension misollari:
Ular:
uchun ishlatiladi.
Yuqori cardinality dimension memory va index hajmiga ta’sir qiladi.
Metric
Metric sonli o‘lchov.
Misollar:
- count;
- revenue;
- duration;
- bytes;
- quantity.
Ingestion vaqtida metric oldindan aggregate qilinishi mumkin.
Raw qiymat kerak bo‘lsa schema va rollup ehtiyotkor tanlanadi.
Segment
Druid data’ni immutable segment fayllarda saqlaydi.
ni o‘z ichiga oladi.
Segmentlar deep storage’da saqlanib, query node’lariga yuklanadi.
Columnar storage
Har column alohida encode va compress qilinadi.
Query faqat kerakli dimension va metriclarni o‘qiydi.
Columnar format aggregation workloadiga mos.
String dimension dictionary encoding va bitmap bilan ishlashi mumkin.
Bitmap index
Dimension qiymati qaysi rowlarda mavjudligini bitmap ko‘rsatadi.
Bir nechta filter bitmap operationlar orqali tez birlashtiriladi.
Masalan:
country = UZ
AND device = mobile
filteri bitmap kesishmasi bilan bajarilishi mumkin.
Rollup
Ingestion vaqtida bir xil timestamp granularity va dimension kombinatsiyasidagi eventlar agregatsiya qilinadi.
Masalan, mingta bir xil event bitta row va countga aylanishi mumkin.
Bu storage va queryni kamaytiradi.
Kamchiligi — individual raw event keyin mavjud bo‘lmaydi.
Granularity
Ikki turdagi granularity mavjud bo‘lishi mumkin:
Query granularity rollup timestamp aniqligini belgilaydi.
Segment granularity data qaysi vaqt bo‘lagi bo‘yicha segmentlarga ajralishini belgilaydi.
Ingestion
Data batch yoki streaming manbadan olinadi.
Streaming ingestion:
- partition;
- offset;
- checkpoint;
- handoff;
- exactly-oncega yaqin semantika
bilan ishlashi mumkin.
Batch ingestion tarixiy file va backfill uchun.
Real-time data
Yangi eventlar avval real-time tasklarda query qilinadigan holatda saqlanadi.
Keyin segment hosil qilinib deep storage’ga yoziladi.
Historical query node segmentni qabul qilgach handoff tugaydi.
Deep storage
Segmentlarning barqaror asosiy nusxasi object storage yoki distributed filesystem’da saqlanadi.
Query serverlar local diskka segmentlarni cache qiladi.
Node yo‘qolsa segment boshqa node’ga deep storage’dan yuklanadi.
Historical node
Historical node immutable segmentlarni local diskda saqlab querylarga xizmat qiladi.
Segmentlar cluster coordinator tomonidan node’lar orasida taqsimlanadi.
Hot va cold tierlar turli hardware’da bo‘lishi mumkin.
Broker
Broker queryni qabul qilib kerakli segmentlarga ega serverlarga yuboradi.
Partial natijalarni birlashtirib clientga qaytaradi.
Broker segment timeline va routing metadata’sini biladi.
Coordinator
Coordinator segment placement va retentionni boshqaradi.
U:
ni nazorat qiladi.
Data segmentining o‘zi coordinator’da saqlanmaydi.
Query turlari
Druid:
- timeseries;
- group by;
- top N;
- scan;
- search;
- SQL
querylarini qo‘llashi mumkin.
Timeseries query interval bo‘yicha aggregate qiladi.
Top N ma’lum dimensionning yuqori qiymatlarini qaytaradi.
Approximate aggregation
Unique count va quantile uchun sketchga o‘xshash approximate algoritmlar ishlatilishi mumkin.
Bu katta data’da memory va latencyni kamaytiradi.
Natija aniq emas, ma’lum xatolik chegarasiga ega.
Compaction
Ko‘p mayda segmentlar kattaroq, optimallashtirilgan segmentlarga birlashtiriladi.
- segment sonini kamaytiradi;
- partition layoutni yaxshilaydi;
- schema transform qiladi;
- query planningni tezlashtiradi.
U compute va deep storage I/O talab qiladi.
Retention
Vaqt intervali bo‘yicha eski segmentlar drop qilinadi.
Deep storage lifecycle bilan cluster metadata retentioni mos bo‘lishi kerak.
Faqat query node’dan drop qilish permanent delete degani emas.
Query cache
Immutable segment query natijalarining ayrim qismlarini cache qilish uchun qulay.
Segment o‘zgarmagani sabab cache entry barqaror.
Real-time data va yangi segment handoff bo‘lganda yakuniy query natijasi o‘zgarishi mumkin.
Schema evolution
Yangi dimension yoki metric kelganda eski segmentlarda u mavjud bo‘lmasligi mumkin.
Query missing columnni null yoki default sifatida ko‘radi.
Type o‘zgarishi murakkab bo‘lib, eski segmentlarni reindex qilish talab qilishi mumkin.
Ingestion spec
Batch va streaming ingestion configurationi source, timestamp, dimension, metric, rollup, tuning va error handlingni belgilaydi.
Bu specification version control’da saqlanib, qayta ishlash va backfill uchun ishlatiladi.
Data skew
Bitta dimension qiymati eventlarning katta qismini egallasa partition va query tasklari notekis bo‘ladi.
Hash partition, secondary partition yoki pre-aggregation yordamida yuk tarqatiladi.
Lookup
Kichik dimension mapping tashqi yoki boshqariladigan lookup sifatida query vaqtida qo‘llanishi mumkin.
Masalan, code’dan display nomiga o‘tish.
Lookup tez yangilanadi, ammo katta join table o‘rnini bosa olmaydi.
Multi-value dimension
Bitta event dimensionda bir nechta qiymat saqlashi mumkin.
Filter va groupingda event bir nechta groupga tushishi ehtimoli bor.
Metric yig‘indisi takroriy hisoblanmasligi uchun semantika tushuniladi.
Bog‘liq tushunchalar
Analytical database, Timeseries, Segment, Dimension, Metric, Rollup, Bitmap index, Columnar storage, Real-time analytics, OLAP