mongodb - 定期回收磁盘空间,无需停机

时间:2014-06-09 17:49:33

标签: mongodb

我们有1个主要副本,1个次要副本和1个仲裁者。我们经常删除集合,因此我正在寻找一种快速方法来回收已删除集合使用的磁盘空间而不会出现停机,当前数据库大小接近3TB。 我一直在研究各种方法,有两种常见方法:

  1. repairDatabase():需要等于已用空间大小的可用空间才能运行,它将主要脱机,然后在辅助节点上启动初始同步,这是一个非常漫长的过程,在此期间只有在repairDatabase期间,一个节点可用于辅助节点,在初始同步期间可以读取/写入。

  2. 在新节点上运行初始同步,然后声明为主节点并退出旧节点。重复该过程以进行辅助。使用此选项,主要和辅助都可用,但过程非常漫长,并且需要将近1周的时间来运行初始同步两次。

  3. 是否有更好的解决方案来定期回收磁盘空间,并且比上述解决方案相对更快。

    请注意,每个集合都可能被删除。

    谢谢

2 个答案:

答案 0 :(得分:1)

除非你设计你的数据库结构以将不同的集合保存在不同的数据库中,否则没有简单的方法来实现这一点,这反过来意味着只要你拥有{{{}就可以将它们存储在硬盘的不同路径中。 1}}在mongo.conf中设置为true。这是一种解决方法,根据您的应用程序,它可能不实用。

虽然放弃一个收藏品不会释放hdd空间是真的,但它所使用的空间并没有丢失也是如此。它最终会被重新用于新的系列。

话虽这么说,除非你真的缺乏空间,否则不要回忆那个空间。定期执行此操作的CPU和I / O成本远远高于我所知道的每个提供商的存储容量成本。

答案 1 :(得分:1)

我将看一下使用MongoDB的分片功能来解决您的一些问题。引用文档:

  

Sharding是一种跨多台计算机存储数据的方法。   MongoDB使用分片来支持具有非常大的数据集的部署   和高吞吐量的操作。

虽然通常使用分片来平衡更多服务器上的大型集合,以避免热点并分散整体负载,但它对于管理大型集合的存储也很有用。在您的具体情况下,我将研究使用分片标记将集合固定到特定分片。

再次,引用文档,分片标记对

很有用
  

隔离特定碎片集上的特定数据子集。

例如,假设您将生产环境拆分为几个分片,shard1和shard2。您可以使用分片标记和分片工具将经常删除的集合固定到shard2上。在这个用例中,shard1包含所有正常集合。然后,当您选择通过第二个选项回收磁盘存储时,您只能在具有已删除集合的分片上执行此操作 - 这样您就可以避免重新创建更多静态数据。它应该以这种方式运行得更快(在任何给定时间,删除的集合分片中的数据量的函数要快得多)。

它还具有第二个好处,即每个分片(实际上每个分片中的副本集)需要较小的服务器,因为它们只包含整个数据的子集。

最佳方法的具体细节将取决于您的确切用例 - 集合的数量和大小,插入,更新,查询和删除频率等。我描述了一个简单的2个分片案例但你可以这样做有更多的碎片。对于具有更多事务量的集合,您还可以在更高性能的硬件上运行一些分片。

除了指出正确的方向进行调查之外,我无法在有限的空间内实现正义。 MongoDB在他们的文档中有很多很好的信息,他们的2个在线DBA课程(免费)会详细介绍。

一些有用的链接:

http://docs.mongodb.org/manual/core/sharding-introduction/

http://docs.mongodb.org/manual/core/tag-aware-sharding/