时间序列数据库 (TSDB)

这篇具有很好参考价值的文章主要介绍了时间序列数据库 (TSDB)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文档:时间序列数据库 TSDB_时间序列数据库 TSDB-阿里云帮助中心

什么是时序数据库

时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。数据可能来自服务器和应用程序的指标、物联网传感器的读数、网站或应用程序上的用户交互或金融市场上的交易活动等。

时序数据的主要数据属性如下:

  • 每个数据点都包含用于索引聚合采样的时间戳
  • 写多读少,高频写入,写入操作几乎是顺序添加,大多数时候数据到达后都以时间排序;
  • 多用于数据的汇总视图,数据汇总入库,时间段查询;

时序数据库相关名词解释

  • 度量 Metric:Metric 类似关系型数据库里的表(Table),代表一系列同类数据集合。
  • 标签 Tag:Tag 描述数据源的特征,通常不随时间变化,数据库内部会自动为 Tag 建立索引,支持根据 Tag 来进行多维检索查询,Tag 由 Key、Value 组成,两者均为 String 类型;
  • 时间戳 Timestamp:Timestamp 代表数据产生的时间点,可以写入时指定,也可由系统自动生成;
  • 量测值 Field:Field 描述数据源的量测指标,通常随着时间不断变化,且通常为可计算的数值;
  • 数据点 Data Point: 数据源在某个时间产生的某个量测指标值(Field Value)称为一个数据点,数据库查询、写入时按数据点数来作为统计指标;
  • 时间线 Time Series :数据源的某一个指标随时间变化,形成时间线,Metric + Tags 组合确定一条时间线;针对时序数据的计算包括降采样、聚合(sum、count、max、min等)、插值等都基于时间线维度进行;
  • 聚合( Aggregation):当同一个度量(Metric)的查询有多条时间线产生(多个指标采集设备),那么为了将空间的多维数据展现为成同一条时间线,需要进行合并计算。
  • 降采样(Downsampling):当查询的时间区间跨度较长而原始数据时间精度较细时,为了满足业务需求的场景、提升查询效率,就会降低数据的查询展现精度,这就叫做降采样,比如按秒采集一年的数据,按照天级别查询展现。

时间序列数据库,数据库,数据库,大数据

TSDB 技术支持与语法

参考文档:调用SDK写入数据_时间序列数据库 TSDB-阿里云帮助中心

客户端创建

TSDBConfig config = TSDBConfig
                // 配置地址,第一个参数可以是 TSDB 的域名或 IP。第二个参数表示 TSDB 端口。
                .address(host, port)
                // user和password 表示用于用户认证的用户名和密码。TSDB用户可在实例管理控制台创建。如果实例未启用用户鉴权功能,则创建Config对象时无需调用basicAuth()方法。
                .basicAuth(tsdbUser, basicPwd)
                // 只读开关,默认为 false。当 readonly 设置为 true 时,异步写开关会被关闭。
                .readonly(false)
                // 网络连接池大小,默认为64。
                .httpConnectionPool(connectPool)
                // HTTP 等待时间,单位为秒,默认为90秒。
                .httpConnectTimeout(timeOut)
                // HTTP连接存在时间长度。单位为秒。默认为0,即不生效,为长连接。建议设置为一个合理值,服务端故障恢复后,客户端通过重新建立连接可达到服务端负载均衡。
                .httpConnectionLiveTime(liveTime)
                // IO 线程数,默认为1。
                .ioThreadCount(1)
                // 异步写开关。默认为 true。推荐异步写。
                .asyncPut(true)
                // 异步写相关,客户端缓冲队列长度,默认为10000。
                .batchPutBufferSize(batchPutBufferSize)
                // 异步写相关,缓冲队列消费线程数,默认为 1。
                .batchPutConsumerThreadCount(batchPutConsumerThreadCount)
                // 异步写相关,每次批次提交给客户端点的个数,默认为 500。
                .batchPutSize(batchPutSize)
                // 异步写相关,每次等待最大时间限制,单位为 ms,默认为 300。
                .batchPutTimeLimit(batchPutTimeLimit)
                // 异步写相关,写请求队列数,默认等于连接池数。可根据读写次数的比例进行配置。
                .putRequestLimit(putRequestLimit)
                //多值写入相关配置
                .multiFieldBatchPutBufferSize(multiFieldBatchPutBufferSize)
                .multiFieldBatchPutConsumerThreadCount(multiFieldBatchPutConsumerThreadCount)
                // 流量限制,设置每秒最大提交 Point 的个数。
                .maxTPS(maxTps)
                // 多值写入回调函数
    	 		.listenMultiFieldBatchPut(multiFieldCallback)
                // 单值写入回调函数
                .listenBatchPut(callback)
                .config();
