必须在首次启动mongod时就配置--keyfile和--auth,否则rs.initiate()后无法安全补加;密钥文件权限须为600、内容字节级一致且无bom,所有节点hostname需dns可解析并正确绑定。

mongod 启动时会因认证失败或配置不一致而拒绝加入集群。
启动副本集时不带 --auth 也能初始化,但后续无法回退补加
很多用户误以为可以先跑通副本集再加 --auth,实际不行。一旦 rs.initiate() 成功,所有节点就进入“已配置状态”,此时若未提前启用内部身份验证(如密钥文件),再强行加 --auth 会导致节点间握手失败、心跳超时、SECONDARY 状态卡住甚至整个副本集不可用。
- 必须在首次启动每个
mongod实例时就带上--keyFile或--tlsCertificateKeyFile(生产环境推荐后者) -
--auth参数本身不提供节点间通信安全,它只控制客户端连接的 RBAC;真正保障副本集内部通信的是--keyFile或 TLS - 如果已用无认证方式初始化过副本集,唯一安全做法是重建:停全部节点 → 清空
dbpath→ 重配密钥文件 → 重启 → 再rs.initiate()
密钥文件必须严格满足权限和内容要求
密钥文件不是普通文本密码,它参与 SHA-256 摘要计算,且 mongod 启动时会校验其文件权限。任意一个节点上权限不对,该节点就起不来,报错类似:ERROR: key file permissions are too open。
- 文件权限必须是
0600(即chmod 600 /path/to/keyfile),Windows 上需设置为仅管理员可读 - 内容不能含空格、换行、BOM,长度建议 6–1024 字节,纯 ASCII 最稳妥(避免 UTF-8 编码问题)
- 所有节点必须使用**完全相同的文件**(字节级一致),不能各自生成一份
- 测试可用
openssl rand -base64 741 | tr -d '\n' > keyfile生成合规密钥
启用 --auth 后,连接 mongosh 必须显式指定用户凭证
启用 --auth 后,即使本地 localhost 连接也不再免认证(MongoDB 4.0+ 默认行为)。不带凭证直接 mongo --port 27017 会进到空 shell,但执行任何命令都报 not authorized on admin to execute command。
- 首次创建用户必须通过 localhost 接口(无需认证),且只能在
admin库执行:db.createUser({user:"admin",pwd:"xxx",roles:["root"]}) - 之后所有连接必须带参数:
mongosh "mongodb://admin:xxx@localhost:27017/admin?authSource=admin" - 注意
authSource必须指定用户所在数据库(通常是admin),否则认证失败 - 副本集连接字符串应包含全部成员,例如:
mongodb://admin:xxx@host1:27017,host2:27017,host3:27017/admin?replicaSet=rs0&authSource=admin
hostname 配置错误会导致节点反复掉线
MongoDB 5.0+ 强制要求副本集配置中的 host 字段必须是 DNS 可解析的 hostname,纯 IP 地址会被拒绝。常见现象是节点刚加入就变成 REMOVED 或 UNKNOWN,日志里反复出现 Failed to connect to ... No such host is known。
- 检查每台机器的
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows),确保所有节点 hostname 能互相 ping 通 -
rs.conf().members[n].host的值必须与各节点mongod启动时绑定的地址一致,比如node1.example.com:27017,而非192.168.1.10:27017 - 启动
mongod时务必加--bind_ip并明确列出 hostname 对应的 IP,例如:--bind_ip 192.168.1.10,localhost,node1.example.com











