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

mo49yndu  于 2023-06-22  发布在  Go
关注(0)|答案(9)|浏览(134)

我第一次尝试了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站点时,我看到我有一个primary、seconday和arbitor。
好了,现在测试一下。
在主数据库中创建一个数据库,代码如下:

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

在辅助服务器上,我这样做并得到以下错误:

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

我对mongodb和复制非常陌生,但我认为如果我在一个中做了一些事情,它就会转到另一个。那么,如果我在其中添加了一条记录,我需要做些什么才能跨机器复制呢?

o8x7eapl

o8x7eapl1#

你必须设置“secondary okay”模式,让mongo shell知道你允许从secondary读取。这是为了防止您和您的应用程序意外执行最终一致的读取。您可以在shell中使用以下命令执行此操作:

rs.secondaryOk()

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

**编辑:**从机查询时只需要设置secondaryOk,每个session只需要设置一次。

des4xlb0

des4xlb02#

要避免每次都键入rs.slaveOk(),请执行以下操作:
创建一个名为replStart.js的文件,其中包含一行:rs.slaveOk()
然后在启动Mongo shell时包含--shell replStart.js。当然,如果您在本地连接到单个示例,这并不会保存任何输入。

3lxsmp7m

3lxsmp7m3#

在mongodb2.0
你应该打字

rs.slaveOk()

在次mongod节点中

1dkrff03

1dkrff034#

这只是给使用Ruby驱动程序处理此问题的任何人的说明

  • 我在使用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'是第三个可选参数。

6qftjkof

6qftjkof5#

我在这里搜索相同的错误,但来自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 });
ojsjcaue

ojsjcaue6#

警告slaveOk()已弃用,可能会在下一个主要版本中删除。请使用secondaryOk()(在mongo shell中)。

x6yk4ghg

x6yk4ghg7#

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

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

wqsoz72f8#

我只是为DB提供商的一个尴尬情况添加这个答案。
在我们的情况下发生的是主DB和次DB反向移位(主DB到次DB,反之亦然),并且我们得到相同的误差。
所以请检查数据库状态的配置设置,这可能对你有帮助。

o4hqfura

o4hqfura9#

将readPreference添加为PRIMARY

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

相关问题