// 创建客户端
TSDB tsdb = TSDBClientFactory.connect(config):

写入数据

// 构造 Point
Point point = Point.metric("test1")
    .tag("tagk1", "tagv1")
    .tag("tagk2", "tagv2")
    .tag("tagk3", "tagv3")
    .timestamp(timestamp)
    .value(123.456)
    .build();

带回调可以获取:成功数、返回数和失败原因,不要在回调方法中做耗时操作;

同步写入

出于写入性能的考虑,同步写建议手动将数据点打包成一批数据,并且建议这批数据包含500~1000个数据点。此外,也建议多个线程并发进行提交;

空返回:tsdb.putSync(points)

摘要返回:tsdb.putSync(points, SummaryResult.class);

详情返回:tsdb.putSync(points, DetailsResult.class);

异步非阻塞写入

空返回:tsdb.put(points)

摘要返回:tsdb.put(points, BatchPutSummaryCallback.class);

详情返回:tsdb.put(points, BatchPutDetailsCallback.class)

查询数据:

同步查询

List<QueryResult> result = tsdb.query(query);
System.out.println("返回结果:" + result);

异步查询

QueryCallback callback = new QueryCallback() {
    @Override
    public void response(Query input, List<QueryResult> result) {
        System.out.println("查询参数:" + input);
        System.out.println("返回结果:" + result);
    }
};

tsdb.query(query, callback);

Query 查询语法

语法如下

Query query = Query
    .timeRange(startTime, endTime)    // 设置查询时间条件
     // 设置子查询1 简单查询
    .sub(SubQuery.metric("hello").aggregator(Aggregator.AVG).tag("tagk1", "tagv1").build())   
     // 设置子查询2 简单查询
    .sub(
        SubQuery subQuery = SubQuery
                .metric("test-metric")
                .aggregator(Aggregator.AVG)
                .downsample("60m-avg")
                .tag("tagk1", "tagv1")
                .tag("tagk2", "tagv2")
                .build();
    )     
	// 设置子查询3 复杂查询
    .sub(
        SubQuery subQuery = SubQuery
                .metric("test-metric")
                .aggregator(Aggregator.AVG)
                .downsample("60m-avg")
                .filter(Filter
                        .filter(FilterType.LiteralOr, "", "")
                        .build()
                )
                .build();
    )
    .build();

timeRange

左闭右闭,即包含开始事件,也包含结束事件;

FilterType 类别

LiteralOr:等于查询,或查询,类似 SQL 里的 IN 查询;

NotLiteralOr:等于查询,或查询,类似 SQL 里的 NOT IN 查询;

Wildcard:模糊匹配,类似 SQL 里的 like 查询;

Regexp:正则匹配;

aggregator 与 downsample

假设有以下数据,共四条时间线;

时间线计算方式 = Metric + Tags, 即 Metric + orgCode + portId + inOut;

time

数据组

Timestamp

orgCode

portId

inOut

value

19:10

1

1675077000000

123456

16604

8

20:10

2

1675080600000

123456

16604

12

21:10

3

1675084200000

123456

16601

IN

2

21:10

4

1675084200000

123456

16601

OUT

8

22:10

5

1675087800000

123456

16605

4

23:10

6

1675091400000

123456

16606

OUT

6

aggregator 聚合

用于控制返回时间线的多少,即 QueryResult 的条数

例如查询:

{
  "start": 1675077000000,
  "end": 1675091400000,
  "queries": [
    {
      "metric": "xx",
      "aggregator": "none",
      "tags": {
        "orgCode": "123456"
      }
    }
  ]
}

