取消分片集合
您可以使用以下命令取消分片集合:unshardCollection
命令。当你取消分片一个集合时,该集合不能跨多个 分片 分区,并且会移除 分片键。
默认情况下,当你取消分片一个集合时,MongoDB 会将集合的数据移动到数据量最少的那片分片。或者,你也可以指定将数据放置在哪个分片上。
关于此任务
兼容性
您可以在以下环境中执行此任务
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
注意
此任务在 Atlas 共享层或 Atlas 无服务器上不可用。
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" } } ] )
如果聚合操作不返回任何数据,则集合已解除分区。