时间序列数据管理对于组织中的数据分析启动至关重要。时间序列数据的示例是股票价格或CPU性能指标。
诸如RedisTimeSeries之类的专用时间序列数据库可以满足处理时间序列数据的需求,并且还消除了关系数据库所施加的限制。
其他专门用于时间序列数据的数据库包括InfluxDB和Prometheus。
通过将Grafana与RedisTimeSeries集成,您可以实时放大或缩小图表。
时间序列数据被广泛定义为按时间顺序存储的一系列数据。时间序列数据的示例范围很广,从多年的股价到过去几小时的CPU性能指标。时间序列数据已在许多垂直行业中广泛使用。它已经建立了自己的数据库类别,因为关系数据库,面向文档的数据库和流式数据库无法满足这种特定类型的数据的需求。

时序数据的特征
由于其独特的特性(在下面列出),与其他数据库一起管理时,时序数据通常效率低下:

高速数据摄取:无论是物联网用例还是市场分析数据,您都有稳定的数据流,这些数据流是高速且经常突发的。对于大多数解决方案,数据是一年365天,每天24/7到达。

不变的数据:数据点一旦插入数据库,就不会发生任何更改,直到它过期或删除。数据通常是带有时间戳和几个数据点的日志数据。

非结构化标签:时间序列数据通常是由许多来源在很长一段时间内连续产生的。例如,在IoT用例中,每个传感器都是时间序列数据的来源。在这种情况下,序列中的每个数据点都将源信息和其他传感器测量结果存储为标签。来自每个来源的数据标签可能不符合相同的结构或顺序。

随时间推移的价值递减:将来只有适当时间范围内的汇总数据摘要才有意义。例如,从现在开始的一年内,大多数用户将不需要以毫秒为单位存储的每个数据点。在这种情况下,只有在一分钟,一小时或一天之内汇总和概括的数据才有意义。

查询是按时间间隔汇总的:基于时间序列数据的图表使您可以放大和缩小。他们通过按时间间隔汇总数据来做到这一点。通常,时间序列数据查询是聚合。这与从数据库检索单个记录相反。
将传统数据库用于时间序列用例的问题
许多解决方案仍将时间序列数据存储在关系数据库中。这种方法有很多缺点,因为关系数据库:

针对事务用例进行了设计和优化。

承担不变的时序数据不需要的锁定和同步开销。这将导致提取和查询的性能均低于要求的性能。然后,企业最终会投资购买更多的计算资源以进行扩展。

对标签强制使用刚性结构,并且不能容纳非结构化数据。

需要计划的作业以清理旧数据。

用于多个用例。过度使用运行时间序列查询可能会影响其他工作负载。
重新思考时间序列数据库
相关赞助内容
服务机器学习模型:体系结构,流处理引擎和框架指南
设计反应系统:角色在分布式体系结构中的作用(由O’Reilly撰写)
使用Java的高性能微服务
混沌工程指南:提高金融服务的可靠性
O’Reilly电子书:Kubernetes最佳实践-立即下载
相关赞助商

CockroachDB-地球上发展最快的云原生分布式SQL数据库。
开始免费试用。

专门构建的时间序列数据库可满足处理时间序列数据的需求。它还消除了关系数据库所施加的限制。RedisTimeSeries专门用于大规模收集,管理和交付时序数据。它提供:

快速的数据提取:作为一个内存数据库,RedisTimeSeries每秒可以在标准节点上提取超过500,000条记录。我们的基准测试表明,使用16个Redis分片集群,您每秒可以摄取超过1150万条记录。

资源效率:使用RedisTimeSeries,您可以通过下采样为压缩数据添加规则。例如,如果您一天收集了超过十亿个数据点,则可以每分钟汇总一次数据以便对数据进行下采样,从而将数据集的大小减小为24 * 60 = 1,440个数据点。您也可以设置数据保留策略,并在不再需要它们时按时间使数据过期。

图1:使用时间序列数据库进行下采样和聚合

简单,快速的查询:RedisTimeSeries允许您按平均值,最小值,最大值,总和,计数,范围,第一个和最后一个来聚合数据。您每秒可以运行100,000多个聚合查询,并且延迟时间不到1毫秒。您还可以在特定时间范围内对标签执行反向查找。
一些专门用于时间序列数据的数据库包括Influx DB和Prometheus。

