mongodb,复制和错误:{“$ err”:“not master and slaveOk = false”,“code”:13435}

时间:2012-01-24 16:14:01

标签: mongodb amazon-ec2

我第一次尝试了mongo副本。

我在ec2上使用ubuntu,我启动了三个实例。 我使用了每个实例的私有IP地址。我选择了主要,下面是代码。

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网站时,我发现我有一个主要的,次要的和仲裁者。

好的,现在进行测试。

在主要创建数据库的代码是:

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

在辅助版上,然后执行此操作并获得以下错误:

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

我对mongodb和复制都很新,但我认为如果我在一个人做某事,那就转到另一个人身上。因此,如果我在一个记录中添加记录,我需要做什么才能跨机器复制?

8 个答案:

答案 0 :(得分:251)

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

rs.slaveOk()

之后,您可以正常查询辅助副本。

关于“最终一致性”的说明:在正常情况下,副本集辅助设备在一秒或更短时间内具有与原色相同的所有数据。在非常高的负载下,您写入主数据库的数据可能需要一段时间才能复制到辅助数据库。这被称为“副本滞后”,从滞后的辅助读取被称为“最终一致”读取,因为,虽然新写入的数据将在某个时刻出现(除非网络故障等),它可能不是立即可用。

编辑:您只需要在从辅助设备查询时设置slaveok,并且每个会话只需设置一次。

答案 1 :(得分:39)

为避免每次都输入rs.slaveOk(),请执行以下操作:

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

然后在启动Mongo shell时包含--shell replStart.js。当然,如果您在本地连接到单个实例,则不会保存任何输入。

答案 2 :(得分:28)

在mongodb2.0中

你应该输入

rs.slaveOk()

在辅助mongod节点

答案 3 :(得分:10)

这只是任何人使用红宝石驾驶员处理此问题的注意事项

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

要在Ruby中设置slaveOk,只需在创建客户端时将其作为参数传递:

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'是第三个可选参数。

答案 4 :(得分:2)

slaveOk不再起作用。一个需要使用readPreference https://docs.mongodb.com/v3.0/reference/read-preference/#primaryPreferred

例如

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

答案 5 :(得分:2)

我到这里是在寻找相同的错误,但来自Node.js native driver。对我来说,答案是campetersonPrabhat的答案的组合。

问题在于readPreference的默认设置为primary,这将以某种方式导致令人困惑的slaveOk错误。我的问题是,我只想从任何节点上读取我的副本集。我什至没有连接到副本集。我只是连接到任何节点以读取它。

readPreference设置为primaryPreferred(或者更好地设置为ReadPreference.PRIMARY_PREFERRED常数)可以解决此问题。只需将其作为选项传递给MongoClient.connect()client.db()或任何find()aggregate()或其他函数。

const { MongoClient, ReadPreference } = require('mongodb');
const client = await MongoClient.connect(MONGODB_CONNECTIONSTRING, { readPreference: ReadPreference.PRIMARY_PREFERRED });

答案 6 :(得分:2)

警告:slaveOk()已被弃用,并可能在下一个主要版本中删除。请改用secondaryOk()。 rs.secondaryOk()

答案 7 :(得分:0)

我只是为数据库提供商的尴尬情况添加了这个答案。

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

所以请检查数据库状态的配置设置,这可能会对您有所帮助。