会返回 5 组时间线,即 1、2 一组,3、4、5、6 各一组,时间线计算方式如上图所示;

{"tags": {"orgCode": "123456", "portId": "16604"},"dps": {1675077000000: 8.0, 1675080600000: 12.0}},
{"tags": {"orgCode": "123456","inOut": "IN",  "portId": "16601"},"dps": {1675084200000: 2.0}},
{"tags": {"orgCode": "123456", "portId": "16605"},"dps": {1675087800000: 4.0}},
{"tags": {"orgCode": "123456","inOut": "OUT", "portId": "16606"},"dps": {1675091400000: 6.0}}
{"tags": {"orgCode": "123456","portId": "16601", "inOut": "OUT"},"dps": {1675084200000: 8.0}},

aggregator 的作用则是:将除查询 tag 外的其他时间线合并,当 Timestamp 相同时,则会用 aggregator 指定的算法计算,例如:

{
  "start": 1675077000000,
  "end": 1675091400000,
  "queries": [
    {
      "metric": "xx",
      "aggregator": "sum",
      "tags": {
        "orgCode": "123456"
      }
    }
  ]
}

返回 1 组时间线,因为 1、2、3、4、5 的 orgCode 都相同,会将 4 条时间合并,但 1675084200000 变成了 10,因为该时间点有两条数据,只是 tag 不同罢了,两条数据用了 sum:

{
  "aggregateTags": [
    "inOut",
    "portId"
  ],
  "dps": {
    1675077000000: 8.0,
    1675080600000: 12.0,
    1675084200000: 10.0,
    1675087800000: 4.0,
    1675091400000: 6.0
  },
  "tags": {
    "orgCode": "123456"
  }
}

downsample 降采样

用于控制返回时间线中数据点的多少,即 dps 的数

格式

[0all | (1)[ s | m | h | d ] ] - [ avg | sum | last | first | count | min | max .... ] [-none | null | zero ]

采样区间 区间操作 补全策略

采样区间计算方式:Timestamp - (Timestamp % Interval)

补全策略包括

    • none - 默认行为,在序列化期间不输出缺失值。
    • nan - 当序列中缺少所有值时,在序列化输出中输出NaN ,计算方式与 none 有类似。
    • null - 与NaN的行为相同,只是在序列化期间它会发出一个null,而不是一个NaN。
    • zero - 缺少时间戳时替换为零。零值将合并到汇总结果中。

例如

{
  "start": 1675077000000,    // 19:10
  "end": 1675091400000,			// 23:10
  "queries": [
    {
      "metric": "xx",
      "aggregator": "sum",
      "downsample": "2h-sum-none",
      "tags": {
        "orgCode": "123456"
      }
    }
  ]
}

返回 2 小时一个汇总,即 18:00、20:00、22:00,关于区间的计算上面已有解释:

    {
      "aggregateTags": [
        "inOut",
        "portId"
      ],
      "dps": {
        1675072800000: 8.0,
        1675080000000: 14.0,
        1675087200000: 10.0
      },
      "tags": {
        "orgCode": "123456"
      }
    }

注:此处的 dps 开始时间 1675072800000 是 2023-01-30 18:00:00,为什么不是查询的开始时间,因为 tsdb 的采样区间算法是 Timestamp - (Timestamp % Interval), 2023-01-30 19:10:00 - (2023-01-30 19:10:00 % 2h)= 2023-01-30 18:00:00,所以当使用采样时,往往计算的结果不准确,原因在这里;

其他接口支持:

以下参考文档:TSDB如何调用其他接口_时间序列数据库 TSDB-阿里云帮助中心

设置数据时效

tsdb.ttl(time);

查询 Metric,TagKey,TagValue

参数:(类型,模糊值,查询条数)

tsdb.suggest(Suggest.Metrics,"hel",10);

tsdb.suggest(Suggest.Tagk,"hel",10);

tsdb.suggest(Suggest.TagV,"hel",10);

TagKey 查 TagValue

参数:(类型,模糊值,查询条数)

