removeShard
定义
removeShard
从分片集群中移除一个分片。当运行
removeShard
时,MongoDB通过使用均衡器将分片的块移动到集群中的其他分片来清理该分片。一旦分片被清理,MongoDB将移除该分片。
兼容性
此命令在以下环境中提供的托管部署中可用
MongoDB Atlas:MongoDB在云中部署的全托管服务
重要
此命令不支持M10+集群或无服务器实例。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:MongoDB的基于订阅的自托管版本
MongoDB Community:MongoDB的开源、免费使用和自管理的版本
语法
该命令的语法如下
db.adminCommand( { removeShard : <shardToRemove> } )
行为
移除分片时无集群备份
在移除分片期间无法备份数据集群。
并发 removeShard
操作
可以同时进行多个 removeShard
操作。
访问要求
如果您启用了 authorization
,您必须具有 clusterManager
角色,或者任何包含 removeShard
动作的权限。
数据库迁移要求
在一个分片集群中,每个数据库都有一个主分片。如果你想要移除的分片也是集群中某个数据库的主分片,那么在将分片的所有数据迁移到新分片后,你必须手动将数据库移动到新分片。有关更多信息,请参阅 movePrimary
命令和从分片集群中移除分片。
块平衡
当你从一个块分布不均的集群中移除分片时,平衡器首先从正在排空的分片中移除块,然后平衡剩余的不均匀块分布。
写入关注
mongos
将 写入关注 的 removeShard
命令转换为 "majority"
.
更改流
移除分片可能会导致打开的 更改流游标 关闭,关闭的更改流游标可能无法完全恢复。
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
的分片上的数据块迁移(“排空”)到集群中的其他分片。这些迁移缓慢进行,以避免对集群造成不适当的负载。
输出包括表示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 输出字段中指定。 |
大块数据 |
继续检查 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") } } }