mongodb,复制并出错:{“ $ err”:“不是master和slaveOk = false”,“ code”:13435}


174

我第一次尝试了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网站时,我看到我有一个主要的,seconday和arbitor的网站。

好的,现在进行测试。

在主数据库上创建以下代码:

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

在辅助节点上,然后执行此操作并得到以下错误:

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

我对mongodb并不陌生并且可以复制,但是我认为如果我在其中一项中做某事,那将是另一项。因此,如果我在一条记录中添加一条记录,我该怎么做才能在多台计算机之间复制?


弄清楚我必须使用rs.slaveOk(); 这让我有另一个问题。我必须为每个查询执行此操作吗?如果我在主节点上怎么办?

Answers:


282

您必须设置“ slave okay”模式,以使mongo shell知道您允许从辅助目录读取数据。这是为了保护您和您的应用程序免于意外执行最终一致的读取。您可以使用以下命令在外壳中执行此操作:

rs.slaveOk()

之后,您可以正常地从中学查询。

关于“最终一致性”的注释:在正常情况下,副本集辅助副本在几秒钟或更短的时间内具有与主副本相同的所有数据。在非常高的负载下,您写入主数据库的数据可能需要一段时间才能复制到辅助数据库。这被称为“副本滞后”,而从滞后的辅助数据库中进行的读取被称为“最终一致”读取,这是因为,尽管新写入的数据会在某个时候出现(除非出现网络故障等),但可能不会立即可用。

编辑:从次要查询时,您只需要设置slaveok,每个会话仅一次。


3
在执行数据库上不了解的命令之前,请务必先阅读手册。可能导致命令未解释答案的后果。此命令是否更改了副本集所有连接的读取操作的分配方式?最好找出来。此命令最早出现在v2.2 docs.mongodb.com/v2.2/reference/method/rs.slaveOk中。您可以(并且应该)始终替换docs.mongodb.com URL的“ / manual /”部分到您的特定版本,以确保获得相关信息。
布鲁诺·布罗诺斯基

45

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

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

然后--shell replStart.js在启动Mongo Shell时包括在内。当然,如果要本地连接到单个实例,则不会保存任何键入内容。


26
节省键入内容的更好方法是将其添加rs.slaveOk()~/.mongorc.js文件中,该文件将在启动mongo shell时自动执行。
Stennie 2013年

2
我觉得有用把缺省配置~/.mongorc.js和自定义配置的replStart.jsadminStart.js或什么的。
Ed Norris

41

在mongodb2.0中

你应该输入

rs.slaveOk()

在二级mongod节点中


11

这只是任何使用红宝石驱动程序解决此问题的人的注意事项

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



1

我只是为数据库提供者的尴尬情况添加此答案。

在我们的案例中,发生的情况是主数据库和辅助数据库反向移动(主数据库到辅助数据库,反之亦然),并且我们遇到了相同的错误。

因此,请在配置设置中检查数据库状态,这可能会对您有所帮助。


0

我在这里搜索相同的错误,但是是从Node.js本机驱动程序搜索的。对我来说,答案是CampetersonPrabhat的答案的组合。

问题在于readPreference设置默认为primary,这会导致混乱的slaveOk错误。我的问题是,我只想从任何节点读取我的副本集。我什至没有连接到副本集。我只连接到任何节点即可读取。

设置readPreferenceprimaryPreferred(或更好的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 });
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.