ConfigServer 必须以副本集(CSRS)形式运行,MongoDB 3.2+ 不允许单点启动;需配置sharding.clusterRole: configsvr、replication.replSetName,并确保bindIp包含本机IP和localhost,数据目录必须干净且时间同步。

ConfigServer 必须是副本集,不能单点启动
直接用 mongod --configsvr 启动一个孤立的 config server 进程,MongoDB 3.2+ 会拒绝启动并报错:config servers must be part of a replica set。从 3.2 开始,配置服务器强制要求以副本集(CSRS)形式运行,哪怕测试环境也得初始化为至少一个成员的副本集——但生产环境必须 ≥3 成员,且不能有仲裁节点或延迟节点。
配置文件里 sharding.clusterRole: configsvr 是必需项
很多部署失败是因为只加了 configsvr=true(旧参数),而没配新版 YAML 格式配置。CentOS 7 / RHEL 7 上使用 systemd 或配置文件方式启动时,必须显式声明:
sharding: clusterRole: configsvr replication: replSetName: cfgset net: bindIp: 192.168.36.137,localhost port: 21000
注意:bindIp 要包含本机 IP 和 localhost,否则后续用 mongo 连本地初始化副本集会失败;replSetName 不能和任何分片副本集同名,比如 shard1 的 replSetName 是 shard1rs,那 config server 就得叫 cfgset 或类似不冲突的名字。
初始化副本集前,所有 config server 节点必须已启动且可连通
常见错误是只启了一台 config server 就急着执行 rs.initiate(),结果初始化成功但无法添加其他成员,因为其余节点根本没在监听。正确顺序是:
- 三台机器各自启动
mongod,端口、路径、replSetName一致,仅bindIp不同 - 确认每台都能 telnet 通其他两台的 config server 端口(如 21000)
- 任选一台,用
mongo --port 21000连入,执行:rs.initiate({ _id: "cfgset", configsvr: true, members: [ { _id: 0, host: "192.168.36.137:21000" }, { _id: 1, host: "192.168.36.138:21000" }, { _id: 2, host: "192.168.36.139:21000" } ] })
如果提示 no reachable nodes,大概率是防火墙没关、SELinux 拦截、或 bindIp 没放开远端地址。
config server 数据目录不能复用已有 mongod 实例的目录
有人图省事把旧的 /data/db 直接挪给 config server 用,结果启动报 Found an invalid featureCompatibilityVersion document 或直接崩溃。config server 的数据目录必须是干净初始化的,不能含任何非 config 或 admin 数据库的文件。创建时务必用新路径,例如:/var/lib/mongo/configdb,并确保属主是 mongod 用户(chown -R mongod:mongod /var/lib/mongo/configdb)。
最容易被忽略的是:config server 副本集初始化后,rs.status() 显示 stateStr: "OTHER" 或成员状态长期为 STARTUP2,这通常意味着某台机器的系统时间不同步——NTP 未校准会导致副本集握手失败,必须统一用 chronyd 或 ntpd 对齐时间。











