删除不可访问的Mongo碎片

问题描述 投票:6回答:3

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

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

有什么方法可以让Mongo知道我现在不关心该碎片,然后在可用时稍后重新启用它。

mongodb sharding
3个回答
3
投票

手动修改配置数据库中的分片条目,然后单击removeshard


9
投票

我有一个不同的问题,我用以下方法手动删除了分片:

use config
db.shards.remove({"_id":"shard0002"});

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()时会收到错误Collection'db.collection'未分片。

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

  • 关闭分片群集中的所有mongod和mongos
  • 将可用分片作为独立服务启动(请参见Perform Maintenance on Replica Set Members
  • 使用mongodump从可用的碎片中备份。
  • 从所有主机删除数据文件夹。
  • 从头开始重新构建您的应用程序。启动所有mongod和mongos
  • 使用mongorestore将数据加载到新集群中>
  • 也许对于大型集群,您必须像这样进行随机播放:

  • [使用一个空分片部署Config服务器和mongos服务器
    1. 以独立方式启动一个旧分片
    2. 从此旧碎片中获取备份
    3. 拆下这个旧碎片
    4. 建立一个空的新碎片
    5. 向新集群添加新分片
    6. 将数据恢复到新集群中
    7. 可以删除备份,并且可以在新集群中重用分片
  • 对群集中的每个分片重复以上操作(可能会跳过损坏的分片)
© www.soinside.com 2019 - 2024. All rights reserved.