我们有一个由1个主、1个辅助和1个仲裁器组成的副本集。我们经常删除集合,所以我正在寻找一种快速的方法来回收已删除集合使用的磁盘空间,而不会停机,目前的数据库大小接近3TB。我一直在研究各种方法来做到这一点,2种常见的方法是:
>
修复数据库():它需要可用空间等于已用空间的大小才能运行,它将使主服务器脱机,然后在辅助服务器上启动初始同步,这是一个非常漫长的过程,在此过程中,只有一个节点可用于在修复数据库期间从辅助服务器读取,并在初始同步期间读取/写入。
在新节点上运行初始同步,然后声明为主节点并停用旧节点。对辅助节点重复该过程。使用此选项,主节点和辅助节点都可用,但过程非常漫长,需要近1周的时间才能运行两次初始同步。
是否有更好的解决方案可以定期回收磁盘空间,并且比上述解决方案相对更快。
请注意,每个集合都可能被删除。
谢啦
没有简单的方法可以实现这一点,除非您设计DB结构以将不同的集合保存在不同的数据库中,这反过来意味着只要您在mongo. conf中将DirectoryPerDB
设置为true,就将它们存储在HDD的不同路径中。这是一种解决方法,根据您的应用程序,它可能不切实际。
虽然删除一个集合确实不会释放硬盘空间,但它没有丢失已使用的空间也是事实。它最终会被重用于新的集合。
话虽如此,除非你真的空间不足,否则不要回收空间。定期这样做的CPU和I/O成本远远高于我所知道的每个提供商的存储容量成本。
我会看看使用MongoDB的分片功能来解决您的一些问题。引用留档:
分片是一种跨多台机器存储数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。
虽然分片经常用于在更多服务器上平衡大型集合的通过放置,以避免热点和分散整体负载,但它对于管理大型集合的存储也很有用。在您的特定情况下,我会研究使用分片标记将集合固定到特定分片。
同样,引用留档,分片标签对
隔离特定分片集上的特定数据子集。
例如,假设您将正式生产环境拆分为两个分片,shard 1和shard 2。您可以使用shard标签和分片工具将经常删除的集合固定在shard 2上。在这个用例中,shard 1包含所有正常的集合。当您选择通过第二个选项回收磁盘存储时,您将仅在具有已删除集合的分片上执行此操作——这样您就不必重新创建更多静态数据。这样它应该运行得更快(速度是任何给定时间已删除集合分片中有多少数据的函数)。
它还有一个次要的好处,因为每个分片(实际上是每个分片内的副本集)需要更小的服务器,因为它们只包含整体数据的一个子集。
执行此操作的最佳方法的细节将由您的确切用例驱动-集合的数量和大小,插入,更新,查询和删除频率等。我描述了一个简单的2分片案例,但您可以使用更多分片来执行此操作。对于具有更多交易量的集合,您还可以在更高性能的硬件上运行一些分片。
我真的不能在有限的空间内做分片正义,除了给你指出正确的方向来调查它。MongoDB在他们的留档中有很多好的信息,他们的两个在线DBA课程(免费)详细介绍了这一点。
一些有用的链接:
http://docs.mongodb.org/manual/core/sharding-introduction/
http://docs.mongodb.org/manual/core/tag-aware-sharding/