MongoDB "not master" — Failover Sonrası Uygulama Neden Yazamıyor?
Failover sonrası "not master" hatasının nedeni, replicaSet içermeyen bağlantı dizesi, retryWrites ve election fırtınası teşhisi.
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
MongoServerError: not primary and secondaryOk=false - consider using
readPreference=primary. (NotWritablePrimary, code 10107)Sürüme göre iki farklı metin gözlemlenir:
- •MongoDB 5.0 Öncesi:
not master - •MongoDB 5.0 ve Sonrası:
NotWritablePrimary(Hata Kodu 10107)
Aynı hata ailesinden gelen akraba kodlar:
| Kod | Hata Adı | Anlamı |
|---|---|---|
| 10107 | NotWritablePrimary | Bağlanılan düğüm artık primary değil |
| 13435 | NotPrimaryNoSecondaryOk | Secondary düğüme okuma izni olmadan sorgu gönderildi |
| 189 | PrimarySteppedDown | Primary düğüm kendini geri çekti (failover başladı) |
| 11602 | InterruptedDueToReplStateChange | Replikasyon durumu değiştiği için işlem kesildi |
▸Kök Neden: Yanlış Bağlantı Modeli
Replica set failover'ı bir arıza değil, tasarımın gerektirdiği normal bir olaydır. Hata, uygulamanın topoloji değişiminden habersiz olmasından kaynaklanır:
-- YANLIŞ: Tek bir sunucuya doğrudan bağlanıyor
mongodb://10.0.1.5:27017/app
-- DOĞRU: Replica set topolojisini sürücüye teslim ediyor
mongodb://h1:27017,h2:27017,h3:27017/app?replicaSet=rs0&readPreference=primaryİlk biçimde sürücü tek bir IP'ye bağlanır; o sunucu failover ile secondary olduğunda yazma reddedilir ve sürücünün yeni primary'yi keşfetme imkânı kalmaz. İkinci biçimde ise sürücü tüm küme üyelerini dinamik olarak keşfeder ve yazmaları otomatik olarak yeni primary'ye yönlendirir.
▸Adım Adım Teşhis
1. Küme Durumunu Sorgulayın
rs.status().members.map(m => ({ name: m.name, state: m.stateStr }));
db.hello(); // isWritablePrimary, primary, me bilgilerini doğrular2. Anlık Failover mı, Kronik Seçim (Election) Fırtınası mı?
rs.status().members.map(m => ({
name: m.name, state: m.stateStr, health: m.health,
optimeDate: m.optimeDate, electionTimeout: m.electionTimeoutMillis
}));
rs.printReplicationInfo();- •
health: 0olan bir üye ağ izolasyonu yaşamaktadır. - •Secondary düğümlerin
optimeDatedeğeri primary'den belirgin derecede gerideyse (replikasyon gecikmesi), seçilebilir primary adayı kalmadığı için failover süresi uzar.
3. Oplog Boyutunu ve Dayanıklılığını Denetleyin
db.getSiblingDB('local').oplog.rs.stats().maxSize;
rs.printReplicationInfo(); -- "log length start to end" penceresiYetersiz oplog boyutu, geçici bir bakım sırasında geride kalan bir secondary'nin bir daha asla yetişememesine (stale) yol açar.
▸Çözüm Yolları
1. Bağlantı Dizesini Replica Set Parametresiyle Güncelleyin
Yukarıdaki ?replicaSet=rs0 biçimini uygulayın.
2. retryWrites Özelliğini Etkinleştirin
mongodb://h1:27017,h2:27017,h3:27017/app?replicaSet=rs0&retryWrites=true&w=majorityMongoDB 4.2+ sürücülerinde varsayılan olarak açıktır; ağ kopmalarında tek seferlik yazmaları otomatik yineler.
3. Okuma Tercihini (readPreference) Bilinçli Seçin
Uygulamanız mutlaka en güncel veriyi istiyorsa readPreference=primary kullanın; secondaryPreferred seçilirse geçici veri gecikmelerinin kabul edildiği anlamına gelir.
4. Uygulama Katmanında Hata Kodlarını Sınıflandırın
Uygulamada yalnızca 10107, 189 ve 11602 kodları otomatik yeniden denenmeli (retry); 13435 ise yapılandırma hatası olduğu için retry edilmemelidir.
▸Bunu Bir Daha Yaşamamak İçin
Bakım pencerelerinde kontrollü olarak rs.stepDown() çalıştırarak uygulamanın kesintisiz devam edip etmediğini test edin (Failover Tatbikatı).
- •Veritabanı Hub: MongoDB Üretim Mimarisi Rehberi
- •İlgili Hata: PostgreSQL Database being accessed by other users
- •İlgili Hata: PostgreSQL canceling statement due to conflict with recovery