← Back to list

Mongodb cluster ko’tarish va uni to’g’ri ishlata olish

MongoDB Replica Set — bu MongoDB’ning yuqori ishonchlilik va ma’lumotlarning uzluksiz mavjudligini ta’minlash uchun ishlatiladigan…

Azizbek Hojimurodov · 2024-11-08 15:28 · 79 claps · 4.5 min read
#mongodb #cluster #mongodb-cluster #replica #software-development
Open on Medium ↗

Mongodb cluster ko’tarish va uni to’g’ri ishlata olish

MongoDB Replica Set — bu MongoDB’ning yuqori ishonchlilik va ma’lumotlarning uzluksiz mavjudligini ta’minlash uchun ishlatiladigan texnologiyasidir. Replica Set’da bitta asosiy (primary) va bir yoki bir nechta ikkinchi darajali (secondary) node’lare mavjud bo‘ladi. Barcha yozish operatsiyalari faqat asosiy node orqali amalga oshiriladi, ikkinchi darajali node’lar esa asosiydan ma’lumotlarni nusxalab olishadi.

Agar asosiy tugun nosozlikka uchrasa, sistema avtomatik tarzda yangi asosiy tugunni saylaydi va faoliyat uzluksiz davom etadi. Bu texnologiya orqali yuqori mavjudlik(High Availability), ma’lumotlarning himoyasi va o‘qish yuklamasini taqsimlash kabi afzalliklarga erishish mumkin.

Nega men MongoDB bazamni cluster qilishim kerak?

  1. Yuqori mavjudlik (High Availability): Klasterda bir nechta nusxa (replica set) mavjud bo‘ladi, shuning uchun asosiy node ishlamay qolsa, tizim avtomatik ravishda yangi asosiy node’ni tanlaydi va faoliyat to‘xtamay davom etadi.
  2. Kengaytiriladigan hajm (Scalability): Sharding yordamida ma’lumotlar bir nechta tugunlarga bo‘lib saqlanadi, bu esa katta hajmdagi ma’lumotlarni ishlash va ko‘proq foydalanuvchilarni qabul qilish imkonini beradi.
  3. Yuklamani taqsimlash (Load Distribution): O‘qish operatsiyalarini ikkinchi darajali node’larga yo‘naltirish orqali asosiy node’dagi yuk kamayadi va tezlik oshadi.
  4. Nosozlikka chidamlilik (Fault Tolerance): Har bir tugunda ma’lumotlarning nusxasi bo‘lgani uchun, nosozlik yuzaga kelganda ma’lumotlar yo‘qolmaydi va tizim ishonchliligi oshadi.
  5. Past kechikish (Low Latency): Klasterni turli hududlarda joylashtirib, foydalanuvchilarga yaqinroq qilib, ularga ma’lumotlarni tezkor yetkazish va kechikishni kamaytirish mumkin.

Clusterdan foydalanishning nima muommolari bor?

  1. Yozuvlar uchun cheklangan kengaytirilish (Limited Write Scalability): Barcha yozuvlar faqat asosiy node’da amalga oshadi, bu esa yuqori yozuv yuklamasida asosiy node’ni sekinlashtirishi mumkin.
  2. Yuqori saqlash xarajatlari (High Storage Costs): Har bir node’da ma’lumotlarning to‘liq nusxasi saqlanadi, bu esa ko‘proq saqlash joyi va resurslar talab qiladi.
  3. Replikatsiya kechikishi (Replication Lag): Ma’lumotlarni asosiy node’dan ikkinchi darajali node’larga yetkazishda kechikishlar bo‘lishi mumkin, bu esa ikkinchi darajali node’larda eski ma’lumotlar bilan ishlashga olib keladi.
  4. Murakkab failover jarayoni (Complex Failover Process): Asosiy node ishlamay qolganda, yangi asosiy tugunni tanlash jarayoni murakkab bo‘lishi mumkin va vaqt talab etadi, bu esa vaqtinchalik uzilishlarga sabab bo‘lishi mumkin.
  5. Yuqori darajadagi xizmat ko‘rsatish va kuzatuv talab qiladi (High Maintenance and Monitoring Requirements): Klasterni boshqarish uchun muntazam xizmat ko‘rsatish, sinxronizatsiya, va monitoring talab etiladi, bu esa qo‘shimcha vaqt va resurs talab qiladi.

Docker yordamida 1 ta hostda bir nechta replica ko’tarish

Agar siz replica qanday ishlashini tushungan va sizga cluster qilish kerak deb hisoblagan bo’lsangiz boshladik.

“Dehqoncha” ayganda biz bir nechta mongodb container ko’taramiz va ular bir biri bilan kompyuterimizni networki orqali aloqa qilishadi, docker network orqali emas. So’ngra bir mongodb containerni asosiy replica node qilib belgilaymiz va tayyor yozib qo’yilgan nodejs dasturimiz orqali replicalarda to’g’ri foydalanishni ko’rib chiqamiz. Va bizni replica set’imiz to’g’ri ishlayotganligini tekshirish uchun asosiy node’ni kill qilib boshqa node asosiy bo’lganligini tekshiramiz.

  1. Hostimizni IP addresini bilib olamiz.
ipconfig getifaddr en0 # bu buyruqning natijasida siz ip addressni olasiz.
# 192.168.x.x Natija shunaqa chiqadi. x=[0,255]
  1. Docker buyruq yodamida 3ta mongdb container run qilamiz. 1 tasi asosiy node bo’ladi qolgan 2tasi esa ikkinchi darajali node hisoblanadi.
