3

我面临的问题与存储和检索相当快的数百万条日志有关。我致力于从防火墙、入侵检测和预防系统、应用程序日志、用户活动等收集日常日志,将它们存储在数据库中,执行实时报告并将它们关联起来以识别入侵等。所以在使用 syslog 构建系统之后和 mysql 我发现目前的瓶颈是数据库。我只有在关系数据库方面的经验。另一方面,我完全迷失了所有这些现有的技术,并在数据库领域获得了我的知识。

那么 NoSQL 数据库(mongo、cassandra 等)会更好并且优于传统数据库(MySQL、Oracle、MSSQL 等)吗?从我所阅读的内容到现在,没有聚合函数,因此报告将不可行,对吗?

Dataware Houses 是否更符合我的需求?我知道它们用于报告,但不是实时的。这是真的吗,或者今天有任何支持可能接近实时的实现,这可能是可以接受的?我发现这或多或少是一种设计数据库模式的不同方式,而传统数据库可能是很好的选择。这是真的?

我还被提议创建表分区,但不使用数据库中存在的数据库功能。这个想法可能是根据大小使用单独的表,并创建存储和更新单独表的索引的过程,并且通常在我需要执行连接或聚合时操纵它们以加快速度。有没有人听说过或使用过类似的东西?因为起初它似乎完全不适用于我的这种解决方案。

到底有没有可能把上面的一些技术移植到更好更平衡的效果上呢?

我知道这是一个大问题。但是,我发现我在 RDBMS 方面的最新知识和经验不足以解决问题。而且由于技术如此之多,我需要听取意见,讨论它并由过去有一些经验的人指导。还讨论某些方法的优缺点。有没有可以对我有帮助的论坛?最后一件事是数据量的测量等级将是 TB,而不是 PB,因此这可能会排除一些技术,如 hadoop。

4

4 回答 4

2

在您确定存储方法之前,问题是您想要进行哪种类型的分析。

对于面向聚合的工作负载和您正在谈论的卷,应该使用在强大的服务器上运行的传统 rdbms,如 oracle、sql server 或 postgresql。它们原生支持分区和其他 DWH 技术(例如物化视图),这将节省您自己拼凑的时间。例如,oracle 查询优化器将在生成新的查询计划时考虑分区。

作为报告前端,您可以选择市售的一种或创建自己的。一些选项是 obiee、SQL server 报告服务、cognos 和 pentaho(免费),它们都在一定程度上支持跨数据库报告(结合 DWH + 操作存储)。

如果您需要针对涉及大量(十亿行数据集)聚合的任意查询的即时答案,您可以查看 teradata、netezza、vertica 等。这些往往会花费很多。

如果您经常需要对涉及较小数据集聚合的任意查询的即时答案,请查看。他们有一个强大的内存分析工具。我相信它对单人使用是免费的。

如果这不仅仅是将数字相加而是分析大量复杂关系(类似图形的分析)的问题,那么您就不走运了。旧的解决方案不能很好地扩展或价格昂贵,新的解决方案经常受到打击。无论哪种方式都会很昂贵。在不知道如何关联事件的情况下,很难推荐任何东西。我不知道任何一般的解决方案。

就个人而言,我会使用 postgres(后端)+ pentaho 和(都是前端)和kettle 进行传统 ETL 和 hadoop 或自定义代码来预先计算结果以进行更复杂的分析。在 postgres 中,将您的数据拆分到操作存储和 DWH 中。

于 2013-08-07T21:32:27.410 回答
0

很多问题!

Q1: NoSQL 有聚合吗?

A1:我知道 Mongo 有聚合,但是我上次使用它时,它与关系数据库相比并不是特别快。不能和卡桑德拉说话。很多人使用 Mongo 来存储结构化日志和报告。

Q2:数据仓库呢?

A2:您说得对,数据仓库可以存在于关系数据库中。这只是构建数据和思考数据的不同方式。

您是否考虑过在实时关系数据库中保存时间快照,然后归档旧日志?

例如,可能在 1000 万条时,您开始将最旧的日志条目发送到数据仓库,这可以保证您始终只查看最近的 1000 万条日志条目,这应该很快。

于 2013-07-31T16:20:38.990 回答
0

如果您的数据大小需要,您最好查看 Hadoop/Cassandra 进行聚合。

当我使用 Mongo 时,它的聚合是单线程的,不确定它是否已经改变 - 这解释了随着集合大小的增长而变得缓慢。

如果您正在研究具有防弹灾难恢复的多数据中心复制,那么 Cassandra 比 Hadoop 获得了一些分数,因为该架构比主从更民主,后者往往会出现单点故障。

Cassandra 和 Hadoop 都经过了存储大量非结构化数据的公司的实战考验。它们是否比 SQL 更复杂,是的。它们是解决不同类型问题的不同类型的数据库。Hadoop 更像是一个生态系统,你需要一年的时间才能掌握——而不是数据库。需要注意的一点是,Cassandra 还需要修剪 SSTables 以获得良好的性能。随着数据量的增长,这个问题更加明显。

当您需要进行即席查询(在索引的字段上)时,Mongo 更适合。

于 2013-08-08T06:25:22.930 回答
0

“有人建议我创建表分区,但不使用数据库中存在的数据库功能。这个想法可能是根据大小使用单独的表,并创建存储和更新分离表索引的过程,并通常操纵它们以加快速度每当我需要执行连接或聚合时”
这是一个好方法,您可以根据负载每小时、每天创建新表。Mysql 使用表锁,对大表的查询会花费更多时间,因此会增加查询等待时间。多个表鼓励进行并行查询,例如
假设表是每小时创建的,要获得一天的统计信息,您可以有两个线程,第一个线程将获取从 hour-0 到 hour-6 的统计信息,第二个线程将从中获取统计信息小时 7 到小时 12。没有等待表锁。
您可以拥有多个数据库服务器来处理更多负载

于 2013-08-05T10:10:34.730 回答