Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

removeShard

在此页面上

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

分片集群中删除分片片。 当您运行 removeShard时, MongoDB通过使用分片负载均衡器将分片的数据段移动到集群中的其他分片来清空分片。 一旦分片被MongoDB分片分片集群中删除分片。

此命令可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

重要

M 个10以上的集群或无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

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

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

您可以有多个正在进行的removeShard操作。

如果已启用authorization ,则必须具有clusterManager角色或任何包含removeShard操作的角色。

分分片集群中的每个数据库都有一个主分片。 如果要删除的分片也是集群数据库的主节点 (primary node in the replica set)分片,则必须在迁移该分片的所有数据后,手动将数据库移动到新分片分片。 有关更多信息,请参阅movePrimary命令和从分片集群中删除分片

当您从集群中删除数据段分布不均匀的分片时,负载均衡器首先从要清空的分片中删除数据段,然后均衡剩余的不均匀数据段分布。

提示

另请参阅:

mongos将 命令的 removeShard写关注 转换为"majority"

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

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

mongosh开始, removeShard操作类似于以下内容:

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的分片迁移(“排干”)到集群中的其他分片。这些迁移缓慢进行,以避免对集群造成过度负载。

输出包含dbsToMove字段,该字段指示以bristol01主分片分片的数据库。 在负载均衡器移动所有数据段并将所有集合移动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 字段包括以下字段:

字段
说明

chunks

分片当前剩余的数据段总数。

dbs

主分片是分片的数据库总数。这些数据库在 dbsToMove 输出字段中指定。

jumboChunks

chunks的总数中,该数字是巨型数据。

如果jumboChunks大于 0,则等到分片上只剩下jumboChunks 。 一旦只剩下巨型块,您必须手动清除巨型标志,然后才能完成排干。请参阅清除jumbo标志。

清除 jumbo 标记后,负载均衡器可以迁移这些数据段。有关迁移过程的详细信息,请参阅范围迁移过程

继续检查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