对全局集合进行分片
在此页面上
在 Atlas 用户界面中对用于全局写入的全局集合进行分片
注意
只有全球集群支持全局写入,而且全球集群需要
M30+
集群层。您只能使用 Atlas 用户界面对启用了 Atlas 托管分片的全局集群的全局集合进行分片。
本文档假定用户事先了解分片语义。继续本教程之前,请查看“分片”文档。
在分片集群中,可以根据分片键创建分片数据区域。您的区域可根据地理区域分割数据。如需详细了解如何根据地理区域进行分片,请参阅按位置分割数据。
Atlas 用户界面只支持对使用 Atlas 托管分片的全局集群进行全局写入集合分片。要对非全局写入集合或使用自托管分片的全局写入集合进行分片,必须使用 mongosh
或应用程序代码。如需了解更多信息,请参阅“部署分片集群”。
必需的访问权限
您必须拥有集群的 Atlas 项目的 Project Owner
(项目所有者)或 Organization Owner
(组织所有者)角色,才能在 Atlas 用户界面中对全局写入集合进行分片。
Considerations
在开始此过程之前,请查看:
您可以配置 Online Archive,将 Atlas 集群中不常访问的数据转移到 MongoDB 托管的只读联合数据库实例,而不是对集合分片或升级集群层级。要了解有关 Online Archive 的更多信息,请参阅管理 Online Archive。
通过 Atlas 用户界面选择片键后,Atlas 会尝试对目标集合分片。在此期间,确保没有用户手动对集合分片。如果 Atlas 检测到目标集合的分片键与通过 Atlas 用户界面选择的键不同,则 Atlas 会停止此过程,并在 Atlas 用户界面中显示针对该集合的警告。您可以单击 Unmanage Collection 来清除警告。此操作会将集合从 Atlas 管理中删除,同时保留底层集合和手动选择的分片键。
更新分片键值
从 MongoDB 4.2 开始,您可以更新文档的分片键值,除非分片键字段是不可变的 _id
字段。如需了解更多信息,请参阅更改文档的分片键值。
在 MongoDB 4.0 及更早版本中, 无法更新已启用“全局写入”的集合中现有文档的片键字段值。
步骤
对“全球集群”中的集合分片:
在 AtlasClusters 中,转到项目的 页面。
如果尚未显示,请选择包含所需项目的组织导航栏中的Organizations菜单。
如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。
如果 Clusters(数据库部署)页面尚未出现,请单击侧边栏中的 Database(数据库)。
此时会显示“集群”页面。
转到Collections 页面。
单击集群的对应 Browse Collections 按钮。
显示数据浏览器。
展开 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 全球集群分片引用。
配置集合后,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“全局写入”需要组合分片键,以便促进分片数据在整个集群中有效分布。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.0 及更高版本的 Atlas 集群。
如果执行了以下操作之一, Atlas 会散列片键的第二个字段来实现分片数据平均分布:
通过在 Atlas 用户界面中选择 Use hashed index as the shard key(使用哈希索引作为分片键),来启用哈希索引分片键。
通过 API 设置
isCustomShardKeyHashed
。
您可以选择是否为空或不存在的集合执行初始数据段创建和分布。 该操作 基于已定义的集合区域和区域范围。 为此,请执行以下操作之一:
在 Atlas 用户界面中选择 Pre-split data for even distribution(对数据进行预拆分以实现均匀分布)。
使用 API 设置
presplitHashedZone
。
使用组合哈希分片键为 Global Clusters 创建分片集合时,Atlas 会为每个位置代码创建至少 1 个数据块,并尝试在集群中的各个分片之间均匀分布这些数据块。
使用 Atlas 用户界面或通过 API 设置 numInitialChunks
参数对带有哈希分片键的空集合分片时,还可以指定初始创建数据块的最小数量。
注意
如果指定了每个分片的数据段数量,Atlas 至少会创建 您指定的最小数据段数量,每个位置代码的数据段数量相同。 如果指定了 最小数据段数量,Atlas 会快速设置分区分片, 尤其是在分片前已经知道如何在地理上分布数据的情况下。
Error Handling
如果 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 只保证对符合对用于全局写入的集合分片中定义的标准的插入文档实施这种行为。具体来说,MongoDB 可以将 location
字段不符合 ISO-3166-1 alpha 2 或 ISO-3166-2 的文档路由到集群中的任何分片。
全球集群读取操作
MongoDB 查询路由取决于读取操作是否包含完整的分片键,以及 location
值是否对应受支持的 ISO-3166-1 alpha 2 国家代码("US"
、"DE"
、"IN"
)或受支持的 ISO-3166-2 细分代码("US-DC"
、"DE-BE"
、"IN-DL"
)。
对于包含完整分片键且其
location
值符合“全局写入”要求的查询,MongoDB 会将读取操作定向至映射到查询中指定的一个或多个location
值的区域。对于不包含
location
值的读取操作,或者如果location
值与受支持的 ISO-3166-1 alpha 2 国家代码或 ISO-3166-2 细分代码不对应,MongoDB 必须将读取操作传播至集群中的每个区域。对于在地理位置较远的区域具有 Read-only(只读)节点的“全局写入”区域,这些区域中的客户端可以在查询中指定完整的分片键,并通过一个读取偏好
nearest
发出读取操作,以查询相应区域的本地 Read-only(只读)节点。
重要
辅助读取可能会返回过时数据, 具体取决于辅助节点和主节点之间的复制延迟程度。
要了解更多信息,请参阅 MongoDB 读取偏好和 MongoDB 查询路由。
无需全局写入即可对集合进行分片
“全局写入”集群支持与标准 Atlas 分片集群相同的“范围和哈希”分片策略。对于分片键和文档模式不支持“全局写入”的分片集合,MongoDB 会根据所选的分片键,将分片数据平均分配到集群中的可用分片上。对于无法利用“全局写入”功能的数据,可考虑使用单独的分片集群。
分片后无法修改集合以支持“全局写入”。 我们建议您选择片键, 以便将来在某个集合中使用“全局写入”功能。
全局写入集群中的未分片集合
全球集群与标准 Atlas 分片集群一样,支持非分片集合。对于集群中的每个数据库,MongoDB 会将其非分片集合存储在主分片上。请使用 mongosh
中的 sh.status()
来确定数据库的主分片。