You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MongoDB 3.6.21启用分片失败(未授权错误)求助

MongoDB分片集群执行sh.enableSharding()时出现Unauthorized错误

问题场景

我们搭建了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")
		}
	}
}

问题原因

从错误信息能明确看出核心问题:

  1. enableSharding集群级管理命令,必须在admin数据库上下文执行,且需要对应的集群管理权限;
  2. 你登录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

火山引擎 最新活动