11

安装 mongodb 后,我运行mongod

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
}

我不知道我能做些什么来搞砸这一切。我认为这应该有效。我该如何度过这个难关?

4

4 回答 4

11

正如上面的答案所说,配置设置不正确。

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

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>
于 2018-07-10T09:11:42.630 回答
9

这里的问题是你跑了rs.initiate()..作为空!您没有告诉哪些机器属于该副本集。

所以..

rs.initiate({
      _id: "rs0",
      version: 1,
      members: [
         { _id: 0, host : "address.to.this.machine:27017" }
      ]
   }
)
于 2016-08-11T08:49:27.010 回答
2

简短的回答:

我需要做:

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”应用程序评估目的的单个服务器和单个副本集。

于 2020-04-24T01:13:07.443 回答
0

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

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

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

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

  • 检查主机名和主机

    主机名

    须藤 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

}

- - - - 谢谢你 - - - -

于 2016-09-28T09:42:03.987 回答