keyfile必须用openssl rand -base64 756生成且长度严格在6–1024字节,权限为600、属主正确、路径绝对且所有节点一致,同时启用security.keyfile和security.authorization。

keyFile必须用openssl生成且长度严格在6–1024字节
mongod启动时会校验keyFile内容长度,不是“看起来像密码”就行。用echo "abc" > keyfile或dd if=/dev/urandom bs=1 count=10 > keyfile都可能因长度不合规被拒绝,报错key file does not have permissions restricted或key file is empty。
正确做法是用openssl rand -base64 756:756字节原始随机数据经base64编码后约1008字节,落在合法区间内。生成后立刻检查:
-
stat -c "%a %U" /etc/mongod/keyfile确认权限是600、属主正确 -
xxd /etc/mongod/keyfile | head -n1确认无BOM、无空行、开头是可打印base64字符 -
cat /etc/mongod/keyfile | wc -c确认输出值在6–1024之间(含换行符)
所有节点的keyFile路径必须完全一致且为绝对路径
副本集成员间握手失败的常见原因是路径不一致——哪怕文件内容一模一样,A节点配/etc/mongod/keyfile,B节点配/data/keyfile,mongod也会报no valid authentication credentials provided,日志里反复出现auth error: saslStart failed。
配置时注意:
- 在
/etc/mongod.conf中写死绝对路径:security.keyFile: /etc/mongod/keyfile,不能用相对路径 - 所有节点统一放同一位置,推荐
/etc/mongod/keyfile或/var/lib/mongodb/keyfile - 复制完文件后,在每个节点上执行
sudo -u mongod cat /etc/mongod/keyfile >/dev/null,模拟mongod用户读取权限
security.keyFile和security.authorization必须同时启用
只开authorization: enabled,副本集内部通信仍无认证;只配keyFile,客户端连不上任何数据库。两者是绑定开关,缺一不可,且必须同在security:块下:
security: keyFile: /etc/mongod/keyfile authorization: enabled
漏掉任一个,现象很隐蔽:
- rs.status()显示某个节点HEALTH: 0,但网络通、端口开
- 初始化副本集时报
Quorum check failed,即使3个节点都启动了 - 主节点能查数据,但从节点
rs.printSecondaryReplicationInfo()返回空
MongoDB 7.0要求所有成员使用DNS主机名而非IP地址
从MongoDB 5.0起,纯IP地址配置的副本集成员无法通过启动验证。MongoDB 7.0更严格:如果rs.initiate()里用了"host": "192.168.1.10:27017",节点会卡在Waiting for quorum,日志里提示hostname validation failed。
必须提前配置好DNS或hosts,并在初始化时用主机名:
- 每台机器
/etc/hosts加一行:192.168.1.10 mongo1.local - 初始化配置中写
"host": "mongo1.local:27017",不能混用IP - 确认
hostname -f输出与配置中主机名完全一致(大小写、后缀都不能错)
这一步最容易被跳过,等集群跑了一周才发现某节点始终SECONDARY,其实只是hostname没对齐。











