首页 文章

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

提问于
浏览
143

我第一次尝试了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和复制都很新,但我认为如果我在一个人做某事,那么它会转向另一个人 . 所以,如果我在一个记录中添加记录,我需要做什么来跨机器复制?

5 回答

  • 234

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

    rs.slaveOk()
    

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

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

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

  • 36

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

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

    然后在启动Mongo shell时包含 --shell replStart.js . 当然,如果你're connecting locally to a single instance, this doesn' t保存任何打字 .

  • 22

    在mongodb2.0中

    你应该打字

    rs.slaveOk()
    

    在辅助mongod节点

  • 9

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

    在我们的情况下发生的是主要和次要数据库反向移动(主要到次要,反之亦然),我们得到相同的错误 .

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

  • 0

    THIS IS JUST A NOTE FOR ANYONE DEALING WITH THIS PROBLEM USING THE RUBY DRIVER

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

相关问题