分片原理

分片核心概念

  • 分片(Shard):每个分片是存储数据子集的独立 MongoDB 实例(通常以副本集形式部署,保证高可用性)。所有分片共同存储整个数据集
  • 分片键(Shard Key):集合中用于划分数据的字段(如 user_id 或 timestamp)。分片键的选择直接影响数据分布的均衡性和查询性能
  • 块(Chunk):分片内数据的逻辑划分单位,默认大小为 64MB/128MB。块是数据在分片间迁移的最小单位
  • 配置服务器(Config Server):储分片集群的元数据(如分片键范围、块分布信息),通常以副本集形式部署,保证元数据高可用
  • 查询路由器(mongos):轻量级进程,作为客户端与分片集群的入口,负责将请求路由到正确的分片

分片工作原理

  • 数据分片流程

    • 写入流程:当客户端写入数据时,mongos 根据分片键计算数据应归属的块,检查该块当前所属的分片,并将数据写入对应的分片
    • 读取流程:mongos 根据查询条件中的分片键确定目标分片,若查询包含分片键,直接路由到对应分片;否则,向所有分片广播查询(scatter-gather),合并结果后返回
  • 数据均衡机制

    • 块拆分(Chunk Splitting):当一个块的大小超过阈值(如 128MB),MongoDB 自动将其拆分为多个更小的块。

    • 块迁移(Chunk Migration):集群的均衡器(Balancer) 监控分片间的数据分布。若某个分片负载过高,均衡器会将部分块迁移到负载较低的分片,确保数据均匀分布。

参考资料