Mongo分片创建填充时遇not connected to mongos错误的解决求助
嘿,这个问题我之前帮不少人排查过,先给你理清楚mongod和mongos的核心区别,再一步步解决你的报错问题~
先搞懂:mongod vs mongos 到底有啥不一样?
这俩完全是MongoDB生态里的不同角色:
- mongod:这是MongoDB的核心服务进程,负责存储数据、处理读写请求,说白了就是单个数据库实例的“引擎”。你后台跑的
mongod就是启动了一个独立的MongoDB节点——不管是单节点、副本集的成员,还是分片集群里的分片节点,都是用mongod启动的。 - mongos:这是分片集群专属的“路由节点”,相当于整个分片集群的统一入口。所有针对分片集群的读写请求都得先经过mongos,它会把请求转发到对应的分片节点,再把结果汇总返回给客户端。只有在搭建分片集群的时候才需要用到mongos,单节点或者副本集环境根本不需要它。
解决你的报错问题
你遇到的Error:not connected to mongos,本质是你试图执行分片相关的命令(比如创建分片、添加分片节点),但当前连接的是普通的mongod节点,而不是分片集群的路由节点mongos——分片操作只能在mongos上执行,直接连mongod是没法操作分片的。
接下来一步步解决:
1. 先确认:你真的需要搭建分片集群吗?
如果只是做测试、或者数据量不大,单节点/副本集完全够用,没必要折腾分片。如果确实需要分片,那得按正确的流程搭建集群。
2. 运行mongos报错?问题出在启动命令
mongos启动的时候必须指定配置服务器的地址,因为它需要从配置服务器获取集群的分片信息。直接裸跑mongos不加参数,它会默认找localhost:27019的配置服务器,如果这个节点没启动,自然会报错。
正确的mongos启动命令格式是:
mongos --configdb <配置服务器副本集名称>/<配置服务器节点1地址>:<端口>,<配置服务器节点2地址>:<端口> --port <mongos监听端口>
举个实际例子:如果你的配置服务器副本集叫configRS,节点是localhost:27019和localhost:27020,想让mongos监听27017端口,命令就是:
mongos --configdb configRS/localhost:27019,localhost:27020 --port 27017
3. 分片集群搭建简化流程(一步步来)
如果确实要搭分片集群,按这个流程走:
- 第一步:启动配置服务器副本集
先创建配置服务器的数据目录:
启动两个配置节点:mkdir -p /data/configdb1 /data/configdb2
连接其中一个配置节点,初始化副本集:mongod --configsvr --replSet configRS --port 27019 --dbpath /data/configdb1 mongod --configsvr --replSet configRS --port 27020 --dbpath /data/configdb2mongo --port 27019 rs.initiate({_id:"configRS", members:[{_id:0, host:"localhost:27019"},{_id:1, host:"localhost:27020"}]}) - 第二步:启动分片节点
创建分片的数据目录:
启动两个分片节点(这里用单节点分片,生产环境建议用副本集):mkdir -p /data/shard1 /data/shard2
分别连接每个分片,初始化副本集:mongod --shardsvr --replSet shard1RS --port 27021 --dbpath /data/shard1 mongod --shardsvr --replSet shard2RS --port 27022 --dbpath /data/shard2# 初始化shard1 mongo --port 27021 rs.initiate({_id:"shard1RS", members:[{_id:0, host:"localhost:27021"}]}) # 初始化shard2 mongo --port 27022 rs.initiate({_id:"shard2RS", members:[{_id:0, host:"localhost:27022"}]}) - 第三步:启动mongos并添加分片
用之前的命令启动mongos,然后连接mongos:
现在在mongos里添加分片:mongo --port 27017
之后就可以创建分片集合、填充数据了,这时候就不会再报sh.addShard("shard1RS/localhost:27021") sh.addShard("shard2RS/localhost:27022")not connected to mongos的错误了。
4. 如果是误操作?
如果你其实不需要分片,只是不小心执行了分片命令,那直接连接你的mongod节点正常操作就行,别碰分片相关的命令就OK。
内容的提问来源于stack exchange,提问作者Will.S89
相关产品推荐
相关产品推荐

