6

我有一个带有 3 个分片的 MongoDB 分片设置:shard0000、shard0001 和 shard0002。运行 shard0002 的机器现在宕机了,这导致我所有的查询都失败了。我想暂时从我的设置中删除 shard0002 并继续使用前两个分片。假设我只使用位于前两个分片中的非分片集合,这应该是可行的,对吧?

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

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

4

3 回答 3

12

我有一个不同的问题,我手动删除了碎片:

use config
db.shards.remove({"_id":"shard0002"});
于 2015-06-19T15:20:41.497 回答
3

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

于 2010-10-05T13:35:50.160 回答
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") }

它在一定程度上起作用,即 CRUD 操作正在起作用。但是,当您运行时,getShardDistribution()您会收到错误Collection 'db.collection' is not sharded。

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

  • 关闭分片集群中的所有 mongod 和 mongos
  • 将可用分片作为独立服务启动(请参阅对副本集成员执行维护
  • 使用 .从可用分片中进行备份mongodump
  • 从所有主机中删除数据文件夹。
  • 从头开始构建您的应用程序。启动所有 mongod 和 mongos
  • 将数据加载到新集群中mongorestore

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

  • 部署 Config 服务器和 mongos 服务器,一个空分片
    1. 独立启动一个旧分片
    2. 从这个旧碎片中备份
    3. 拆掉这个旧碎片
    4. 建立一个全新的空分片
    5. 将新分片添加到新集群
    6. 将数据恢复到新集群
    7. 可以删除备份并且可以在新集群中重用分片
  • 对集群中的每个分片重复上述操作(最有可能跳过损坏的分片)
于 2019-11-22T15:33:11.297 回答