要删除碎片,你必须确保碎片的数据迁移到集群中的其他碎片。此过程描述了如何安全地迁移数据以及如何删除分片。
当您在块分布不均匀的集群中删除一个分片时,平衡器首先从排水分片中删除这些块,然后平衡其余的不均匀块分布。
此过程描述了如何安全地删除单个碎片。不要 使用此过程将整个群集迁移到新硬件。要将整个分片迁移到新硬件,请像将其作为独立副本集那样迁移各个分片。
要删除碎片,请首先mongos
使用mongo
shell 连接到集群的一个
实例。然后使用本文档中的任务序列从集群中删除分片。
要成功地从分片迁移数据,必须启用平衡器进程
。使用外壳中的助手检查平衡器状态
。有关更多信息,请参见关于平衡器操作的部分。sh.getBalancerState()
mongo
要确定分片的名称,请mongos
使用mongo
外壳连接到实例,并使用以下任一方法:
使用listShards
命令,如下所示:
该shards._id
字段列出了每个分片的名称。
在admin
数据库中,运行removeShard
命令。这开始将要删除的分片中的大块“排放”到集群中的其他分片中。例如,对于名为的碎片mongodb0
,运行:
mongos
转换
写入关注的的
removeShard
命令"majority"
。
该操作返回以下响应:
平衡器开始将大块从已命名的碎片迁移mongodb0
到集群中的其他碎片。这些迁移的速度很慢,以避免对整个群集造成不必要的负载。根据您的网络容量和数据量,此操作可能需要几分钟到几天才能完成。
注意
输出包括dbsToMove
指示字段(如果有)的数据库,该数据库的分片是主分片。在所有碎片都从分片中耗尽后,您必须movePrimary
为数据库添加一个数据库,或者删除数据库(删除关联的数据文件)。
要在过程的任何阶段检查迁移进度,请再次removeShard
从admin
数据库运行
。例如,对于名为的碎片mongodb0
,运行:
mongos
转换
写入关注的的
removeShard
命令"majority"
。
该命令返回的输出类似于以下内容:
在输出中,该remaining
字段包括以下字段:
chunks |
当前保留在分片上的块总数。 |
dbs |
主分片为分片的数据库总数。这些数据库在dbsToMove 输出字段中指定。 |
jumboChunks |
在总数中 如果 从4.2.2(和4.0.14)开始可用 |
继续检查removeShard
命令的状态,直到剩余的块数为0
。
如果该分片是集群中一个或多个数据库的主分片,则必须使该数据库使用其他分片作为其主分片。在命令输出removeShard
的dbsToMove
字段中列出您需要移动的所有数据库。如果该分片不是任何数据库的主要分片,请跳至下一个任务“
完成迁移”。
警告
排完碎片之前,请勿执行此过程。
要将数据库移动到另一个分片,请使用movePrimary
命令。
重要
为了确保平滑迁移,请参阅考虑中movePrimary
命令文档运行前movePrimary
。
要将fizz
数据库从
迁移mongodb0
到mongodb1
,请发出以下命令:
mongos
对...使用"majority"
关注
movePrimary
。
直到MongoDB完成所有数据移动后,此命令才会返回。该命令的响应类似于以下内容:
警告
如果使用movePrimary
命令移动
未分片的集合,则必须:
mongos
实例和所有分片
mongod
成员(包括辅助成员);flushRouterConfig
在所有mongos
实例和所有分片mongod
成员(包括辅助成员)上使用命令
。否则,您可能会丢失读取数据,并且可能不会将数据写入正确的分片。要恢复,您必须手动进行干预。
如果使用movePrimary
命令移动
未分片的集合,则必须:
mongos
实例;flushRouterConfig
在所有mongos
实例上使用该命令
。否则,您可能会丢失读取数据,并且可能不会将数据写入正确的分片。要恢复,您必须手动进行干预。
要清理所有元数据信息并完成删除操作,请removeShard
再次运行
。例如,对于名为的碎片
mongodb0
,运行:
mongos
转换
写入关注的的
removeShard
命令"majority"
。
成功消息显示在完成时:
一旦state
字段的值“完成”,您就可以安全地停止包含分片的实例mongodb0
。