MongoDB 分片集群概览
什么是分片
分片(Sharding)是MongoDB用来实现水平扩展的核心技术,将大型数据集水平分割并分布到多个服务器上。
分片的组成要素
- 分片(Shard):每个分片包含数据集的一个子集
- 配置服务器(Config Server):存储集群的元数据
- 查询路由器(Mongos):作为应用程序的入口点
分片策略
- 范围分片:基于分片键的值范围进行数据划分
- 哈希分片:使用哈希函数均匀分布数据
- 区域分片:基于地理位置定义数据分布规则
片键详解
选择标准
- 基数:高基数字段更适合
- 写分布:避免热点写问题
- 查询模式:常用查询条件应包含片键字段
片键选择场景推荐
| 场景 | 推荐片键策略 |
|---|---|
| 用户订单 | {user_id: “hashed”} |
| 按用户查多 | {user_id: “hashed”} |
| 时间范围检索多 | {order_time: 1} |
| 设备+时间 | {device_id:1, ts:1} |
最小可运行示例
操作分片
// 在 mongos 上执行
sh.addShard("rs0/rs0a:27018,rs0b:27018,rs0c:27018")
sh.enableSharding("shop")
db = db.getSiblingDB("shop")
db.createCollection("orders")
// 片键:hashed示例
sh.shardCollection("shop.orders", { user_id: "hashed" })
预分裂 + 均衡
sh.splitAt("shop.orders", { user_id: NumberLong(0) })
sh.splitAt("shop.orders", { user_id: NumberLong(1e9) })
sh.startBalancer()
验证分布
sh.status()
db.orders.getShardDistribution()
FAQ
- 片键能改吗?≥5.0可在线reshardCollection
- 跨分片聚合慢?优先下推过滤条件到片键