批量保存到数据库的大批量日志记录?

时间:2011-07-14 15:09:47

标签: logging access-log

我希望以快速的方式将有关请求的信息存储到我的网站,这不会给我的数据库带来额外的压力。目标是使用此信息来防止滥用并收集有关用户如何与站点交互的信息(ip,GET / POST,url / action,timestamp)。

我目前正在将每个页面请求的新行保存到数据库中。但是,当服务器也已将相同的信息记录到nginx日志文件时,这会浪费资源并进行额外的数据库调用。

我想知道我能做些什么来更好地处理这个问题,如果有更好的方法,我想知道两个想法。

  1. CRON作业每天解析访问日志并将批处理事务另存为数据库。
  2. RAM缓存(redis / memcached)存储有关请求的数据,然后CRON保存到数据库。
  3. 但是,如果我以一种可以检索所有记录并将其插入数据库的方式使用键值缓存,我不确定如何存储数据。

    我也不知道如何以一种我不会重读条目的方式解析访问日志。

    如何以有效的方式记录访问尝试?

1 个答案:

答案 0 :(得分:1)

  1. 如果您使用的是MySQL(其他引擎不需要),请使用延迟插入
  2. 注意使写入操作变得昂贵的索引
  3. 每分钟/小时/天旋转一次表
  4. 小心过度规范化和外键
  5. 一种常见的模式是使用简单的表进行普通写入并将每分钟/小时的日志移动到一组主表。主集可以高度标准化和索引,并且可以使用简单的非规范化表(以节省空间)。

    另一种模式是拥有一个简单的大表并每分钟/每小时运行一次摘要查询。简单表可以按日期编制索引(请记住使用本机类型)。

    最后一个提示,使架构和脚本具有幂等性(如果多次运行,数据仍然有效)。对于特定的分钟/小时/天的窗口来说,通常会有快照和简单的重新运行,可以快速修复所有内容,而不是进行大规模重建。