我有一个带有3个分片的MongoDB分片设置:shard0000,shard0001和shard0002。运行shard0002的计算机现在已关闭,这会导致我的所有查询都失败。我想暂时从我的设置中删除shard0002并继续使用前两个分片。这应该是可行的,假设我只使用驻留在前两个分片中的未整数集合,对吗?
我首先尝试的是:db.runCommand({removeshard: 'IP:PORT'})
显然没有帮助,因为它只是将碎片置于排水模式,这将永远不会结束(因为它已经关闭)。然后我尝试连接到我的配置服务器并在配置数据库上执行db.shards.remove({_id: 'shard0002'})
然后重新启动mongos,以便重新加载配置。现在每当我尝试做任何事情时,我都会“找不到碎片:shard0002”。
有没有办法让Mongo知道我现在不关心那个碎片,然后在它变得可用时重新启用它。
答案 0 :(得分:5)
我有一个不同的问题,我手动删除了碎片:
use config
db.shards.remove({"_id":"shard0002"});
答案 1 :(得分:4)
手动修改配置数据库中的分片条目,然后removeshard
答案 2 :(得分:0)
我在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()
时,您会收到错误未对集合'db.collection'进行分片。
最后,我只看到一种可靠且安全的解决方案:
mongodump
从可用分片中备份。 mongorestore
也许对于大型集群,您必须像这样洗牌: