mongodb, repliche ed errori: {“$ err”: “non master e slaveOk = false”, “codice”: 13435}


174

Ho provato i set di repliche di mongo per la prima volta.

Sto usando Ubuntu su ec2 e ho avviato tre istanze. Ho usato l'indirizzo IP privato di ciascuna delle istanze. Ho scelto come principale e sotto è il codice.

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

Tutto a questo punto va bene. Quando vado sul http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replImpostare il sito vedo che ho un primario, un secondo e un arbitor.

Ok, ora per un test.

Sul primario creare un database in questo è il codice:

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

sul secondario, quindi faccio questo e ottengo l'errore di seguito:

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

Sono molto nuovo con mongodb e repliche ma ho pensato che se faccio qualcosa in uno, va nell'altro. Quindi, se aggiungo un record in uno, cosa devo fare per replicare su più macchine?


capito che devo usare rs.slaveOk (); Questo mi lascia a un'altra domanda. Devo fare questo per ogni domanda? Cosa succede se mi trovo sul nodo principale?

Risposte:


282

Devi impostare la modalità "slave okay" per far sapere alla shell mongo che stai permettendo letture da un secondario. Questo per proteggere te e le tue applicazioni dall'esecuzione accidentale di letture alla fine coerenti. Puoi farlo nella shell con:

rs.slaveOk()

Successivamente è possibile eseguire query normalmente da secondari.

Una nota sulla "eventuale coerenza": in circostanze normali, i secondari del set di repliche hanno tutti gli stessi dati delle primarie entro un secondo o meno. Con un carico molto elevato, i dati che hai scritto sul primario potrebbero richiedere del tempo per replicarsi sui secondari. Questo è noto come "ritardo di replica" e la lettura da un secondario in ritardo è nota come lettura "eventualmente coerente", perché, mentre i dati appena scritti verranno visualizzati ad un certo punto (salvo errori di rete, ecc.), Potrebbe non essere Immediatamente Disponibile.

Modifica: è necessario impostare slaveok solo per le query dai secondari e solo una volta per sessione.


3
Controlla sempre il manuale prima di iniziare a eseguire comandi che non capisci sui tuoi DB. Potrebbero esserci conseguenze sul comando che la risposta non spiega. Questo comando cambia il modo in cui vengono distribuite le operazioni di lettura per tutte le connessioni al set di repliche? Meglio scoprirlo. Questo comando appare fin dalla v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk Puoi (e dovresti) sostituire sempre la parte "/ manual /" di un URL docs.mongodb.com alla tua versione specifica per assicurarti di ottenere informazioni pertinenti.
Bruno Bronosky,

45

Per evitare di digitare rs.slaveOk()ogni volta, procedere come segue:

Crea un file denominato replStart.js, contenente una riga:rs.slaveOk()

Quindi includere --shell replStart.jsquando si avvia la shell Mongo. Naturalmente, se ti connetti localmente a una singola istanza, questo non salva alcuna digitazione.


26
Un modo migliore per risparmiare sulla digitazione sarebbe quello di aggiungere rs.slaveOk()al tuo ~/.mongorc.jsfile, che verrà eseguito automaticamente all'avvio della shell mongo.
Stennie

2
Trovo utile per mettere la configurazione predefinita in ~/.mongorc.jse configurazioni personalizzate in replStart.jso adminStart.jso qualsiasi altra cosa.
Ed Norris,

41

in mongodb2.0

dovresti digitare

rs.slaveOk()

nel nodo mongod secondario


11

QUESTA È SOLO UNA NOTA PER TUTTI GLI AFFARI CON QUESTO PROBLEMA UTILIZZANDO IL RUBY DRIVER

Ho avuto lo stesso problema durante l'utilizzo della gemma Ruby.

Per impostare slaveOk in Ruby, basta passarlo come argomento quando si crea il client in questo modo:

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)

Si noti che "args" è il terzo argomento facoltativo.



1

Sto solo aggiungendo questa risposta per una situazione imbarazzante da parte del provider DB.

ciò che è accaduto nel nostro caso è il db primario e secondario spostato al contrario (da primario a secondario e viceversa) e stiamo ottenendo lo stesso errore.

quindi controlla nelle impostazioni di configurazione lo stato del database che può aiutarti.


0

Ho qui alla ricerca per lo stesso errore, ma da Node.js driver nativo . La risposta per me è stata una combinazione di risposte di Campeterson e Prabhat .

Il problema è che l' readPreferenceimpostazione predefinita è primary, il che in qualche modo porta a confusioneslaveOk all'errore . Il mio problema è che volevo solo leggere dal mio set di repliche da qualsiasi nodo. Non mi collego nemmeno ad esso come replicaset. Mi collego a qualsiasi nodo per leggere da esso.

Impostazione readPreferencea primaryPreferred(o meglio alla ReadPreference.PRIMARY_PREFERREDcostante) ha risolto per me. Basta passare come opzione per MongoClient.connect()oa client.db()oa qualsiasi find(), aggregate()o di altra funzione.

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.