分片集群管理员用户必须分两类创建:一是通过mongos创建的集群级用户(存于配置服务器admin库),用于sh命令等全局操作;二是直连分片主节点创建的分片本地用户(存于对应分片admin库),专用于compact、rs.reconfig()等单分片维护操作,二者不可混用或遗漏。

分片集群的管理员用户必须分两类创建:一类是集群级用户(通过 mongos),另一类是分片本地用户(直接连分片主节点)。混用或漏建其中一类,会导致部分管理操作失败,比如 rs.reconfig() 或 compact 直接报“not authorized”。
连接 mongos 创建集群级管理员用户
所有面向整个集群的用户(如备份、路由、跨库读写)都必须通过 mongos 实例创建,且角色必须在 admin 数据库中声明。MongoDB 不会把这类用户同步到各分片本地,而是统一存于配置服务器的 admin.system.users 中。
- 先用
mongo --host <mongos-host> --port <port></port></mongos-host>连到任意mongos - 切换到
admin数据库:use admin - 执行
db.createUser({user: "clusterAdmin", pwd: "xxx", roles: ["root"]})—— 注意"root"角色只在admin库生效,不能写成{role: "root", db: "admin"}以外的形式 - 验证:断开重连后用
db.auth("clusterAdmin", "xxx"),再运行sh.status()确认能正常查看分片拓扑
连接分片主节点创建分片本地管理员用户
某些操作(如 compact、db.fsyncLock()、rs.reconfig())要求直连分片副本集的 primary 节点,此时必须用“分片本地用户”身份认证。这类用户只存在于对应分片的 admin 数据库中,不跨分片共享。
- 查某分片的 primary 地址:先在
mongos上运行sh.status(),找到shardX对应的host字段(例如shard01/node1:27001,node2:27001,node3:27001),再用rs.status()确认当前 primary - 直连该 primary:
mongo --host node1 --port 27001 -
use admin后执行db.createUser({user: "shard01Admin", pwd: "xxx", roles: ["clusterAdmin"]})—— 这里用clusterAdmin而非root,因为分片本地不需要全局权限,且root在单一分片上无意义 - 每个分片都要单独创建,不能复用同一套凭据(除非你明确同步了密钥文件和用户数据)
常见错误:auth failed 或 No primary found
这类报错往往不是密码错,而是连接路径或认证上下文不对:
-
Authentication failed:检查是否误用mongos地址去连分片本地用户,或反过来;确认mongod启动时加了--auth,且内部认证(如密钥文件)已就绪 -
No primary found:说明你试图直连一个非 primary 的分片成员,或副本集状态异常(rs.status().members[n].stateStr !== "PRIMARY") -
not authorized on admin to execute command:大概率是用了分片本地用户去调sh.addShard()这类集群级命令,或者忘了在mongos上创建用户 - 从 MongoDB 5.0 起,如果
mongod配置里写的是 IP 而非 DNS 主机名(如192.168.1.10:27001),启动会直接失败 —— 必须统一用/etc/hosts解析的 hostname
最容易被忽略的是:分片本地用户无法执行任何涉及 sh 命令的操作,哪怕你给它 root 角色也没用;而集群级用户永远无法绕过 mongos 直接操作单一分片的底层数据文件。两类账户本质隔离,缺一不可。











