【问题标题】:Single Instance Mongodb Replica Set - cannot perform query/insert operations单实例 Mongodb 副本集 - 无法执行查询/插入操作
【发布时间】:2015-06-27 08:08:44
【问题描述】:

安装完mongodb后,我跑mongod with

mongod --dbpath <pathtodb> --logpath <pathtolog> --replSet rs0

然后我连接到 mongo shell 并运行

rs.initiate()

然后我尝试将文档插入到集合中,但收到错误:

> db.blah.insert({a:1})
WriteResult({ "writeError" : { "code" : undefined, "errmsg" : "not master" } })

查看rs.status(),我看到状态是REMOVED

> rs.status() { “状态”:10, “stateStr”:“删除”, “正常运行时间”:1041, "optime" : 时间戳(1429037007, 1), "optimeDate" : ISODate("2015-04-14T18:43:27Z"), “好”:0, "errmsg" : "我们的副本集配置无效或者我们不是其中的成员", “代码”:93 }

我不知道我能做些什么来搞砸这一切。我认为这应该有效。我该如何克服这个问题?

【问题讨论】:

  • 副本集只有一个成员。我正在尝试将其用作副本集,以便我可以跟踪 oplog 并查看发生的更改。
  • 因为它只是一个测试设置,所以将其清除并重新开始。做了一些事情把它搞砸了,但我们不知道是什么,至少没有看到 rs.conf()。
  • 嗯。这似乎确实有效。不知道究竟是什么导致了这个问题。现在工作...

标签: mongodb replicaset


【解决方案1】:

如上回答所说,配置设置不正确。

我尝试重新初始化副本,但收到错误消息:

singleNodeRepl:OTHER> rs.initiate({ _id: "rs0", members: [ { _id: 0, host : "localhost:27017" } ] } )
{
    "info" : "try querying local.system.replset to see current configuration",
    "ok" : 0,
    "errmsg" : "already initialized",
    "code" : 23,
    "codeName" : "AlreadyInitialized"
}

解决办法是reconfmongo:

singleNodeRepl:OTHER> rsconf = rs.conf()
singleNodeRepl:OTHER> rsconf.members = [{_id: 0, host: "localhost:27017"}]
[ { "_id" : 0, "host" : "localhost:27017" } ]
singleNodeRepl:OTHER> rs.reconfig(rsconf, {force: true})
{ "ok" : 1 }
singleNodeRepl:OTHER>
singleNodeRepl:SECONDARY>
singleNodeRepl:PRIMARY>

【讨论】:

  • 非常感谢!遇到完全相同的问题。自从使用 localhost 后重新启动/更新容器时现在应该很好。
【解决方案2】:

这里的问题是您运行rs.initiate().. 为空!你没有告诉哪些机器属于那个副本集。

所以..

rs.initiate({
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "address.to.this.machine:27017" }
      ]
   }
)

【讨论】:

  • Empty rs.initiate() 很好,你只需要遵循例如rs.add("db.example.com")
【解决方案3】:

简答:

我需要做的:

rs.initiate({_id:'rs0', version: 1, members: [{_id: 0, host:'localhost:27017'}]}

而不是rs.initiate()

长答案:

我和@Madbreaks 和@Yihe 的评论几乎一样,但我的背景不同,所以我在这里添加我的评论。

背景

我使用了 mongoDB 的 docker 容器,并通过rs.initiate() 启动了副本集。 (数据卷挂载到宿主机上,不过这里跑题了)。

发生了什么

当我重新启动 mongoDB 容器时,发生错误“MongoError: not master and slaveOk=false”。是的,错误信息与@d0c_s4vage 的不同,但解决方法与@Yihe 的相同。

根本原因

根本原因是动态分配主机名,如下所示:

rs0:PRIMARY> rs.conf()
{
    "_id" : "rs0",
    ...
    "members" : [
        {
            ...
            "host" : "ee4ed99b555e:27017",  # <----- !!!!

其中,上面的主机“ee4...”来自docker容器的内部主机名;这是由我的第一个rs.initiate() 设置的。这将在重新创建容器时更改。就我而言,localhost 很好,因为单个服务器和单个副本集用于“rocketchat”应用评估目的。

【讨论】:

    【解决方案4】:

    我也面临同样的问题,我尝试了以下步骤,

    注意:如果您已经进行了集群设置,请按照我的步骤操作

    • 我停止了特定服务器(主机:“address.to.this.machine:27017”)
    • 删除 mongod.lock 文件
    • 再创建一个数据目录 - (默认:/data/db,新数据目录:/data/db_rs0)

    • 更新**配置**文件 -更改数据库路径(“/data/db_rs0”), - 检查 bindIP(默认:127.0.0.0 到 0.0.0.0)

    • 检查主机名和主机

      主机名

      sudo vi /etc/hosts

    添加到主机

             127.0.0.0 hostname
    
             127.0.1.1 hostname
    
            (add your Public/Private IP)   hostname 
    
    • 中启动MONGODB服务器

      sudo /usr/bin/mongod -f /etc/mongod.conf &

    rs.initiate({ _id: "rs0", members: [ { _id: 0, host : "hostname:27017" } ] })

    rs.status()

    {

    ....

    “成员”:[

    {
    
      "_id": 0,
    
      "name": "hostname:27017",
    
      "health": 1,
    
      "state": 1,
    
      "stateStr": "PRIMARY",
    
      "uptime": 98231,
    
      "optime": {
    
        "ts": Timestamp(1474963880, 46),
    
        "t": NumberLong(339)
      },
    
      "optimeDate": ISODate("2016-09-27T08:11:20Z"),
    
      "electionTime": Timestamp(1474956813, 1),
    
      "electionDate": ISODate("2016-09-27T06:13:33Z"),
    
      "configVersion": 12,
    
      "self": true
    },
    

    ...........

    ]

    “确定”:1

    }

    -------- 谢谢你--------

    【讨论】:

    • 本地主机地址是 127.0.0.1 而不是 127.0.0.0。你说的是集群,当你真正的意思是副本集时...... ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2021-02-22
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2014-11-01
    • 2012-10-08
    相关资源
    最近更新 更多