0

查询数据库或日志文件以获取正常运行时间信息或每个给定时间间隔的请求数是很常见的。

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

典型问题:

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

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

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

你会如何解决这个问题?你知道更好的工具来完成这项任务吗?

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

4

3 回答 3

0

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

于 2013-06-15T18:00:18.957 回答
0

CouchDB二级索引/视图在O(log n) 时间内公开您的数据,并且由于整个事物位于 RESTful HTTP API 后面,因此实现和交互毫不费力。一探究竟:

  • 一个二级索引根据日志事件的创建时间为它们建立索引,并使用内置的_countreduce 函数将它们减少到一个计数。
  • 另一个二级索引可能只索引指示停机时间、正常运行时间、500 秒或独角兽的日志事件。关键是,它们都像对数运行的 3 行函数。
  • 通过使用 查询startkey=[timestamp for X days ago],您可以只计算从那一刻起的日志条目。
  • 通过使用 查询reduce=false,您可以返回日志条目本身,以创建日期为键。
  • 使用其他内置 reduce 函数_stats,例如获取有关日志的统计信息。

CouchDB 有JavaPython的客户端库,但归根结底只是一个 RESTful HTTP API,所以任何 HTTP 库都应该能做到这一点。

于 2013-05-30T22:35:05.693 回答
0

我会建议一种不同的概念方法......

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

  1. 开始在表中存储日志数据。
  2. 一旦日志表达到 100 万条记录,您就可以将整个表发送到数据仓库。基本上“存档”数据,以便较慢的查询可以在以后遇到它。
  3. 对刚刚归档的数据进行离线聚合快照。运行一项获得您正在寻找的数字的工作。
  4. 编写代码以合并实时查询和 - 如果需要 - 存档查询。

总体思路是日志数据在完成后是静态的。您可以对数据运行一次聚合,它永远不会改变。那么为什么每次都是实时的呢?

你想让你的实时数据变得非常小和快速。较旧的数据要么快速查找已知聚合,要么处理时间更长。

于 2013-05-28T21:01:55.983 回答