database - 海量的流量数据应该如何存储以便于检索?

标签 database sqlite storage

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

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

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

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

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

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

    • 优点:使用 SQL 查询一个用户的文件可以很容易地获取信息。
    • 缺点:获取整体信息仍然很困难。

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

非常感谢。

最佳答案

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

您正在做一项数据仓库工作,您需要像处理数据仓库工作一样处理它。您需要阅读此类内容的正确设计模式。

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

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

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

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

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

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

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

  4. 将这些加载文件保存在磁盘上。这些文件没有更新。他们只是积累。使用简单的表示法,例如 CSV,这样您就可以轻松地批量加载它们。

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

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

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

关于database - 海量的流量数据应该如何存储以便于检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2343754/

相关文章:

ruby-on-rails - 当数据库格式为 DateTime 时,如何从数据库中选择不同的日期

sqlite - 如何加密 SQLite 数据库

android - 缩小照片尺寸

python - 为什么 Jupyter 无法读取文件夹中的 csv 文件?

ios - 为什么每次访问我的关系对象时都会重新初始化?

java - Lucene 搜索问题

android - 我必须使用 _ID 作为 SQlite 主键吗?它必须是 INT 吗? (安卓开发)

mysql - symfony数据库访问配置问题

storage - 卷和分区有什么区别?

android - 如何在Android中获取已安装SD卡的实际大小?