对全局集合进行分片
重要
无服务器实例中的不可用功能
无服务器实例目前不支持此功能。要了解详情,请参阅无服务器实例限制。
在 Atlas 用户界面中对用于全局写入的全局集合进行分片
注意
只有全球集群支持全局写入,而且全球集群需要
M30+
集群层。您只能使用 Atlas 用户界面对启用了 Atlas 托管分片的全局集群的全局集合进行分片。
本文档假定用户事先了解分片语义。在继续本教程之前,请查看分片文档。
在分片集群中,您可以根据分 片键 创建分片数据 区域 。您的区域可以根据地理区域分割数据。要了解有关基于地理区域分片的更多信息,请参阅 按位置分割数据。
Atlas 用户界面仅支持对使用Atlas 托管分片的全局集群的全局写入集合进行分片。要对使用自管理分片的非全局写入集合或全局写入集合进行分片,必须使用mongosh
或应用程序代码。要了解更多信息,请参阅部署分片集群。
必需的访问权限
您必须拥有集群的 Atlas 项目的 Project Owner
(项目所有者)或 Organization Owner
(组织所有者)角色,才能在 Atlas 用户界面中对全局写入集合进行分片。
考虑因素
在开始此过程之前,请查看:
您可以配置 Online Archive,将 Atlas 集群中不常访问的数据转移到 MongoDB 托管的只读联合数据库实例,而不是对集合分片或升级集群层级。要了解有关 Online Archive 的更多信息,请参阅管理 Online Archive。
通过 Atlas 用户界面选择片键后,Atlas 会尝试对目标集合分片。在此期间,确保没有用户手动对集合分片。如果 Atlas 检测到目标集合的分片键与通过 Atlas 用户界面选择的键不同,则 Atlas 会停止此过程,并在 Atlas 用户界面中显示针对该集合的警告。您可以单击 Unmanage Collection 来清除警告。此操作会将集合从 Atlas 管理中删除,同时保留底层集合和手动选择的分片键。
更新分片键值
从 MongoDB 4开始。 2 ,您可以更新文档的分片键值,除非分片键字段是不可变的_id
字段。要了解更多信息,请参阅更改文档的分片键值。
在 MongoDB 4.0 及更早版本中, 无法更新已启用“全局写入”的集合中现有文档的片键字段值。
重要
分片键值和 Atlas 全球集群
在所有 MongoDB 版本中,您无法对“全局集群”上的集合重新分片。要了解更多信息,请参阅对用于全局写入的集合进行分片。
步骤
对“全球集群”中的集合分片:
可选:展开 Advanced Shard Key Configuration(高级分片键配置)部分,以指定如何对集合进行分片。
您可以选择以下选项之一:
Default | Atlas 使用指定一个或多个字段的文档作为分片键。 |
Use unique index as the shard key | Atlas 使用底层索引对“全局集合”的片键
强制执行唯一性约束。 |
Use hashed index as the shard key | Atlas 对分片键的第二个字段进行散列,从而使分片数据均匀分布。此选项仅适用于运行 MongoDB v5.0 或更高版本的 Atlas 集群。 您可以选择 Pre-split data for even distribution(对数据进行预拆分以实现均匀分布),以指定是否根据为集合定义的区域和区域范围,执行空集合或不存在集合的初始数据块创建和分配。 如果选择Pre-split data for even distribution选项,还可以指定在使用哈希分片键对空集合进行分片时最初创建的最小数据段数。初始数据段分布允许 Atlas 快速设置分区分片。 Atlas 创建的数据段数量取决于您定义的区域数量。默认情况下,Atlas 会为每个位置代码创建一个数据段,并将数据段平均分配给所有分片。 |
要了解有关这些选项的更多信息,请参阅“全局集群分片参考”。
配置集合后,Atlas 会在 Global Writes 标签页顶部附近显示组合分片键。
全球集群分片引用
以下部分介绍分片行为以及如何为“管理全球集群”启用分片。
对全局写入分片集合
适用于具有Atlas 托管分片的全球集群。启用后,未分片的集合必须在分片之前满足以下兼容性要求,才能在分片时使用“全局写入”:
集合中的每个文档都必须包含一个
location
(位置)字段。字段的值
location
必须 是 ISO-3166 -1 alpha2 国家/地区代码("US"
、"DE"
、"IN"
) 或 支持的 ISO-3166 -2 细分代码("US-DC"
、"DE-BE"
、"IN-DL"
)。不符合此条件的文档无法路由到集群中的任何分片。要查看当前支持的国家/地区或分区代码的完整列表,请参阅 https://cloud.mongodb.com/static/atlas/country_iso_codes.txt。
仅在location
字段上使用分片键可能会导致瓶颈,尤其是对于国家/地区或分区子集接收大部分写入操作的工作负载而言。 Atlas Global Writes 需要复合分片键来促进分片数据在集群中的高效分配。 Atlas Global Cluster 分片键与 MongoDB 分片键具有相同的限制。适用以下 Atlas Global Cluster 限制:
组合分片键的第一个字段必须是
location
(位置),且不能散列。组合分片键中只能有一个二级分片键字段。
复合分片键的二级分片键字段可以进行哈希处理。
从节点分片键字段不能是数组。
要详细了解关于:
重要
更改分片键
分片后,可以修改的内容取决于运行的 MongoDB 版本:
MongoDB 版本 | 修改分片键 | 修改分片键值 |
---|---|---|
MongoDB 5.0 | 是的,只能使用 Atlas 用户界面为键添加字段。 | 是 |
MongoDB 6.0 | 是的,只能使用 Atlas 用户界面为键添加字段。 | 是 |
MongoDB 7.0 | 是的,只能使用 Atlas 用户界面为键添加字段。 | 是 |
在所有 MongoDB 版本中,您无法对“全局集群”上的集合重新分片。
Atlas 用户界面支持创建分片集合,并对全局写入进行特定验证。要了解更多信息,请参阅Atlas 用户界面中的对用于全局写入的全局集合进行分片。
您还可以使用mongosh
来执行sh.shardCollection()
。对集合进行分片后,您必须使用Atlas 用户界面为该集合启用全局写入。
警告
如果您对已具有 Atlas Search 索引的集合进行分片,当该集合开始出现在分片上时,您可能会遇到短暂的查询停机时间。此外,如果您为包含 Atlas Search 索引的已分片集合添加分片,针对该集合的搜索查询将失败,直到添加的分片完成初始同步过程为止。要了解更多信息,请参阅初始同步进程。
要了解有关通过 Atlas 用户界面对集合分片的更多信息,请参阅在 Atlas 用户界面中对用于全局写入的全局集合进行分片。
哈希分片选项。
分片键使用哈希分片和预分割数据来实现均匀分布。这仅适用于运行 MongoDB 5的 Atlas 集群。 0及更高版本。
如果执行了以下操作之一, Atlas 会散列片键的第二个字段来实现分片数据平均分布:
通过在Atlas 用户界面中选择Use hashed index as the shard key来启用哈希索引分片键。
通过API设置
isCustomShardKeyHashed
。
您可以选择是否为空或不存在的集合执行初始数据段创建和分布。 该操作 基于已定义的集合区域和区域范围。 为此,请执行以下操作之一:
在Atlas 用户界面中选择Pre-split data for even distribution 。
使用API设置
presplitHashedZone
。
当您使用复合哈希分片键为全球集群创建分片集合时,Atlas 会为每个位置代码至少创建1个数据段,并尝试在集群中的分片之间平均分配数据段。
您还可以使用 Atlas 用户界面 或通过numInitialChunks
API 设置 参数来指定在使用 哈希分片键 对空集合进行分片时最初创建的最小数据段数。
注意
如果指定了每个分片的数据段数量,Atlas 至少会创建 您指定的最小数据段数量,每个位置代码的数据段数量相同。 如果指定了 最小数据段数量,Atlas 会快速设置分区分片, 尤其是在分片前已经知道如何在地理上分布数据的情况下。
错误处理
如果 Atlas 在对用于全局写入的集合分片时遇到错误, 屏幕顶部的横幅中会显示信息。
单击 See Details(查看详细信息),以了解错误以及发生错误的命名空间。随后会出现一个模式窗口,其中包含完整的错误消息和一个 Fix Now(立即修复)按钮。
单击 Close(关闭),导航到 Atlas 用户界面中的集合。您还可以单击 Fix Now(立即修复)按钮,进入该 Atlas 集群的 Atlas 用户界面。
单击错误消息中提到的集合的 Global Writes 标签页。
单击 Unmanage Collection(取消托管集合),以取消全局写入分片操作。您必须拥有
Project Data Access Admin
角色,才能取消分片操作。
根据错误信息的提示对集合进行必要更改后,就可以再次启动分片过程。
可能出现的错误包括:
- 自定义分片键上已经存在一个索引。
- 如果被选为组合片键第二部分的字段已被索引,分片操作可能会失败。
- 该分片键字段不存在。
- 集合中的所有文档必须同时包含这两个分片键字段。该错误仅在 MongoDB 5.0 之前的版本中出现。
- 已经对集合进行分片。
- 如果已对集合手动分片,则操作失败。
- 该集合具有自定义默认排序规则。
- 集合上的自定义默认排序规则可能会导致分片错误。
全球集群写入操作
对于写入操作中的每个文档,MongoDB 都会使用分片键的 location
字段(如果包含)来确定要将数据路由到哪个区域。MongoDB 会选择与该区域相关联的分片作为写入文档的目标,从而便于从地理上隔离和分割数据存储。
警告
如果写入操作中没有包含分片键,或者包含了分片键但没有 location
(位置)字段,则写入操作会成功,但不会分布生成的文档。
MongoDB 可以保证仅对符合location
用于全局写入的集合 分片中定义的条件的插入文档执行此行为。具体来说,MongoDB 可以路由 字段不符合 ISO-3166 -1 alpha2 的文档 或 ISO-3166 - 集群中的任何分片。2
全球集群读取操作
MongoDB 查询路由取决于读取操作是否包含完整分片键, 以及 location
值对应于受支持的 ISO-3166 -1 alpha2 国家/地区代码("US"
、"DE"
、"IN"
) 或 支持的 ISO-3166 -2 细分代码("US-DC"
、"DE-BE"
、"IN-DL"
)。
对于包含完整分片键且其
location
值符合“全局写入”要求的查询,MongoDB 会将读取操作定向至映射到查询中指定的一个或多个location
值的区域。对于不包含
location
值的读取操作,或者 值与支持的location
ISO-3166 -1 Alpha2 国家/地区代码或 ISO-3166 -2 分区代码,MongoDB 必须将读取操作广播到集群中的每个区域。对于在地理位置相距较远的区域具有Read-only节点的全局写入区域,这些区域中的客户端可以查询该区域的本地Read-only节点,方法是指定完整分片键作为查询的一部分,并发出带有读取偏好的读取操作的
nearest
。
重要
辅助读取可能会返回过时数据, 具体取决于辅助节点和主节点之间的复制延迟程度。
要了解更多信息,请参阅MongoDB 读取偏好和MongoDB 查询路由。
无需全局写入即可对集合进行分片
全局写入集群支持与标准 Atlas 分片集群相同的范围和哈希分片策略。对于分片键和文档模式不支持全局写入的分片集合,MongoDB 会根据所选分片键将分片数据平均分配到集群中的可用分片上。对于无法利用“全局写入”功能的数据,请考虑使用单独的分片集群。
分片后无法修改集合以支持“全局写入”。 我们建议您选择片键, 以便将来在某个集合中使用“全局写入”功能。
提示
另请参阅:
要了解有关“全局写入”分片要求的更多信息,请参阅对“全局写入”的集合进行分片。
全局写入集群中的未分片集合
全球集群为非分片集合提供与标准 Atlas 分片集群相同的支持。对于集群中的每个数据库,MongoDB 将其未分片集合存储在 主 分片上。使用sh.status()
{ 中的mongosh
确定数据库的主分片。