On this page
removeShard
在本页面
removeShard
- 从sharded cluster移除碎片。当您运行removeShard时,MongoDB 通过使用平衡器将分片的块移动到集群中的其他分片来耗尽分片。一旦分片耗尽,MongoDB 就会从集群中删除分片。
要运行removeShard
,请使用db.runCommand( { <command> })方法。
Behavior
您一次只能删除一个分片。如果现有的removeShard操作正在进行中,则removeShard返回错误。
Access Requirements
您必须在连接到mongos的同时运行removeShard。对admin
数据库发出命令或使用sh._adminCommand()
帮助器。
如果启用了authorization,则必须具有clusterManager角色或包含removeShard操作的任何角色。
数据库迁移要求
分片群集中的每个数据库都有一个主分片。如果要删除的分片也是集群数据库之一的主数据库,则在从该分片迁移所有数据之后,必须手动将数据库移至新的分片。有关更多信息,请参见movePrimary命令和从现有分片群集中删除分片。
Chunk Balancing
当您在块分布不均匀的群集中删除一个分片时,平衡器首先从排水分片中删除这些块,然后平衡其余的不均匀块分布。
Change Streams
碎片删除可能会导致打开的更改流光标关闭,并且关闭的变更流游标可能无法完全恢复。
Example
在mongo shell 中,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,
"$clusterTime" : {
"clusterTime" : Timestamp(1510716515, 1),
"signature" : {
"hash" : BinData(0,"B2ViX7XLzFLS5Fl9XEuFXbwKIM4="),
"keyId" : NumberLong("6488045157173166092")
}
},
"operationTime" : Timestamp(1510716515, 1)
}
平衡器开始将大块从名为bristol01
的碎片迁移到集群中的其他碎片。为了避免在群集上施加不必要的负载,这些迁移的速度很慢。由于bristol01
是fizz
和buzz
数据库的主要分片,因此removeShard注意必须使用movePrimary命令将这些数据库移动到另一个分片。或者,您可以使用dropDatabase删除数据库并删除其关联的数据文件。
Note
如果要删除的分片不是任何数据库的主分片,则dbsToMove
数组将为空,并且removeShard无需干预即可完成迁移。
如果再次运行该命令,removeShard将返回类似于以下内容的输出:
{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(2),
"dbs" : NumberLong(2)
},
"note" : "you need to drop or movePrimary these databases",
"dbsToMove" : [
"fizz",
"buzz"
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1510716515, 1),
"signature" : {
"hash" : BinData(0,"B2ViX7XLzFLS5Fl9XEuFXbwKIM4="),
"keyId" : NumberLong("6488045157173166092")
}
},
"operationTime" : Timestamp(1510716515, 1)
}
remaining
document指定在分片上剩余多少块和数据库。使用movePrimary命令将dbsToMove
中列出的每个数据库移动到另一个分片。或者,使用dropDatabase删除数据库。
当平衡器完成将所有块移出分片并且您已经移动或删除了dbsToMove
中列出的任何数据库时,再次运行removeShard将返回类似于以下内容的输出:
{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "bristol01",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1510716515, 1),
"signature" : {
"hash" : BinData(0,"B2ViX7XLzFLS5Fl9XEuFXbwKIM4="),
"keyId" : NumberLong("6488045157173166092")
}
},
"operationTime" : Timestamp(1510716515, 1)
}