MongoDB 6.0 副本集必须显式执行 rs.initiate() 初始化,且三节点须使用不同端口、独立数据目录与日志路径,host 地址需可网络解析,防火墙/SELinux 需放行,且仅 mongosh 支持该命令。

直接说结论:MongoDB 6.0 副本集不是“装完就能跑”,必须显式初始化,且三个节点不能共用同一份配置或数据目录——否则 rs.initiate() 会失败,rs.status() 显示 STARTUP 或 REMOVED 状态,根本进不了主从同步。
副本集节点必须用不同端口和独立数据目录
常见错误是把三台机器的 mongod 都指向 /data/db,或者只改端口没隔离数据路径。MongoDB 不允许同一主机上多个实例共享数据目录,哪怕端口不同也会报错 dbpath already in use。
- 每台机器至少分配一个专属端口(如
27017、27018、27019) - 每台机器创建独立数据目录:
mkdir -p /data/rs1 /data/rs2 /data/rs3,并确保chown $USER:$USER权限正确 - 日志路径也需分离,避免写冲突:
/var/log/mongodb/rs1.log、/var/log/mongodb/rs2.log等 - 配置文件中必须显式指定
replSet名称,三台一致(如rs0),但bindIp要设为0.0.0.0或具体内网 IP,不能只写127.0.0.1
启动前必须先启 mongod,再连 mongosh 执行 rs.initiate()
很多人卡在 rs.initiate() 报错 no replset config object retrieved,本质是没在任意一台节点上执行过初始化命令——它不是自动触发的,也不是靠配置文件加载就生效的。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 先分别在三台机器上启动各自实例:
mongod --config /etc/mongod-rs1.conf(其他类似) - 任选一台(比如
rs1),用mongosh --port 27017连上去 - 执行:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "192.168.1.10:27017" }, { _id: 1, host: "192.168.1.11:27018" }, { _id: 2, host: "192.168.1.12:27019" } ] }) - 注意:host 必须是其他节点能解析的地址,不能写
localhost;如果用了域名,确保所有节点/etc/hosts一致或 DNS 可通
防火墙和 SELinux 是副本集连不通的头号原因
即使配置全对、端口开着,rs.status() 里仍可能看到 HEALTHY 为 0 或状态卡在 STARTUP2,大概率是网络策略拦住了心跳请求。
- 确认三台机器都开放对应端口:
firewall-cmd --permanent --add-port=27017-27019/tcp && firewall-cmd --reload - SELinux 若启用,需放行 MongoDB 网络通信:
setsebool -P mongod_can_network_connect on - 用
telnet 192.168.1.11 27018在 rs1 上测试能否连通 rs2,不通就不是 MongoDB 问题,而是基础网络层 - 若用云服务器(如 AWS/Aliyun),安全组规则必须双向放行,不只是入方向
mongosh 没装或版本不匹配会导致 rs 命令不可用
MongoDB 6.0+ 已彻底弃用旧版 mongo 客户端,rs.initiate() 等副本集命令只在 mongosh 中可用。如果终端敲 rs. 没自动补全,基本就是 shell 不对。
- 检查是否安装:
which mongosh,没有就去官网下最新版mongosh(不是mongodb-linux-x86_64-*.tgz里的那个) - 不要用系统包管理器装的老旧版本(如 Ubuntu 的
mongo包),它不支持 6.0+ 的 replica set 协议 - 连接时务必指定端口:
mongosh --port 27017,否则默认连27017,但你可能在另一端口启了实例 -
mongosh启动后先运行db.runCommand({ ping: 1 })确认连得上,再执行rs.initiate()
真正容易被忽略的是:副本集初始化后,任意节点宕机或重启,其他节点不会自动重新选举——除非你配置了足够多的投票成员(至少 3 个),且没人为禁用 votes 或设成 priority: 0。一个节点挂了,剩下两个若无法形成多数派,整个副本集就只读不可写,这不是 bug,是 Raft 协议的必然行为。

















