mongod 启动后不会自动组成副本集,必须手动执行 rs.initiate() 并传入完整成员配置;replSet 仅声明名称,不触发初始化;三节点 replSet 名称须完全一致;SELinux、bind_ip、dbpath、端口、keyfile 等配置均需严格校验。
mongod 启动后不自动组成副本集,必须手动执行 rs.initiate() —— 这是绝大多数人卡住的第一步。
很多人以为在 mongod.conf 里写了 replSet=rs0 就算配好了副本集,其实这只是告诉进程“我将来要加入叫 rs0 的副本集”,它自己仍是独立节点。真正触发选举和状态同步,得靠客户端命令。
replSet 参数必须三台机器完全一致(包括大小写、空格),否则 rs.add() 会报 replSet name mismatch
dbpath 不在标准位置(如 /var/lib/mongo),需用 semanage fcontext 放行,否则 mongod 静默失败bind_ip 别写 127.0.0.1 或 localhost —— 其他节点连不上;推荐写具体内网 IP,或 0.0.0.0 + 配合防火墙(firewall-cmd --add-port=27017/tcp)直接敲 rs.initiate() 会创建单节点副本集(只有自己),后续加节点会失败:错误提示 already initialized 且无法再改成员列表。必须一开始就指定全部成员。
cfg = { _id: "rs0", members: [ {_id: 0, host: "192.168.1.10:27017"}, {_id: 1, host: "192.168.1.11:27017"}, {_id: 2, host: "192.168.1.12:27017", arbiterOnly: true}] }
use admin,再 rs.initiate(cfg);成功返回 { "ok" : 1 }
rs.initiate() 会卡住或超时,此时删掉该节点条目重试,等集群稳定后再用 rs.add() 加入仲裁节点不存数据,但 dbpath 必须存在且可写,否则 mongod 启动失败 —— 错误日志里常见 Failed to unlink socket file 或 Permission denied。
dbpath 目录可以为空,但不能指向其他节点正在用的路径(比如和主节点共用 /data/mongo)telnet 192.168.1.12 27017 要通)oplogSize 或 directoryperdb —— 无效且可能引发 warning一旦配置了 security.authorization: enabled 和 security.keyFile,所有节点启动前必须同步同一份 keyfile(权限必须是 chmod 400),且初始化时连接要用 admin 用户认证。
openssl rand -base64 756 > /etc/mongod-keyfile && chmod 400 /etc/mongod-keyfile
mongo --host 192.168.1.10:27017 -u "admin" -p "pwd" --authenticationDatabase "admin"
authorization: enabled?mongod 会直接拒绝启动,日志报 KeyFile must be specified when authorization is enabled
副本集真正可用的标志不是所有 mongod 进程都 running,而是 rs.status().members[n].stateStr 出现 PRIMARY、SECONDARY、ARBITER —— 中间任何一环断开(比如时间不同步、hostname 解析失败、防火墙拦截心跳包),状态就会卡在 STARTUP 或 RECOVERING。