【问题标题】:How should I store extremely large amounts of traffic data for easy retrieval?我应该如何存储大量的交通数据以便于检索?
【发布时间】:2010-02-26 18:08:08
【问题描述】:

对于流量统计系统,我需要存储大量关于通过我们的网关路由器发送的互联网数据包的数据集(包含时间戳、用户 ID、目标或源 ip、字节数等)。

这些数据必须存储一段时间,至少几天。也应该可以轻松检索。

有什么好的方法可以做到这一点?我已经有了一些想法:

  • 为每个用户和日期创建一个文件,并将每个数据集附加到它。

    • 优势:速度可能非常快,并且在文件布局一致的情况下很容易找到数据。
    • 缺点:不容易看到例如所有用户的所有 UDP 流量。
  • 使用数据库

    • 优点:使用正确的 SQL 查询很容易找到特定数据。
    • 缺点:我不确定是否有数据库引擎可以有效地处理包含数亿数据集的表。
  • 也许可以将这两种方法结合起来: 为每个用户使用一个 SQLite 数据库文件。

    • 优点:使用 SQL 查询对文件进行查询的用户可以轻松获取信息。
    • 缺点:获取整体信息仍然很困难。

但也许其他人有一个很好的主意?

非常感谢。

【问题讨论】:

    标签: database sqlite storage


    【解决方案1】:

    首先,在您做任何事情之前先获取The Data Warehouse Toolkit

    您正在做一项数据仓库工作,您需要像处理数据仓库工作一样处理它。您需要了解此类事情的正确设计模式。

    [注意数据仓库并不意味着疯狂的大或昂贵或复杂。这意味着 Star Schema 和处理大量从未更新的数据的智能方法。]

    1. SQL 数据库速度很慢,但这种速度有利于灵活检索。

    2. 文件系统很快。更新是一件很可怕的事情,但你不是在更新,你只是在积累。

    一个典型的 DW 方法就是这样做。

    1. 为您的数据定义“星型模式”。可衡量的事实和这些事实的属性(“维度”)。您的事实似乎是# of bytes。其他所有内容(地址、时间戳、用户 ID 等)都是该事实的一个维度。

    2. 在主维度数据库中构建维度数据。它相对较小(IP 地址、用户、日期维度等)。每个维度都包含您可能想知道的所有属性。这种情况越来越多,人们总是在向维度添加属性。

    3. 创建一个“加载”过程来获取您的日志、解析维度(时间、地址、用户等)并将维度键与度量(字节数)合并。这可能会更新维度以添加新用户或新地址。通常,您正在读取事实行、进行查找并编写具有所有正确 FK 的相关事实行。

    4. 将这些加载文件保存在磁盘上。这些文件没有更新。他们只是积累。使用简单的符号,如 CSV,以便您轻松批量加载它们。

    当有人想要进行分析时,为他们构建一个数据集市。

    对于选定的 IP 地址或时间范围等,获取所有相关事实,以及相关的主维度数据并批量加载数据集市。

    您可以在此集市上执行所有您想要的 SQL 查询。大多数查询将通过各种 GROUP BYHAVINGWHERE 子句转移到 SELECT COUNT(*)SELECT SUM(*)

    【讨论】:

      【解决方案2】:

      我认为正确的答案实际上取决于“数据集”的定义。正如您在问题中提到的那样,您正在为每条记录存储单独的信息集;时间戳、用户 ID、目标 ip、源 ip、字节数等。

      SQL Server 完全有能力处理这种包含数亿条记录的数据存储,没有任何实际困难。当然,这种类型的日志记录需要一些好的硬件来处理它,但它不应该太复杂。

      在我看来,任何其他解决方案都会使报告变得非常困难,而且从它的声音来看,这是一个重要的要求。

      【讨论】:

      • 你是对的,用户必须能够检查他们造成的流量。不幸的是,我不能使用 SQL Server,因为我们所有的服务器都运行 Debian Linux。前段时间,我在我们的 PostgreSQL 数据库上写了一个查询来查找没有合同的用户。在一个表中查找在另一个表中没有匹配条目的所有条目似乎很简单,两个表的行数都低于 5000。但是,生成的查询需要五秒钟才能执行。这就是为什么我担心对数亿数据集的查询。
      • 听起来好像有人忘记为您的 Postgre 数据库编制索引!在一个设计合理的数据库中,在如此小的数据集上进行这样的简单查询应该需要几毫秒的时间。
      【解决方案3】:

      因此,在这样一种情况下,您的写入活动比读取多得多,您希望写入不会阻止您,并且您希望读取“相当快”但不危急。这是一个典型的商业智能用例。

      您可能应该使用数据库并将数据存储为“非规范化”模式,以避免对每条记录进行复杂的连接和多次插入。将您的表视为一个巨大的日志文件。

      在这种情况下,一些“新奇的”NoSQL 数据库可能正是您要寻找的:它们提供了宽松的 ACID 约束,您在这里不必太介意(如果发生崩溃,您可以松开最后一个日志行),但它们在插入时表现得更好,因为它们不必在每个事务中同步磁盘上的日志。

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 1970-01-01
        • 2011-06-01
        • 2011-04-17
        • 2014-03-22
        • 1970-01-01
        • 2015-01-04
        • 2013-09-15
        • 1970-01-01
        相关资源
        最近更新 更多