必须先配内部认证(keyfile/x.509)再配外部认证(admin库创建用户);内部需所有节点共用相同keyfile并启用authorization,外部用户须在admin库创建且连接时指定authsource=admin。

必须分两步走:先配内部认证(shard/mongos 之间),再配外部认证(客户端连接);漏掉任何一步,集群就起不来或连不上。
分片集群的内部认证不能只靠 authorization: enabled
单纯在每个 mongod 和 mongos 的配置里加 security.authorization: enabled 是不够的。分片集群成员(shard、config server、mongos)之间需要互相验证身份,否则副本集无法初始化、config server 同步失败、mongos 启动报 Failed to load clusterID。
- 必须启用 keyfile 或 x.509 认证作为内部认证机制 —— MongoDB 4.0+ 已弃用
MONGODB-CR,keyfile 是最简方案 - keyfile 文件需满足:600 权限(Linux/macOS)、600 或 400(Windows)、内容为 6–1024 字节随机 ASCII 字符(不能含空格/换行)
- 所有 shard 节点、所有 config server、所有 mongos 必须使用**完全相同的 keyfile**,且路径一致(例如都放在
/data/keyfile) - 配置中要显式指定:
security.keyFile: /data/keyfile,同时保留security.authorization: enabled
外部用户必须在 admin 数据库创建,并明确区分「分片本地用户」和「集群范围用户」
客户端登录时用的账号,不是随便在某个数据库里 db.createUser() 就完事。分片集群里,用户作用域分两类:
-
分片本地用户:直接连接到某个 shard 副本集(如rs0/192.168.1.10:27018)创建的用户,只对该 shard 有效,db字段必须是该 shard 上存在的库(如test),角色也仅限于该库(如{role:"readWrite", db:"test"}) -
集群范围用户:必须通过mongos连接后,在admin库创建,且roles中的db字段只能是admin或通配角色(如readAnyDatabase)。例如:db.createUser({user:"appuser", pwd:"xxx", roles:[{role:"readWriteAnyDatabase", db:"admin"}]}) - Ops Manager / Backup Agent 等工具用户,必须在
admin库创建,并赋予clusterAdmin、backup、restore等角色 —— 少一个,备份或自动化就会卡住
连接 mongos 时,--authenticationDatabase 必须是 admin
即使你创建的用户角色是针对 myapp 库的 readWrite,登录 mongos 时也不能写 --authenticationDatabase myapp,否则会报 Authentication failed。
- 所有集群范围用户的凭证都存于 config server 的
admin.system.users,所以认证必须指向admin - 正确命令示例:
mongosh "mongodb://192.168.1.20:27017" --username appuser --password xxx --authenticationDatabase admin - Studio 3T / Compass 等 GUI 工具,Authentication Database 字段必须手动填
admin,不能依赖下拉默认值 - 应用代码里(如 Node.js 的
mongodb驱动),连接字符串末尾要加?authSource=admin
最容易被忽略的是:config server 副本集自己也得先完成内部认证(keyfile + authorization: enabled)才能启动,否则 mongos 根本连不上 config server,整个集群就卡在「waiting for config server」状态。别急着建用户,先 rs.status() 确认三个 config server 成员状态是 PRIMARY 或 SECONDARY,再动用户的事。











