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的碎片迁移到集群中的其他碎片。为了避免在群集上施加不必要的负载,这些迁移的速度很慢。由于bristol01fizzbuzz数据库的主要分片,因此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)
}