对集合取消分片
您可以使用 unshardCollection
命令对分分片的集合取消分片。 当您对集合取消分片时,该集合无法跨多个分片分区,并且分片分片键将被删除。
默认,当您对集合取消分片时, MongoDB会将集合的数据移动到分片量最少的分片。 或者,您可以分片要放置数据的分片。
关于此任务
兼容性
您可以对以下环境中托管的部署执行此任务:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
注意
此任务在Atlas共享层或Atlas Serverless 上不可用。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
限制
unshardCollection
只能在分分片的集群上运行。unshardCollection
只能对分分片的集合进行操作。unshardCollection
一次只能对一个集合进行操作。unshardCollection
最短持续时间为5分钟。您必须在
unshardCollection
运行后重建Atlas Search索引。在
unshardCollection
完成之前,您无法进行拓扑结构更改,例如添加或删除分片或在嵌入式配置服务器和专用配置服务器之间转换。当
unshardCollection
正在进行时,您无法对正在取消分片的集合运行以下操作:unshardCollection
正在进行时,您无法对集群运行以下操作:在
unshardCollection
正在进行时进行的索引构建可能会静默失败。正在进行
unshardCollection
时,请勿创建索引。如果正在进行索引构建,请勿调用
unshardCollection
。
访问控制
如果您的部署启用了访问权限控制,则enableSharding
角色会授予您运行unshardCollection
命令的访问权限。
开始之前
在对集合取消分片之前,请确保满足以下要求:
您的应用程序可以允许受影响的集合块进行两秒钟的写入。 在写入受阻期间,应用程序的延迟会增加。
您的数据库符合这些资源要求:
确保分片集合移动到的分片具有足够的存储空间用于集合及其索引。 目标分分片需要至少
( Collection storage size + Index Size ) * 2
字节可用。确保 I/O容量低于50 %。
确保 CPU 负载低于80 %。
步骤
(可选)列出分片名称
如果要将分分片的集合中的数据放在特定分片上,则需要目标分片的名称。
要查看集群中的分分片名称列表,请使用listShards
命令:
db.adminCommand( { listShards: 1 } )
shards._id
字段列出了每个分片的名称。
对集合取消分片
要对集合取消分片,请运行unshardCollection
命令。 以下示例对sales
数据库中名为us_accounts
的集合取消分片:
db.adminCommand( { unshardCollection: "sales.us_accounts", toShard: "shard1" } )
取消分片操作完成后, us_accounts
集合中的数据位于shard1
上。 如果省略toShard
字段,则数据将放置在分片量最少的分片上。
确认集合未分片
要确认集合未分片,请使用$shardedDataDistribution
阶段并尝试在未分片的命名空间上进行匹配:
db.aggregate( [ { $shardedDataDistribution: { } }, { $match: { "ns": "sales.us_accounts" } } ] )
如果聚合未返回任何数据,则不对集合进行分片。