MongoDB 分片(Sharding) 是把数据分布到多台机器上的方式,用于 水平扩展。下面我按 生产级标准流程,从 概念 → 架构 → 配置步骤 → 示例 → 常见坑 给你讲一遍。
一个完整的分片集群至少包含 3 类角色:
| 角色 | 作用 |
|---|---|
| Shard(分片) | 真正存储数据的 MongoDB 实例(可以是副本集) |
| Config Server(配置服务器) | 存储集群元数据(分片信息、chunk 信息) |
| Mongos(路由) | 应用连接的入口,负责路由请求 |
✅ 生产环境强烈建议:
App
|
Mongos1 Mongos2
| |
Config Server Replica Set
| |
Shard1 Shard2 Shard3
(副本集) (副本集) (副本集)
假设 3 台机器:
| 机器 | 角色 |
|---|---|
| node1 | configsvr + shard1 + mongos |
| node2 | shard2 |
| node3 | shard3 |
端口规划:
| 角色 | 端口 |
|---|---|
| mongos | 27017 |
| configsvr | 27019 |
| shard | 27018 |
mongod --configsvr --replSet configRS --port 27019 --dbpath /data/configdb
rs.initiate({
_id: "configRS",
configsvr: true,
members: [
{ _id: 0, host: "node1:27019" },
{ _id: 1, host: "node2:27019" },
{ _id: 2, host: "node3:27019" }
]
})
mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/shard1
rs.initiate({
_id: "shard1",
members: [
{ _id: 0, host: "node1:27018" },
{ _id: 1, host: "node2:27018" },
{ _id: 2, host: "node3:27018" }
]
})
⚠️ 每个 shard 都要单独做(shard2、shard3)
mongos --configdb configRS/node1:27019,node2:27019,node3:27019 --port 27017
连接 mongos:
mongosh --port 27017
添加分片:
sh.addShard("shard1/node1:27018,node2:27018,node3:27018")
sh.addShard("shard2/node1:27018,node2:27018,node3:27018")
sh.addShard("shard3/node1:27018,node2:27018,node3:27018")
查看分片状态:
sh.status()
sh.enableSharding("mydb")
db.mycollection.createIndex({ user_id: 1 })
sh.shardCollection("mydb.mycollection", { user_id: 1 })
| 策略 | 适用场景 |
|---|---|
| Hash 分片 | 数据分布均匀,写入多 |
| Range 分片 | 范围查询多 |
| Zone 分片 | 多机房、冷热数据 |
示例(Hash):
sh.shardCollection("mydb.logs", { _id: "hashed" })
❌ 直接对普通集合分片
✅ 必须先建索引
❌ 对 _id 做 range 分片
✅ 推荐 hashed
❌ 单节点做 shard
✅ 生产环境必须是副本集
❌ mongos 直连 shard
✅ 应用只连 mongos
如果你只是 本地测试,可以:
我可以给你 单机 docker-compose 或 本地脚本版。
你可以直接说:
我可以直接给你 可复制配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。