为什么要分片
大数据量和高吞吐量会对机器性能造成较大压力,通过将数据调配到多台机器上,来升高单机的负载,进步整体性能,还能够通过减少分片来实现零碎扩容,另外分片也进步了整体服务的可用性。
- 晋升读写性能
- 存储容量扩容
- 高可用
分片集群架构
- 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…
MongoDB 中文文档 MongoDB 分片:https://docs.mongoing.com/fen-pian
《Mongo 进阶 – DB 外围:分片 Sharding》https://www.pdai.tech/md/db/nosql-mongo/mongo-z-sharding.html
本文由 mdnice 多平台公布