MongoDB İmleç Zaman Aşımı: 10 Dakikalık cursorTimeout Limiti, Batch İşleme ve maxTimeMS Yönetimi
Uzun süren toplu veri aktarımlarında istemcinin yavaş okuması sonucu sunucunun cursor'ı kapatması; batchSize optimizasyonu ve kontrollü noCursorTimeout kullanımı.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Toplu veri işleme veya migration scripti çalışırken belirli bir süre sonra aniden düşer:
MongoServerError: cursor id 584930284729102938 not found
MongoServerSelectionError: operation exceeded time limit (maxTimeMS expired)▸Sahada Ne Görürsün?
Script 100.000 dokümanın ilk 30.000'ini işledikten sonra (yaklaşık 10. dakikada) imleç bulunamadı hatasıyla patlar.
▸Kök Neden Matrisi
| Olasılık | Kök Neden | Açıklama |
|---|---|---|
| %65 | 10 Dakikalık Hareketsizlik Limiti | MongoDB sunucusu 10 dakika boyunca yeni batch talep edilmeyen cursor'ları belleği korumak için otomatik yok eder. İstemci dokümanı işlerken çok vakit kaybetmiştir. |
| %25 | Küçük `batchSize` Varsayılanı (101 Doküman) | Her 101 dokümanda bir sunucuya gidilir; istemci yavaşsa aralık 10 dakikayı geçer. |
| %10 | `maxTimeMS` Sınırı | Sorgu için tanımlanan çalışma bütçesi aşılmıştır. |
▸ACİL RUNBOOK (0-5dk)
// 1. Sunucuda açık cursor sayısını gör
db.serverStatus().metrics.cursor;
// 2. Takılı kalan yetim cursor'ları sonlandır
db.killCursors("prod.users", [NumberLong("584930284729102938")]);
// 3. Acil script düzeltmesi: batchSize(1000) ve cursorTimeout süresini uzat
db.adminCommand({ setParameter: 1, cursorTimeoutMillis: 1800000 }); // 30 dakika▸KALICI BLUEPRINT
- 1`batchSize(1000)` Standardı: Toplu veri okuma scriptlerinde varsayılan yerine her zaman optimize edilmiş batch boyutu atanmalıdır:
const cursor = db.users.find().batchSize(1000);- 1Kontrollü `noCursorTimeout` Kullanımı: Zorunlu uzun işlemlerde
noCursorTimeout()açılmalı ancaktry / finallybloğunda mutlaka manuel kapatılmalıdır (cursor.close()).
▸Doğrulama
db.serverStatus().metrics.cursor.open;Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MongoDB "not master" / NotWritablePrimary Hatası
Failover sonrası "not master" hatasının nedeni, replicaSet içermeyen bağlantı dizesi, retryWrites ve election fırtınası teşhisi.
MongoDB E11000: Duplicate Key Error Teşhisi ve Çözümü
Aynı anahtara sahip iki dokümanın eşzamanlı eklenmesiyle oluşan E11000 hatasının tespiti, getIndexes denetimi ve $setOnInsert ile upsert desenleri.
MongoDB MongoNetworkError & HostUnreachable Teşhisi
Replica set primary düğümünün çökmesi, yanlış mongodb+srv dizesi ve ağ gecikmelerinde sürücünün bağlantı havuzunu temizlemesi; rs.status() ve kalıcı timeout ayarları.