乐趣区

关于后端: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 上。

指定分片键:

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 多平台公布

退出移动版