IHS Strategic
Tüm Blog Yazıları
HowTo22 Eylül 2026•2 dk okuma

Rehber: MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi

Yüksek trafikli sistemler için MongoDB ve Mongoose optimizasyon adımları. Bağlantı havuzu, şema tasarımı, indeksleme ve performans rehberi.

S

Sistem Yöneticisi

Kıdemli Yazılım Mimarı

Ölçeklenebilir Veritabanı Mimarisi Neden Gerekli?

Büyüyen sistemlerde veritabanı darboğazı ilk karşılaşılan sorundur. Doğru şema ve bağlantı yönetimi RAM tüketimini azaltır, I/O operasyonlarını düşürür. Modern dijital strateji ve bulut trendleri gereksiz kaynak tüketimini engellemeyi hedefler.

Adım 1: Doğru Bağlantı Havuzu (Connection Pool) Yapılandırması

Mongoose varsayılan maxPoolSize değeri 100'dür. Tek sunucu için gereksiz soket tüketimi yaratır. Yük durumuna göre havuz boyutunu sınırlayın.

const mongoose = require('mongoose');

mongoose.connect(process.env.MONGO_URI, {
  maxPoolSize: 50,
  minPoolSize: 10,
  serverSelectionTimeoutMS: 5000,
  socketTimeoutMS: 45000,
});

Adım 2: Şema Tasarımı (Embedding vs. Referencing)

Yanlış şema tasarımı sorgu maliyetini artırır. İlişki türüne göre karar verin:

  • Gömülü (Embedding): Veriler birlikte okunuyorsa (1-1 veya sınırlı 1-N). Belge boyutu 16MB sınırını aşmamalıdır.
  • Referanslı (Referencing): Veri bağımsız güncelleniyorsa veya ilişkiler sınırsız büyüyorsa (1-Many).
Kural: Birlikte sorgulanan veriyi tek dökümanda tutun; $lookup maliyetinden kaçının.

Adım 3: Etkili İndeksleme Stratejileri

Eksik indeks tam koleksiyon taramasına (COLLSCAN) yol açar. Çok fazla indeks ise yazma (write) hızını düşürür.

  • Bileşik İndeks (Compound Index): Eşitlik (Equality), Sıralama (Sort), Aralık (Range) - ESR kuralını uygulayın.
  • Kısmi İndeks (Partial Index): Sadece belirli koşulu sağlayan belgeleri indeksleyin, disk alanından tasarruf edin.
const userSchema = new mongoose.Schema({
  email: { type: String, required: true },
  status: { type: String, required: true },
  createdAt: { type: Date, default: Date.now }
});

// ESR: status (Equality), createdAt (Range)
userSchema.index({ status: 1, createdAt: -1 });

// Kısmi indeks: Yalnızca aktif kullanıcılar
userSchema.index({ email: 1 }, { partialFilterExpression: { status: 'active' } });

Adım 4: Mongoose Okuma Optimizasyonu (.lean() ve Projeksiyon)

Mongoose belgeleri tam nesne olarak döndürür (get/set metodları, sanal alanlar). Salt okunur sorgularda bellek tüketimini azaltmak için .lean() kullanın.

// Ağır yöntem: Mongoose Document döner
// const users = await User.find({ status: 'active' });

// Hızlı ve hafif yöntem: Düz JS nesnesi döner
const users = await User.find({ status: 'active' })
  .select('email createdAt')
  .lean();

Adım 5: Sharding ve Replikasyon Mimarisi

Yatay ölçekleme için trendler sharded cluster mimarisini işaret eder.

  • Replica Set: Yüksek erişilebilirlik (HA) ve veri yedekliliği sağlar. 1 Primary, en az 2 Secondary düğüm gerekir.
  • Shard Key Seçimi: Yüksek kardinaliteye sahip, homojen dağılan anahtarlar seçin (örn: Hashed ID). Monotonik artan değerler (auto-increment ID, Date) hotspot oluşturur.