mongos启动必须指定config server地址,否则报错退出;需通过--configdb或配置文件sharding.configdb配置,且副本集名称与主机名须严格匹配、可dns解析。

mongos 启动时必须指定 config server 地址
不指定 --configdb 或配置文件中缺失 sharding.configDB,mongos 会直接报错退出,错误信息类似:Failed to connect to config server: No such host is known 或 Unable to load config database。它不会尝试默认地址,也不会 fallback 到 localhost。
配置方式有两种:
- 命令行启动:
mongos --configdb cfgset/cfg1.example.net:27019,cfg2.example.net:27019,cfg3.example.net:27019 --port 27017 --logpath /var/log/mongos.log --fork - 配置文件(推荐):
sharding: configDB: cfgset/cfg1.example.net:27019,cfg2.example.net:27019,cfg3.example.net:27019 net: port: 27017 bindIp: 0.0.0.0 systemLog: destination: file logPath: /var/log/mongos.log quiet: true
注意:cfgset 是配置服务器副本集名称,必须与 rs.initiate() 中设置的 _id 完全一致;主机名必须可被 DNS 解析(不能只写 IP,尤其在 MongoDB ≥5.0 中会启动失败)。
mongos 不需要 dbpath,但必须有可写日志目录
mongos 是无状态路由进程,不存储数据,因此不能也不应配置 dbpath。若误加该参数,启动时会报错:mongos does not support dbpath。
但它依赖日志记录诊断信息,且需确保日志路径存在、权限可写。常见疏漏:
- 日志目录未创建(
mkdir -p /var/log/mongos忘了执行) - 日志文件被其他进程占用或权限为 root,而
mongos以普通用户(如mongodb)运行 - 配置中用了相对路径(如
logPath: mongos.log),导致日志写入到工作目录而非预期位置
建议始终用绝对路径,并在启动前验证:sudo -u mongodb touch /var/log/mongos.log && sudo -u mongodb rm /var/log/mongos.log。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
多个 mongos 实例需避免配置服务器连接风暴
每个 mongos 实例都会定期轮询配置服务器(默认每 30 秒一次)以刷新元数据缓存。当部署数十个 mongos 时,频繁请求可能压垮配置服务器,尤其在 chunk 迁移或分片扩容期间,容易触发 StaleConfig 错误或延迟升高。
缓解方式包括:
- 控制数量:生产环境通常 3–5 个
mongos足够,优先部署在应用服务器本地,而非集中堆砌 - 启用连接复用:确保
mongos与配置服务器之间使用 keepalive(Linux kernel 默认开启,无需额外配置) - 避免短周期重启:滚动更新时,新实例启动后旧实例不要立即 kill,留出几秒重叠期防止元数据断层
可通过 mongostat --host localhost:27017 -o 1 观察 netIn/netOut 波动,异常高频小包即可能是配置服务器心跳过载信号。
客户端连接 mongos 时必须用完整 host:port,不能省略端口
即使 mongos 监听默认端口 27017,驱动连接字符串也必须显式写出端口,例如:mongodb://mongos1.example.net:27017/?directConnection=false。省略端口(如 mongodb://mongos1.example.net/)会导致 driver 尝试直连 mongod,绕过路由逻辑,最终报错:not master and slaveOk=false 或连接超时。
另外两个关键点:
-
directConnection=false必须显式设置(MongoDB Driver ≥4.0 默认为true),否则 driver 会跳过mongos的拓扑发现流程,无法感知分片集群结构 - 如果前端有负载均衡器(如 Nginx、HAProxy),必须开启客户端关联性(client stickiness),否则同一 session 的连续请求可能落到不同
mongos,导致事务失败或游标失效
真正容易被忽略的是:mongos 本身不校验数据库或集合是否存在——它只管转发。所以即使连接成功,db.foo.find() 返回空结果,也未必是数据问题,先确认是否已执行 sh.enableSharding("mydb") 和 sh.shardCollection()。










