OPTIONS
翻译或纠错本页面

从集群中删除分片

要删除一个 shard ,必须确定这个分片的数据已经被迁移到了集群中的其他分片中.这篇教程描述了如何安全地迁移数据和删除分片.

这篇教程描述的是如何安全地删除 一个 分片, 不要 使用这篇教程迁移一整个集群到新系统中.要想将整个集群迁移到一个新的系统,需要挨个迁移每个分片.

要想删除一个分片,需要首先使用 mongo 终端连接到 mongos ,并使用这篇文档中的一系列任务完成删除工作:

确认均衡器是开启的

为了使得数据迁移能够成功, balancer 必须 是开启的.在 mongo 终端中使用 sh.getBalancerState() 确定这一点.参见 均衡器选项 以获得更多信息.

确定要删除的分片的名字

要确定删除分片的名字,使用 mongo 终端连接到 mongos 或者:

shards._id 字段列出了每个分片的名字.

从分片中迁移数据块

admin 数据库中,运行 removeShard 命令.运行之后会开始将这个分片的数据块”转移”到其他分片的过程,比如,对一个命名为 mongodb0 的分片,运行:

use admin
db.runCommand( { removeShard: "mongodb0" } )

这个操作是立刻返回的,返回为:

{
    "msg" : "draining started successfully",
    "state" : "started",
    "shard" : "mongodb0",
    "ok" : 1
}

取决于网络状况与数据量大小,这个操作需要花费十几分钟到几天的时间来完成:

检查迁移的状态

检查迁移的状态,再次在 admin 数据库运行 removeShard 命令,比如,对一个命名为 mongodb0 的分片,运行:

use admin
db.runCommand( { removeShard: "mongodb0" } )

这条命令返回类似如下的输出:

{
     "msg" : "draining ongoing",
    "state" : "ongoing",
    "remaining" : {
        "chunks" : 42,
        "dbs" : 1
    },
    "ok" : 1
}

在输出结果中, remaining 文档显示的是MongoDB必须迁移到其他分片的数据块中剩余的数据块数量与”primary”在这个分片的数据库数量.

remaining 字段变为0之前,持续运行 removeShard 命令检查状态.这个命令需要在 admin 数据库上运行,在其他库可以使用 sh._adminCommand 命令操作.

迁移没有分片的数据

如果这个分片是一个或多个数据库的 primary shard ,上面会存储没有分片的数据,如果不是,则跳过 完成迁移 任务.

在集群中,没有分片的数据库只会将数据存放在一个分片上,这个分片就是这个数据库的主分片.(不同的数据库可以有不同的主分片.)

警告

在将分片上其他数据迁移走之前,不要执行这个过程.

  1. 使用以下命令确认这个分片是不是集群中某些数据库的主分片:

    在返回的文档中, databases 字段列出了所有数据库和它的主分片.比如,以下的 databases 字段显示了 products 数据库使用 mongodb0 作为主分片.

    {  "_id" : "products",  "partitioned" : true,  "primary" : "mongodb0" }
    
  2. 将数据库迁移到另一个分片,需要使用 movePrimary 命令.使用如下命令将所有的剩余的未分片的数据从 mongodb0 迁移到 mongodb1 上.

    db.runCommand( { movePrimary: "products", to: "mongodb1" })
    

    这个命令直到全部数据迁移完成才会返回,可能会花费较长时间.最后返回的结果类似这样:

    { "primary" : "mongodb1", "ok" : 1 }
    

完成迁移

为了清除所有的元信息,并结束删除分片的过程,再次执行 removeShard , 比如,对 mongodb0 这个分片,执行:

use admin
db.runCommand( { removeShard: "mongodb0" } )

在完成时会显示出成功的信息:

{
    "msg" : "removeshard completed successfully",
    "state" : "completed",
    "shard" : "mongodb0",
    "ok" : 1
}

一旦 state 的值变为 “completed”,就可以安全地停止 mongodb0` 分片上的monod进程.