我有一个带有3个分片的MongoDB分片设置:shard0000,shard0001和shard0002。现在运行shard0002的计算机已关闭,这导致我的所有查询均失败。我想从设置中暂时删除shard0002,并继续使用前两个分片。假设我只使用位于前两个分片中的未分片集合,那应该可行,对吗?
我首先尝试的是:db.runCommand({removeshard: 'IP:PORT'})
显然没有帮助,因为它只是将分片置于排空模式,该模式永远不会结束(因为它已关闭)。然后,我尝试连接到配置服务器,并在配置数据库上进行了db.shards.remove({_id: 'shard0002'})
,然后重新启动mongos,以便它重新加载配置。现在,无论何时我尝试做任何事情,我都会得到“找不到碎片:shard0002”。
有什么方法可以让Mongo知道我现在不关心该碎片,然后在可用时稍后重新启用它。
手动修改配置数据库中的分片条目,然后单击removeshard
我有一个不同的问题,我用以下方法手动删除了分片:
use config
db.shards.remove({"_id":"shard0002"});
我在4.2版中尝试了几种方法来做到这一点。
最后,我结束了要在Config Server上执行的这些命令:
use config
db.databases.updateMany( {primary: "shard0002"}, {$set: {primary: "shard0000"} })
db.shards.deleteOne({_id : "shard0002" })
db.chunks.updateMany( {shard : "shard0002"}, {$set: {shard: "shard0000"} })
while ( db.chunks.updateMany( {"history.shard" : "shard0002"},
{$set: {"history.$.shard": "shard0000"} }).modifiedCount > 0 ) { print("Updated") }
它在一定程度上有效,但是当您运行getShardDistribution()
时会收到错误Collection'db.collection'未分片。
最后我只看到一种可靠和安全解决方案:
mongodump
从可用的碎片中备份。 mongorestore
将数据加载到新集群中>也许对于大型集群,您必须像这样进行随机播放: