Bosh sahifa Wiki CouchDB

CouchDB

CouchDBJSON documentlarni HTTP API orqali saqlash va boshqarishga mo‘ljallangan document-oriented database. U MVCC, revision, replication va offline-first synchronizationga mos arxitekturasi bilan ajralib turadi.

CouchDB’da har document unique ID va revision identifikatoriga ega.

Document

Document JSON fieldlardan iborat.

Misol:

{
  "_id": "user:15",
  "name": "Farrukh",
  "country": "UZ",
  "active": true
}

Reserved fieldlar document identity, revision va attachment metadata’sini saqlashi mumkin.

_id

Har document unique _idga ega.

ID client tomonidan yoki server orqali yaratilishi mumkin.

Business ma’noli ID replication va idempotent create uchun qulay, ammo key naming va maxfiylik hisobga olinadi.

_rev

Document har update’da yangi revision oladi.

Client update yuborganda o‘zi o‘qigan _revni ham beradi.

Agar document boshqa client tomonidan yangilangan bo‘lsa revision mos kelmaydi va conflict xatosi qaytadi.

Bu optimistic concurrency.

MVCC

Reader documentning committed revisionini ko‘radi.

Writer mavjud revisionni joyida o‘zgartirmasdan yangi revision yaratadi.

Eski revisionlar compactiongacha storage’da qolishi mumkin.

MVCC reader va writerni kamroq bloklaydi.

HTTP API

Database operationlari HTTP orqali bajariladi.

Amallar:

Status code va ETagga o‘xshash revision metadata web semantikasi bilan mos ishlaydi.

Attachment

Document binary attachmentlarga ega bo‘lishi mumkin.

Attachment:

  • content type;
  • length;
  • digest;
  • revision

metadata’si bilan saqlanadi.

Juda katta fayllar uchun object storage qulayroq bo‘lishi mumkin.

View

CouchDB viewlari documentlardan key-value index hosil qiladi.

Map function documentdan key va value chiqaradi.

Reduce function aggregate qilishi mumkin.

View index incremental yangilanadi.

Query emitted key bo‘yicha range va sorting ishlatadi.

Map function

Map har document uchun deterministic natija chiqarishi kerak.

Misol:

country → 1

Key bo‘yicha grouping va query bajariladi.

Map tashqi API yoki o‘zgaruvchan vaqtga tayanmasligi kerak.

Reduce function

Bir xil keylar bo‘yicha count, sum yoki boshqa aggregation bajaradi.

Reduce function qayta reduce qilinishi mumkin bo‘lgan associative modelga mos bo‘lishi kerak.

Juda katta raw qiymat qaytarish reduce maqsadiga zid.

Mango query

JSONga o‘xshash selector syntax orqali document query qilinishi mumkin.

Selector field, comparison va boolean shartlarni ifodalaydi.

Samarali query uchun mos index yaratiladi.

Indexsiz query katta scan qilishi mumkin.

Changes feed

Database o‘zgarishlari ketma-ket feed orqali olinadi.

Consumer oxirgi sequence’ni saqlab, uzilishdan keyin davom etadi.

Qo‘llanishlar:

Sequence global vaqt yoki document revision bilan bir xil emas.

Replication

CouchDB database’lar o‘rtasida document revisionlarini takrorlaydi.

Replication:

  • bir martalik;
  • continuous;
  • push;
  • pull;
  • filtered

bo‘lishi mumkin.

Manba va target bir-biridan vaqtincha uzilgan bo‘lsa keyin synchronization davom etadi.

Multi-masterga yaqin model

Bir nechta replica mustaqil update qabul qilishi mumkin.

Bir document parallel o‘zgarsa conflict revisionlar paydo bo‘ladi.

Database winning revisionni tanlaydi, ammo yutqazgan revision darhol yo‘qolmasligi mumkin.

Application conflictni merge qilishi kerak.

Conflict

Conflict business ma’noga ko‘ra hal qilinadi.

Usullar:

Faqat “eng katta revision” eng yangi vaqt degani emas.

Offline-first

Client local database’da ishlaydi va network mavjud bo‘lganda server bilan replicate qiladi.

Bu mobil va edge applicationlar uchun qulay.

Application:

holatlarini boshqaradi.

Delete

Document delete qilinganda tombstonega o‘xshash revision yaratiladi.

Bu replicationga delete hodisasini yetkazadi.

Darhol barcha eski revisionni fizik o‘chirish remote replica’da document qayta paydo bo‘lishiga sabab bo‘lishi mumkin.

Compaction

Eski revision bodylari va foydalanilmaydigan data fizik storage’dan tozalanadi.

Compaction database fayl hajmini kamaytiradi.

Revision tree va replication uchun kerakli metadata saqlanishi mumkin.

Process disk va I/O talab qiladi.

Partitioned database

Document IDning ma’lum qismi partition key sifatida ishlatilishi mumkin.

Partition ichidagi querylar kamroq shardga murojaat qiladi.

Global query qimmatroq bo‘lishi mumkin.

Key distribution va partition hajmi muhim.

Security

Database:

bilan himoyalanadi.

Public internetga admin party holatida ochish barcha data’ni xavf ostiga qo‘yadi.

Document-level authorization application yoki design qoidalarini talab qiladi.

Validation function

Document update server-side validation qoidalaridan o‘tishi mumkin.

U user roli, oldingi document va yangi documentni tekshiradi.

Validation deterministic bo‘lishi va tashqi service’ga tayanmasligi kerak.

Revision tree

Parallel replica’larda o‘zgargan document bir nechta branchli revision tree hosil qiladi.

Winning revision queryda ko‘rinadi, ammo boshqa leaf revision conflict sifatida saqlanishi mumkin.

Application ularni o‘qib yagona merged revision yaratadi va eski branchlarni delete qiladi.

Bulk update

Bir requestda ko‘p document yuborilishi mumkin, ammo bu barcha document uchun yagona atomic transaction bo‘lmasligi ehtimoli bor.

Har document natijasi va conflict alohida tekshiriladi.

Cluster

Partition va replica’lar bir nechta node’da joylashadi.

Node qo‘shish, shard ko‘chirish va quorum sozlamalari availabilityga ta’sir qiladi.

Client cluster endpointi orqali ishlaydi.

Bog‘liq tushunchalar

Document database, JSON, Revision, MVCC, Replication, Conflict resolution, Changes feed, Offline-first, MapReduce view, HTTP API