拆分

在本页面

拆分是一种跨多台计算机分发数据的方法。 MongoDB 使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

具有大数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。例如,高查询率会耗尽服务器的 CPU 容量。工作集大小大于系统的 RAM 会强调磁盘驱动器的 I/O 容量。

有两种解决系统增长的方法:垂直和水平缩放。

垂直扩展涉及增加单个服务器的容量,例如使用更强大的 CPU,添加更多 RAM 或增加存储空间量。可用技术的局限性可能会限制单个机器对于给定工作负载而言足够强大。此外,Cloud-based 提供商基于可用的硬件配置具有硬性上限。结果,垂直缩放有实际的最大值。

水平扩展涉及划分系统数据集并加载多个服务器,添加其他服务器以根据需要增加容量。虽然单个机器的总体速度或容量可能不高,但每台机器处理整个工作负载的子集,可能提供比单个 high-speed high-capacity 服务器更高的效率。扩展部署容量只需要根据需要添加额外的服务器,这可能比单个机器的 high-end 硬件的总体成本更低。权衡是基础架构和部署维护的复杂性增加。

MongoDB 支持通过分片进行水平扩展。

Sharded Cluster

MongoDB 分片 cluster由以下组件组成:

  • 碎片:每个分片包含分片数据的子集。每个分片都可以部署为副本集

  • mongosmongos充当查询 router,在 client applications 和分片 cluster 之间提供接口。

  • 配置服务器:为 cluster 配置服务器 store 元数据和 configuration 设置。从 MongoDB 3.4 开始,必须将配置服务器部署为副本集(CSRS)。

下图描述了分片 cluster 中组件的交互:

用于 production 目的的 sample 分片 cluster 图。包含 3 个配置服务器,2 个或更多mongos查询 routers,以及至少 2 个分片。分片是副本集。

MongoDB 在采集 level 处分片数据,在 cluster 中的分片中分配集合数据。

碎片钥匙

要在集合中分发文档,MongoDB 分区使用碎片 key集合。 碎片 key由目标集合中每个文档中存在的不可变字段组成。

分片集合时选择分片 key。分片后无法更改分片 key 的选择。分片集合只能有一个分片 key。见碎片关键规范

要分片 non-empty 集合,集合必须具有以分片 key 开头的指数。对于空集合,如果集合尚未具有指定 shard key 的适当索引,则 MongoDB 将创建索引。见Shard Key 索引

shard key 的选择会影响分片 cluster 的 performance,效率和可伸缩性。具有最佳硬件和基础结构的 cluster 可能会因选择 shard key 而受到瓶颈。选择 shard key 及其支持索引也会影响 cluster 可以使用的分片策略

有关更多信息,请参阅碎片 key文档。

大块

MongoDB 将分片数据分区为。每个块都具有基于碎片 key的包含较低且独占的较高范围。

MongoDB 使用分片集群平衡器分片 cluster中跨碎片迁移。平衡器尝试在 cluster 中的所有分片中实现块的均衡平衡。

有关更多信息,请参见使用 Chunks 进行数据分区

分片的优点

读/写

MongoDB 在分片 cluster中的碎片上分配读写工作负载,允许每个分片处理 cluster 操作的子集。通过添加更多分片,可以在 cluster 上水平扩展读取和写入工作负载。

对于包含 shard key 或复合 shard key 前缀的查询,mongos可以在特定分片或一组分片中定位查询。对于 cluster 中的每个分片,这些目标操作通常比广播更有效。

存储容量

拆分在 cluster 中的碎片上分发数据,允许每个分片包含整个 cluster 数据的子集。随着数据集的增长,额外的分片会增加 cluster 的存储容量。

高可用性

即使一个或多个分片不可用,也可以继续执行部分读/写操作。虽然在停机期间无法访问不可用分片上的数据子集,但是针对可用分片的读取或写入仍然可以成功。

从 MongoDB 3.2 开始,您可以将配置服务器部署为副本 sets。具有配置服务器副本集(CSRS)的分片集群可以继续 process 读取和写入为 long,因为大多数副本集可用。

在 version 3.4, MongoDB 删除对 SCCC 配置服务器的支持中。

在 production 环境中,应将各个分片部署为副本 sets,从而提高冗余和可用性。

分片前的注意事项

Sharched cluster 基础架构要求和复杂性需要仔细规划,执行和维护。

