Database 我应该如何存储大量流量数据以便于检索?

Database 我应该如何存储大量流量数据以便于检索?,database,sqlite,storage,Database,Sqlite,Storage,对于流量计费系统,我需要存储有关通过网关路由器发送的internet数据包的大量数据集(包含时间戳、用户id、目的地或源ip、字节数等) 这些数据必须存储一段时间,至少几天。也应该可以轻松检索 做这件事的好方法是什么?我已经有了一些想法: 为每个用户和日期创建一个文件,并将每个数据集附加到该文件中 优点:它可能非常快,并且如果文件布局一致,数据很容易找到 缺点:不容易看到所有用户的所有UDP流量 使用数据库 优点:使用正确的SQL查询很容易找到特定的数据 缺点:我不确定是否有一个数据库引

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

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

做这件事的好方法是什么?我已经有了一些想法:

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

    • 优点:它可能非常快,并且如果文件布局一致,数据很容易找到
    • 缺点:不容易看到所有用户的所有UDP流量
  • 使用数据库

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

    • 优点:对一个用户的文件使用SQL查询很容易获得信息
    • 缺点:获取总体信息仍然很困难
但也许其他人有一个很好的主意


非常感谢。

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

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

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

首先,在做任何事情之前都要做好准备

你正在做一个数据仓库工作,你需要像处理数据仓库工作一样处理它。你需要仔细阅读这类东西的正确设计模式

[注:数据仓库并不意味着庞大、昂贵或复杂。它意味着星型模式和处理大量从未更新的数据的智能方法。]

  • SQL数据库的速度很慢,但这种速度有利于灵活的检索

  • 文件系统速度很快。更新是件可怕的事情,但你不是在更新,你只是在积累

  • 一种典型的DW方法就是这样做

  • 为数据定义“星型模式”。可测量的事实以及这些事实的属性(“维度”)。您的事实似乎有#个字节。其他一切(地址、时间戳、用户id等)都是这个事实的一个维度

  • 在主维度数据库中构建维度数据。它相对较小(IP地址、用户、日期维度等),每个维度都具有您可能想要知道的所有属性。随着时间的推移,人们总是在向维度添加属性

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

  • 将这些加载文件保存在磁盘上。这些文件没有更新。它们只是积累。使用一个简单的符号,比如CSV,这样您就可以轻松地批量加载它们

  • 当有人想做分析时,给他们建立一个数据集市

    对于选定的IP地址或时间范围或任何内容,获取所有相关事实,加上相关的主维度数据,并批量加载数据集市


    您可以在此集市上执行所需的所有SQL查询。大多数查询将转移到
    SELECT COUNT(*)
    SELECT SUM(*)
    ,使用各种
    groupby
    具有
    WHERE
    子句进行分组。

    因此,在这种情况下,您的写操作比读操作要多得多,您希望写操作不会阻止您,并且希望读操作被阻止“相当快”,但并不关键。这是一个典型的商业智能用例

    您可能应该使用数据库并将数据存储为“非规范化”模式,以避免复杂的联接和每条记录的多次插入


    在这种情况下,您可能正在寻找一些“新颖别致”的NoSQL数据库:它们提供了宽松的ACID约束,在这里您不应该太在意这些约束(在崩溃的情况下,您可以去掉日志的最后几行),但它们的插入性能要好得多,因为它们不必在每次事务中同步磁盘上的日志。

    你是对的,用户必须能够检查它们造成的流量。不幸的是,我不能使用SQL Server,因为我们所有的服务器都运行Debian Linux。不久前,我在我们的PostgreSQL数据库上编写了一个查询,以查找具有ut是一个契约。在一个表中查找所有条目似乎很简单,而在另一个表中没有匹配的条目,两个表的行数都在5000行以下。但是,结果查询需要5秒钟才能执行。这就是为什么我担心查询数亿个数据集的原因。我觉得好像有人忘记为Postgre编制索引了数据库!在这样一个小的数据集上进行这样一个简单的查询,在一个设计合理的数据库中应该需要数千秒。