MongoDB副本集添加Secondary节点时遇Error code18认证失败问题
跨服务器Docker容器添加MongoDB副本集Secondary节点时认证失败问题
错误日志
{"t":{"$date":"2022-12-24T11:00:54.895+00:00"},"s":"I", "c":"NETWORK", "id":4712102, "ctx":"ReplicaSetMonitor-TaskExecutor","msg":"Host failed in replica set","attr":{"replicaSet":"{Replset_name}","host":"{VPS_IP}:27019","error":{"code":18,"codeName":"AuthenticationFailed","errmsg":"Authentication failed."},"action":{"dropConnections":false,"requestImmediateCheck":true}}}
副本集结构
- 主节点(Primary):VPS1_DO:container1(已激活,处于同一overlay网络)
- 从节点1(Secondary1):VPS1_DO:container2(已激活,处于同一overlay网络)
- 从节点2(Secondary2):VPS2_Azure:container1(出现错误)
rs.status() 成员信息
"members" : [ { "_id" : 0, "name" : "10.5.0.11(staticIP-container1):27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 258904, "optime" : { "ts" : Timestamp(1672026076, 1), "t" : NumberLong(67) }, "optimeDurable" : { "ts" : Timestamp(1672026076, 1), "t" : NumberLong(67) }, "optimeDate" : ISODate("2022-12-26T03:41:16Z"), "optimeDurableDate" : ISODate("2022-12-26T03:41:16Z"), "lastAppliedWallTime" : ISODate("2022-12-26T03:41:16.739Z"), "lastDurableWallTime" : ISODate("2022-12-26T03:41:16.739Z"), "lastHeartbeat" : ISODate("2022-12-26T03:41:17.962Z"), "lastHeartbeatRecv" : ISODate("2022-12-26T03:41:18.521Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncSourceHost" : "10.5.0.12:27017", "syncSourceId" : 1, "infoMessage" : "", "configVersion" : 17, "configTerm" : 67 }, { "_id" : 1, "name" : "10.5.0.12(staticIP-container2):27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 589529, "optime" : { "ts" : Timestamp(1672026076, 1), "t" : NumberLong(67) }, "optimeDate" : ISODate("2022-12-26T03:41:16Z"), "lastAppliedWallTime" : ISODate("2022-12-26T03:41:16.739Z"), "lastDurableWallTime" : ISODate("2022-12-26T03:41:16.739Z"), "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1671767185, 1), "electionDate" : ISODate("2022-12-23T03:46:25Z"), "configVersion" : 17, "configTerm" : 67, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 2, "name" : "178.128.xx.xxx(IP-VPS):27019", "health" : 0, "state" : 6, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDurable" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"), "lastAppliedWallTime" : ISODate("1970-01-01T00:00:00Z"), "lastDurableWallTime" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2022-12-26T03:41:17.427Z"), "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "authenticated" : false, "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : -1, "configTerm" : -1 } ]
已确认一致的配置
- 相同的MongoDB版本(5.0.6)
- 相同的mongod.conf文件(相同的replSet名称)
- 相同的keyFile且权限为
chmod 400(只读) - 服务器间可ping通(已开放ICMP入站端口)
排查与解决方案
1. 端口与网络连通性校验
- 确认VPS2_Azure的27019端口已在防火墙/安全组中开放,允许VPS1_DO的IP访问;在VPS1_DO上执行
nc -zv 178.128.xx.xxx 27019验证端口是否可连通。 - 检查Docker容器端口映射:VPS2_Azure的container1需将内部27017端口映射到主机27019端口,且容器内mongod的
net.bindIp配置为0.0.0.0(允许外部访问)。
2. KeyFile一致性与权限复查
- 用
md5sum命令对比两台服务器上keyFile的哈希值,确保内容完全一致;避免复制时出现换行符、空格等差异。 - 进入VPS2_Azure的容器,执行
ls -l /path/to/keyfile,确认权限为400且所属用户为mongodb(MongoDB运行用户)。
3. 副本集地址配置检查
- 确认Secondary2节点自身的
rs.conf()中,成员地址与主节点添加时使用的178.128.xx.xxx:27019一致;若节点初始化时用了容器内网IP,会导致主节点无法正确识别。 - 检查Secondary2的mongod.conf中
replSetName与主节点完全匹配。
4. 认证用户权限验证
- 在主节点执行
db.getUsers(),确认存在拥有clusterAdmin或clusterManager角色的集群管理用户,且Secondary2节点使用该用户进行认证。 - 手动在Secondary2节点用该用户登录MongoDB,验证认证是否成功:
mongo -u <username> -p <password> --authenticationDatabase admin。
5. 查看Secondary2节点日志
- 登录VPS2_Azure,查看container1的mongod日志,定位更详细的认证失败原因(如keyFile读取错误、用户权限不足等)。
内容的提问来源于stack exchange,提问作者Khiem Nguyen
相关产品推荐
相关产品推荐

