2

背景

现在mongodb有一张日志表,保留每天的系统访问信息,由于每天的数量非常大,导致长时间之后表变得非常大,影响插入效率,并且导致无法查询,现在我们需要制定方案来解决这个问题,需求是实现表的按时清理和归档。要求是尽量不修改项目现有的业务代码。并且现在数据库的大概每天产生30至60万条数据,能够平稳的处理。

解决方案

方案一:
集中清除:

假设在2019年的11月1号开始增加ttl设置为30天后的凌晨1点进行自动删除,然后我们每30天也就是2019年12月1号凌晨0点开始第一次备份数据,这是我们的数据库中会有一个月的数据,备份完成一小时后,开始删除当天数据,当下个月备份的时候,也就是1月1号,我们11月的数据已经自动删除完,这时进行备份,只有12月的数据。

方案二:
分散清除:

备份方案与方案一相同,ttl设置为在日志生成后2592000秒(30天)后删除。

两种方案的区别:

  1. 第二种方案将删除分散到一天,将压力分散开;不需要更改原有代码只需要数据库设置索引
  2. 第一种方案将删除放在凌晨,在服务器低峰删除;需要增加删除字段,并自定义删除时间

最终选择实施方案一

原因:1. 不需要更改业务代码

   2. 按照 mongodb设计如果删除数据时处于数据库高峰,会延后删除,(更改方案:将删除时间设为整天的时间加减某些量如5小时等,会生成错峰)

操作步骤

  1. 设置mongodb的ttl索引,在一个选中的类型为date的字段上加上ttl索引,参考代码如下,具体实现参照百度。

参照实现:ttl

  1. 数据库备份,参照百度,使用shell脚本定时备份。

参照实现:备份

参考资料


雨澍生
164 声望11 粉丝