首页 文章

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

提问于
浏览
8

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

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

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

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

3 回答

  • 0

    在MongoDB中只有三种方法可以进行清除 . 看起来你已经确定了几个权衡因素 .

    • 单个集合,删除旧条目

    • 每天收集,丢弃旧收藏品

    • 每天数据库,删除旧数据库

    Option #1: single collection

    利弊

    • 易于实施

    • 易于运行Map / Reduces

    缺点

    • 删除与插入一样昂贵,导致大量IO并且需要"defragment"或"compact"数据库 .

    • 在某些时候,你最终会处理"writes"的两倍,因为你必须插入一天的数据并删除一天的数据 .

    Option #2: collection per day

    利弊

    • 通过 collection.drop() 删除数据非常快 .

    • Still Map / Reduce友好,因为每天的输出可以与摘要数据合并或重新缩小 .

    缺点

    • 您可能仍然存在一些碎片问题 .

    • 您需要重新编写查询 . 但是,根据我的经验,如果您有足够的数据要清除,则很少直接访问该数据 . 相反,您倾向于对该数据运行Map / Reduces . 所以这可能不会改变那么多查询 .

    Option #3: database per day

    利弊

    • 删除速度尽可能快,文件只是被截断 .

    • 零碎片问题,易于备份/恢复/归档旧数据 .

    缺点

    • 会使查询更具挑战性(期望编写一些包装代码) .

    • 编写Map / Reduce并不容易,但请看一下Aggregation Framework,因为它可以更好地满足您的需求 .


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

  • 9

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

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

  • 5

    我有类似的情况,这个页面帮助了我,特别是底部的"Helpful Scripts"部分 . http://www.mongodb.org/display/DOCS/Excessive+Disk+Space

相关问题