代码之家  ›  专栏  ›  技术社区  ›  jrydberg

Web访问日志的实时数据仓库

  •  3
  • jrydberg  · 技术社区  · 15 年前

    我们正在考虑建立一个数据仓库系统来加载Web服务器生成的Web访问日志。其思想是实时加载数据。

    对于用户,我们希望呈现数据的折线图,并允许用户使用维度向下钻取。

    问题是如何平衡和设计系统,以便;

    (1)数据可以实时提取并呈现给用户(<2秒)。

    (2)数据可以按小时和每天进行汇总,以及

    (2)由于大量数据仍可以存储在仓库中,并且

    我们目前的数据传输速率大约是每秒10次访问,这给我们每天大约800K行。我使用MySQL和简单的星型模式进行的简单测试表明,当我们有超过800万行时,我的需求开始花费超过2秒的时间。

    是否可能从这样的“简单”数据仓库中获得实时查询性能, 而且它仍然可以存储大量的数据(如果能够 从未 丢弃任何数据)

    是否有方法将数据聚合到更高分辨率的表中?

    我觉得这不是一个新问题(不过我在谷歌上搜索了很多)。可能有人会给这样的数据仓库解决方案打分吗?一个想到的是Splunk。

    也许我抓得太多了。

    更新

    我的模式是这样的;

    • 尺寸:

      • 客户端(IP地址)
      • 服务器
      • 网址
    • 事实;

      • 时间戳(秒)
      • 传输的字节数
    4 回复  |  直到 15 年前
        1
  •  1
  •   Seth    15 年前

    听起来不是问题。MySQL 非常快。

    对于存储日志数据,使用myisam表——它们速度更快,非常适合于Web服务器日志。(我认为InnoDB是这些天新安装的默认设置-对于日志表,不需要使用外键和InnoDB的所有其他功能)。您也可以考虑使用 merge 表-您可以将单个表保持在可管理的大小,同时仍然可以将它们作为一个大表访问。

    如果您仍然无法跟上进度,那么请按顺序为您自己增加内存、更快的磁盘、RAID或更快的系统。

    另外:永远不要丢弃数据可能是个坏主意。如果每行大约有200字节长,那么您所说的是每年至少50 GB,仅针对原始日志数据。如果有索引,至少乘以2。再乘以(至少)2作为备份。

    如果你愿意的话,你可以把它全部保留下来,但我认为你应该考虑将原始数据存储几周,并将聚合数据存储几年。对于任何更旧的内容,只需存储报告。(也就是说,除非法律要求你保持在周围。即使那样,也可能不会超过3-4年)。

        2
  •  2
  •   user241295    15 年前

    赛斯的回答是一个非常合理的答案,我相信如果你在适当的知识和硬件上投资,它将有很高的成功机会。

    Mozilla做了很多Web服务分析。我们每小时跟踪细节,并使用商业数据库产品Vertica。对于这种方法,它会很好地工作,但是由于它是一种专有的商业产品,所以它有一组不同的相关成本。

    您可能想研究的另一种技术是MongoDB。它是一个文档存储数据库,有一些特性使它可能非常适合这个用例。 即封顶集合(搜索MongoDB封顶集合了解更多信息)

    以及快速增量操作,如跟踪页面视图、点击量等。 http://blog.mongodb.org/post/171353301/using-mongodb-for-real-time-analytics

        3
  •  1
  •   Damir Sudarevic    15 年前

    此外,还要研究分区,尤其是当查询大多访问最新数据时;例如,您可以设置大约5.5米行的每周分区。

    如果每天和每小时进行聚合,可以考虑使用日期和时间维度——您没有列出它们,所以我假设您没有使用它们。其思想是不要在查询中有任何函数,比如hour(mytimestamp)或date(mytimestamp)。日期维度的分区方式应与事实数据表相同。

    有了这个功能,查询优化器就可以使用分区修剪,因此表的总大小不会像以前那样影响查询响应。

        4
  •  0
  •   KenFar    15 年前

    这已经成为一个相当常见的数据仓库应用程序。我已经运行了几年,每天支持2000-1亿行,响应时间为0.1秒(从数据库),超过一秒(从Web服务器)。这甚至不在大型服务器上。

    您的数据量不太大,所以我认为您不需要非常昂贵的硬件。但我还是会用多核64位内存。

    但是,您将希望主要命中聚合数据而不是细节数据,尤其是对于在数天、数月等时间序列图。聚合数据可以通过异步过程定期在数据库上创建,或者在这种情况下,如果转换数据的ETL过程创建聚合数据,则通常效果最好。阿塔。请注意,聚合通常只是事实数据表的分组依据。

    正如其他人所说,在访问细节数据时,分区是一个好主意。但对于聚合数据来说,这并不那么重要。此外,对预先创建的维度值的依赖性比对函数或存储过程的依赖性要好得多。这两种策略都是典型的数据仓库策略。

    关于数据库-如果是我,我会尝试PostgreSQL而不是MySQL。原因主要是优化器的成熟度:PostgreSQL可以更好地处理您可能运行的查询类型。MySQL更容易在五路连接时混淆,在运行子select时自下而上,等等。如果这个应用程序很值钱,那么我会考虑使用商业数据库,如DB2、Oracle、SQL Server。然后您将获得额外的特性,如查询并行性、针对聚合表的自动查询重写、额外的优化器复杂性等。