背景
现在 mongodb 有一张日志表,保留每天的系统访问信息,由于每天的数量非常大,导致长时间之后表变得非常大,影响插入效率,并且导致无法查询,现在我们需要制定方案来解决这个问题,需求是实现表的按时清理和归档。要求是尽量不修改项目现有的业务代码。并且现在数据库的大概每天产生 30 至 60 万条数据,能够平稳的处理。
解决方案
方案一:
集中清除:
假设在 2019 年的 11 月 1 号开始增加 ttl 设置为 30 天后的凌晨 1 点进行自动删除,然后我们每 30 天也就是 2019 年 12 月 1 号凌晨 0 点开始第一次备份数据,这是我们的数据库中会有一个月的数据,备份完成一小时后,开始删除当天数据,当下个月备份的时候,也就是 1 月 1 号,我们 11 月的数据已经自动删除完,这时进行备份,只有 12 月的数据。
方案二:
分散清除:
备份方案与方案一相同,ttl 设置为在日志生成后 2592000 秒(30 天)后删除。
两种方案的区别:
- 第二种方案将删除分散到一天,将压力分散开;不需要更改原有代码只需要数据库设置索引
- 第一种方案将删除放在凌晨,在服务器低峰删除;需要增加删除字段,并自定义删除时间
最终选择实施方案一
原因:1. 不需要更改业务代码
2. 按照 mongodb 设计如果删除数据时处于数据库高峰,会延后删除,(更改方案:将删除时间设为整天的时间加减某些量如 5 小时等,会生成错峰)
操作步骤
- 设置 mongodb 的 ttl 索引,在一个选中的类型为 date 的字段上加上 ttl 索引,参考代码如下,具体实现参照百度。
参照实现:ttl
- 数据库备份,参照百度,使用 shell 脚本定时备份。
参照实现:备份