1

我在我正在管理的网站的LAMP堆栈上。需要汇总使用情况统计信息(与我们的桌面产品相关的各种事物)。

我最初用 PHP 解决了这个问题(因为我已经有一堆类来处理数据)。在我使用 5.3 的开发盒上一切正常。

长话短说,5.1 的内存管理似乎更糟了,我不得不做很多傻事才能让长期汇总脚本在固定的内存空间中运行。我们的服务器人员此时不愿意升级 PHP。我已经将我的开发服务器移回 5.1,所以我不会再遇到这个问题。

为了挖掘 MySQL 数据库以汇总不同时期和分辨率的统计信息,可能会运行一个在未来一直执行此操作的进程(而不是按 cron 计划),您推荐哪种语言选择?我正在研究 Python(我或多或少地了解它)、Java(不太了解),或者使用 PHP(非常了解)。


编辑:评论者的设计说明

分辨率:汇总脚本目前的工作方式是我有一些用于定义分辨率和存储桶的类。我有年、月、周、日——给定一个“桶号”,每个类都给出一个定义该桶的时间范围的开始和结束时间戳——这是基于任意纪元日期。系统维护“完整”记录,即,它将完成自上次运行以来的每个分辨率的汇总数据集,目前。

SQL Strat:基本统计信息位于许多不同的模式和表中。大多数情况下,我对每个汇总的统计信息进行单独查询,然后填写一条记录以进行插入。您建议嵌套子查询,例如:

插入rolled_up_stats (someval, someval, someval, ...) VALUES (SELECT SUM(somestat) from someschema, SELECT AVG(somestat2) from someschema2)

那些子查询会生成临时表,对吧?我的经验是,这在过去就像糖蜜一样缓慢。这是更好的方法吗?

编辑 2:为问题添加一些内联响应

语言是 5.1 php 的瓶颈——我基本上被告知我选择了错误的语言(尽管脚本在 5.3 上运行良好)。你提到了python,我正在检查这个任务。明确地说,我正在做的是为桌面产品的使用情况统计提供一个管理工具(日志实际上是由 EJB 服务器写入 mysql 表的)。我做 apache 日志文件分析,以及更多的 web 端自定义 web 报告,但是这个项目是独立的。到目前为止,我采用的方法是聚合表。我不确定这些消息队列产品能为我做什么,我来看看。

更进一步——这些数据被用于绘制服务和客户级别的活动图表,以便管理层了解产品的使用情况。您可以选择一个时间段(4 月 1 日至 4 月 10 日),并根据所选时间段以不同的粒度(小时、天、月等)检索某个功能的总使用分钟数图表。它本质上是对使用情况的事后分析。然而,需求似乎倾向于实时(查看最后一小时的使用情况)

4

3 回答 3

1

我过去曾在一个项目上做过类似的事情,所以我对性能有实际的经验。您将很难击败“INSERT ... SELECT”(而不是“INSERT...VALUES (SELECT ...)”的性能。请参阅http://dev.mysql.com/doc/refman/5.1 /en/insert-select.html

这样做的好处是,如果您这样做,特别是如果您将汇总代码保留在 MySQL 过程中,那么您从外部需要的只是一个 cron-job 来让数据库在正确的位置执行正确的汇总times -- 就像一个带有 ' mysql <correct DB arguments etc.> "CALL RollupProcedure"'的 shell 脚本一样简单

这样,您可以保证自己零内存分配错误,并且当 MySQL DB 在单独的机器上时具有良好的性能(没有跨机器边界移动数据......)

编辑:每小时分辨率很好 - 只需运行每小时一次的 cron 作业......

于 2010-04-15T19:04:53.363 回答
1

这个问题有很多不同的方法,其中一些在这里提到,但是你对数据后汇总所做的事情还不清楚......?

如果您想利用这些数据在您的网站上提供类似于 digg 的“X diggs”按钮,或者摘要图或类似的东西,需要在某种持续的基础上可用,您实际上可以利用 memcache,并拥有您的代码通过在适当的时间递增它来保持特定统计信息的缓存键是最新的。

您还可以在数据库中保留聚合表,这可以很好地用于更复杂的报告。在这种情况下,根据您拥有的数据量和您的需求,您可能能够摆脱每小时表,然后仅基于该基表创建视图来表示天、周等。

如果您有大量数据,并且需要聚合表,则应该考虑将统计信息收集(可能还有数据库查询本身)卸载到 RabbitMQ 或 ActiveMQ 等队列。在队列的另一端放置一个消费者守护进程,它一直在运行,根据需要更新数据库(可能还有缓存)中的内容。

您可能还会考虑的一件事是您的 Web 服务器的日志。我已经看到在对配置中的日志格式规则进行细微调整后,我能够从 Web 服务器日志本身获得大部分所需统计信息的实例。您可以每次滚动日志,然后开始离线处理它们,将结果记录在报告数据库中。

我已经用 Python 完成了所有这些事情(我发布了loghetti 专门用于处理 Apache 组合格式日志),尽管我不认为语言是这里的限制因素或瓶颈。Ruby、Perl、Java、Scala 甚至 awk(在某些情况下)都可以工作。

于 2010-04-15T23:55:24.263 回答
0

如果您主要运行 SQL 命令,为什么不在命令行上使用 MySQL 等?您可以创建一个列出聚合数据的简单表,然后运行类似mysql -u[user] -p[pass] < commands.sql从文件传递 SQL 的命令。

或者,将工作分成更小的块并按顺序运行它们(如果最简单的话,作为 PHP 文件)。

如果你真的需要它是一个持续的长时间运行的过程,那么像 python 或 java 这样的编程语言会更好,因为你可以创建一个循环并让它无限期地运行。PHP 不适合这种事情。将任何 PHP 类转换为 Java 非常容易。

于 2010-04-15T18:41:51.133 回答