MongoDB 分片集群概览

什么是分片

分片(Sharding)是MongoDB用来实现水平扩展的核心技术,将大型数据集水平分割并分布到多个服务器上。

分片的组成要素

  1. 分片(Shard):每个分片包含数据集的一个子集
  2. 配置服务器(Config Server):存储集群的元数据
  3. 查询路由器(Mongos):作为应用程序的入口点

分片策略

  1. 范围分片:基于分片键的值范围进行数据划分
  2. 哈希分片:使用哈希函数均匀分布数据
  3. 区域分片:基于地理位置定义数据分布规则

片键详解

选择标准

  1. 基数:高基数字段更适合
  2. 写分布:避免热点写问题
  3. 查询模式:常用查询条件应包含片键字段

片键选择场景推荐

场景推荐片键策略
用户订单{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
  • 跨分片聚合慢?优先下推过滤条件到片键