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

161 amazon-ec2 mongodb

我第一次尝试了mongo副本集.

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

mongo --host Private IP Address
rs.initiate()
rs.add(“Private IP Address”)
rs.addArb(“Private IP Address”)
Run Code Online (Sandbox Code Playgroud)

所有这一切都很好.当我去http://ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com:28017/_replSet网站时,我发现我有一个主要的,次要的和仲裁者.

好的,现在进行测试.

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

use tt
db.tt.save( { a : 123 } )
Run Code Online (Sandbox Code Playgroud)

在二级,我然后这样做并得到以下错误:

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

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

dcr*_*sta 262

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

rs.slaveOk()
Run Code Online (Sandbox Code Playgroud)

之后,您可以正常查询辅助.

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

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

  • 在执行DB上不理解的命令之前,请务必查看手册.答案可能会对命令产生影响.此命令是否会更改为副本集的所有连接分配读取操作的方式?更好地了解.此命令可以追溯到v2.2 https://docs.mongodb.com/v2.2/reference/method/rs.slaveOk/您可以(并且应该)始终替换文档的"/ manual /"部分.mongodb.com指向您特定版本的URL,以确保您获得相关信息. (3认同)

Ed *_*ris 41

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

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

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

  • 节省打字的一个更好的方法是将`rs.slaveOk()`添加到你的[`〜/ .mongorc.js`](http://docs.mongodb.org/manual/reference/mongo/#mongo- mongorc-file)文件,在启动mongo shell时会自动执行. (25认同)
  • 我发现将`〜/ .mongorc.js`中的默认配置和`replStart.js`或`adminStart.js`中的自定义配置放入其中是很有用的. (2认同)

小智 32

在mongodb2.0中

你应该输入

rs.slaveOk()
Run Code Online (Sandbox Code Playgroud)

在次要mongod节点


cam*_*son 11

这只是一个注意,任何人使用红宝石驱动程序处理这个问题

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

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

mongo_client = MongoClient.new("localhost", 27017, { slave_ok: true })
Run Code Online (Sandbox Code Playgroud)

https://github.com/mongodb/mongo-ruby-driver/wiki/Tutorial#making-a-connection

mongo_client = MongoClient.new # (optional host/port args)
Run Code Online (Sandbox Code Playgroud)

请注意,'args'是第三个可选参数.


kub*_*b1x 8

我在这里寻找相同的错误,但来自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 });
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 6

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