典型的时间序列数据库通常仅用于管理时间序列数据,因此它所面临的挑战之一是用例,这些用例需要在时间序列数据之上进行某种计算。一个示例是在时间序列数据库中捕获实时视频提要。如果要为面部识别应用某种AI模型,则必须提取时间序列数据,应用某种数据转换然后进行计算。这对于实时用例而言并不理想。还可以管理其他数据模型的多模型数据库解决了这些用例,在这些用例中可以就地操纵多个数据模型。

RedisTimeSeries快速入门指南
使用RedisTimeSeries最快的方法是将其作为数据源添加到Grafana仪表板。在本文的下一部分中,我将指导您如何将示例时间序列数据加载到RedisTimeSeries中以及如何在Grafana仪表板中查看数据。

我选择使用Grafana面板上的图表来比较苹果公司(AAPL)和英特尔公司(INTC)过去19年的股价表现:

图2:使用RedisTimesSeries和Grafana比较Apple和Intel股票的性能

我的RedisTimeSeries设置
我首先从GitHub下载RedisTimeSeries源代码并在本地构建它。然后,使用以下命令将“ .so”文件导入Redis:

MODULE LOAD [path to]/redistimeseries.so
我还可以通过在redis.conf中插入以下命令来加载模块:

loadmodule [path to]/redistimeseries.so
如果您更喜欢使用Docker,可以通过发出以下命令来尝试一下:

docker run -p 6379:6379 -it --rm redislabs/redistimeseries
Redis服务器启动后,我通过运行“模块列表”来检查Redis是否已成功加载模块。瞧,“时间序列”被列为模块之一:

127.0.0.1:6379> module list

  1. “name”
  2. “timeseries”
  3. “ver”
  4. (integer) 200
    样本数据集:超过19年的股市数据
    我从《华尔街日报》下载了AAPL和INTC的每日股票价格。该文件包含csv(逗号分隔值)格式的2000年至今的价格。以下是有关AAPL的一些示例数据:
2006-01-03,10.34,10.68,10.32,10.68,201853036,AAPL
 2006-01-04,10.73,10.85,10.64,10.71,155225609,AAPL
 2006-01-05,10.69,10.7,10.54,10.63,112396081,AAPL
 2006-01-06,10.75,10.96,10.65,10.9,176139334,AAPL
 2006-01-09,10.96,11.03,10.82,10.86,168861224,AAPL
 2006-01-10,10.89,11.7,10.83,11.55,570088246,AAPL
 2006-01-11,11.98,12.11,11.8,11.99,373548882,AAPL
 2006-01-12,12.14,12.34,11.95,12.04,320201966,AAPL
 2006-01-13,12.14,12.29,12.09,12.23,194153393,AAPL
 2006-01-17,12.24,12.34,11.98,12.1,209215265,AAPL
 接下来,我编写了一个Python脚本将这些数据导入RedisTimeSeries:import sys
 import csv
 import time
 import redisif(len(sys.argv) > 1):
 ticker = str(sys.argv[1])
 else:
 ticker = ‘test’file = ticker + ‘.csv’
r = redis.Redis(host=‘localhost’, port=6380, db=0)
with open(file) as csv_file:
 csv_reader = csv.reader(csv_file, delimiter=",")
 r.execute_command(“ts.create stock:”+ticker);
 count = 0
 for row in csv_reader:
 time_tuple = time.strptime(row[0], ‘%Y-%m-%d’)
 time_epoch = time.mktime(time_tuple)*1000
 r.execute_command(“ts.add stock:”+ticker+" “+str(int(time_epoch))+” "+row[1])
 count = count + 1print(f’Imported {count} lines’)


如您所见,我使用RedisTimeSeries的TS.CREATE命令来建立新的时间序列数据结构,并使用其TS.ADD命令来填充该数据结构。对于符号AAPL,此程序创建了一个称为stock:aapl的数据结构。添加数据的示例命令如下所示:

TS.ADD stock:aapl 1513324800000 173.04
接下来,我运行TS.RANGE来验证数据。请注意,此查询中使用的时间戳以毫秒为单位。

