删除无法访问的Mongo分片

时间:2010-10-05 05:29:49

标签: mongodb sharding

我有一个带有3个分片的MongoDB分片设置:shard0000,shard0001和shard0002。运行shard0002的计算机现在已关闭,这会导致我的所有查询都失败。我想暂时从我的设置中删除shard0002并继续使用前两个分片。这应该是可行的,假设我只使用驻留在前两个分片中的未整数集合,对吗?

我首先尝试的是:db.runCommand({removeshard: 'IP:PORT'})显然没有帮助,因为它只是将碎片置于排水模式,这将永远不会结束(因为它已经关闭)。然后我尝试连接到我的配置服务器并在配置数据库上执行db.shards.remove({_id: 'shard0002'})然后重新启动mongos,以便重新加载配置。现在每当我尝试做任何事情时,我都会“找不到碎片:shard0002”。

有没有办法让Mongo知道我现在不关心那个碎片,然后在它变得可用时重新启用它。

3 个答案:

答案 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'进行分片。

最后,我只看到一种可靠且安全的解决方案:

  • 关闭分片群集中的所有mongod和mongos
  • 将可用分片作为独立服务启动(请参见Perform Maintenance on Replica Set Members
  • 使用mongodump从可用分片中备份。
  • 从所有主机上删除数据文件夹。
  • 从头开始重新构建您的应用程序。启动所有mongod和mongos
  • 使用mongorestore
  • 将数据加载到新集群中

也许对于大型集群,您必须像这样洗牌:

  • 使用一个空分片部署Config服务器和mongos服务器
    1. 以独立方式启动一个旧分片
    2. 从此旧碎片中获取备份
    3. 拆除旧碎片
    4. 构建一个空的新碎片
    5. 将新的分片添加到您的新集群
    6. 将数据还原到新集群中
    7. 可以删除备份,并且可以在新群集中重新使用分片
  • 对集群中的每个分片重复以上操作(可能会跳过损坏的分片)