定义
commitShardRemoval从分片集群中删除分片。
要运行此命令,您必须首先使用
startShardDraining命令清空分片。此命令指示负载均衡器将数据段从该分片移动到集群中的其他分片。在运行commitShardRemoval命令之前,还必须手动移动使用该分片作为主分片的任何数据库以及存储在该分片上的未分片集合。如果分片未完全清空或者包含数据库或未分片的集合,则该命令将返回错误。如果分片已清空,并且所有数据库和未分片集合均已迁移出分片,则该命令将返回
ok。要开始排干分片,请参阅
startShardDraining命令。要检查排干分片的状态,请参阅
shardDrainingStatus命令。要停止排干分片,请参阅
stopShardDraining命令。8.3版本新增。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
注意
MongoDB Atlas不支持此命令。请参阅修改Atlas分片集群以在Atlas 集群中添加或删除分片。
语法
该命令具有以下语法:
db.adminCommand( { commitShardRemoval: <shard> } )
行为
访问要求
如果已启用authorization ,则必须具有clusterManager角色或任何包含removeShard操作的角色。
数据库迁移要求
分片集群中的每个数据库都有一个主分片。如果您要排空的分片也是集群数据库之一的主节点 (primary node in the replica set),则在迁移分片的所有数据后,您必须手动将数据库从其主分片移动到新分片。
如果存在一个数据库将您要用主节点 (primary node in the replica set)的分片,则 commitShardRemoval 命令会返回错误。
有关详细信息,请参阅movePrimary 命令和从分片集群中删除分片以了解更多信息。
集合迁移要求
未分片集合存储在单个分片上。如果其中一个集合位于要删除的分片上,则必须先将该集合迁移到其他分片。
如果要删除的分片上存储有未分片集合,则 commitShardRemoval 命令会返回错误。
要迁移未分片集合,请参阅moveCollection 命令。
示例
要开始排干分片,请使用db.adminCommand() 方法运行startShardDraining 命令:
db.adminCommand( { startShardDraining: "shard04" } )
要检查排干操作的状态,请使用shardDrainingStatus 命令:
db.adminCommand( { shardDrainingStatus: "shard04" } )
{ "msg" : "draining completed successfully", "state" : "drainingComplete", "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771839836, 139), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771839836, 139) }
如果输出在dbsToMove 字段中显示任何数据库,请使用movePrimary 命令将它们移动到不同的分片上。
如果输出在 字段中显示任何未分片的集合,请使用collectionsToMove moveCollection命令将它们移动到其他分片上。
当shardDrainingStatus 显示{ state:
"drainingComplete" } 时,则负载均衡器已完成从分片的操作。您现在可以删除分片:
db.adminCommand( { commitShardRemoval: "shard04" } )
{ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1771840037, 12), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1771840037, 12) }