removeShard
定义
removeShard
从分片集群中删除分片片。 当您运行
removeShard
时, MongoDB通过使用分片负载均衡器将分片的数据段移动到集群中的其他分片来清空分片。 一旦分片被MongoDB分片分片集群中删除分片。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 个10以上的集群或无服务器实例不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.adminCommand( { removeShard : <shardToRemove> } )
行为
在分片删除期间没有集群备份
在删除分片期间无法备份集群数据。
并发removeShard
操作
您可以有多个正在进行的removeShard
操作。
访问要求
如果已启用authorization
,则必须具有clusterManager
角色或任何包含removeShard
操作的角色。
数据库迁移要求
分分片集群中的每个数据库都有一个主分片。 如果要删除的分片也是集群数据库的主节点 (primary node in the replica set)分片,则必须在迁移该分片的所有数据后,手动将数据库移动到新分片分片。 有关更多信息,请参阅movePrimary
命令和从分片集群中删除分片。
数据块均衡
当您从集群中删除数据段分布不均匀的分片时,负载均衡器首先从要清空的分片中删除数据段,然后均衡剩余的不均匀数据段分布。
写关注
Change Streams
删除分分片可能会导致打开的变更流游标关闭,并且关闭的变更流游标可能无法完全恢复。
DDL 操作
如果您在集群执行 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
字段包括以下字段:
字段 | 说明 |
---|---|
| 分片当前剩余的数据段总数。 |
| 主分片是分片的数据库总数。这些数据库在 |
| 在 如果 清除 |
继续检查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") } } }