Mongos 连接报错 ShardNotFound 通常意味着路由节点缓存的分片元数据与实际集群状态不一致,或者目标分片已下线但未从配置服务器中彻底移除。处理重点是刷新 mongos 缓存或完成分片移除流程,操作前需确认业务是否允许短暂连接中断。
先说结论:该报错本质是元数据不一致,优先检查分片状态和配置服务器连通性,必要时刷新路由缓存。
- 先确认:使用 sh.status() 检查分片列表是否包含报错中提到的分片名称。
- 先处理:在 mongos 执行 flushRouterConfig 命令刷新缓存,或完成 removeShard 流程。
- 再验证:重新发起业务请求,确认不再出现 ShardNotFound 错误日志。
命令速用版
以下命令需在 mongos 节点的 mongo Shell 中执行,用于检查状态和刷新缓存。
检查分片状态:
sh.status()
刷新路由缓存(不影响正在进行的查询):
db.adminCommand({flushRouterConfig: 1})查看当前分片移除进度(如果正在移除分片):
db.adminCommand({removeShard: "shardName"})为什么会这样
Mongos 报错 ShardNotFound 的核心原因是路由节点持有的元数据缓存与配置服务器(Config Server)的实际记录不一致。Mongos 会从配置服务器缓存分片映射关系,当某个分片被移除、网络分区导致 mongos 无法感知分片下线,或者配置服务器数据未同步时,mongos 仍试图将请求路由到不存在或不可达的分片,从而触发该错误。公开资料中没有看到可靠的量化数据说明该错误发生的频率,通常与运维操作时序有关。
分步处理
步骤 1:确认分片是否存在于集群元数据
登录 mongos 执行 sh.status(),查看输出中的 Shards 列表。如果报错提到的分片名称不在列表中,说明该分片已被移除或从未添加成功。如果分片在列表中但状态异常,需检查该分片节点的网络连通性。
步骤 2:刷新 Mongos 路由缓存
如果分片确实存在且网络正常,可能是 mongos 缓存了旧的元数据。在 mongos 执行 db.adminCommand({flushRouterConfig: 1})。该操作不会中断现有连接,但新请求会使用最新元数据。注意不要同时重启所有 mongos 节点,避免服务不可用。
步骤 3:检查分片移除流程
如果正在执行移除分片操作,必须确保数据块(Chunks)已完全迁移。执行 db.adminCommand({removeShard: "shardName"}) 查看返回状态。如果返回 msg: "draining",表示数据正在迁移,此时连接该分片可能报错,需等待迁移完成。如果强制移除未 drain 完成的分片,会导致数据丢失风险。
步骤 4:检查配置服务器连通性
Mongos 依赖配置服务器获取元数据。检查 mongos 日志中是否有连接 config server 失败的记录。如果配置服务器副本集不可用,mongos 无法更新元数据,需优先恢复配置服务器集群。
怎么验证是否生效
执行刷新操作后,使用业务账号运行一条涉及分片键的查询命令。观察 mongos 日志文件(通常位于 /var/log/mongodb/mongos.log 或配置指定的 logPath),确认不再出现 ShardNotFound 错误堆栈。同时监控应用端报错率,确认错误消失。
常见坑
1. 强制移除未迁移完的分片
在 removeShard 返回 draining 状态时强制下线分片节点,会导致部分数据不可读。必须等待 removeShard 命令返回 ok: 1 且 msg: "removeshard completed successfully"。
2. 同时重启所有 Mongos
刷新缓存无效时,重启 mongos 可强制重载元数据。但生产环境应避免同时重启所有 mongos 实例,需滚动重启,防止客户端连接全部中断。
3. 忽略网络分区
如果 mongos 与特定分片之间防火墙策略变更或网络波动,也会报此错。需使用 telnet 或 mongosh 直接从 mongos 服务器尝试连接报错的分片端口,验证网络层是否通畅。
常见问题
ShardNotFound 错误会导致数据丢失吗?
单纯报错不会导致数据丢失,但如果是因强制移除分片引起的报错,可能意味着部分数据已不可访问。需立即检查分片移除状态确认数据迁移进度。
刷新缓存后为什么还会报错?
如果刷新缓存后仍报错,说明配置服务器元数据中确实不存在该分片,或者该分片节点已彻底宕机。需检查分片节点进程状态和配置服务器数据一致性。
可以在业务高峰期执行 flushRouterConfig 吗?
可以,该命令设计为在线执行,不会锁库或中断现有连接。但建议在低峰期操作,以防元数据加载瞬间增加延迟。
参考来源
MongoDB Official Documentation - Sharding Administration
URL: https://www.mongodb.com/docs/manual/sharding/
MongoDB Server Log Messages - ShardNotFound Error
URL: https://www.mongodb.com/docs/manual/reference/log-messages/