keyfile认证必须在所有mongod(shard、config server)和mongos上同时启用且使用完全相同的密钥文件,否则集群组件无法握手,sh.status()会卡在unreachable或反复重连;keyfile须为6–1024字节随机内容(推荐openssl rand -base64 753生成)、权限严格400、路径一致、字节级相同,并配合--clusterauthmode keyfile和--auth启用。

直接说结论:KeyFile认证必须在所有 mongod(shard、config server)和 mongos 实例上同时启用且使用完全相同的密钥文件,否则集群组件无法握手,sh.status() 会卡在 UNREACHABLE 或反复重连。
生成的KeyFile必须满足哪些硬性条件
不是随便一个文本文件就能当 KeyFile —— MongoDB 启动时会校验内容与权限,任一不满足都会静默失败或报错 Failed to load keyfile: Permission denied 或 Invalid keyfile format。
-
openssl rand -base64 753是推荐生成方式(长度 ≈ 1004 字节,落在 6–1024 范围内);用echo "abc" > keyfile会直接被拒绝 - 文件权限必须是
600(即chmod 600 keyfile),Linux/macOS 下 group/other 有读写权限会导致启动失败 - 所有节点上的文件路径要一致(比如都放在
/etc/mongod/keyfile),且内容逐字节相同 ——diff node1/keyfile node2/keyfile应无输出 - KeyFile 本身不加密通信,只用于内部身份验证(“你是谁”),所以必须配合
--clusterAuthMode keyFile和--auth(或配置文件中security.authorization: enabled)才生效
mongos、shard、config server 的启动参数怎么配
三类实例都要加 --keyFile,但 --clusterAuthMode 必须显式指定,否则默认是 preferKeyFile(兼容旧版),在分片集群中可能引发认证协商失败。
- shard 节点(mongod):
mongod --shardsvr --replSet shard1 --keyFile /etc/mongod/keyfile --clusterAuthMode keyFile --auth --config /etc/mongod/shard.conf - config server(mongod):
mongod --configsvr --replSet configReplSet --keyFile /etc/mongod/keyfile --clusterAuthMode keyFile --auth --config /etc/mongod/config.conf - mongos(注意它不读
security.authorization):mongos --configdb configReplSet/10.0.0.1:27019,10.0.0.2:27019,10.0.0.3:27019 --keyFile /etc/mongod/keyfile --clusterAuthMode keyFile
⚠️ 容易漏掉的点:mongos 没有 --auth 参数,但它依赖 --keyFile + --clusterAuthMode 才能跟 config server 建立可信连接;如果 config server 没开 --auth,mongos 就连不上 admin 数据库,后续建用户会失败。
建管理员用户前必须先连对哪个节点
别急着 use admin; db.createUser(...) —— 这一步必须在 mongos 上执行,且连接时要带认证凭据(否则 sh.status() 看不到分片状态)。
- 先用本地 socket 或 localhost 连未认证的 mongos(仅限首次):
mongosh --host localhost:27017,然后创建 admin 用户 - 用户必须在
admin数据库建,角色选{role: "root", db: "admin"}(root是唯一能跨分片执行管理操作的角色) - 之后所有连接都得加认证:
mongosh -u admin -p 123456 --authenticationDatabase admin --host mongos-host:27017 - config server 和 shard 节点上的
config和各分片本地的admin数据库,**不需要单独建用户** —— KeyFile 只管组件间互信,用户权限由 mongos 统一管控
为什么 sh.status() 仍显示 UNREACHABLE
常见原因不是密码错,而是节点间根本没完成初始握手。排查顺序比改配置更重要:
- 检查所有 mongod/mongos 进程是否真的加载了
--keyFile:ps aux | grep keyFile,确认参数存在且路径可读 - 看日志里有没有
Unable to authenticate to config server或Failed to load keyfile—— 很多时候是权限或路径不一致导致静默失败 - 停掉全部进程,用
mongod --shardsvr --keyFile /path/to/keyfile --port 27018 --dbpath /tmp/shard1 --bind_ip localhost单节点最小化测试,确认 KeyFile 能跑通 - 确保 config server 的 replica set 名称(
--replSet)和 mongos 的--configdb参数完全一致,大小写、逗号空格都不能错
KeyFile 是“全有或全无”的机制:任何一个 shard 或 config server 没配对,整个集群就不可用 —— 没法局部启用,也没法降级回退(除非停机重配)。











