Bosh sahifa Wiki Druid

Druid

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.

Segment:

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:

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:

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.

Compaction:

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