docker run -d \
  --name mongo1 \
  -p 27017:27017 \
  mongo:latest \
  --replSet rs0 \
  --bind_ip_all

docker run -d \
  --name mongo2 \
  -p 27018:27017 \
  mongo:latest \
  --replSet rs0 \
  --bind_ip_all

docker run -d \
  --name mongo3 \
  -p 27019:27017 \
  mongo:latest \
  --replSet rs0 \
  --bind_ip_all

Hamma containerlar to’g’ri ko’tarilganini tekishirish uchun quydagi buyruqni terasiz.

docker ps | grep mongo 

Tepadagi buyruqni natijasi shunaqa chiqishi kerak.

Tepadagi buyruqni natijasi shunaqa chiqishi kerak.

  1. Asosiy baza qilmoqchi bo’lgan container ichiga kirish va uni asosiy baza qilish buyruqlari.
docker exec -it mongo1 mongosh # containerni ichidagi mongoga ulanish uchun terliadigan buyruq.

Pastda tepadagi buyruqni natijasi berilgan. Bu yerda warninglarga e’tibor bermaysiz chunki biz production uchun ko’tarmayabmiz faqat testoviy ko’tarayabmiz. Shuni uchun authorization va boshqa bazi sozlamalar to’g’rilanmadi.

Pastda berilgan buyruq orqali replicalar sozlanadi va 1 dona node asosiy bo’ladi va bu yerda siz hostni o’rniga o’zingizni kompyuter/serverizni ip manzilini qo’yasiz.

rs.initiate({
  _id: "rs0",
  members: [
    { _id: 0, host: "192.168.x.x:27017" },
    { _id: 1, host: "192.168.x.x:27018" },
    { _id: 2, host: "192.168.x.x:27019" }
  ]
})

Tepadagi buyruqning natijasi.

Tepadagi buyruqning natijasi.

Va nixoyat biz replicalarni sozlab bo’ldik endi biz qaysi container asosiy node ekanligini qo’ydagi buyruq yordamida bilib olsak bo’ladi.

rs.status()

Hop yaxshi, replica set ko’tarib oldik, endi unga qanday connect qilaman?

Oddiy pastdagi mongdb url orqali:

mongodb://192.168.100.149:27017,192.168.100.149:27018,192.168.100.149:27019/your_database_name?replicaSet=rs0&readPreference=secondaryPreferred

# replicaSet=rs0 -> Replicadan foydlanaishini aniqlaydi.
# readPreference=secondaryPreferred -> Read operatsiyalar secondary bazalardan o'qishiydi degani 
# agar secondary databaselar bolsa.

Keling endi replicalar qanday ishlayotganini test qilamiz. Men tayyor crud operation yozib github’ga qo’yib qo’ydim va hozir siz uni clone qilib run qilasiz.

[embed]GitHub - golanguzb70/mongo-replica-set Contribute to golanguzb70/mongo-replica-set development by creating an account on GitHub.github.com

Yozish operatsiyasini tekshirish

Va k6 oraqli biz write loadni tekshirib ko’ramiz yani bir vaqtda ko’p nagruskada ma’lumot create qilamiz. Uni uchun siz tepadagi repoda /load-test papkaga kirasiz va quydagi komandani run qilasiz.

k6 run write.js

Sizda ham shunaqa jarayon boshlanishi kerak.

Sizda ham shunaqa jarayon boshlanishi kerak.

Va qo’ydagi docker buyruqni tepadagi jarayon tugamasdan run qilib qaysi containerga qanchalik bosim tushayotganini ko’rishimiz mumkin.

docker stats

Bu yerda bizni asosiy host mongo2 ekan. Shu sababli unga boshqa node’larga nisbatan kattaroq bosim tushyabdi.

Savol bo’lishi mumkin nega ikkinchi darajali node’larga ham bosim tushyabdi deb. Buni sababi asosiy node’da o’zgarish bo’lganda buni qolgan nodelar ham copy qilib olishi kerak bo’ladi.

O’qish operatsiyasini tekshirish

O’qish operatsiyasini tekshrish uchun /load-test papkasida qo’yidagi buyruqni run qilamiz.

k6 run read.js

Tepadagi buyruqni boshlanish jarayoni.

Tepadagi buyruqni boshlanish jarayoni.

Va qo’ydagi docker buyruqni tepadagi jarayon tugamasdan run qilib qaysi containerga qanchalik bosim tushayotganini ko’rishimiz mumkin.

docker stats

Ko’rinib turibdiki read operationlar bajarilayotganda asosan ikkinchi darajali nodelarga bosim tushyabdi.

Oxirigacha o’qiganingiz uchun rahmat. Agar foydali bo’lgan bo’lsa men xursandman. O’zbek tilida shunaqa maqolalarni o’qish uchun follow qilib qo’yishni unutmang.

LinkedIn | Telegram


메타데이터
post_id
5bc8a2b2b662
slug
mongodb-cluster-kotarish-va-uni-to-g-ri-ishlata-olish-5bc8a2b2b662
url
https://medium.com/@hojimurotov/mongodb-cluster-kotarish-va-uni-to-g-ri-ishlata-olish-5bc8a2b2b662
canonical_url
https://medium.com/@hojimurotov/mongodb-cluster-kotarish-va-uni-to-g-ri-ishlata-olish-5bc8a2b2b662
author_url
https://medium.com/@hojimurotov
status
ok
fetched_at
2026-06-21 20:33:08