MongoDB 3.6.21启用分片失败(未授权错误)求助
问题场景
我们搭建了MongoDB 3.6.21分片集群,包含3个分片,每个分片配置2个副本。随后在不同节点的各分片主节点中创建了拥有root权限的admin用户,目前可以通过用户名/密码认证直接登录mongod服务。但登录mongos(运行在27017端口)执行以下命令时出现未授权错误:
[root@MONGODB01 ~]# mongo --port 27017 MongoDB shell version v3.6.21 connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb Implicit session: session { "id" : UUID("45c58424-422c-4a73-9d18-027718aa0a36") } MongoDB server version: 3.6.21 mongos> use dsyh_mongo switched to db dsyh_mongo mongos> sh.enableSharding("dsyh_mongo") { "ok" : 0, "errmsg" : "not authorized on admin to execute command { enableSharding: \"dsyh_mongo\", lsid: { id: UUID(\"45c58424-422c-4a73-9d18-027718aa0a36\") }, $clusterTime: { clusterTime: Timestamp(1634624354, 1), signature: { hash: BinData(0, 3F3BBFE3DD659B7E0FAEE493345496D9DAB9B2A4), keyId: 7020363352299798554 } }, $db: \"admin\" }", "code" : 13, "codeName" : "Unauthorized", "operationTime" : Timestamp(1634624352, 1), "$clusterTime" : { "clusterTime" : Timestamp(1634624354, 1), "signature" : { "hash" : BinData(0,"Pzu/491lm34PruSTNFSW2dq5sqQ="), "keyId" : NumberLong("7020363352299798554") } } }
问题原因
从错误信息能明确看出核心问题:
enableSharding是集群级管理命令,必须在admin数据库上下文执行,且需要对应的集群管理权限;- 你登录mongos后直接切换到了业务库
dsyh_mongo,没有在admin库完成合法的用户认证——哪怕你的admin用户有root权限,也需要在mongos节点的admin库完成认证,才能触发集群级权限校验。
解决步骤
1. 正确登录并认证mongos
有两种便捷方式完成认证:
- 方式一:登录时直接指定认证参数
mongo --port 27017 -u admin -p 你的密码 --authenticationDatabase admin - 方式二:登录后切换到admin库手动认证
mongos> use admin switched to db admin mongos> db.auth("admin", "你的密码") # 返回1表示认证成功
2. 确认用户权限(可选)
在admin库执行以下命令,验证你的admin用户拥有集群管理权限:
mongos> db.getUser("admin")
查看返回结果的roles数组,确保包含root或者{ role: "clusterAdmin", db: "admin" }这类角色。
3. 执行分片启用命令
认证成功后,无需切换到业务库,直接在admin库执行命令即可:
mongos> sh.enableSharding("dsyh_mongo") # 返回{ "ok" : 1, ... }表示执行成功
补充说明
之前能正常操作大概率是因为当时集群未启用认证,或者使用了无权限校验的超级用户会话。在启用认证的分片集群中,所有集群级操作(分片管理、副本集配置等)都要求在admin库完成认证后执行,这是MongoDB权限管控的标准机制。
内容的提问来源于stack exchange,提问作者Nitin G




