文档菜单
文档首页
/
MongoDB 手册
/ / /

removeShard

本页内容

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 示例
removeShard

分片集群中移除一个分片。当运行removeShard时,MongoDB通过使用均衡器将分片的块移动到集群中的其他分片来清理该分片。一旦分片被清理,MongoDB将移除该分片。

此命令在以下环境中提供的托管部署中可用

  • MongoDB Atlas:MongoDB在云中部署的全托管服务

重要

此命令不支持M10+集群或无服务器实例。有关更多信息,请参阅不受支持的命令。

该命令的语法如下

db.adminCommand(
{
removeShard : <shardToRemove>
}
)

在移除分片期间无法备份数据集群。

可以同时进行多个 removeShard 操作。

如果您启用了 authorization,您必须具有 clusterManager 角色,或者任何包含 removeShard 动作的权限。

在一个分片集群中,每个数据库都有一个主分片。如果你想要移除的分片也是集群中某个数据库的主分片,那么在将分片的所有数据迁移到新分片后,你必须手动将数据库移动到新分片。有关更多信息,请参阅 movePrimary 命令和从分片集群中移除分片

当你从一个块分布不均的集群中移除分片时,平衡器首先从正在排空的分片中移除块,然后平衡剩余的不均匀块分布。

提示

另请参阅

mongos写入关注removeShard 命令转换为 "majority".

移除分片可能会导致打开的 更改流游标 关闭,关闭的更改流游标可能无法完全恢复。

如果在您的集群执行DDL操作(如reshardCollection)时运行removeShard,则removeShard只有在并发DDL操作完成后才会执行。

mongoshremoveShard操作类似于以下内容

db.adminCommand( { removeShard : "bristol01" } )

bristol01替换为您要删除的分片的名称。运行removeShard时,命令返回类似以下的消息

{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "bristol01",
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575398919, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575398919, 2),
"signature" : {
"hash" : BinData(0,"Oi68poWCFCA7b9kyhIcg+TzaGiA="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

均衡器开始将名为bristol01的分片上的数据块迁移(“排空”)到集群中的其他分片。这些迁移缓慢进行,以避免对集群造成不适当的负载。

输出包括表示bristol01主分片的数据库的dbsToMove字段。在均衡器迁移所有数据块,并且所有集合通过moveCollection移动后,您必须为数据库(们)执行movePrimary

如果再次运行该命令,removeShard将返回该过程的当前状态。例如,如果操作处于ongoing状态,则命令返回类似以下内容的输出

{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(2),
"dbs" : NumberLong(2),
"jumboChunks" : NumberLong(0)
},
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575399086, 1655),
"$clusterTime" : {
"clusterTime" : Timestamp(1575399086, 1655),
"signature" : {
"hash" : BinData(0,"XBrTmjMMe82fUtVLRm13GBVtRE8="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

在输出中,remaining字段包含以下字段

字段
描述
数据块
当前在分片上剩余的数据块总数。
数据库
其主分片是此分片的数据库总数。这些数据库在 dbsToMove 输出字段中指定。
大块数据

在所有数据块中,那些是 大块数据 的数量。

如果 大块数据 的数量大于 0,等待直到只有 大块数据 剩余在分片上。一旦只有大块数据剩余,您必须在排空完成之前手动清除大块标志。请参阅 清除 大块 标志。

清除 大块 标志后,均衡器可以迁移这些数据块。有关迁移过程的详细信息,请参阅 范围迁移过程。

继续检查 removeShard 命令的状态(即重新运行该命令),直到剩余的数据块数量为 0

{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(0), // All chunks have moved
"dbs" : NumberLong(2),
"jumboChunks" : NumberLong(0)
},
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"operationTime" : Timestamp(1575400343, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400343, 1),
"signature" : {
"hash" : BinData(0,"9plu5B/hw4uWAgEmjjBP3syw1Zk="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

在所有数据块都从分片上排空后,如果您有 dbsToMove,您可以对这些数据库执行 movePrimary 或者,也可以删除数据库(这将删除相关数据文件)。

均衡器完成将所有数据块从分片上移除,并处理完 dbsToMove 后,removeShard 可以完成。再次运行 removeShard 会返回类似以下输出的结果

{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "bristol01",
"ok" : 1,
"operationTime" : Timestamp(1575400370, 2),
"$clusterTime" : {
"clusterTime" : Timestamp(1575400370, 2),
"signature" : {
"hash" : BinData(0,"JjSRciHECXDBXo0e5nJv9mdRG8M="),
"keyId" : NumberLong("6766255701040824328")
}
}
}

返回

refineCollectionShardKey