it-swarm.com.de

mongodb, repliziert und fehler: {"$ err": "nicht master und slaveOk = false", "code": 13435}

Ich habe zum ersten Mal Mongo-Replik-Sets ausprobiert.

Ich verwende ubuntu auf ec2 und habe drei Instanzen hochgefahren .. Ich habe die private IP-Adresse jeder der Instanzen verwendet. Ich habe als primär gewählt und unten ist der Code.

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

An diesem Punkt ist alles in Ordnung. Wenn ich zur http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet Site gehe, sehe ich, dass ich einen primären, zweiten und Arbiter habe.

Ok, jetzt zum Test. 

Auf dem primären erstellen Sie eine Datenbank in dieser ist der Code:

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

auf der sekundär mache ich das dann und bekomme den folgenden fehler:

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

Ich bin sehr neu in mongodb und repliziert, aber ich dachte, wenn ich etwas in einem mache, geht es zum anderen. Was muss ich tun, wenn ich einen Datensatz in einem Datensatz hinzufüge?

146
user959129

Sie müssen den "Slave OK" -Modus einstellen, um die Mongo-Shell wissen zu lassen, dass Sie das Lesen von einer Sekundärseite zulassen. Dies soll Sie und Ihre Anwendungen vor versehentlich konsistenten Lesevorgängen schützen. Sie können dies in der Shell mit:

rs.slaveOk()

Danach können Sie normalerweise von sekundären Abfragen abfragen. 

Ein Hinweis zur "eventuellen Konsistenz": Unter normalen Umständen haben Replikatsatz-Sekundärdateien alle Daten als Primärdaten innerhalb einer Sekunde oder darunter. Unter sehr hoher Last kann es eine Weile dauern, bis Daten, die Sie in den Primärdatenbank geschrieben haben, auf die Sekundärdaten repliziert werden. Dies wird als "Replikationsverzögerung" bezeichnet, und das Lesen von einer verzögerten Sekundärseite wird als "eventuell konsistenter" Lesevorgang bezeichnet, da die neu geschriebenen Daten zwar irgendwann auftauchen werden (Netzwerkfehler ausgeschlossen usw.), dies jedoch möglicherweise nicht der Fall ist sofort verfügbar. 

Edit: Sie müssen Slaveok nur einstellen, wenn Sie von Sekundäranfragen abfragen, und nur einmal pro Sitzung. 

244
dcrosta

Gehen Sie folgendermaßen vor, um zu vermeiden, dass Sie rs.slaveOk() eingeben:

Erstellen Sie eine Datei mit dem Namen replStart.js, die eine Zeile enthält: rs.slaveOk()

Fügen Sie dann --Shell replStart.js ein, wenn Sie die Mongo Shell starten. Wenn Sie sich lokal mit einer einzelnen Instanz verbinden, werden dadurch keine Eingaben gespeichert.

39
Ed Norris

in mongodb2.0

du solltest tippen

rs.slaveOk()

im sekundären mongod-knoten

26
andyshi

DIESES IS NUR EIN HINWEIS FÜR JEDER, DER MIT DIESEM PROBLEM UNTER VERWENDUNG DES Ruby TREIBERS

Ich hatte das gleiche Problem bei der Verwendung des Ruby Gem.

Um slaveOk in Ruby zu setzen, übergeben Sie es einfach als Argument, wenn Sie den Client wie folgt erstellen:

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)

Beachten Sie, dass 'args' das dritte optionale Argument ist.

11
campeterson

slaveOk funktioniert nicht mehr. Man muss readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred verwenden

z.B.

const client = new MongoClient(mongoURL + "?readPreference=primaryPreferred", { useUnifiedTopology: true, useNewUrlParser: true });
0
Prabhat

Ich füge diese Antwort nur für eine unangenehme Situation des DB-Anbieters hinzu.

was in unserem Fall passiert ist, ist die primäre und sekundäre Db, die umgekehrt verschoben wurde (primäre zu sekundären und umgekehrt), und wir erhalten den gleichen Fehler.

Überprüfen Sie daher in den Konfigurationseinstellungen den Datenbankstatus, der Ihnen helfen kann.

0
jit