dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #54
mongodb
PerformanceSEV2 · CİDDİ BOZULMA15-30 dakika / 15-30 minsclusterAdmin / dbAdminAnyDatabase / root

MongoDB Cursor Zaman Aşımları: getMore ve Session Yaşam Döngüsü

Artan cursor timeout sayısını istemci tüketim hızı, oturum süresi ve getMore hatalarıyla eşleştirir; noCursorTimeout kullanımının sınırlarını açıklar.

İlişkili Metrik:M57
İlişkili Script:S81S88
#cursor#getMore#session#timeout

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Belirti / Symptom

M57 `db.serverStatus().metrics.cursor.timedOut` sayacı artar; istemci tarafında `CursorNotFound`, getMore hataları veya yarıda kesilmiş batch'ler görülebilir. Tek başına sıfırdan büyük kümülatif sayaç geçmiş olayı gösterir, **delta** izleyin.

2. Etki / Impact

Uzun süren arka plan taramaları veya raporlar yarıda kalır; tekrar denemeler ek yük ve yinelenen iş yaratabilir. Her cursor timeout doğrudan uygulama hatası değildir.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. Sunucuda cursor sayacı ve açık cursor dağılımını alın:
javascript
const c = db.serverStatus().metrics.cursor;
({ open: c.open, timedOut: c.timedOut });

Farklı zamanlardaki ölçümleri karşılaştırın; restart ile sayaç sıfırlanabilir.

🟢 Salt Okunur2. İlgili uygulama adını, kaynak IP'yi ve aktif `getMore` işlemlerini (S81, S88) eşleştirin:
javascript
db.getSiblingDB('admin').aggregate([
  { $currentOp: { allUsers: true, idleConnections: true } },
  { $match: { $or: [ { op: 'getmore' }, { 'command.getMore': { $exists: true } } ] } },
  { $project: { client: 1, appName: 1, ns: 1, secs_running: 1,
                'command.getMore': 1, 'command.batchSize': 1 } }
]);
🟢 Salt Okunur3. Uygulama loglarında son `getMore` zamanı, cursor'un kapatılıp kapatılmadığı, ağ kopması ve driver sürümünü kontrol edin. `currentOp` yalnızca anlık işlemleri gösterir, bitmiş timeout'u geçmişte bulmak için log/APM gerekir.
🟢 Salt Okunur4. Oturum (logical session) boşta kalıyorsa varsayılan yaklaşık **30 dakika** sonunda süresi dolabilir; session'a bağlı cursor'da `noCursorTimeout` bunu engellemez. Cursor ve session süreleri sürüme/konfigürasyona göre değiştiği için 4.4/5.0/6.0/7.0 ortamında doğrulayın.

4. Müdahale / Response

🟡 Geri Alınabilir1. Uygulama tarafında cursor'u düzenli tüketin ve işi bitince açıkça kapatın; büyük sorguları filtreleyip daha küçük batch'lere bölün. Sadece batch küçültüp aradaki beklemeyi artırmak timeout'u kötüleştirebilir.
🟡 Geri Alınabilir2. Çok uzun raporları checkpoint'li/idempotent sayfalara ayırın; uzun süre açık tek cursor'a bağımlı kalmayın.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ3. `noCursorTimeout()`'u topluca açmayın: terk edilen cursor'lar kaynak tüketir ve session timeout'u yine cursor'u kapatabilir. Mantıksal session'ın özel uzun işlerde canlı tutulması gerekiyorsa uygulama tasarımı/driver'ın `refreshSessions` prosedürünü test ederek uygulayın.
🔴 YÜKSEK RİSK / GERİ ALINAMAZ4. Tüm cursor timeout'ları için sunucu genel zaman aşımı ayarını körlemesine büyütmeyin; önce hangi istemcinin sorunlu olduğunu bulun.

5. Doğrulama / Verification

M57'nin **birim zamandaki artışı** düşüyor, yeni getMore hataları yok, açık cursor sayısı baseline'a dönüyor, raporlar eksiksiz ve tekrar üretilebilir biçimde tamamlanıyor.

6. Geri Alma / Rollback

Uygulama batch/işleme değişikliklerini önceki sürüme döndürün. Kapanan cursor geri açılmaz; sonuçları en son işlenen kayıt/checkpoint'ten idempotent olarak yeniden üretin.

Diğer MONGODB Runbook'ları