Not Master and SlaveOk Not Set Hatası Nedir?
MongoDB'nin çalışma prensibi, çoklu veritabanı sunucuları arasında veri paylaşımını sağlamaktır. Bu sistemde "Primary" (Ana) ve "Secondary" (Yedek) sunucular bulunur. Ana sunucu, tüm yazma işlemlerini kabul ederken, yedek sunucular sadece okuma işlemleri gerçekleştirir. Ancak, bazı durumlarda bu denetim mekanizması yanlış yapılandırıldığında "Not Master and SlaveOk Not Set" hatasıyla karşılaşılabilir.
Bu hata, MongoDB istemcisinin veritabanına bağlanmaya çalışırken, istediği işlemi gerçekleştirmek için doğru sunucuya yönlendirilmemesi sonucu ortaya çıkar. Yani, istemci bir "Secondary" (Yedek) sunucusuna bağlanmaya çalıştığında ve "SlaveOk" seçeneği aktif değilse, bu hata meydana gelir.
Hata Neden Olur?
"Not Master and SlaveOk Not Set" hatasının birkaç yaygın nedeni vardır:
1. Okuma ve Yazma Ayrımı: MongoDB'nin replikasyon yapısı, yazma işlemlerini yalnızca "Primary" sunucusunda yapar. Yedek sunucularda yalnızca okuma işlemleri yapılabilir. Eğer istemci, bir yedek sunucuya bağlanmaya çalışır ve yazma işlemi yapmaya çalışırsa, bu hata alınır.
2. SlaveOk Ayarının Eksikliği: MongoDB istemcisine bağlanırken, eğer "SlaveOk" ayarı aktif değilse ve istemci bir "Secondary" sunucuya bağlanmaya çalışıyorsa, yazma işlemi gerçekleştirmek istenirse bu hata meydana gelir.
3. Replikasyon Durumu: Eğer MongoDB cluster'ınızda bir replikasyon hatası veya iletişim problemi varsa, istemci yanlış sunucuya yönlendirilmiş olabilir ve bu hatayı alırsınız.
Çözüm: Hata Nasıl Giderilir?
Bu hatayı çözmek için birkaç basit adım izleyebilirsiniz. İşte bu adımlar:
1. "SlaveOk" Seçeneğini Etkinleştirin
Eğer MongoDB istemcisine bağlanırken okuma işlemi yapıyorsanız ve bir yedek sunucuya bağlanıyorsanız, "SlaveOk" özelliğini etkinleştirmeniz gerekir. Bu, istemcinin yedek sunuculardan veri okumasına izin verir. Aşağıdaki gibi bir bağlantı kodu kullanabilirsiniz:
MongoClient mongoClient = new MongoClient("mongodb://localhost:27017/?readPreference=secondaryPreferred");
Burada `readPreference=secondaryPreferred` parametresi, istemcinin tercihen yedek sunuculardan okuma yapmasını sağlar. Ancak yazma işlemleri her zaman "Primary" sunucusuna yapılacaktır.
2. Bağlantı Ayarlarını Gözden Geçirin
Yazma işlemlerini yalnızca "Primary" sunucusuna yönlendirmek istiyorsanız, istemci bağlantınızda replikasyonun doğru şekilde yapılandırıldığından emin olun. Eğer yazma işlemleri için sadece "Primary" sunucuya yönlendirme yapıyorsanız, bağlantı stringinizi şu şekilde düzenleyebilirsiniz:
MongoClient mongoClient = new MongoClient("mongodb://localhost:27017/?readPreference=primary");
Bu bağlantı, sadece "Primary" sunucusuna yazma işlemi yapılmasına izin verir.
3. Replikasyon Durumunu Kontrol Edin
Replikasyon yapılandırmanızda bir sorun olup olmadığını kontrol etmek, bu hatayı önleyebilir. MongoDB replikasyon durumunu görmek için şu komutu kullanabilirsiniz:
rs.status();
Bu komut, replikasyon setinizin durumunu gösterecek ve olası sorunları fark etmenize yardımcı olacaktır.
Sonuç
“Not Master and SlaveOk Not Set” hatası, MongoDB'nin replikasyon yapısı ve istemci bağlantı ayarlarıyla ilgili bir sorundur. Ancak doğru bağlantı ayarları ve replikasyon yapılandırmasıyla bu hatayı kolayca çözebilirsiniz. Yedek sunuculardan okuma yapmak istiyorsanız "SlaveOk" seçeneğini aktif hale getirmeli ve istemcinin doğru sunucuya yönlendirilmesini sağlamalısınız. Ayrıca replikasyonun düzgün çalışıp çalışmadığını kontrol etmek de önemlidir.
Bu adımları takip ederek MongoDB veritabanınızda bu hatayı hızla çözebilir ve sorunsuz bir şekilde veritabanınızı kullanmaya devam edebilirsiniz.