恢复过时的配置服务器

时间:2015-08-11 06:20:11

标签: mongodb config

我们有1个包含

的测试mongodb群集
  • 1台mongos服务器

  • 3个配置服务器

  • 6个分片

Q1。我们已尝试恢复过时的配置服务器备份。我们只能发现config.chunks的记录比以前少,但我们可以在mongodb中查询和插入/更新数据。如果我们使用过时的配置服务器备份,最糟糕的结果是什么?

Q2。是否有任何工具可以使用每个分片中的现有数据重新构建配置服务器中的丢失记录?

1 个答案:

答案 0 :(得分:0)

回答Q1

对于过时的配置服务器内容,iirc,可能会有一个未被注意到的巨大数据丢失。原因如下:

MongoDB中的分片基于关键范围。也就是说,为每个分片分配一系列它负责的分片键。

为了便于说明,我们假设您有一个从1到无穷大的整数的分片键。所以的键范围看起来像这样(不包括边界)

shard0001: -infinity to 100
shard0002: 101 - 200
shard0003: 201 - 300
shard0004: 301 - 400
shard0005: 401 - 500
shard0006: 501 - 600

那你怎么知道这个发行版?它存储在配置服务器上。现在让我们假设你的元数据已经改变,你的shard0002实际上保存了100-500的数据。假设您要使用分片键450检索文档。根据旧元数据,此文档必须位于shard0005上(如果存在)。所以查询被路由到shard0005。将完成索引查找,并且分片发现它没有文档。因此,虽然文档存在(在shard0002上),但由于过时的元数据,它将在shard0005上查找,它不存在。

回答Q2

据我所知。但是,你可以做的是对MongoDB使用以下过程< 3.0.0。

  

<强>声明

     

我没有测试过这个程序。在擦除数据目录之前确保准备好备份,并且不要省略--repair--objcheck标志   为获得最大安全性,请在使用前创建文件系统快照。   如果您不这样做,请不要因为任何数据丢失而责怪我。

  1. 正常关闭整个群集
  2. 对数据目录使用mongodump

     mongodump --repair --dbpath /path/to/your/datafiles -o /path/for/backups/mongo
    

    每个碎片都要这样做一次。

  3. 擦除所有数据目录并重新创建分片群集
  4. 连接到mongos

     sh.enableSharding({"database":yourDb})
     sh.shardCollection("yourdDb.yourShardedCollection",{"yourShardKey":1})
    
  5. 从每个分片中,使用mongorestore将备份写入mongos

     mongorestore -h mongosHost:mongosPort --db yourDb --dir /path/for/backups/ \
     --objcheck --write-concern "{w:1}"
    
  6. 请注意,您应该 NOT 并行执行还原,因为这可能会使平衡器过载。

    我们基本上做的是从各个分片中收集所有数据,在新数据库中创建一个新的分片集合,并将收集的数据放入该数据库,并使分片集合自动平衡。

    请仔细观察此过程,并确保不要使平衡器过载,否则在没有最佳分片键的情况下,碎片上的磁盘空间可能会耗尽。

    当然,您可以相应地使用mongorestore从备份中重新创建其他分片数据库。要恢复未加密的数据库,只需连接到要保存集合的复制集,而不是连接到mongos。

    旁注:

    如果您需要恢复配置服务器,只需转储其他两个中的一个并将配置数据库恢复到该服务器。

    这样做的原因是因为除非所有配置服务器都已启动,正在运行且同步,否则无法更新元数据。