单实例 Mongodb 副本集 - 无法执行 query/insert 操作
Single Instance Mongodb Replica Set - cannot perform query/insert operations
安装 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()
{
"state" : 10,
"stateStr" : "REMOVED",
"uptime" : 1041,
"optime" : Timestamp(1429037007, 1),
"optimeDate" : ISODate("2015-04-14T18:43:27Z"),
"ok" : 0,
"errmsg" : "Our replica set config is invalid or we are not a member of it",
"code" : 93
}
我不知道我该怎么做才能把事情搞砸。我认为这 应该 有效。我该如何克服这个问题?
这里的问题是你 运行 rs.initiate()
.. As EMPTY!您没有说明哪些机器属于该副本集。
所以..
rs.initiate({
_id: "rs0",
version: 1,
members: [
{ _id: 0, host : "address.to.this.machine:27017" }
]
}
)
我也遇到了同样的问题,我尝试了以下步骤,
注意:如果您已经设置了集群,请按照我的步骤进行操作
- 我停止了特定服务器(主机:"address.to.this.machine:27017")
- 删除 mongod.lock 文件
再创建一个数据目录
-(默认值:/data/db,新数据目录:/data/db_rs0)
更新**配置**文件
-更改数据库路径(“/data/db_rs0”),
- 检查 bindIP(默认值:127.0.0.0 到 0.0.0.0)
检查主机名和主机
hostname
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()
{
.....
"members":[
{
"_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
},
............
]
"ok": 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"
}
解决方法是reconf
mongo:
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>
简答:
我需要做的:
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()
设置的。这将在重新创建容器时更改。就我而言,本地主机很好,因为用于 'rocketchat' 应用程序评估目的的单个服务器和单个副本集。
安装 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() { "state" : 10, "stateStr" : "REMOVED", "uptime" : 1041, "optime" : Timestamp(1429037007, 1), "optimeDate" : ISODate("2015-04-14T18:43:27Z"), "ok" : 0, "errmsg" : "Our replica set config is invalid or we are not a member of it", "code" : 93 }
我不知道我该怎么做才能把事情搞砸。我认为这 应该 有效。我该如何克服这个问题?
这里的问题是你 运行 rs.initiate()
.. As EMPTY!您没有说明哪些机器属于该副本集。
所以..
rs.initiate({
_id: "rs0",
version: 1,
members: [
{ _id: 0, host : "address.to.this.machine:27017" }
]
}
)
我也遇到了同样的问题,我尝试了以下步骤,
注意:如果您已经设置了集群,请按照我的步骤进行操作
- 我停止了特定服务器(主机:"address.to.this.machine:27017")
- 删除 mongod.lock 文件
再创建一个数据目录 -(默认值:/data/db,新数据目录:/data/db_rs0)
更新**配置**文件 -更改数据库路径(“/data/db_rs0”), - 检查 bindIP(默认值:127.0.0.0 到 0.0.0.0)
检查主机名和主机
hostname
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()
{
.....
"members":[
{
"_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
},
............
]
"ok": 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"
}
解决方法是reconf
mongo:
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>
简答:
我需要做的:
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()
设置的。这将在重新创建容器时更改。就我而言,本地主机很好,因为用于 'rocketchat' 应用程序评估目的的单个服务器和单个副本集。