MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi Rehberi
Yüksek trafikli uygulamalar için MongoDB ve Mongoose tabanlı ölçeklenebilir veritabanı mimarisi tasarım rehberi. İndeksleme, bağlantı yönetimi ve şema optimizasyon adımları.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Giriş: Ölçeklenebilir Mimarinin Önemi
Modern web uygulamalarında artan veri yükü, doğru mimari seçimini zorunlu kılar. Bu rehber, MongoDB ve Mongoose ikilisiyle yüksek hacimli trafiği yönetecek veritabanı altyapısının kurulum adımlarını içerir. Güncel trendler doğrultusunda, monolitik yapılardan mikroservis odaklı ve dağıtık veri modellerine geçiş kritik bir dijital strateji gerektirir.
1. Bağlantı Havuzu ve Optimum Connection Yönetimi
Veritabanı bağlantılarının her istekte tekrar açılması kaynak tüketir. Tekil bağlantı nesnesi (Singleton) ve optimize edilmiş havuz boyutu gerekir.
Uygulama Adımı
import mongoose from 'mongoose';
const MONGODB_URI = process.env.MONGODB_URI;
export const connectDB = async () => {
if (mongoose.connection.readyState >= 1) return;
return mongoose.connect(MONGODB_URI, {
maxPoolSize: 50,
minPoolSize: 10,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
});
};Havuz limitleri sunucu işlemci ve bellek sınırına göre ayarlanır. Aşırı büyük havuz boyutu DB sunucusunu kilitler.
2. Şema Tasarımı: Embedding vs Referencing
NoSQL modellemede iki temel yaklaşım bulunur: İç içe gömme (embedding) ve referans verme (referencing).
- Embedding (1:1 / 1:Few): Birlikte okunan, sık güncellenmeyen veriler tek dokümanda saklanır. Tek disk I/O işlemiyle okunur.
- Referencing (1:Many / Many:Many): Büyüyen listeler, bağımsız güncellenen veriler ayrı koleksiyonlarda tutulur. 16MB doküman boyutu limitine takılmayı önler.
Büyük veri setlerinde kontrolsüz array büyümesi performansı düşürür. Doküman boyutu 16MB sınırını aşmamalıdır.
3. İndeksleme Stratejileri ve Compound Index Kullanımı
Doğru indeksleme olmadan veritabanı full collection scan (COLLSCAN) yapar. Bu durum RAM ve CPU tüketimini artırır.
Bileşik İndeks Kuralı (ESR: Equality, Sort, Range)
import { Schema, model } from 'mongoose';
const orderSchema = new Schema({
userId: { type: Schema.Types.ObjectId, required: true },
status: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
});
// ESR kuralı: userId (Eql), status (Eql), createdAt (Sort/Range)
orderSchema.index({ userId: 1, status: 1, createdAt: -1 });
export const Order = model('Order', orderSchema);4. Okuma Performansı: `lean()` ve Projeksiyon
Mongoose dokümanları getter, setter, sanal alanlar ve dirty tracking yükü taşır. Salt okuma işlemlerinde bu yük gereksizdir.
.lean(): Düz JavaScript nesnesi döndürür, bellek kullanımını %70 azaltır.- Projeksiyon: Sadece ihtiyaç duyulan alanlar seçilir (
.select('name email')), ağ trafiği düşürülür.
const users = await User.find({ isActive: true })
.select('name email createdAt')
.lean()
.exec();5. Yatay Ölçekleme: Replica Set ve Sharding
Dikey ölçekleme sınırına ulaşıldığında yatay ölçekleme mekanizmaları devreye girer.
- Replica Sets: Yüksek erişilebilirlik (High Availability) ve failover sağlar. Okuma yükü `secondary` düğümlere dağıtılabilir.
- Sharding: Veri kümesini birden çok sunucuya böler. Doğru `Shard Key` seçimi (yüksek kardinalite, dengeli dağılım) zorunludur.
Sonuç ve Kontrol Listesi
Ölçeklenebilir mimaride connection pooling doğru yapılandırılmalı, indeksler ESR kuralına uymalı, okuma operasyonlarında lean() tercih edilmelidir. Sürekli izleme (MongoDB Atlas Metrics / APM araçları) ile darboğazlar erkenden tespit edilir.