0

我想以一种不会对我的数据库造成额外压力的快速方式存储有关对我的站点的请求的信息。目标是使用这些信息来防止滥用并收集有关用户如何与站点交互的信息(ip、GET/POST、url/action、时间戳)。

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

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

  1. CRON 作业每天解析访问日志并作为批处理事务保存到数据库。
  2. RAM 缓存(redis/memcached)存储有关请求的数据,然后 CRON 保存到数据库。

但是,如果我以可以检索所有记录并将它们插入数据库的方式使用键值缓存,我不确定如何存储数据。

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

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

4

1 回答 1

1
  1. 如果您使用的是 MySQL,请使用延迟插入(其他引擎不需要这个)
  2. 当心索引会使写操作变得昂贵
  3. 每分钟/小时/天轮换一次表格
  4. 注意过度规范化和外键

一种常见的模式是有一个简单的表用于普通写入,并每分钟/小时将日志移动到一组主表。主集可以高度规范化和索引以及一个简单的非规范化表(以节省空间)。

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

最后一个提示,使架构和脚本具有幂等性(如果多次运行,数据仍然有效)。在分钟/小时/天的特定窗口中简单地重新运行任务是很常见的,可以快速修复所有问题,而不是进行大规模重建。

于 2011-07-14T15:23:16.833 回答