寻找一种非常干净且廉价的方法来摆脱旧数据并将磁盘空间回收到操作系统而不会感到痛苦。
我存储采样数据(时间戳+一堆属性)。很多。 每个样本都是一个文档,集合变得庞大。
上限集合是不可能的,因为我需要根据时间范围存储数据,而不是根据它所需的大小。 由于TTL索引所需的空间,TTL集合并不好,它可能会变得非常大。 由于其他一些原因,出现了分片。
所以我想做的就是自己分割整个东西。 我将分别存储数据分区(例如每周批量)。 每周我都会开始新的'分区'。 此外,每周我都会放弃一些旧的“分区”。 残酷而简单。 我删除了大量索引数据,因此删除而不是删除文档。
这里的问题是我应该将什么用于'分区'?收藏或数据库? 从技术上讲,我可以采用任何一种方式,该应用程序是基于Java的,我可以轻松管理大量的集合或数据库。
我对删除集合的担心是mongodb过去常常将磁盘空间回收到操作系统。 然后它试图重用它,可能存在碎片问题,需要做修复()..以及类似的东西。
将丢弃数据库是一种更有效的方法吗?
同样,我需要以最少破坏性的方式摆脱旧数据的terra字节,同时继续提取新数据。 如果您对这两种方法都有经验,请分享。
答案 0 :(得分:1)
每周我都会开始新的'分区'。
一个常见的解决方案是每周创建一个集合,将其命名为recordings_wk53
,然后每周删除该集合。
收藏品还是数据库?
集合将更容易在您的应用程序中管理,并且可能更快,因为要删除的文件较少(等等)但它不会释放磁盘空间到操作系统。
现在您可以相对轻松地使用数据库执行此操作,您可以在应用程序中每周创建一个连接,只要您只管理100个就应该没问题,并且因为您没有使用它们作为垂直扩展OP的方法模式等应该对用例非常有用。
将丢弃数据库是一种更有效的方法吗?
这是一个非常主观和自以为是的问题,但我可能会去收集,然后MongoDB可以立即重用该集合而无需重新分配所有空间,我的意思是这就是为什么MongoDB不会将空间释放回操作系统;所以它不必重新拍摄它可能很慢。