mongodb, kopyalar ve hata: {“$ err”: “master ve slaveOk = false”, “code”: 13435}


174

Mongo çoğaltma setlerini ilk kez denedim.

Ec2 üzerinde ubuntu kullanıyorum ve üç örnek açtım. Her bir örneğin özel IP adresini kullandım. Ben birincil olarak aldı ve aşağıda kodu.

mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)

Bu noktada her şey yolunda. Ben gittiğimde http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet sitede ben bir birincil, seconday ve arbitor sahip olduğunu görüyoruz.

Tamam, şimdi bir test için.

Birincil bu bir veritabanı oluşturmak kodu:

use tt
db.tt.save( { a : 123 } )

ikincil olarak, sonra bunu yapmak ve aşağıdaki hatayı alıyorum:

db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }

Mongodb ve replikasyonlar için çok yeniyim ama birinde bir şey yaparsam, diğerine gider diye düşündüm. Birine bir kayıt eklersem, makineler arasında çoğaltma yapmak için ne yapmam gerekir?


rs.slaveOk () kullanmak zorunda olduğunu anladım; Bu beni başka bir soruya bırakıyor. Bunu her sorgu için yapmak zorunda mı? Ana düğümdeysem ne olur?

Yanıtlar:


282

Mongo kabuğunun ikincil bir okumaya izin verdiğinizi bildirmek için "köle tamam" modunu ayarlamanız gerekir. Bu, sizi ve uygulamalarınızı yanlışlıkla tutarlı okumalar yapmaktan korumak içindir. Bunu kabukta aşağıdakilerle yapabilirsiniz:

rs.slaveOk()

Bundan sonra normalden ikincil olarak sorgulayabilirsiniz.

"Nihai tutarlılık" ile ilgili bir not: normal şartlar altında, çoğaltma kümesi ikincil değerleri bir saniye veya daha kısa bir sürede primerlerle aynı verilere sahiptir. Çok yüksek yük altında, birincil öğeye yazdığınız verilerin ikincil öğelere çoğaltılması biraz zaman alabilir. Bu, "çoğaltma gecikmesi" olarak bilinir ve geciken bir ikincil öğeden okuma, "sonunda tutarlı" bir okuma olarak bilinir, çünkü yeni yazılan veriler bir noktada (ağ hatalarını engelleme, vb.) Gösterilse de, Hemen Mümkün.

Düzenleme: Yalnızca ikincil sorgulama yaparken ve oturum başına yalnızca bir kez slaveok ayarlamanız gerekir.


3
DB'lerinizde anlamadığınız komutları yürütmeden önce her zaman kılavuzu kontrol edin. Komutun cevabın açıklamamış sonuçları olabilir. Bu komut, çoğaltma kümesine yapılan tüm bağlantılar için okuma açıklarının dağıtılma şeklini değiştiriyor mu? Daha iyi öğren. Bu komut v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk kadar geriye docs.mongodb.com URL'sinin "/ manual /" kısmını her zaman değiştirebilirsiniz (ve değiştirmeniz gerekir) ilgili bilgileri aldığınızdan emin olmak için sürümünüze ekleyin.
Bruno Bronosky

45

rs.slaveOk()Her seferinde yazmaktan kaçınmak için şunu yapın :

replStart.jsBir satır içeren bir dosya oluşturun :rs.slaveOk()

Sonra --shell replStart.jsMongo kabuğunu başlattığınızda ekleyin . Tabii ki, yerel olarak tek bir örneğe bağlanıyorsanız, bu herhangi bir yazmayı kaydetmez.


26
Yazarak tasarruf etmek daha iyi bir yol eklemek olacaktır rs.slaveOk()sizin için ~/.mongorc.jsMongo kabuk başlatırken otomatik olarak çalıştırılacaktır dosyası.
Stennie

2
Varsayılan yapılandırmayı ~/.mongorc.jsve özel yapılandırmaları içine replStart.jsveya başka bir yere koymayı yararlı buluyorum adminStart.js.
Ed Norris

41

mongodb2.0 içinde

yazmalısın

rs.slaveOk()

ikincil mongod düğümünde


11

BU SADECE YAKIN SÜRÜCÜ KULLANARAK BU SORUNLA HERHANGİ BİR FIRSAT İÇİN BİR NOT

Ruby Gem'i kullanırken de aynı sorunu yaşadım.

Ruby'de slaveOk'u ayarlamak için, istemciyi şu şekilde oluşturduğunuzda bunu bir argüman olarak iletirsiniz:

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })

https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional host/port args)

Üçüncü değişkenin isteğe bağlı argüman olduğuna dikkat edin.



1

Ben sadece DB sağlayıcısından garip bir durum için bu cevabı ekliyorum.

Bizim durumumuzda olan şey, birincil ve ikincil db'nin tersine kaydırılmasıdır (birincilden ikincil ve tersi) ve aynı hatayı alıyoruz.

bu yüzden lütfen size yardımcı olabilecek veritabanı durumu için yapılandırma ayarlarını kontrol edin.


0

Burada aynı hatayı aradım, ancak Node.js yerel sürücüsünden . Benim için cevap tarafından cevapların kombinasyonu idi campeterson ve PRABHAT .

Sorun, readPreferenceayarın varsayılan olarak ayarlanmasıdır primary, bu da bir şekilde kafa karıştırıcı slaveOkhataya yol açar . Benim sorunum sadece herhangi bir düğümden çoğaltma kümemden okumak istiyorum. Çoğaltma için bile bağlantım yok. Sadece okumak için herhangi bir düğüme bağlanırım.

Ayar readPreferenceiçin primaryPreferred(veya daha iyi ReadPreference.PRIMARY_PREFERREDsabiti) benim için çözüldü. Sadece bir seçeneği gibi geçmek MongoClient.connect()ya client.db()ya herhangi find(), aggregate()veya diğer işlevi.

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.