必须用--replSet启动且所有节点配置一致,否则rs.initiate()失败;配置文件需显式声明replSetName和bindIp(不能仅127.0.0.1),并确保目录权限、网络连通性及hostname解析正确。

mongod 必须用 --replSet 启动,且所有节点配置一致;否则 rs.initiate() 会失败或后续节点无法加入。直接用包管理器安装的 mongodb-org 默认不启用副本集,必须手动改配置。
配置文件里必须显式声明 replSetName 和 bindIp
很多人以为只要命令行加 --replSet rs0 就够了,但 systemd 服务启动时读的是 /etc/mongod.conf,命令行参数会被忽略。
编辑 /etc/mongod.conf,确保包含以下内容:
replication:
replSetName: rs0
net:
port: 27017
bindIp: 0.0.0.0 # 或具体内网IP,不能只写 127.0.0.1
storage:
dbPath: /var/lib/mongo
journal:
enabled: true注意:bindIp 写成 127.0.0.1 会导致其他节点连不上,这是最常被忽略的点;dbPath 目录权限必须是 mongod 用户可读写(chown -R mongod:mongod /var/lib/mongo)。
systemd 服务启动前要验证配置有效性
直接 systemctl start mongod 失败时,错误日志往往藏在 journalctl -u mongod -n 50 -f 里,常见报错包括:
-
Failed to start mongod.service: Unit mongod.service not found→ 检查是否装的是mongodb-org-server(RHEL/CentOS)或mongodb-org(Ubuntu)完整包,不是只装了 client -
Permission denied on /var/lib/mongo→ SELinux 或目录权限问题,临时关 SELinux:setenforce 0,或恢复上下文:restorecon -Rv /var/lib/mongo -
Address already in use→ 端口被占,检查ss -tlnp | grep :27017
验证配置语法:运行 mongod --config /etc/mongod.conf --dryRun,无输出即通过。
初始化副本集必须在首次连接后立即执行
三台机器都启动 mongod 后,只连其中一台(比如 node1),进 shell 执行 rs.initiate(),不要带参数——除非你明确要自定义成员 ID 和 host 名。
原因:rs.initiate({ _id: "rs0", members: [...] }) 中的 host 值必须和其它节点能解析的主机名/IP 完全一致,否则 rs.status() 显示 STARTUP2 卡住、状态始终为 OTHER。
执行后等待返回 "ok" : 1,再立刻执行:
rs.add("node2:27017")
rs.add("node3:27017")注意:rs.add() 必须在 primary 节点上运行;如果误连到还没完成初始化的节点,会报 not master 错误。
仲裁节点(Arbiter)不能共享数据目录,也不能开 journal
如果想加仲裁节点(比如只有两台数据节点,需要奇数投票),不要复制整个 /var/lib/mongo,而应单独建轻量目录:
mkdir -p /var/lib/mongo-arbiter chown mongod:mongod /var/lib/mongo-arbiter
另配一个 conf 文件(如 /etc/mongod-arbiter.conf),关键差异:
storage.dbPath: /var/lib/mongo-arbiter-
storage.journal.enabled: false(仲裁节点不需要 journal) -
replication.replSetName必须和主集完全一致
然后用独立 service 启动它,避免和主服务冲突。
真正容易出问题的地方不在初始化命令本身,而在于节点间网络连通性、hostname 解析一致性、以及 journal 日志是否开启 —— 这三项没对齐,rs.status() 就永远看不到全部成员进入 SECONDARY 或 PRIMARY 状态。


















