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