web-dev-qa-db-fra.com

mongodb, replicates et error: {"$ err": "not master and slaveOk = false", "code": 13435}

J'ai essayé les jeux de répliques Mongo pour la première fois.

J'utilise ubuntu sur ec2 et j'ai démarré trois instances ..__ J'ai utilisé l'adresse IP privée de chacune des instances. J'ai choisi comme principal et ci-dessous est le code.

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

Tout va bien à ce stade. Quand je vais au http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet site, je vois que j'ai un primaire, un second jour et un arbitre.

Ok, maintenant pour un test. 

Sur le primaire, créer une base de données est le code suivant:

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

sur le secondaire, je le fais alors et j'obtiens l'erreur ci-dessous:

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

Je suis très nouveau sur mongodb et je le répète, mais je pensais que si je fais quelque chose dans l’un, c’est un autre. Ainsi, si j'ajoute un enregistrement dans un, que dois-je faire pour répliquer sur des machines?

146
user959129

Vous devez définir le mode "esclave correct" pour que le shell mongo sache que vous autorisez les lectures à partir d'un secondaire. Cela vous protège, ainsi que vos applications, d’effectuer par accident des lectures cohérentes. Vous pouvez le faire dans le shell avec:

rs.slaveOk()

Après cela, vous pouvez interroger normalement les secondaires. 

Remarque à propos de la "cohérence éventuelle": dans des circonstances normales, les serveurs secondaires répliqués ont toutes les mêmes données que les serveurs primaires en une seconde ou moins. Sous une charge très élevée, les données que vous avez écrites sur le primaire peuvent prendre un certain temps pour être répliquées sur les secondaires. Ceci est appelé "retard de réplique", et la lecture d'un secondaire en retard est appelée une lecture "éventuellement cohérente", car, même si les données nouvellement écrites apparaîtront à un moment donné (sauf en cas de défaillance du réseau, etc.), Immédiatement disponible. 

Edit: Vous avez seulement besoin de configurer slaveok lorsque vous interrogez des serveurs secondaires, et seulement une fois par session. 

244
dcrosta

Pour éviter de saisir rs.slaveOk() à chaque fois, procédez comme suit:

Créez un fichier nommé replStart.js, contenant une ligne: rs.slaveOk()

Incluez ensuite --Shell replStart.js lorsque vous lancez Mongo Shell. Bien sûr, si vous vous connectez localement à une seule instance, cela n'enregistre pas les saisies.

39
Ed Norris

dans mongodb2.0

vous devriez taper

rs.slaveOk()

en noeud de mongod secondaire

26
andyshi

This IS JUSTE UNE NOTE POUR TOUTE PERSONNE QUI S'AJUSTE À CE PROBLÈME UTILISANT LE PILOTE Ruby

J'ai eu le même problème avec Ruby Gem.

Pour définir slaveOk dans Ruby, il vous suffit de le passer comme argument lors de la création du client, comme suit:

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)

Notez que 'args' est le troisième argument optionnel.

9
campeterson

slaveOk ne fonctionne plus. Il faut utiliser readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred

par exemple.

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

Je viens d'ajouter cette réponse pour une situation délicate du fournisseur de base de données.

ce qui s’est passé dans notre cas est que la base de données primaire et secondaire a été inversée (primaire vers secondaire et vice versa) et nous obtenons la même erreur.

veuillez donc vérifier dans les paramètres de configuration l'état de la base de données, ce qui peut vous aider.

0
jit