tsdb.dumpMeta("tagk1","tagv1",10);

删除一段时间的数据

tsdb.deleteData("hello", startTime, nowTime);

删除指定时间线

Timeline timeline =Timeline.metric("hello").tag("tagk1","tagv1").build();

tsdb.deleteMeta(timeline);

清空所有表

tsdb.truncate()文章来源地址https://www.toymoban.com/news/detail-646282.html

到了这里,关于时间序列数据库 (TSDB)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 时间序列预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost时间序列预测,GWO-XGBoost时间序列预测模型,单列数据输入模型

    效果一览 文章概述 时间序列预测 | Matlab灰狼算法(GWO)优化极限梯度提升树XGBoost时间序列预测,GWO-XGBoost时间序列预测模型,单列数据输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码

    2024年02月13日
    浏览(54)
  • 【数据挖掘】时间序列教程【一】

            对于时间序列的研究,可以追溯到19世纪末和20世纪初。当时,许多学者开始对时间相关的经济和社会现象进行研究,尝试发现其规律和趋势。其中最早的时间序列研究可以追溯到法国经济学家易贝尔(Maurice Allais)和英国经济学家詹姆斯·克拉克(James Clark)的研

    2024年02月12日
    浏览(50)
  • 【数据挖掘】时间序列教程【五】

    (说明:本文接上回: 【数据挖掘】时间序列教程【四】_无水先生的博客-CSDN博客 )                 上面介绍的傅里叶变换的问题在于,无论是正弦/余弦回归模型形式还是复指数形式,它都需要 操作以计算所有傅里叶系数。有n 数据点和有n/2 可以计算傅里叶系数的

    2024年02月11日
    浏览(52)
  • 【数据挖掘】时间序列教程【四】

            我们可以对上述  的主模型采用方差分析方法,并将中的总变异分解为 为残差平方和和可归因于各种频率的变化。                 第二行是可能的,因为平方的所有交叉项都等于零,即对于所有 ,                                 

    2024年02月12日
    浏览(50)
  • 数据分析实战│时间序列预测

    时间序列预测问题是一类常见的数据分析问题。数据中往往包含时间标签,这类问题往往根据过去一段时间的数据,建立能够比较精确地反映序列中所包含的动态依存关系的数学模型,并对未来的数据进行预测。 本案例给出二战时期的某气象站温度记录值,通过分析之前的天

    2024年02月11日
    浏览(49)
  • 【数据挖掘】时间序列教程【九】

            状态空间模型通常试图描述具有两个特征的现象 有一个底层系统具有时变的动态关系,因此系统在时间上的“状态”t 与系统在时间的状态t−1有关 .如果我们知道系统在时间上的状态t−1 ,那么我们就有了 我们需要知道的一切 ,以便对当时的状态进行推断或预测

    2024年02月13日
    浏览(44)
  • 【数据挖掘】时间序列教程【十】

    上一节中描述的状态空间模型作为观测方程的更一般的公式            和状态方程                    这里是一个p×1 向量是一个k×1 向量,  是一个p×k 矩阵,  是k×k 矩阵。我们可以想到的和          给定初始状态 和 ,预测方程为(类似于上面)      

    2024年02月15日
    浏览(52)
  • 【数据挖掘】时间序列教程【八】

    我们先考虑一个简单的线性回归模型,                                          哪里 和是具有平均值的高斯过程 00 和自协方差 .现在,在不失去一般性的情况下,让我们假设 而那 瓦尔

    2024年02月12日
    浏览(46)
  • 时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集

    效果一览 文章概述 时间序列预测 | Matlab基于粒子群算法优化门控循环单元(PSO-GRU)的时间序列预测,PSO-GRU时间序列预测,单列数据集。

    2024年02月12日
    浏览(53)
  • 【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

    🚨注意🚨 :最近经粉丝反馈,发现有些订阅者将此专栏内容进行二次售卖,特在此声明,本专栏内容仅供学习,不得以任何方式进行售卖,未经作者许可不得对本专栏内容行使发表权、署名权、修改权、发行权、转卖权、信息网络传播权,如有违者,追究其法律责任。 👑

    2023年04月15日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包