【问题标题】:MySQL tracking systemMySQL跟踪系统
【发布时间】:2010-01-07 08:35:26
【问题描述】:

我必须实现一个由 MySQL 数据库备份的跟踪系统。系统将跟踪许多应用程序,每个应用程序至少跟踪 5 个事件(例如,有多少用户点击了链接 x,有多少用户访问了页面 y)。一些应用程序将拥有数百万用户,因此每秒几千次更新并不是一个牵强的假设。 系统的另一个组件将必须计算一些应该每分钟更新的统计信息。系统还应记录这些统计值的过去值。

我的一个朋友建议的方法是将每个事件记录在日志表中,并有一个每分钟运行一次的 cron 作业,计算所需的信息并更新统计表。

这对我来说听起来很合理。有更好的选择吗?

谢谢。

【问题讨论】:

    标签: mysql tracking


    【解决方案1】:

    我已经登录到一个 mysql 日志表,其中有一个可以处理它的 cron。

    我通常在我的应用程序中使用innodb 表,但对于日志表,我使用myisam 并使用insert DELAYED . . . 查询。

    Myisam 没有提供 innodb 的所有优点,但我相信它会稍微快一些(出于这个原因)。

    您主要担心的是当您的 cron 运行时数据库锁定,但使用“插入延迟”可以在很大程度上解决这个问题。

    【讨论】:

    • 根据您的经验,哪些会更好/更快:使用 memcached 或其他形式的内存缓存或让 mysql 通过 INSERT DELAYED 执行类似的操作(afaik mysql 在使用延迟插入时将未写入的行列在内存中) ?
    • 听起来都是有效的选项。为了获得最终性能,使用现有日志分析器的答案是有道理的。我认为你应该考虑方便而不是过度优化。我发现延迟到 mysql 中的插入对我的网站来说效果很好(每天记录多达一百万次插入),而且它非常容易实现。
    【解决方案2】:

    如果您的命中率太高,甚至无法将延迟插入 myisam 表来处理,您可能希望将最近的命中保留在内存中(memcache 可以派上用场,或者您可以编写自定义守护程序)并从内存中处理命中定期进入数据库统计表(聚合)。

    【讨论】:

    • 我以前也想过自定义守护进程的方法,但我从来没有写过,因为我认为insert delayed 基本上是一回事。如果你不想让你的主数据库服务器过载,你可以很容易地在不同的服务器上设置另一个 mysql 副本。
    • 不完全一样,因为插入延迟最终会击中磁盘。如果您只是想聚合一些数据并每隔一段时间刷新一次,您不需要每次都访问磁盘。
    【解决方案3】:

    我真的建议您使用现有的日志分析器来分析来自 Web 服务器的现有日志。一个例子是webalizer。我认为更好的是外部系统,例如google analytics。这样做效果更好,因为它将继续与负载平衡器和缓存等中间系统一起工作。

    【讨论】:

    • 问题是客户端应用程序运行在不同的服务器上,所以我无权访问日志文件。
    • Google 分析通过向您要跟踪的每个页面添加一些代码来工作。非常简单,只需放入标题即可。
    猜你喜欢
    • 2011-04-20
    • 2012-04-03
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多