我正在开发的Web应用程序(在PHP中)需要能够记录每个页面请求。
就像普通的access_log一样,它会存储详细信息,如请求的URL,源IP地址,日期/时间,但我还需要它来存储登录用户的用户ID(存储在php会话变量中)。
然后将查询此数据,以便在以后根据需要创建网站范围或每个用户的分析报告 - 例如访问总次数/唯一访问次数,特定时间段内的网页浏览量,地理定位IP地址和查看地点,一天中最活跃的时间,最活跃的成员等。
显而易见的事情是在每个页面上都有一个mysql插入语句,但是如果应用程序正在接收数千个req / sec,那么这将成为数据库的一个重要瓶颈,所以我正在寻找替代的,可扩展的没有大的基础设施要求的方法。
我所拥有的一些想法是:
1)为Nginx工作,以便能够从普通Web服务器access_log中的会话/应用程序记录user_id,可以定期(夜间)解析并加载到数据库中。这感觉就像是一个黑客攻击,并且需要在每个Web服务器上进行操作,因为系统可以扩展。
2)将每个页面请求记录到具有高写入速度的Redis中 - 问题是缺乏在日后查询日期的能力。
3)将每个页面请求记录到作为缓存(或消息队列)的Memcache / Redis中,然后从那里将其定期提取,插入MySQL并删除。
4)具有更多查询功能的MongoDB会适合吗?
我对你如何处理这个问题感兴趣,如果有人有类似应用程序的经验(或者在网上遇到过任何问题)。
我也对如何将数据进行适当的结构化以存储在memcache / redis中的想法感兴趣。
由于
答案 0 :(得分:15)
答案 1 :(得分:0)
将日志记录信息发送到syslog-ng:)
答案 2 :(得分:0)
当您使用MongoDB进行日志记录时,高写入吞吐量会引起锁争用。尽管默认情况下MongoDB的插入是fire-and-forget样式,但调用大量的insert()会导致严重的写入锁争用。这可能会影响应用程序性能,并阻止读者聚合/过滤存储的日志。
一种解决方案可能是使用日志收集器框架,例如Fluentd,Logstash或Flume。这些守护进程应该在每个应用程序节点上启动,并从应用程序进程中获取日志。
他们缓冲日志,异步将数据写入其他系统,如MongoDB / PostgreSQL等。写入由批次完成,因此效率更高而不是直接从应用程序写此链接描述了如何将日志从PHP程序放入Fluentd。
以下是一些关于MongoDB + Fluentd的教程。