Ich habe zum ersten Mal Mongo Replica Sets ausprobiert.
Ich verwende Ubuntu auf ec2 und habe drei Instanzen hochgefahren. Ich habe die private IP-Adresse jeder Instanz verwendet. Ich habe als primären ausgewählt und unten ist der Code.
mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
Alles an diesem Punkt ist in Ordnung. Wenn ich zur Website http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet gehe, sehe ich, dass ich einen primären, einen zweiten und einen Schiedsrichter habe.
Ok, jetzt zu einem Test.
Beim primären Erstellen einer Datenbank ist dies der Code:
use tt
db.tt.save( { a : 123 } )
Auf der Sekundärseite mache ich das dann und erhalte den folgenden Fehler:
db.tt.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
Ich bin sehr neu in Mongodb und repliziere, aber ich dachte, wenn ich etwas in einem mache, geht es in den anderen. Was muss ich tun, um maschinenübergreifend zu replizieren, wenn ich einen Datensatz in einen hinzufüge?
quelle
Antworten:
Sie müssen den "Slave OK" -Modus einstellen, um die Mongo-Shell darüber zu informieren, dass Sie Lesevorgänge von einer Sekundärseite zulassen. Dies soll Sie und Ihre Anwendungen davor schützen, versehentlich konsistente Lesevorgänge durchzuführen. Sie können dies in der Shell tun mit:
Danach können Sie normal von Secondaries abfragen.
Ein Hinweis zur "eventuellen Konsistenz": Unter normalen Umständen haben Sekundärdateien von Replikatsätzen innerhalb einer Sekunde oder weniger dieselben Daten wie Primärdaten. Unter sehr hoher Last kann es eine Weile dauern, bis Daten, die Sie in die Primärdaten geschrieben haben, auf die Sekundärdaten repliziert werden. Dies wird als "Replikatverzögerung" bezeichnet, und das Lesen von einer verzögerten Sekundärseite wird als "eventuell konsistenter" Lesevorgang bezeichnet, da die neu geschriebenen Daten zwar irgendwann angezeigt werden (mit Ausnahme von Netzwerkfehlern usw.), dies jedoch möglicherweise nicht der Fall ist sofort verfügbar.
Bearbeiten: Sie müssen Slaveok nur einstellen, wenn Sie von Secondaries abfragen, und nur einmal pro Sitzung.
quelle
Gehen Sie folgendermaßen vor, um nicht
rs.slaveOk()
jedes Mal zu tippen:Erstellen Sie eine Datei mit dem Namen
replStart.js
, die eine Zeile enthält:rs.slaveOk()
Schließen
--shell replStart.js
Sie dann ein, wenn Sie die Mongo-Shell starten. Wenn Sie eine lokale Verbindung zu einer einzelnen Instanz herstellen, erspart dies natürlich keine Eingabe.quelle
rs.slaveOk()
, Ihrer~/.mongorc.js
Datei etwas hinzuzufügen , das beim Starten der Mongo-Shell automatisch ausgeführt wird.~/.mongorc.js
und benutzerdefinierte Konfigurationen inreplStart.js
oderadminStart.js
oder was auch immer zu setzen.in mongodb2.0
Sie sollten eingeben
im sekundären Mongod-Knoten
quelle
Dies ist nur ein Hinweis für jeden, der sich mit diesem Problem unter Verwendung des Rubin-Treibers befasst
Ich hatte das gleiche Problem bei der Verwendung des Ruby Gem.
Um SlaveOk in Ruby festzulegen, übergeben Sie es einfach als Argument, wenn Sie den Client wie folgt erstellen:
https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection
Beachten Sie, dass 'args' das dritte optionale Argument ist.
quelle
SlaveOk funktioniert nicht mehr. ReadPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred muss verwendet werden
z.B
quelle
Ich füge diese Antwort nur für eine unangenehme Situation des DB-Anbieters hinzu.
Was in unserem Fall passiert ist, ist die umgekehrte Verschiebung der primären und sekundären Datenbank (primär zu sekundär und umgekehrt) und wir erhalten den gleichen Fehler.
Überprüfen Sie daher in den Konfigurationseinstellungen den Datenbankstatus, der Ihnen möglicherweise hilft.
quelle
Ich habe hier für den gleichen Fehler suchen, aber von Node.js nativen Treiber . Die Antwort für mich war eine Kombination von Antworten von Campeterson und Prabhat .
Das Problem ist, dass
readPreference
die Standardeinstellung auf gesetzt istprimary
, was dann irgendwie zu einem verwirrendenslaveOk
Fehler führt. Mein Problem ist, dass ich nur von einem beliebigen Knoten aus meinem Replikatsatz lesen möchte. Ich verbinde mich nicht einmal mit ihm als Replikat. Ich verbinde mich einfach mit einem beliebigen Knoten, um daraus zu lesen.Das Setzen
readPreference
aufprimaryPreferred
(oder besser auf dieReadPreference.PRIMARY_PREFERRED
Konstante) hat es für mich gelöst. Geben sie nur als eine OptionMongoClient.connect()
oder zuclient.db()
oder zu einemfind()
,aggregate()
oder eine andere Funktion.quelle