使用大量读取在Riak中存储时间序列的最有效方法是什么

时间:2013-10-15 15:06:55

标签: mapreduce erlang nosql time-series riak

我目前的做法:

  • 我有一个域类 - 应用程序
  • 我系统中的每个应用程序都存储在 APPLICATION_KEY
  • 下的“应用程序”存储桶中
  • 除了存储在此存储桶中的应用程序元数据外,每个应用程序都有自己的存储桶名为“time_metrics / APPLICATION_KEY”,其中我以某种方式存储时间序列:

      

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

我担心的是在给定应用程序的特定时间窗口上进行查询的效率。目前为了从某个特定的时间窗口获取时间序列并最终进行一些缩减,我必须对整个“time_metric / APPLICATION_KEY”桶进行map / reduce,我发现的不是推荐的用例Riak Map/Reduce

我的问题:这种系统的最佳数据库结构是什么,以及如何有效地查询它。

2 个答案:

答案 0 :(得分:4)

添加到@ macintux的答案。

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

Kivra还有good slide deck关于他们如何使用riak使用时间序列数据。

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

答案 1 :(得分:3)

如果你有足够的计算能力并且事先知道你需要什么密钥,你当然可以使用Riak的MapReduce,但是经常检索密钥并在客户端上运行你的处理速度会一样快(并且不会使你的集群紧张)。

一些一般性的想法:

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

说了这么多,如果你正在做直接键/值请求(理想的是总是能够计算你需要的键,而不是做索引或搜索),Riak可以支持非常繁重的流量负载,所以我不建议花太多时间创建替代存储机制,除非你知道你将面临延迟问题。