MongoDB性能系列最佳实践-分片
什么是MongoDB分片?
分片是一种将数据分布或分割到多台计算机上的方法。相较于单个计算机,分片技术允许您进行水平扩展,这在大型现代工作负载的场景下是非常有用的。
水平扩展,也称为横向扩展,是指添加计算机来共享数据集和负载。水平扩展允许进行接近无限的扩展,以处理大数据和强烈的工作负载。
通过分片实现横向扩展
通过分片,您可以自动将MongoDB数据库跨多个节点和区域进行扩展,以处理写入密集型工作负载、不断增长的数据大小以及数据存储要求。
使用MongoDB的分片,您可以在应用程序增长超出单个服务器的硬件限制时,在无需增加应用程序复杂性的情况下,无缝地扩展数据库。
为了响应不断变化的工作负载需求,可以在分片之间迁移文档,并随时向群集中添加或删除节点 - MongoDB将自动根据需要重新平衡数据,无需手动干预。
分片的好处
分片允许您将数据库扩展以处理几乎无限的负载增加。它通过增加读/写吞吐量和存储容量来实现这一点。具体来说:
增加的读/写吞吐量:通过将数据集分布到多个分片上,您可以利用并行处理来增加读/写的吞吐量。假设一个分片可以每秒处理一千次操作,每增加一个分片,您将多获得额外的一千次每秒的吞吐量。
增加的存储容量:同样地,通过增加分片的数量,您还可以增加总体的存储容量。假设一个分片可以容纳4TB的数据。每增加一个分片,您的总存储容量将增加4TB。这样可以实现接近无限的存储容量。
数据本地性:区域分片允许您轻松创建分布式数据库,以支持地理分布的应用程序,并通过强制数据在特定区域内驻留的策略来实现。每个区域可以有一个或多个分片。
MongoDB中的分片策略
大多数分布式数据库在处理数据分布时,是通过简单地对主键值进行散列,将数据随机分布在集群节点中。这在查询跨节点的数据时会带来性能损失,并且在需要将数据本地化到特定区域时会增加应用程序的复杂性。
MongoDB 可以提供多种分片策略,提供对于数据分布更好的方法。。数据可以根据查询模式或数据位置要求进行分布,从而在各种工作负载下实现更高的可扩展性:
-
范围分片。文档根据分片键值分区到分片上。分片键值彼此接近的文档可能位于同一个分片上。这种方法非常适用于需要优化基于范围的查询的应用程序,例如将特定区域所有客户的数据放置在特定分片上。
-
散列分片。文档根据分片键值的MD5散列进行分布。这种方法保证了写入在分片上的均匀分布,通常对于摄取时间序列和事件数据流是最优选择。
-
区域分片。提供了开发人员定义在分片群集中数据放置的特定规则的能力。
MongoDB Atlas中的全局群集
完全托管的云数据库服务MongoDB Atlas允许您使用可视化用户界面或Atlas API快速实现区域分片。您可以轻松创建分布式数据库以支持地理分布的应用程序,并通过强制在特定区域内存储数据的策略来实现数据存储。
使用阿里云MongoDB 分片集群为始终在线、全球分布式的写入应用程序提供服务
要确保充分发挥分片的优势,您需要遵循一系列最佳实践。
-
确保分片键的均匀分布
当读取和写入的分片键不均匀分布时,操作可能会受限于单个分片的容量。当分片键均匀分布时,没有单个分片会限制系统的容量。 -
避免散布-汇集查询用于运营工作负载
在分片系统中,不能基于分片键进行路由的查询必须广播到所有分片进行评估。由于这些查询涉及每个请求的多个分片,随着添加更多分片,这些查询不会呈线性扩展,并且需要额外的开销来合并来自多个分片的结果。您应该在查询中包含分片键,以避免散布-汇集查询。
这一规则的例外是大型聚合查询。在这些情况下,散布-汇集可以是一种有用的方法,因为它允许查询在所有分片上并行运行。
-
在适当的时候使用基于散列的分片
对于发出基于范围的查询的应用程序,基于范围的分片是有益的,因为操作可以路由到最少的分片,通常是一个分片。然而,基于范围的分片需要对数据和查询模式有很好的理解,在某些情况下可能不切实际。 基于散列的分片确保读取和写入的均匀分布,但不提供高效的基于范围的操作。 -
预分割和分发分片
在创建新的分片集合以加载数据时,首先做集合的预分片,并将它们均匀分布在所有分片上,然后再加载数据。对于基于散列的分片,您可以使用numInitialChunks来自动执行此操作。
下一步
以上就是MongoDB 性能最佳实践中关于分片的内容。接下来我们将介绍事务相关的实践。