127.0.0.1:6379> TS.RANGE stock:aapl 1513324800000 1514324800000 aggregation avg 1
1. (integer) 1513324800000
2. “173.63”
3. (integer) 1513584000000
4. “174.88”
5. (integer) 1513670400000
6. “174.99000000000001”
7. (integer) 1513756800000
8. “174.87”
9. (integer) 1513843200000
10. “174.16999999999999”
11. (integer) 1513929600000
12. “174.68000000000001”
13. (integer) 1514275200000
14. “170.80000000000001”

  1. 在下一步中,我将解释如何使用Grafana查看和比较股票价格。

在Grafana中查看RedisTimeSeries数据
在本节中,我将逐步介绍如何安装Grafana以及如何使用SimpleJSON数据连接器从RedisTimeSeries读取数据。为此,我开发了一个新的SimpleJSON数据源应用程序。这是一个基于HTTP的中介Node.js应用程序,可将SimpleJSON调用转换为Redis调用,并将RedisTimeSeries数据转换为JSON数据。

步骤1:安装Grafana
首先,我使用自制工具在Mac上安装了Grafana(如果您使用的是PC,请按照Grafana的说明手册进行安装和设置)。我运行以下命令来启动并运行Grafana:

$ brew install grafana
$ brew services start grafana
==> Successfully started grafana (label: homebrew.mxcl.grafana)
随着Grafana现在在端口3000上运行,我可以使用http:// localhost:3000登录。

步骤2:开发和运行SimpleJSON数据源应用程序
Grafana带有一个称为SimpleJSON的内置数据源连接器,该连接器使用支持“ /”,“ / search”和“ / query”的HTTP服务器连接到任何应用程序。由于RedisTimeSeries还没有自己的连接器,因此我开发了一个新的Node.js应用程序,该应用程序支持HTTP协议以及对SimpleJSON数据源应用程序的必需查询。您可以从GitHub下载我的代码,然后在本地Node.js环境中运行它。

SimpleJSON数据源应用程序中的每个HTTP查询都有其独特的用途,我针对每个程序使用以下设计原则来开发程序:

1.“ /”:这是默认请求,应以任意消息响应。它用于测试连接(如ping测试)。

2.“ / search”:这应该返回保存时间序列数据的键的列表。(对于其他数据库,这可能是表名列表而不是键,但是由于Redis是键值存储,因此我们返回时间序列的特殊类型的键列表)。

为了获得此键列表,我使用了更安全的“ SCAN”命令而不是“ KEYS”。对于每个键,我检查了键的类型是否为“ TSDB-TYPE”,这是我们用于时间序列键的内部名称。该程序维护该类型的所有键的数组,并以JSON格式返回该数组。

3.“ / query”:查询命令接收输入参数,包括键列表,开始时间,结束时间和存储时间。该应用程序根据输入命令以JSON格式返回时间序列数据。

还有第四个HTTP请求,称为“ / annotations”,但对于此示例应用程序,我不需要该请求。

准备好代码后,便运行了节点应用程序。该示例代码在端口3333上侦听HTTP请求,因此我可以在浏览器中通过调用http:// localhost:3333对其进行测试。它返回:“我正在寻找你!”

步骤3:将Grafana与RedisTimeSeries连接
这是所有步骤中最简单的。登录到Grafana后,我通过转到“配置”>“数据源”,然后单击“添加数据源”来添加数据源。

我搜索了SimpleJSON选项并选择了它。

这打开了一个配置屏幕,我在其中输入URL以连接到我的Node.js应用程序。

现在已经配置了数据源,可以将新面板添加到仪表板中。在此示例中,我添加了一个面板,其中包含两个查询:一个针对每个股票报价器的时间序列查询。如图所示,我的查询的下拉菜单已经填充了时间序列键stock:aapl和stock:intc。选择时间序列键后,图表中也将填充数据。在后台,SimpleJSON连接器使用适当的查询(“ / search”和“ / query”)调用了我们的应用程序。

这是最终结果:一个查询RedisTimeSeries的Grafana面板。设置RedisTimeSeries并将其与Grafana连接非常简单。

总之,RedisTimeSeries结合了Redis的所有优点和专用的时间序列数据库。它可以通过多种方式帮助您的业务,包括节省资源,支持更多最终用户以及通过轻松集成将应用程序更快推向市场。通过将Grafana与RedisTimeSeries集成,您可以实时放大或缩小图表。您还可以每秒处理更多查询,使您的仪表板在其面板中显示更多数据点。最重要的是,您可以添加更多面板,并为更多最终用户提供服务。