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

removeShard

在此页面上

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

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

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

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

重要

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

要运行,请从mongos实例对admin数据库发出命令:

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

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

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

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

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

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

提示

另请参阅:

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

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

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主分片的数据库。在所有数据块从分片中耗尽后,您必须对数据库执行movePrimary,或者选择删除这些数据库。

注意

如果要删除的分片不是任何数据库的主分片,则dbsToMove数组将为空, removeShard可以在无需干预的情况下完成迁移。

如果再次运行该命令, 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