【问题标题】:What is the most efficient way to store time series in Riak with heavy reads在 Riak 中存储大量读取时间序列的最有效方法是什么
【发布时间】:2013-10-23 11:05:06
【问题描述】:

我目前的做法:

  • 我有一个域类 - Application
  • 我系统中的每个应用程序都存储在 APPLICATION_KEY 键下的 "applications" 存储桶中
  • 除了存储在此存储桶中的应用程序元数据外,每个应用程序都有自己的存储桶,称为 "time_metrics/APPLICATION_KEY",我在其中存储时间序列的方式如下:

    KEY - 时间戳/VALUE - 一些属性

我担心的是在给定应用程序的特定时间窗口内进行查询的效率。目前要从某个特定时间窗口获取时间序列并最终进行一些缩减,我必须在整个 "time_metric/APPLICATION_KEY" 存储桶上进行映射/缩减,我发现这不是推荐的用例Riak Map/Reduce

我的问题:对于这种系统来说,最好的数据库结构是什么以及查询它的效率如何。

【问题讨论】:

  • 你在时间序列中存储什么样的数据?是统计数据吗?
  • 是 - 对于每个时间戳存储给定应用程序的活动会话数

标签: mapreduce erlang nosql time-series riak


【解决方案1】:

添加到@macintux 的答案。

Basho 有一些客户使用 riak 作为时间序列指标。 Boundary 有一个nice tech talk,关于他们如何将 Riak 与他们的网络监控软件一起使用。他们将数据汇总到不同的时间块(1m、5m、15m)中进行分析。 他们还有一个series of blog posts,关于实施该系统时的经验教训。

Kivra 也有一个good slide deck,介绍了他们如何将时间序列数据与 riak 一起使用。

您可以将数据汇总到某种任意时间长度,然后通过发出常规 K/V 获取来读取您需要的范围,然后在您的应用程序中重建更大的图片/减少。

【讨论】:

    【解决方案2】:

    如果你有多余的计算能力并且事先知道你需要什么密钥,你当然可以使用 Riak 的 MapReduce,但通常检索密钥并在客户端上运行你的处理将同样快(并且不会给你的集群带来压力)。

    一些一般性的想法:

    • 将数据汇总成更大的块
      • 如果您担心客户端在缓冲数据时崩溃会丢失数据,您可以随时在数据到达时存储数据
      • 类似的想法:数据到达时存储,然后按一定的时间间隔检索和汇总
        • 一旦您确信数据可靠地存储在更大的块中,您可以使用 Bitcask 或 Memory 后端自动使数据过期
        • 内存后端对于只需要在有限时间内存储的任何数据都非常有用(RAM 允许)
    • 相关:不要害怕存储数据的多个副本,以便以后更轻松地阅读/报告
      • 多个时间块(例如 5 分钟和 15 分钟的块)
      • 多种报告格式

    话虽如此,如果您正在执行直接的键/值请求(理想的做法是始终能够计算您需要的键,而不是进行索引或搜索),Riak 可以支持非常大的流量负载,所以我除非您知道自己将面临延迟问题,否则不建议您花太多时间创建替代存储机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2016-05-26
      • 1970-01-01
      • 2018-11-15
      • 2011-04-17
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多