mongodb,replicates和error:{“$ err”:“not master and slaveOk = false”,“code”:13435}

我第一次尝试了mongo副本。

我在ec2上使用ubuntu,并启动了三个实例。 我使用了每个实例的私有IP地址。 我select作为主要和下面的代码。

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

所有这一切都很好。 当我去http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet网站时,我看到我有一个主要的,seconday和arbitor。

好吧,现在进行testing。

在主要创build一个数据库在这是代码:

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

在中学,我然后做这个,得到下面的错误:

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

我对mongodb非常陌生,但是我认为如果我在一个中做了一些事情,那么它就是另一个。 所以,如果我在一个logging中添加logging,那么我需要做什么才能跨机器复制?

您必须设置“slave okay”模式,让mongo shell知道您允许从辅助节点读取数据。 这是为了保护您和您的应用程序不会意外执行最终一致的读取。 你可以在shell中做到这一点:

 rs.slaveOk() 

之后,你可以正常从辅助查询。

关于“最终一致性”的说明:在正常情况下,副本集副本与一次数据具有相同的数据,在一秒或更短的时间内。 在非常高的负载下,您写入主服务器的数据可能需要一段时间才能复制到辅助服务器。 这就是所谓的“复制滞后”,从滞后中学的阅读被称为“最终一致”阅读,因为尽pipe新写入的数据会在某个时刻出现(除了networking故障等),它可能不是立即可用。

编辑:你只需要在从辅助angular色查询时设置slaveok,每个会话只需要设置一次。

为避免每次inputrs.slaveOk() ,请执行以下操作:

创build一个名为replStart.js的文件,其中包含一行: rs.slaveOk()

然后在启动Mongo shell时join--shell replStart.js 。 当然,如果你本地连接到一个实例,这不会保存任何input。

在mongodb2.0

你应该input

 rs.slaveOk() 

在第二个mongod节点中

这只是一个注意任何人处理这个问题使用的ruby驱动程序

使用Ruby Gem时,我遇到了同样的问题。

要在Ruby中设置slaveOk,只需在创build如下客户端时将其作为parameter passing:

 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) 

注意“args”是第三个可选参数。

我只是从数据库提供商的一个尴尬的情况join这个答案。

在我们的例子中发生的是主要和次要数据库反向移动(主要到次要,反之亦然),我们得到相同的错误。

所以请检查数据库状态的configuration设置,这可能会帮助你。