MongoDB ve Mongoose ile Ölçeklenebilir Veritabanı Mimarisi Kurulum Rehberi
Yüksek trafikli modern uygulamalar için MongoDB ve Mongoose ile optimize edilmiş bağlantı havuzu, indeksleme stratejileri ve şema modelleme adımları.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Giriş: Modern Uygulamalarda Veri Mimarisi
Büyüyen veri hacmi ve trafik altında sistem performansını korumak doğru mimari tasarım gerektirir. Modern yazılım trendleri ve kurumsal dijital strateji hedefleri, veritabanı katmanında gecikmeyi minimize eden yapılar kurmayı zorunlu kılar. Bu rehber, Node.js ekosisteminde MongoDB ve Mongoose ikilisiyle ölçeklenebilir altyapı kurulum adımlarını açıklar.
Adım 1: Optimum Bağlantı Havuzu (Connection Pool) Yapılandırması
Mongoose varsayılan ayarları yüksek eşzamanlı istekler için yetersiz kalır. Bağlantı havuzunu optimize etmek ilk adımdır.
const mongoose = require('mongoose');
const connectDB = async () => {
const options = {
maxPoolSize: 50,
minPoolSize: 10,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
family: 4
};
await mongoose.connect(process.env.MONGO_URI, options);
};- maxPoolSize: Eşzamanlı açılacak maksimum soket sayısı. Trafik yoğunluğuna göre ayarlanır.
- serverSelectionTimeoutMS: Düğüm yanıt vermediğinde sürücünün hata vermeden önce bekleyeceği süre.
Adım 2: Şema Modelleme – Embedding ve Referencing Dengesi
MongoDB döküman tabanlıdır. İlişkisel veri modelleme yerine erişim desenine göre model kurulur.
Embedding (İç İçe Dökümanlar)
Veriler daima birlikte okunuyorsa ve alt döküman sınırı (16MB) aşılmayacaksa gömülü yapı kullanılır.
const AddressSchema = new mongoose.Schema({
street: { type: String, required: true },
city: { type: String, required: true }
});
const UserSchema = new mongoose.Schema({
name: { type: String, required: true },
addresses: [AddressSchema]
});Referencing (Referans Verme)
Veri bağımsız güncelleniyorsa veya bire çok ilişkide alt kayıt sayısı belirsiz şekilde büyüyorsa referans kullanılır.
const OrderSchema = new mongoose.Schema({
userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true, index: true },
amount: { type: Number, required: true }
});Adım 3: İndeksleme ve Sorgu Optimizasyonu
İndekssiz sorgular koleksiyon taraması (COLLSCAN) yapar, CPU tüketimini katlar.
- Bileşik İndeksler (Compound Indexes): Çok kriterli sorgularda sıra kritiktir: Eşitlik (Equality), Sıralama (Sort), Aralık (Range) kuralı uygulanır.
- Lean Sorgular: Mongoose hydration maliyetini ortadan kaldırmak için salt okunur sorgularda
.lean()kullanılır.
// Bileşik indeks tanımı
OrderSchema.index({ userId: 1, createdAt: -1 });
// Performanslı sorgu
const orders = await Order.find({ userId })
.select('amount createdAt')
.sort({ createdAt: -1 })
.lean()
.exec();Adım 4: Write Concern ve Read Preference ile Dağıtık Mimari
Replica set yapılarında veri tutarlılığı ve okuma dağıtımı kurumsal dijital strateji gereksinimlerine göre ayarlanmalıdır.
- Read Preference: Raporlama sorguları
secondaryPreferredmodunda çalıştırılarak ana düğüm yükü azaltılır. - Write Concern: Kritik finansal işlemler için
w: 'majority'seçilerek veri kaybı engellenir.
İpucu: Sayfalama işlemlerinde skip() yerine son kaydın ID değeri üzerinden sorgulama (Cursor-based / Keyset Pagination) yapmak O(1) erişim performansı sağlar.