【问题标题】:Which database to choose (Cassandra, MongoDB, ?) for storing and querying event / log / metrics data?选择哪个数据库(Cassandra、MongoDB、?)来存储和查询事件/日志/指标数据?
【发布时间】:2011-08-01 10:55:44
【问题描述】:

在 sql 术语中,我们是这样存储数据的:

table events (
  id
  timestamp
  dimension1
  dimension2
  dimension3
  etc.
)

所有维度值都是整数。这张表变得非常大。

我们希望对这样的查询进行快速读取:

SELECT dimension1, dimension2, COUNT(*) 
FROM   events
WHERE  dimension8 = 'foo'
AND    dimension9 = 'bar'
GROUP BY 1, 2

我们想要快速写入,而不关心事务和一致性。我们关心最终的可用性和分区容错性。

我正在寻找“NoSQL”替代方案。 Casandra 可以做我正在寻找的那种查询吗?这在阅读他们的文档时并不是很明显......如果可以做到这一点,那么这些类型的查询的性能如何?

我也在研究 MongoDB,但他们的“group()”函数有严重的限制,据我所知(最多 10,000 行)。

您是否有使用这些数据库的经验,您会推荐它作为上述问题的解决方案吗?

我应该考虑哪些其他数据库可以快速执行此类查询?

干杯, 吉米

【问题讨论】:

  • 你站在哪一边?你能处理 .NET 解决方案吗?
  • """我也在看 MongoDB,但他们的“group()”函数在我能读到的范围内有严重的限制(最多 10,000 行)。""" - 改用 M/R !
  • 这是您想要对数据执行的唯一查询吗?我会建议你以不同的方式组织你的数据,你可以以你想要的形式存储它们。这里的主题不是 NoSQL 是否可以执行您想要的查询,而是改变您的想法以适应 NoSQL 哲学。更改架构,您将不再需要分组...
  • @ALoR 用户最好能够过滤任何维度并选择最多 5 个维度(最多 30 个,包括时间维度)。我猜你建议为维度值的所有(排序)组合生成键,然后让这些值包含每个的所有度量计数器?如果我要避免分组,那么当更新包含 30 个维度值的 1 条记录时,我将不得不更新 174,436 个计数器(所有这些计数器的最大键长度为 5 个维度值)。在 MongoDB 或 Cassandra 中更新这么多计数器需要(大约)多长时间?

标签: mongodb cassandra nosql


【解决方案1】:

我也在研究 MongoDB,但他们的“group()”函数有严重的限制,据我所知(最多 10,000 行)。

为了澄清,这是返回 10,000 行。在您的示例中,这将适用于多达 10,000 个 dimension1/dimension2 组合。如果太大,您也可以使用较慢的Map / Reduce。请注意,如果您运行的查询结果超过 10k,则最好使用 Map / Reduce 并保存此数据。 10k 是一个很大的查询结果,否则只会“扔掉”。

您有使用这些数据库的经验吗?您会推荐它作为上述问题的解决方案吗?

许多人实际上使用 MongoDB 来“实时”进行这种类型的汇总,但他们使用“计数器”而不是“聚合”来完成。他们不会“汇总”详细数据,而是会进行常规插入,然后会增加一些计数器。

特别是,使用atomic modifiers$inc$push 在单个请求中自动更新数据。

看看hummingbird 是否有人正在这样做。还有一个由 MongoDB 支持的开源事件记录系统:Graylog2ServerDensity 还进行由 MongoDB 支持的服务器事件日志记录。

查看这些可能会给您一些关于您想要执行的日志记录类型的灵感。

【讨论】:

  • MongoDB的Map/Reduce功能适合实时查询吗?我看过一些“旧”帖子表明它不是,也许它得到了改进?
  • MongoDB 的 Map/Reduce 通常推荐用于实时查询。通常,M/R 用于预聚合,然后您查询进入该集合。因此,您不必为响应用户请求而执行 M/R,而是定期将 M/R 作为汇总执行并查询这些结果。
【解决方案2】:

“Group by”和“stupidly fast”不能同时使用。那只是那头野兽的本性……因此,Mongo的团体操作受到了限制; Cassandra 甚至本身都不支持它(尽管它支持通过 Hadoop 进行 Hive 或 Pig 查询......但这些并不是为了愚蠢地快速)。

像 Twitter 的 Rainbird(使用 Cassandra)这样的系统通过非规范化/预计算计数来进行实时分析:http://www.slideshare.net/kevinweil/rainbird-realtime-analytics-at-twitter-strata-2011

【讨论】:

  • “Group by”和“stupidly fast”确实可以同时使用,因为这就是我在使用 Google Analytics API 时所体验到的。我最多可以按 7 个维度分组(可能有 70 多个选择),而且速度非常快。我假设他们正在使用 BigTable,但即便如此,他们如何组织数据?我无法想象对最多 7 维的所有可能组合进行非规范化。
  • 如果您有 70 多个可能的选择中的 7 个维度,平均每个维度有 10 个度量(这是一个非常低的数字),您如何非规范化/预先计算万亿次万亿次万亿次万亿次可能性?
  • GA 有很多 PHD 解决了这个问题。您一定听说过 Dremel。 GA 也有 BIG 集群。至于自定义报告,他们很可能是按需生成,而不是预先计算。反正这是一个非常难的问题,否则市场上会有更多的解决方案。
【解决方案3】:

我出于类似目的(指标收集和报告)开始走这条路,这就是我最终的目标......

获取数据是很容易的部分。获取数据是困难的部分。

如果您有时间和才华,您可以学习和使用此处描述的开源工具组合:http://kibana.org/infrastructure.html。零件清单:

  • Syslog-ng - Syslogd
  • Lo​​gstash - 强大的日志管道
  • RabbitMQ 或 Redis - 用于排队消息
  • Elasticsearch - 全文文档存储和搜索
  • Graphite - 来自 Orbitz,可扩展的实时绘图
  • Statsd - 来自 Etsy,计算字段的出现次数并运送到石墨
  • Graphital - 一个 ruby​​ 守护程序,用于将主机级别的性能数据发送到石墨
  • Kibana - 基于浏览器的 Logstash 和 Elasticsearch 日志分析前端

如果您的钱多于时间,请考虑使用 Splunk。它很昂贵,但在很多情况下它是一个不错的选择。例如我的情况是客户非常稀缺,但他们不介意花钱,所以 splunk 非常适合,因为它更像是一个交钥匙解决方案,而不是学习和拼接工具的组合.

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 2014-11-30
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多