MongoDB Replica Set Replikasyon Gecikmesi: Teşhis ve Çözüm
Secondary'nin primary'nin gerisinde kalma nedenini (yazma yükü, disk, ağ, flow control) bulur, oplog penceresini kontrol eder ve resync riskini önler.
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.
1. Belirti / Symptom
- Secondary'nin `optimeDate` değeri primary'nin gerisinde; M50 > 10-60 sn.
- Secondary'den okuyan uygulamalar eski veri görüyor.
- `w:majority` yazmaları yavaş veya zaman aşımına uğruyor.
2. Etki / Impact
Okuma tutarsızlığı, majority write gecikmesi, failover'da veri kaybı riski (rollback). Gecikme oplog penceresini aşarsa secondary **"too stale to catch up"** olur ve tam **initial sync** gerekir.
3. Teşhis / Diagnosis
rs.status().members.map(m => ({ name: m.name, state: m.stateStr, lag_s: m.optimeDate ? (rs.status().date - m.optimeDate)/1000 : null, ping: m.pingMs }));
rs.printSecondaryReplicationInfo();rs.printReplicationInfo(); // "log length start to end" saat cinsinden- Disk I/O doygun mu? (`iostat -x 1`, yüksek `await`/`%util`).
- CPU veya ağ darboğazı var mı? Primary ile secondary arası bant genişliği/gecikme.
- Secondary'de **ağır okuma/raporlama sorguları** veya index build çalışıyor mu?
- Primary'de ani yazma patlaması mı (toplu import/update)?
db.serverStatus().flowControl; // isLagged, targetRateLimit4. Müdahale / Response
db.killOp(<opid>);db.adminCommand({ replSetResizeOplog: 1, size: 32768 }); // MB6. **Kalıcı çözüm:** Oplog penceresini yoğun toplu işlemi kapsayacak şekilde boyutlandırın (en az 24-72 saat), secondary donanımını primary ile eşitleyin, raporlama için ayrı (hidden/analytics) bir üye kullanın.
5. Doğrulama / Verification
- Tüm secondary'ler `SECONDARY` durumunda ve lag birkaç saniyenin altında (M50 normal).
- Oplog penceresi hedefin (>24 saat) üzerinde (M51).
- `w:majority` yazma gecikmesi normale döndü.
6. Geri Alma / Rollback
- `killOp` geri alınamaz; işlem uygulama tarafında yeniden denenmelidir.
- `replSetResizeOplog` ile oplog küçültülebilir ancak pencereyi daraltır; yalnızca gerekirse yapın.
- Initial sync geri alınamaz; başlamadan önce yedek/snapshot doğrulayın.