Server selection timeout ne demektir?
MongoDB sürücüsü bir sorguyu göndermeden önce uygun bir sunucu seçer. Yazma için primary, okuma için tercih ettiğiniz read preference davranışına uygun bir node gerekir. Sürücü uygun node bulamazsa server selection timeout hatası verir.
Bu hata tek başına “MongoDB kapalı” anlamına gelmez. Sürücü clusterı keşfedemiyor, TLS doğrulamasında takılıyor, replica set adı uyuşmuyor veya bağlantı havuzu tamamen dolmuş olabilir.
- Replica set adı bağlantı dizesinde yanlış olabilir.
- DNS bazı uygulama podlarında farklı çözümleniyor olabilir.
- TLS parametreleri ortamdan ortama değişmiş olabilir.
- Uygulama her istekte yeni MongoClient oluşturuyor olabilir.
- Bağlantı havuzu küçük veya bekleme kuyruğu yetersiz olabilir.
MongoClient yaşam döngüsünü kontrol edin
Node.js, Java, Python fark etmez: MongoDB client nesnesi genellikle uygulama boyunca yeniden kullanılmalıdır. Her HTTP isteğinde yeni client oluşturmak kısa süre çalışır, sonra hem uygulamayı hem veritabanını yorar.
Bağlantı havuzu ayarı sorunları saklamak için değil, gerçek eşzamanlılık ihtiyacını karşılamak için yapılır. maxPoolSize değerini büyütmek, kötü client yaşam döngüsünü düzeltmez.
Node.js tarafında tek MongoClient kullanımı
import { MongoClient } from "mongodb"
const uri = process.env.MONGODB_URI || ""
const client = new MongoClient(uri, {
maxPoolSize: 50,
minPoolSize: 5,
serverSelectionTimeoutMS: 5000,
connectTimeoutMS: 5000,
})
export async function getDb() {
if (!client.topology?.isConnected()) {
await client.connect()
}
return client.db("app")
}Örnek kavramsaldır; kullandığınız sürücü sürümüne göre bağlantı durumu kontrolü değişebilir.
Havuz doldu mu, cluster mı erişilemiyor?
Bağlantı havuzu dolduğunda uygulama tarafında bekleme ve zaman aşımı artar. Cluster erişilemiyorsa ise sürücü uygun sunucu seçemez. Bu iki durum kullanıcıya aynı hata gibi dönebilir.
Ayırmak için uygulama metriklerine ve MongoDB tarafındaki bağlantı sayısına birlikte bakın. Sadece veritabanı bağlantı sayısı değil, uygulamanın kaç client ve kaç pool açtığı da önemlidir.
MongoDB bağlantı sayısını görme
db.serverStatus().connections // Örnek alanlar: // current: açık bağlantı sayısı // available: kullanılabilir bağlantı kapasitesi // totalCreated: süreç boyunca oluşturulan toplam bağlantı
Bağlantı hatasında güvenlik ayarlarını gevşetmeyin
TLS veya izin listesi kaynaklı bir bağlantı hatasında ilk refleks güvenliği kapatmak olmamalı. Doğru yaklaşım hangi katmanın sorun çıkardığını anlamaktır: DNS mi, TLS mi, IP erişimi mi, kullanıcı/parola mı, replica set keşfi mi?
Aynı bağlantı dizesiyle resmi istemciden bağlanmak, sorunun uygulama kodunda mı bağlantı yolunda mı olduğunu ayırmak için hâlâ en pratik yöntemlerden biridir.