KeyFile必须chmod 600且所有节点路径内容完全一致,同时启用security.keyFile与security.authorization,初始化前需清空local库并统一配置重启。

KeyFile 生成必须用 chmod 600,否则 mongod 拒绝启动
副本集开启认证后,keyFile 不是普通密码文件,而是用于节点间通信的共享密钥。MongoDB 要求它严格限制权限:只允许文件所有者读写,其他用户不能有任何访问权限。如果权限是 644 或 755,mongod 启动时会直接报错:ERROR: keyfile must be accessible only by owner。
- Linux/macOS 下生成后立刻执行:
chmod 600 /path/to/keyfile - Windows 不检查权限,但建议统一用
openssl rand -base64 756 > keyfile生成(避免换行或空格) - 不要用
echo "abc" > keyfile—— 明文字符串太短、含换行、无加密强度,会被拒绝 - 文件内容不能有 BOM、不能含中文、不能有多余空行;可用
xxd keyfile | head -n1确认开头无异常字节
副本集所有节点的 keyFile 必须完全一致且路径相同
不是“内容相同”就够了——mongod 进程启动时读取的是配置中指定的绝对路径。如果 A 节点配了 /data/keyfile,B 节点配了 /etc/mongod/keyfile,即使文件内容一模一样,节点间握手仍会失败,日志里反复出现:no valid authentication credentials provided 或 auth error: saslStart failed。
- 推荐把
keyfile放在每个节点统一位置,比如/etc/mongod/keyfile - 配置中必须用绝对路径写进
security.keyFile,相对路径会被忽略 - 确认所有节点上该路径可读:
sudo -u mongod cat /etc/mongod/keyfile > /dev/null(模拟 mongod 用户读取) - 不要把 keyfile 放进
/data/db目录——重启时可能被误删或备份脚本扫走
security.authorization: enabled 和 security.keyFile 必须同时启用
只开 authorization 不等于副本集内认证生效;只配 keyFile 也不触发用户鉴权。两者是绑定关系:前者让 mongod 检查客户端连接的身份,后者让副本集成员之间用共享密钥完成内部认证。漏掉任一个,都会导致奇怪现象——比如主节点能连,但从节点 rs.status() 显示 HEALTH: 0,或者初始化副本集时报 Quorum check failed。
- 配置文件中这两项必须同在
security:块下,例如:
security: keyFile: /etc/mongod/keyfile authorization: enabled
mongo --port 27017,再执行 db.runCommand({connectionStatus: 1}),检查 authInfo.authenticatedUsers 是否为空 —— 非空说明认证已生效初始化副本集前必须停掉所有节点并清空 local 数据库
很多人在已有数据的单机上直接加 keyFile 并运行 rs.initiate(),结果卡在 STARTUP2 状态,日志狂刷 replSet could not find member xxx in config。这是因为带认证的副本集要求初始配置干净:任何残留的 local.system.replset 或未清理的 oplog 都会和新 keyFile 冲突。
- 操作前确保所有 mongod 进程已停止:
sudo systemctl stop mongod(或kill -2) - 删除每个节点的
local数据库目录(如/data/db/local),但保留admin和业务库 - 首次启动时,所有节点用同一份配置 + 同一 keyFile,然后只在一台上运行
rs.initiate(),其它节点自动加入 - 切勿在不同节点上分别执行
rs.initiate()—— 会导致多个独立副本集,无法合并
HEALTH: 0 或 STARTUP2 卡住,先查权限、再清 local,比翻日志快得多。


















