根本原因是mongos未正确配置--configdb参数或config server未以--configsvr模式启动并完成副本集初始化;config server必须是带--configsvr的副本集且已rs.initiate()并处于PRIMARY状态,mongos才可连接。

为什么 mongos 启动就报 “failed to connect to config server”
根本原因不是网络不通,而是 mongos 启动时没读到正确的 config server 地址,或者 config server 自身没以 --configsvr 模式运行。它不会自动发现 config 节点,必须显式指定。
-
mongos必须通过--configdb参数传入 config server 的完整 replica set 名 + 地址列表,格式为myConfigReplSet/127.0.0.1:27019,127.0.0.1:27020,不能只写 IP 或漏掉 replset 名 - config server 必须用
mongod --configsvr --replSet myConfigReplSet启动(MongoDB 4.2+ 强制要求 config server 是副本集,哪怕单节点也要初始化为 1 节点 replset) - config server 副本集必须已执行
rs.initiate()并处于PRIMARY状态;mongos启动前可用mongo --port 27019 --eval "rs.status()"验证 - 别把 config server 当普通
mongod启动——少了--configsvr,mongos连上也会立刻断开并报错
添加 shard 时 sh.addShard() 返回 “no host described in new configuration”
这是 shard 节点没正确加入集群的典型信号,本质是 config server 的元数据里没存下这个 shard 的连接信息,常见于启动参数或初始化顺序错误。
- 每个 shard 必须是副本集(即使测试环境单节点),且副本集名不能和 config server 的
--replSet名重复 - shard 节点启动命令必须含
--shardsvr(MongoDB 4.2+ 强制),否则sh.addShard()会拒绝注册 - 执行
sh.addShard("shardRS/127.0.0.1:27018")前,确保该 replica set 已rs.initiate()并有 PRIMARY;如果用的是单节点 shard,要加{force: true}选项(仅限开发) - 别在 config server 还没完全选举出 PRIMARY 时就执行
sh.addShard()——此时 config 元数据不可写,操作会卡住或失败
分片集合写入后数据没分散到不同 shard,全落在一个上
不是分片没生效,而是集合还没真正“开启分片”,或者片键(shard key)选得不合理,导致 chunk 无法分裂和迁移。
- 必须先对数据库启用分片:
sh.enableSharding("mydb"),再对集合分片:sh.shardCollection("mydb.mycoll", {"_id": "hashed"}) - 片键不能是数组、正则、未索引字段;若用
{"field": 1},该字段必须已有升序索引;若用{"field": "hashed"},必须有field的哈希索引(db.mycoll.createIndex({"field": "hashed"})) - 刚分片完的集合只有 1 个 chunk,数据自然全在一个 shard;等写入量上来、触发自动分裂(默认 chunk 大小 64MB)且 balancer 开启后,才会迁移
- 检查 balancer 是否运行:
sh.getBalancerState();手动触发迁移前可先sh.startBalancer(),但生产环境别频繁开关
停掉某个 shard 节点后,整个集群读写卡顿甚至超时
这不是高可用失效,而是剩余 shard 节点负载突增 + balancer 尝试重平衡失败导致的连锁反应,尤其当 chunk 分布不均或片键倾斜时更明显。
- shard 副本集内单节点宕机通常不影响服务,但若 PRIMARY 挂了且选举慢(比如网络延迟高、oplog 不足),
mongos会持续重试,拖慢请求 - 停掉整个 shard(比如关掉全部三个节点),所有发往它的 chunk 请求会失败;
mongos默认重试 3 次,每次间隔递增,造成明显延迟 - balancer 在检测到 shard 不可达后会暂停迁移,但已有 chunk 不会自动剔除——你得手动
sh.removeShard()(需先迁移走所有 chunk) - 关键点:分片集群没有“自动故障转移 shard”的机制;shard 是逻辑单元,挂掉就得人工介入,不能指望 mongos 自动绕过
配置和启动顺序比拓扑图重要得多,很多人花半天画架构,却在 --configsvr 和 --shardsvr 上卡住两小时。

















