写点什么

MongoDB 官方文档笔记之分片 Sharding

作者:菜皮日记
  • 2023-09-09
    北京
  • 本文字数:1298 字

    阅读完需:约 4 分钟

为什么要分片

大数据量和高吞吐量会对机器性能造成较大压力,通过将数据分配到多台机器上,来降低单机的负载,提高整体性能,还可以通过增加分片来实现系统扩容,另外分片也提高了整体服务的可用性。

  • 提升读写性能

  • 存储容量扩容

  • 高可用

分片集群架构

  • shard:即分片,真正存储数据的地方,其中数据以 chunk 为单位存储。部署时每个分片可以部署成一个副本集群,提高单个分片的可用性。

  • mongos:查询路由,相当于一层代理,让客户端无感知读写分片集群。

  • config servers:存储配置元数据,mongos 通过与之交互,得到分片的位置和信息。config servers 也可部署成副本集群。

分片中通过块 Chunk 来组织数据

在一个 shard 中,数据是通过 chunk 的形式存储的,每个 chunk 有一定容量,存储一系列文档数据。chunk 默认大小是 64M。

分片中有两个比较重要的进程:splitting 和 balancer。

splitting 进程:

splitting 进程在 chunk 的大小超过最大值或 chunk 中文档个数超过一定数量时,会将 chunk 做切分处理:

balancer 进程

balancer 进程负责迁移 chunk。如果分片集群中最大的 shard 和最小 shard 的 chunk 数量超过迁移阈值,balancer 进程将会触发 chunk 迁移,使集群中 shard 之间的容量更加平衡。

分片键

分片键决定了文档在分片集群中分布情况。分片键要么是单字段索引,要么是复合字段索引。

每个分片键的值,与数据块 chunk 对应。也就是说一个分片键的计算结果,映射到一个 chunk 上。

指定分片键:

sh.shardCollection( namespace, key )# namespace 为<database>.<collection> 指定数据库集合# key 为一个索引 后面跟分片类型 { <shard key field1>: <1|"hashed">, ... } 
复制代码

定向操作和广播操作 Targeted Operations & Broadcast Operations

mongos 上的操作,如果能够直接定位到具体一个 shard ,这种操作是最快的,这种被称为定向操作 Targeted Operations。

反之有些操作必须查询所有 shard,之后合并查询结果,这种被称为广播操作 Broadcast Operations。

Broadcast Operations:

Targeted Operations:

哈希分片 Hashed Sharding

哈希分片可以使集群数据分布更均衡,可以将等值匹配的查询直接定位到具体分片上,实现定向操作。但值相近的文档可能会被分配到不同分片上,且范围查询需要通过执行广播操作来完成。

范围分片 Ranged Sharding

范围分片是默认的分片方式。值相近的文档可能分配到相同的块和分片中,使得范围查询效率更高。

分片区 zone

一个区域 zone 可以对应 N 个分片,作用是干预分片键的结果,常见场景如:期望将相关数据存在地理位置相近的分片上。下面列举了分片的作用:

  • 将指定的数据放在指定的分片上。

  • 确保最相关的数据驻留在地理上最靠近应用程序服务器的分片上。

  • 根据分片硬件的硬件/性能将数据路由到分片。

参考

MongoDB 文档 Sharding:https://docs.mongodb.com/v4.2/sharding/

MongoDB 文档 Data Partitioning with Chunks:https://docs.mongodb.com/v4.2/core/sharding-data-partitioning/#chunk-splits

MongoDB 中文文档 MongoDB 分片:https://docs.mongoing.com/fen-pian

《Mongo 进阶 - DB 核心:分片 Sharding》https://www.pdai.tech/md/db/nosql-mongo/mongo-z-sharding.html

用户头像

菜皮日记

关注

全干程序员 2018-08-08 加入

还未添加个人简介

评论

发布
暂无评论
MongoDB 官方文档笔记之分片 Sharding_mongodb_菜皮日记_InfoQ写作社区