【发布时间】:2017-01-07 17:24:03
【问题描述】:
当我停止我的副本集的节点并再次启动它们时,主节点进入“正在恢复”状态。
我创建了一个副本集,未经授权运行。为了使用授权,我添加了用户“db.createUser(...)”,并在配置文件中启用了授权:
security:
authorization: "enabled"
在停止副本集之前(甚至在不添加安全参数的情况下重新启动集群),rs.status() 显示:
{
"set" : "REPLICASET",
"date" : ISODate("2016-09-08T09:57:50.335Z"),
"myState" : 1,
"term" : NumberLong(7),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.1.167:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 301,
"optime" : {
"ts" : Timestamp(1473328390, 2),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2016-09-08T09:53:10Z"),
"electionTime" : Timestamp(1473328390, 1),
"electionDate" : ISODate("2016-09-08T09:53:10Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.1.168:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 295,
"optime" : {
"ts" : Timestamp(1473328390, 2),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2016-09-08T09:53:10Z"),
"lastHeartbeat" : ISODate("2016-09-08T09:57:48.679Z"),
"lastHeartbeatRecv" : ISODate("2016-09-08T09:57:49.676Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.1.167:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.1.169:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 295,
"optime" : {
"ts" : Timestamp(1473328390, 2),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2016-09-08T09:53:10Z"),
"lastHeartbeat" : ISODate("2016-09-08T09:57:48.680Z"),
"lastHeartbeatRecv" : ISODate("2016-09-08T09:57:49.054Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.1.168:27017",
"configVersion" : 1
}
],
"ok" : 1
}
为了开始使用这个配置,我已经停止了每个节点如下:
[root@n--- etc]# mongo --port 27017 --eval 'db.adminCommand("shutdown")'
MongoDB shell version: 3.2.9
connecting to: 127.0.0.1:27017/test
2016-09-02T14:26:15.784+0200 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2016-09-02T14:26:15.785+0200 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:231:14
这次关闭后,我通过检查ps -ax | grep mongo的输出确认了该进程不存在。
但是当我再次启动节点并使用我的凭据登录时,rs.status() 现在显示:
{
"set" : "REPLICASET",
"date" : ISODate("2016-09-08T13:19:12.963Z"),
"myState" : 3,
"term" : NumberLong(7),
"heartbeatIntervalMillis" : NumberLong(2000),
"members" : [
{
"_id" : 0,
"name" : "192.168.1.167:27017",
"health" : 1,
"state" : 3,
"stateStr" : "RECOVERING",
"uptime" : 42,
"optime" : {
"ts" : Timestamp(1473340490, 6),
"t" : NumberLong(7)
},
"optimeDate" : ISODate("2016-09-08T13:14:50Z"),
"infoMessage" : "could not find member to sync from",
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.1.168:27017",
"health" : 0,
"state" : 6,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2016-09-08T13:19:10.553Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : NumberLong(0),
"authenticated" : false,
"configVersion" : -1
},
{
"_id" : 2,
"name" : "192.168.1.169:27017",
"health" : 0,
"state" : 6,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2016-09-08T13:19:10.552Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : NumberLong(0),
"authenticated" : false,
"configVersion" : -1
}
],
"ok" : 1
}
为什么?也许关闭不是停止 mongod 的好方法;但是我也使用'kill pid'进行了测试,但重启最终处于相同的状态。
在这种状态下,我不知道如何修复集群;我又开始了(删除 dbpath 文件并重新配置副本集);我尝试了“--repair”但没有奏效。
关于我的系统的信息:
- Mongo 版本:3.2
- 我以 root 身份启动进程,也许它应该以 'mongod' 用户身份启动?
- 这是我的启动命令:
mongod --conf /etc/mongod.conf - keyFile 配置不起作用;如果我添加“--keyFile /path/to/file”显示:
“即将 fork 子进程,等待服务器准备好连接。”此文件拥有所有权限,但无法使用 keyFile。 -
“net.bindIp”配置示例,来自一台机器上的 mongod.conf:
net: port: 27017 bindIp: 127.0.0.1,192.168.1.167
【问题讨论】:
-
启用认证后你做了什么?您的副本集成员如何尝试向各自的副本集验证他们的成员身份?启用身份验证后,您无法在没有适当凭据的情况下连接到实例,除非您从 localhost 进行连接
-
在所有配置文件中启用身份验证后,我启动副本集(使用 mongod --config /etc/mongod.conf),然后使用我的凭据访问,然后关闭我插入的集群。密钥文件身份验证是可选的,不是我的问题。只有我想要用户/通行证的访问权限
-
您应该添加一些额外的配置,因为不仅客户端需要能够与副本集进行身份验证,而且副本集节点也需要能够相互进行身份验证。因此,每个副本集节点都以具有足够权限的特殊内部用户身份与其他节点进行身份验证
-
例如可以为每个副本集成员添加一个密钥文件,并在其中输入管理员用户的密码。然后使用
--keyFile /path/to/keyfilearg 启动 mongod 实例。
标签: mongodb mongodb-replica-set