选择 shard key 时需要认真考虑,以确保 cluster performance 和效率。分片后不能更改分片 key,也不能取消分片分片。见选择碎片 Key

Sharding 有一定的运营要求和限制。有关更多信息,请参见Sharded Clusters 中的操作限制

如果查询不包含 shard key 或复合 shard key 的前缀,则mongos执行broadcast 操作,查询分片 cluster 中的所有分片。这些 scatter/gather 查询可以是 long running 操作。

注意 如果您对 MongoDB 有 active 支持 contract,请考虑与您的客户代表联系,以获取有关分片 cluster 规划和部署的帮助。

Sharded 和 Non-Sharded Collections

数据库可以混合使用分片和非分片集合。分片集合分区并分布在 cluster 中的碎片。未加密的集合存储在主要碎片上。每个数据库都有自己的主分片。

主要碎片图。主分片包含 non-sharded 集合以及分片集合中的文档块。 Shard A 是主要分片。

连接到 Sharded Cluster

您必须连接到mongos router 才能与分片 cluster中的任何集合进行交互。这包括分片和非分片集合。 Clients 永远不应该连接到 order 中的单个分片来执行读取或写入操作。

applications/drivers 向 mongos 发出查询的图表,用于未加密的集合以及分片集合。配置服务器未显示。

您可以像连接到mongod一样连接到mongos,例如通过mongo shell 或 MongoDB 司机

分片策略

MongoDB 支持两种分片策略,用于跨分片簇分发数据。

哈希碎片

散列分片涉及计算分片 key 字段的 value 的散列。然后根据散列的碎片 key 值为每个分配一个范围。

小费 MongoDB 在使用散列索引解析查询时自动计算哈希值。 Applications ****不需要计算哈希值。

基于散列的分割图。

虽然一系列分片键可能“关闭”,但它们的散列值不太可能在同一个上。基于散列值的数据分布有助于更均匀的数据分布,尤其是在 shard key 更改单调的数据集中。

但是,散列分布意味着 shard key 上的 ranged-based 查询不太可能以单个分片为目标,从而导致更多 cluster 宽broadcast 操作

有关更多信息,请参见哈希碎片

远程分片

远程分片涉及根据分片 key 值将数据分成范围。然后根据 shard key 值为每个分配一个范围。

shard key value 空间的图表被分割成更小的范围或块。

值为“close”的一系列分片键更可能驻留在同一上。这允许目标操作作为mongos可以将操作仅路由到包含所需数据的分片。

远程分片的效率取决于所选的分片 key。考虑不周好的分片键可能导致数据分布不均匀,这可能会导致分片的某些好处,或者可能导致性能瓶颈。有关远程分片,请参见shard key 选择

有关更多信息,请参见远程分片

Shaded Clusters 中的区域

在分片群集中,您可以基于碎片 key创建zones分片数据。您可以将每个 zone 与 cluster 中的一个或多个分片相关联。分片可以与任意数量的 zones 相关联。在平衡的 cluster 中,MongoDB 仅将 zone 覆盖的迁移到与 zone 关联的分片。

每个 zone 涵盖一个或多个碎片 key值范围。 zone 覆盖的每个范围始终包括其下边界并且不包括其上边界。

基于分片 cluster 中 zones 的数据分布图

在定义 zone 要覆盖的新范围时,必须使用碎片 key中包含的字段。如果使用复合 shard key,则范围必须包含 shard key 的前缀。有关更多信息,请参见zones 中的分片键

选择分片 key 时,请仔细考虑将来使用 zone 分片的可能性,因为在分片集合后无法更改分片 key。

最常见的是,zones 用于改善跨越多个数据中心的分片集群的数据位置。

有关更多信息,请参见zones

在 Sharding 的整理

使用带有collation : { locale : "simple" }选项的shardCollection命令来对具有默认排序规则的集合进行分片。成功分片需要:

  • 集合必须具有前缀为 shard key 的索引

  • 索引必须具有排序规则{ locale: "simple" }

使用排序规则创建新集合时,请在分片集合之前确保满足这些条件。

注意 对分片集合的查询继续使用为集合配置的默认排序规则。要使用 shard key 索引的simple归类,请在查询的整理文件中指定{locale : "simple"}

有关分片和整理的详细信息,请参阅shardCollection