MongoDB 官方文档笔记之分片 Sharding
为什么要分片
大数据量和高吞吐量会对机器性能造成较大压力,通过将数据分配到多台机器上,来降低单机的负载,提高整体性能,还可以通过增加分片来实现系统扩容,另外分片也提高了整体服务的可用性。
提升读写性能
存储容量扩容
高可用
分片集群架构
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 上。
指定分片键:
定向操作和广播操作 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
评论