时间序列记录/统计 - 可扩展的解决方案

时间:2013-05-23 02:14:47

标签: java mongodb scalability key-value nosql

通常查询数据库或日志文件的正常运行时间信息或每个给定时间间隔的请求数。

随着您收集越来越多的数据,SQL查询或日志爬网变得越来越慢(想象一下1000万个表行/日志行)。

典型问题:

  • 我们在过去x个月内处理了多少个任务?
  • 过去X时段我们服务的可用性是多少?
  • 过去一小时的平均请求数是否高于过去1天的平均值?

我想使用一些键值存储:许多具有不同自动过期的存储桶 - 所以我们可以查看例如10分钟/ 1小时/ 1天水桶并在那里总结所有项目并自豪地说“在最后10分钟我们处理了10 ^ 6个请求”。

我确信MongoDB或Redis在存储桶中提供时间到期 - 我只是有点担心实现是否会直截了当。

你会如何解决这个问题?你知道更好的工具吗?

(我们的项目是用java和python编写的)

3 个答案:

答案 0 :(得分:0)

我建议采用不同的概念方法......

让我们假设您有一个记录请求的日志表。以下是我将如何解决报告日志数据的问题:

  1. 开始将日志数据存储在表格中。
  2. 一旦日志表达到100万条记录,您就可以将整个表格发送到数据仓库。基本上“归档”数据,以便稍后查询速度较慢。
  3. 使您刚归档的数据脱机聚合快照。运行一个能找到你正在寻找的数字的工作。
  4. 编写代码以合并实时查询,并且 - 如果需要 - 存档查询。
  5. 全局的想法是,日志数据一旦完成就是静态的。您可以对数据运行一次聚合,它将永远不会更改。那为什么每次都是实时的呢?

    您希望将实时数据设置得非常小而且快速。较旧的数据要么对已知聚合进行快速查找,要么处理时间更长。

答案 1 :(得分:0)

CouchDB二级索引/视图在O(log n) time中公开您的数据,并且无需实现和交互,因为整个事情都位于RESTful HTTP API之后。看看:

  • 一个辅助索引会在创建日志事件时将其记录为索引,并使用内置_count reduce函数将其减少为计数。
  • 另一个辅助索引可能仅索引指示停机时间或正常运行时间或500秒或独角兽的日志事件。关键是,它们都像是以对数方式运行的3行函数。
  • 通过startkey=[timestamp for X days ago]查询,您可以只计算自那时起的日志条目。
  • 通过查询reduce=false,您可以自行返回日志条目,并按创建日期键入。
  • 使用其他内置缩减功能(如_stats)来获取有关日志的统计信息。

CouchDB具有JavaPython的客户端库,但最终只是一个RESTful HTTP API,所以任何HTTP库都应该这样做。

答案 2 :(得分:0)

您可以使用RDDTool。 http://oss.oetiker.ch/rrdtool/ IT是一个非常有用的库,用于记录时间序列数据并使用它们创建图形。