mongos与shard的keyfile不一致是认证失败主因:内容、权限或路径任一不匹配(如字节差异、644权限)均导致静默拒绝,表现为sh.status()显示unknown/down但网络连通;须用db.runcommand({getcmdlineopts:1})查配置、sha256sum校验字节一致性、chmod600统一权限,且mongos禁用security块、必须同时指定--keyfile和--auth。

mongos 与 shard 的 keyFile 不一致是主因
认证失败绝大多数不是密码错或网络不通,而是 mongos 和 shard 使用的 keyFile 内容、权限或路径不一致。哪怕只差一个字节、多一个空格、权限是 644 而不是 600,都会导致连接静默拒绝——现象是 sh.status() 显示 shard 状态为 UNKNOWN 或 DOWN,但 telnet shard-host 27017 能通,rs.status() 在 shard 上也正常。
- 在 mongos 上执行
db.runCommand({getCmdLineOpts: 1}),确认返回中parsed.security.keyFile存在且路径可读;若为null或缺失,说明 mongos 根本没启用 internalAuth - 在目标 shard 的 primary 上执行同样命令,比对
keyFile路径和文件内容(用sha256sum /path/to/keyfile校验字节级一致性) - 所有节点统一执行:
chmod 600 /etc/mongod-keyfile;注意 mongos 配置中不能出现security:块,它不支持keyFile,加了会启动失败
mongos 启动时漏掉 --auth 或 --keyFile 参数
--auth 是开关,--keyFile 是凭证,二者缺一不可。只加 --auth 不指定 --keyFile,mongos 启动会报 Failed to load keyfile: No such file or directory;反过来,只配 --keyFile 不加 --auth,mongos 就不校验任何凭据,等同于裸奔,后续路由到 shard 时仍因认证失配被拒。
- mongos 启动命令必须同时含:
mongos --configdb configReplSet/config1:27019,config2:27019 --keyFile /etc/mongod-keyfile --auth - 配置文件方式需确保
sharding:和net:下有正确配置,但security:块必须删除——mongos 不识别该字段 - 别用
--setParameter enableLocalhostAuthBypass=false试图“加强”,它在 mongos 上无效,且掩盖真实配置缺陷
客户端连 mongos 时 authSource 指错了库
用户是在 admin 库创建的,但连接字符串里没显式指定 authSource=admin,客户端就会默认去当前数据库(比如 myapp)查用户,自然报 not authorized on admin to execute command。这不是权限不够,是根本没找到用户记录。
- 正确连接方式(shell):
mongosh "mongodb://user:pass@mongos-host:27017/admin?authSource=admin" - PyMongo 示例:
MONGODB_URI = "mongodb://user:pass@mongos-host:27017/admin?authSource=admin" - 密码含特殊字符(如
@、/)必须 URL 编码,否则解析失败导致认证跳过
config server 没提前建好 admin 用户
mongos 自己不存用户,全靠 config server 的 admin.system.users 集合。如果 config server 没开 --auth + --keyFile 就启动,或者启了但没在 admin 库创建 root 用户,mongos 即使启动成功,也无法完成任何管理操作——sh.addShard() 成功只是写入地址,后续所有分片命令都会卡住或报错。
- 必须按顺序操作:先启 config server(带
--auth和--keyFile)→ 用mongosh --port 27019连 config server → 在admin库执行db.createUser({user:"root", pwd:"xxx", roles:["root"]})→ 再启 mongos - 如果 config server 已运行但没用户,不能直接连 mongos 去建,会返回
not master;必须连 config server 的 primary 节点建 - 角色必须含
"__system"或"root"才能跨分片执行sh.enableSharding()等操作
No route to host,实际是认证被静默丢弃。











