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.
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.