对于流量统计系统我需要存储大量关于通过我们的网关路由器发送的互联网数据包的数据集(包含时间戳,用户ID,目标或源IP,字节数等)。
此数据必须存储一段时间,至少几天。也应该可以轻松检索。
这样做的好方法是什么?我已经有了一些想法:
为每个用户和日创建一个文件,并将每个数据集附加到该文件。
使用数据库
也许可以将两种方法结合起来:为每个用户使用SQLite数据库文件。
但也许其他人有个好主意?
非常感谢。
答案 0 :(得分:4)
首先,在做任何事之前先获取The Data Warehouse Toolkit。
您正在进行数据仓库作业,您需要像数据仓库作业一样处理它。你需要阅读适合这种事情的设计模式。
[注意数据仓库并不意味着疯狂的大或昂贵或复杂。它意味着Star Schema和智能方法来处理从未更新过的大量数据。]
SQL数据库速度很慢,但速度慢对于灵活检索很有用。
文件系统很快。这对于更新来说是一件可怕的事情,但是你没有更新,你只是在积累。
典型的DW方法就是这样做。
为您的数据定义“Star Schema”。可衡量的事实和这些事实的属性(“维度”)。你的事实似乎是字节数。其他所有内容(地址,时间戳,用户ID等)都是这一事实的维度。
在主维度数据库中构建维度数据。它相对较小(IP地址,用户,日期维度等)。每个维度都具有您可能想知道的所有属性。这种情况越来越多,人们总是在维度上添加属性。
创建一个“加载”进程,该进程获取日志,解析维度(时间,地址,用户等)并将维度键与度量(字节数)合并。这可以更新维度以添加新用户或新地址。通常,您正在读取事实行,执行查找以及编写具有与之关联的所有正确FK的事实行。
将这些加载文件保存在磁盘上。这些文件未更新。他们只是积累。使用简单的表示法,例如CSV,这样您就可以轻松地批量加载它们。
当有人想要进行分析时,请构建一个数据集市。
对于选定的IP地址或时间范围或其他内容,获取所有相关事实,以及相关的主维度数据和批量加载数据集市。
您可以在此商店中执行所需的所有SQL查询。大多数查询将转移到SELECT COUNT(*)
和SELECT SUM(*)
,其中包含GROUP BY
和HAVING
以及WHERE
条款。
答案 1 :(得分:0)
我认为正确的答案实际上取决于“数据集”的定义。正如您在问题中提到的那样,您正在为每条记录存储各组信息; timestamp,userid,destination ip,source ip,bytes of number ..
SQL Server完全能够将这种类型的数据存储与数亿条记录一起交付,而不会有任何实际困难。当然,这种类型的日志记录需要一些好的硬件来处理它,但它不应该太复杂。
在我看来,任何其他解决方案都会使报告变得非常困难,而且从它的声音来看这是一个重要的要求。
答案 2 :(得分:0)
因此,如果您有多更多写入活动而不是读取的情况,您希望您的写入不会阻止您,并且您希望您的读取“合理快速”但不是危急。这是一个典型的商业智能用例。
您应该使用数据库并将数据存储为“非规范化”模式,以避免每个记录的复杂连接和多次插入。将您的表视为一个巨大的日志文件。
在这种情况下,一些“新的和奇特的”NoSQL数据库可能正是您正在寻找的:它们提供了轻松的ACID约束,您不应该在这里非常介意(如果发生崩溃,您可以放弃最后一个日志行,但它们的插入效果要好得多,因为它们不必在每次交易时同步磁盘上的日志。