如何在Mongodb中处理数据库清除

时间:2012-01-18 04:53:49

标签: database-design mongodb

我使用mongodb存储30天数据,这些数据作为流来到我这里。我正在寻找一种清除机制,通过它我可以丢弃最旧的数据,为新数据创造空间。我以前使用mysql,我使用分区处理这种情况。我保留了30个以日期为基础的分区。我删除了最旧的日期分区,并创建了一个新分区来保存新数据。

当我在mongodb中映射相同的东西时,我觉得使用基于日期的“分片”。但问题是它使我的数据分发变坏。如果所有新数据都在同一个分片中,那么该分片将会很热,因为有很多人访问它们,并且包含较旧数据的分片将减少用户的负载。

我可以有一个基于集合的清除。我可以有30个收藏品,我可以丢弃最旧的收藏品以容纳新数据。但是有几个问题是1)如果我将集合缩小,那么我不能从分片中获益,因为它们是按照每个集合完成的。 2)我的查询必须更改为从所有30个集合中查询并进行联合。

请建议我一个良好的清除机制(如果有的话)来处理这种情况。

4 个答案:

答案 0 :(得分:9)

在MongoDB中只有三种方法可以进行清除。您似乎已经确定了几个权衡因素。

  1. 单个收集,删除旧条目
  2. 每天收集,删除旧收藏品
  3. 每天数据库,删除旧数据库
  4. 选项#1:单一集合

    优点

    • 易于实施
    • 易于运行Map / Reduces

    缺点

    • 删除与插入一样昂贵,导致大量IO和需要进行碎片整理"或" compact" DB。
    • 在某些时候,你最终会处理双倍的"写"因为您必须插入一天的数据并删除一天的数据。

    选项#2:每天收集

    优点

    • 通过collection.drop()删除数据非常快。
    • Still Map / Reduce友好,因为每天的输出可以与摘要数据合并或重新缩小。

    缺点

    • 您可能仍有一些碎片问题。
    • 您需要重新编写查询。但是,根据我的经验,如果您有足够的数据进行清除,则很少直接访问该数据。相反,您倾向于对该数据运行Map / Reduces。因此,这可能不会改变 许多查询。

    选项#3:每天数据库

    优点

    • 删除速度越快,文件就会被截断。
    • 零碎片问题,易于备份/恢复/归档旧数据。

    缺点

    • 将使查询更具挑战性(期望编写一些包装代码)。
    • 编写Map / Reduce不是那么容易,但是看看聚合框架可能会更好地满足您的需求。

    现在有一个选项#4,但它不是一般解决方案。我知道有些人做过"清洗"只需使用Capped Collections即可。肯定有这样的情况,但它有一些警告,所以你真的需要知道你在做什么。

答案 1 :(得分:5)

我们可以从mongodb 2.2版本或更高版本中设置TTL用于收集。这将帮助您从集合中过期旧数据。

请点击此链接:http://docs.mongodb.org/manual/tutorial/expire-data/

答案 2 :(得分:0)

我有类似的情况,这个页面帮助了我,特别是底部的“有用的脚本”部分。 http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

答案 3 :(得分:0)

最好保留一台服务器作为存档 每隔15天进行一次吹扫 从存档中删除旧文件。 使用更多数据分区进行存档