net.port必须嵌套在net:下级,平级书写会被忽略;bindIp需按单机或多机场景正确配置,避免仅用127.0.0.1导致副本集通信失败;端口冲突时需检查命令行参数、systemd模板或重复配置文件覆盖;IPv6地址须用方括号包裹。

net.port 写在错误层级导致配置不生效
YAML 格式对缩进和层级极其敏感。port 必须嵌套在 net: 下级,不能平级写在根目录。常见错误是直接写 port: 30001,这会被 MongoDB 完全忽略。
正确写法必须是:
net: port: 30001
若用 mongod --config 启动却仍连上 27017,优先检查这一项是否缩进错位或被注释掉。
bindIp 配置不当引发节点间连接失败
副本集成员要互相通信,bindIp 不能只写 127.0.0.1(除非所有节点都在同一台机器且用 localhost 互访)。否则其他节点发来的连接请求会被拒绝。
典型场景下的安全写法:
- 单机多实例开发:用
bindIp: 127.0.0.1,localhost,并确保rs.initiate()中的host字段也用localhost:30001这类本地地址 - 跨机器部署:必须填可路由的 IP,如
bindIp: 192.168.1.10,127.0.0.1,且rs.initiate()的members里对应写"host": "192.168.1.10:30001" - 禁止写
bindIp: 0.0.0.0(除非已配好防火墙+认证),否则暴露数据库到公网
端口冲突时配置与实际监听不一致
改了 net.port 却还是报 Address already in use,往往不是配置没改,而是被更高优先级的参数覆盖了:
- 命令行传了
--port 27017:它会强制覆盖配置文件里的port - systemd 模板硬编码端口:比如
/etc/systemd/system/mongod@.service里写了ExecStart=... --port 27017,会盖过所有配置 - 多个配置文件被重复加载:确认启动时只指定了一个
--config,没意外加载了默认路径的备份配置
验证方式:mongod --config /path/to/conf --dryRun,它会报出最终解析出的端口值,并检查是否能绑定。
IPv6 地址未显式声明导致启动失败
MongoDB 5.0+ 要求副本集成员配置中必须包含可解析的主机名或 IPv4/IPv6 地址;纯 IPv6 地址需用方括号包裹,否则 YAML 解析失败。
例如,若本机 IPv6 地址是 fd00::1,bindIp 应写为:
net: bindIp: fd00::1,127.0.0.1
而 rs.initiate() 中对应成员必须写:
{ _id: 0, host: "[fd00::1]:30001" }
漏掉方括号会导致解析成无效 host,初始化直接报 No host described in new configuration。


















