MongoDB禁用认证时添加副本集成员提示未授权的问题排查
你的问题根源出在mongod.conf里的security.keyFile配置——只要MongoDB配置了keyFile,不管你有没有显式添加--auth启动参数,都会自动启用认证模式。这就是你明明以为没开认证,却收到"Unauthorized"错误的核心原因。
keyFile的作用是让副本集成员之间互相认证身份,当这个配置存在时,MongoDB会强制开启权限校验,此时所有操作(包括副本集的成员添加)都需要对应的权限,但你还没创建任何管理员账户,自然会被拒绝。
按以下顺序操作就能解决问题:
停止所有MongoDB节点
先把三台主机上的mongod服务都停掉,确保配置修改能生效。临时关闭认证相关配置
修改每台主机的mongod.conf,注释掉security.keyFile这一行:systemLog: destination: file path: "/var/log/mongodb/mongod.log" logAppend: true replication: replSetName: rsprod # security: # keyFile: /data/db/replicaSetKey.key然后重启每台主机的mongod服务。
重新完成副本集配置
在其中一台主机上重新初始化副本集:mongo --eval 'rs.initiate()'接着依次添加另外两台主机:
mongo --eval 'rs.add("your-host-2:27017")' mongo --eval 'rs.add("your-host-3:27017")'这次应该能成功添加,因为此时没有认证限制。
创建集群管理员账户
进入Mongo shell,切换到admin数据库,创建拥有最高权限的管理员账户:mongo use admin db.createUser({ user: "root", pwd: "your-strong-password", roles: ["root"] })准备keyFile并同步到所有节点
生成一个随机的keyFile文件(可以用openssl生成):openssl rand -base64 756 > /data/db/replicaSetKey.key确保文件权限是
600,且属主是mongodb用户(否则MongoDB无法读取):chmod 600 /data/db/replicaSetKey.key chown mongodb:mongodb /data/db/replicaSetKey.key把这个keyFile文件复制到另外两台主机的相同路径下,保持权限一致。
恢复认证配置并重启服务
把每台主机的mongod.conf里的security配置恢复,还可以加上authorization: enabled让配置更明确:systemLog: destination: file path: "/var/log/mongodb/mongod.log" logAppend: true replication: replSetName: rsprod security: keyFile: /data/db/replicaSetKey.key authorization: enabled然后重启所有主机的mongod服务。
验证认证和副本集状态
用管理员账户登录Mongo shell,检查副本集状态:mongo -u root -p your-strong-password --authenticationDatabase admin rs.status()此时副本集应该正常运行,且认证功能已经生效。
内容的提问来源于stack exchange,提问作者emmdee

