Mongo Sharding

MongoDB Atlas使用最佳实践实现分片,允许您通过GUI扩展群集。

配置服务器和查询路由器的部署和管理是完全自动化的。

如果您有一个现有的分片MongoDB部署,您可以学习如何将其迁移到Atlas以获得完全管理的分片和其他仅限Atlas的功能。

垂直水平缩放

分片是一种跨多台机器分发数据的方法。

MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。

例如,高查询率会耗尽服务器的CPU容量。

工作集大小大于系统的RAM会强调磁盘驱动器的 I/O 容量。

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

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

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

分片群集

MongoDB分片群集包含以下组件:

分片

每个分片包含分片数据的子集。

每个分片都可以部署为副本集。

mongos

mongos充当查询路由器,提供客户端应用程序和分片集群之间的接口。

配置服务器

配置服务器存储群集的元数据和配置设置。

从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。

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

分片集群中组件的交互

MongoDB在集合级别对数据进行分片,将集合数据分布在集群中的分片上。

Shared Keys

为了在集合中分发文档,MongoDB使用分片键对集合进行分区。

分片键由目标集合中每个文档中存在的不可变字段组成。

在分片集合时选择分片键。分片后无法更改分片键的选择。分片集合只能有一个分片键。

请参阅碎片密钥规范。

要对非空集合进行分片,集合必须具有以分片键开头的索引。对于空集合,如果集合尚未具有指定分片键的适当索引,MongoDB将创建索引。

请参阅碎片密钥索引。

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

有关更多信息,请参阅分片密钥文档。

Chunks(大块)

MongoDB将分片数据划分为块。

每个块都具有基于分片键的包含较低且独占的较高范围。

平衡器甚至块分布

为了在群集中的所有分片上实现块的均匀分布,平衡器在后台运行以跨分片迁移块。

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

分片的优点

读/写

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

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

存储容量

分片在群集中的分片之间分配数据,允许每个分片包含总群集数据的子集。随着数据集的增长,额外的分片会增加群集的存储容量。

高可用性

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

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

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

在生产环境中,应将各个分片部署为副本集,从而提供更高的冗余和可用性。

分片前的注意事项

分片集群基础架构要求和复杂性需要仔细规划,执行和维护。

选择分片密钥时需要认真考虑,以确保集群性能和效率。

分片后不能更改分片键,也不能取消分片分片。

请参阅选择分片键。

Sharding具有一定的操作要求和限制。

有关详细信息,请参阅分片群集中的操作限制。

如果查询不包括分片键或复合分片键的前缀,则mongos将执行广播操作,查询分片群集中的所有分片。

这些分散/收集查询可以是长时间运行的操作。

注意

如果您与MongoDB签订了有效的支持合同,请考虑与您的客户代表联系,以获得有关分片群集规划和部署的帮助。

Sharded和Non-Sharded Collections

数据库可以混合使用分片和非分片集合。

分片集合在集群中的分片上进行分区和分布。

非散列集合存储在主分片上。

每个数据库都有自己的主分片。

Sharded和Non-Sharded Collections

连接到分片群集

您必须连接到mongos路由器才能与分片群集中的任何集合进行交互。

这包括分片和非分片集合。

客户端永远不应连接到单个分片以执行读取或写入操作。

连接到分片群集

您可以像连接到mongod一样连接到mongos,例如通过mongo shell或MongoDB驱动程序。

分片策略

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

哈希分片

散列分片涉及计算分片键字段值的散列。

然后,基于散列的分片键值为每个块分配一个范围。

在使用散列索引解析查询时,MongoDB会自动计算哈希值。应用程序不需要计算哈希值。

hash-sharding

虽然一系列分片键可能“关闭”,但它们的散列值不太可能在同一块上。

基于散列值的数据分布有助于更均匀的数据分布,尤其是在分片键单调变化的数据集中。

但是,散列分布意味着对分片键的基于范围的查询不太可能以单个分片为目标,从而导致更多群集范围的广播操作

有关更多信息,请参阅散列分片。

范围分片

范围分片涉及基于分片键值将数据划分为范围。

然后根据分片键值为每个块分配一个范围。

范围分片

值为“close”的一系列分片键更可能驻留在同一块上。

这允许有针对性的操作,因为mongos可以将操作仅路由到包含所需数据的分片。

范围分片的效率取决于所选的分片键。

考虑不周好的分片键可能导致数据分布不均匀,这可能会抵消分片的某些好处,或者可能导致性能瓶颈。

查看用于范围分片的分片键选择。

有关详细信息,请参阅Ranged Sharding。

Sharded Clusters中的区域

在分片群集中,您可以根据分片键创建分片数据区域。

您可以将每个区域与群集中的一个或多个分片相关联。

分片可以与任意数量的区域相关联。

在平衡群集中,MongoDB仅将区域覆盖的块迁移到与该区域关联的分片。

每个区域涵盖一个或多个分片键值范围。

区域覆盖的每个范围始终包括其下边界并且不包括其上边界。

sharded-cluster-zones

在为要覆盖的区域定义新范围时,必须使用分片键中包含的字段。

如果使用复合分片键,则范围必须包含分片键的前缀。 有关详细信息,请参阅区域中的分片键。

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

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

从MongoDB 4.0.3开始,在对空的或不存在的集合进行分片之前设置区域和区域范围可以更快地设置分区分片。

Sharding in Collection

使用带有排序规则的shardCollection命令:{locale:“simple”} 选项可以对具有默认排序规则的集合进行分片。

成功分片需要:

  1. 集合必须具有一个索引,其前缀是分片键

  2. 索引必须具有排序规则 {locale:“simple”}

  3. 使用归类创建新集合时,请在分片集合之前确保满足这些条件。

注意

分片集合上的查询将继续使用为集合配置的默认排序规则。

要使用分片键索引的简单归类,请在查询的归类文档中指定 {locale:“simple”}

有关分片和排序规则的详细信息,请参阅shardCollection。

改变流

从MongoDB 3.6开始,更改流可用于副本集和分片集群。

更改流允许应用程序访问实时数据更改,而不会产生拖尾oplog的复杂性和风险。

应用程序可以使用更改流来订阅集合或集合上的所有数据更改。

参考资料

https://docs.mongodb.com/manual/sharding/