参考 > 分片
分片是一种用于在多台计算机之间分配数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
具有大数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。例如,高查询率可能会耗尽服务器的CPU容量。大于系统RAM的工作集大小会增加磁盘驱动器的I / O容量。
解决系统增长的方法有两种:垂直缩放和水平缩放。
垂直扩展涉及增加单个服务器的容量,例如使用功能更强大的CPU,添加更多RAM或增加存储空间量。可用技术的局限性可能会限制一台计算机对于给定的工作负载而言功能不足。此外,基于云的提供程序具有基于可用硬件配置的严格上限。结果,垂直缩放有一个实际的最大值。
水平扩展涉及划分系统数据集并在多台服务器上加载,并根据需要添加其他服务器以增加容量。尽管单台计算机的整体速度或容量可能不高,但是每台计算机只能处理总工作量的一部分,因此与单台高速大容量服务器相比,可能提供更高的效率。扩展部署容量仅需要根据需要添加其他服务器,这可以比一台机器的高端硬件降低总体成本。折衷方案是增加基础结构和部署维护的复杂性。
MongoDB 通过分片支持水平扩展。
MongoDB分片群集由以下组件组成:
mongos
充当查询路由器,在客户端应用程序和分片群集之间提供接口。下图描述了分片群集中组件的交互:
MongoDB在收集级别分片数据,将收集数据分布在集群中的分片上。
MongoDB使用分片键在各个分片之间分发集合的文档。分片键由目标集合中每个文档中存在的一个或多个字段组成。
在分片集合时选择分片键。分片后不能更改分片键的选择。分片集合只能有一个分片 密钥。请参阅分片密钥规范。
要分片非空集合,该集合必须具有 以分片键开头的索引。对于空集合,如果集合尚不具有指定分片键的适当索引,则MongoDB会创建索引。请参阅分片键索引。
分片密钥的选择会影响分片群集的性能,效率和可伸缩性。选择分片密钥可以使具有最佳硬件和基础结构的群集成为瓶颈。分片密钥及其后备索引的选择也会影响群集可以使用的分片策略。
MongoDB 4.2的新功能
尽管您不能更改从分片键开始的哪个或哪些字段,但是从MongoDB 4.2开始,您可以更新文档的分片键值,除非分片键字段是不可变_id
字段。在MongoDB 4.2之前,文档的分片键字段值是不可变的。有关更多信息,请参见
更改文档的分片键值。
见片键 以获取更多信息的文档。
分片式群集基础结构的要求和复杂性要求仔细计划,执行和维护。
为了确保群集的性能和效率,在选择分片密钥时需要仔细考虑。不能在分片后更改分片密钥,也不能对分片的集合进行分片。请参阅 选择分片键。
分片有一定的操作要求和限制。有关更多信息,请参见 分片群集中的操作限制。
如果查询不包含分片键或复合分片键的前缀
,请mongos
执行广播操作,查询分
片群集中的所有分片。这些分散/聚集查询可能是长时间运行的操作。
注意
如果您与MongoDB签订了有效的支持合同,请考虑与您的客户代表联系,以获取分片群集计划和部署方面的帮助。
MongoDB支持两种分片策略,用于在分片群集之间分布数据。
在分片群集中,您可以基于shard key创建分片数据区域。您可以将每个区域与集群中的一个或多个分片关联。分片可以与任意数量的区域关联。在平衡的集群中,MongoDB 仅将区域覆盖的块迁移到与该区域关联的碎片。
每个区域覆盖一个或多个分片键值范围。区域覆盖的每个范围始终包括其下边界和上边界。
在定义要覆盖的区域的新范围时,必须使用分片键中包含的字段。如果使用复合分片键,则范围必须包含分片键的前缀。有关更多信息,请参见区域中的分片键。
选择分片密钥时,请仔细考虑将来使用区域分片的可能性,因为在对集合进行分片后无法更改分片密钥。
最常见的是,区域用于改善跨多个数据中心的分片群集的数据局部性。
小费
从MongoDB 4.0.3开始,在 对空集合或不存在的集合进行分片之前设置区域和区域范围可以更快地设置区域分片。
有关更多信息,请参见区域。
使用shardCollection
带有选项的命令可以分片具有默认排序规则的集合
。成功的分片需要:collation :
{ locale : "simple" }
{ locale: "simple" }
使用排序规则创建新集合时,在分片集合之前,请确保满足这些条件。
注意
分片集合上的查询继续使用为集合配置的默认排序规则。要使用分片键索引的simple
归类,请
在查询的归类文档中指定。{locale : "simple"}
参见shardCollection
以获取有关分片和整理的更多信息。