postgresql 查询序列_时间序列数据库(TSDB)初识与选择

作者:码哥字节 如需转载联系我的公众号

背景

这两年互联网行业掀着一股新风,总是听着各种高大上的新名词。大数据、人工智能、物联网、机器学习、商业智能、智能预警啊等等。

以前的系统,做数据可视化,信息管理,流程控制。现在业务已经不仅仅满足于这种简单的管理和控制了。数据可视化分析,大数据信息挖掘,统计预测,建模仿真,智能控制成了各种业务的追求。

“所有一切如泪水般消失在时间之中,时间正在死去“,以前我们利用互联网解决现实的问题。现在我们已经不满足于现实,数据将连接成时间序列,可以往前可以观其历史,揭示其规律性,往后可以把握其趋势性,预测其走势。

于是,我们开始存储大量时间相关的数据(如日志,用户行为等),并总结出这些数据的结构特点和常见使用场景,不断改进和优化,创造了一种新型的数据库分类——时间序列数据库(Time Series Database).

时间序列模型

时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。

每个时序点结构如下:

  • timestamp: 数据点的时间,表示数据发生的时间。
  • metric: 指标名,当前数据的标识,有些系统中也称为name。
  • value: 值,数据的数值,一般为double类型,如cpu使用率,访问量等数值,有些系统一个数据点只能有一个value,多个value就是多条时间序列。有些系统可以有多个value值,用不同的key表示
  • tag: 附属属性。

4b3108526d24e38bdf92e276d66a27f6.png

实现

比如我想记录一系列传感器的时间序列数据。数据结构如下:

* 标识符:device_id,时间戳
* 元数据:location_id,dev_type,firmware_version,customer_id
* 设备指标:cpu_1m_avg,free_mem,used_mem,net_rssi,net_loss,电池
* 传感器指标:温度,湿度,压力,CO,NO2,PM10

如果使用传统RDBMS存储,建一张如下结构的表即可:

d5d66657e88228ac1270fd1be7015ee8.png

如此便是一个最简单的时间序列库了。但这只是满足了数据模型的需要。我们还需要在性能,高效存储,高可用,分布式和易用性上做更多的事情。

大家可以思考思考,如果让你自己来实现一个时间序列数据库,你会怎么设计,你会考虑哪些性能上的优化,又如何做到高可用,怎样做到简单易用。

Timescale

这个数据库其实就是一个基于传统关系型数据库postgresql改造的时间序列数据库。了解postgresql的同学都知道,postgresql是一个强大的,开源的,可扩展性特别强的一个数据库系统。

于是timescale.inc开发了Timescale,一款兼容sql的时序数据库, 底层存储架构在postgresql上。 作为一个postgresql的扩展提供服务。其特点如下:

基础:

  • PostgreSQL原生支持的所有SQL,包含完整SQL接口(包括辅助索引,非时间聚合,子查询,JOIN,窗口函数)
  • 用PostgreSQL的客户端或工具,可以直接应用到该数据库,不需要更改。
  • 时间为导向的特性,API功能和相应的优化。
  • 可靠的数据存储。

扩展:

  • 透明时间/空间分区,用于放大(单个节点)和扩展
  • 高数据写入速率(包括批量提交,内存中索引,事务支持,数据备份支持)
  • 单个节点上的大小合适的块(二维数据分区),以确保即使在大数据量时即可快速读取。
  • 块之间和服务器之间的并行操作

劣势:

  • 因为TimescaleDB没有使用列存技术,它对时序数据的压缩效果不太好,压缩比最高在4X左右
  • 目前暂时不完全支持分布式的扩展(正在开发相关功能),所以会对服务器单机性能要求较高

其实大家都可以去深入了解一下这个数据库。对RDBMS我们都很熟悉,了解这个可以让我们对RDBMS有更深入的了解,了解其实现机制,存储机制。在对时间序列的特殊化处理之中,我们又可以学到时间序列数据的特点,并学习到如何针对时间序列模型去优化RDBMS。

之后我们也可以写一篇文章来深入的了解一下这个数据库的特点和实现。

Influxdb

Influxdb是业界比较流行的一个时间序列数据库,特别是在IOT和监控领域十分常见。其使用go语言开发,突出特点是性能。

特性:

  • 高效的时间序列数据写入性能。自定义TSM引擎,快速数据写入和高效数据压缩。
  • 无额外存储依赖。
  • 简单,高性能的HTTP查询和写入API。
  • 以插件方式支持许多不同协议的数据摄入,如:graphite,collectd,和openTSDB
  • SQL-like查询语言,简化查询和聚合操作。
  • 索引Tags,支持快速有效的查询时间序列。
  • 保留策略有效去除过期数据。
  • 连续查询自动计算聚合数据,使频繁查询更有效。

Influxdb已经将分布式版本转为闭源。所以在分布式集群这块是一个弱点,需要自己实现。

OpenTSDB

The Scalable Time Series Database. 打开OpenTSDB官网,第一眼看到的就是这句话。其将Scalable作为其重要的特点。OpenTSDB运行在Hadoop和HBase上,其充分利用HBase的特性。通过独立的Time Series Demon(TSD)提供服务,所以它可以通过增减服务节点来轻松扩缩容。

ace98944569f95d3ac872164d8108aa8.png
  • Opentsdb是一个基于Hbase的时间序列数据库(新版也支持Cassandra)。
    其基于Hbase的分布式列存储特性实现了数据高可用,高性能写的特性。受限于Hbase,存储空间较大,压缩不足。依赖整套HBase, ZooKeeper
  • 采用无模式的tagset数据结构(sys.cpu.user 1436333416 23 host=web01 user=10001)
    结构简单,多value查询不友好
  • HTTP-DSL查询

OpenTSDB在HBase上针对TSDB的表设计和RowKey设计是值得我们深入学习的一个特点。有兴趣的同学可以找一些详细的资料学习学习。

Druid

Druid是一个实时在线分析系统(LOAP)。其架构融合了实时在线数据分析,全文检索系统和时间序列系统的特点,使其可以满足不同使用场景的数据存储需求。

  • 采用列式存储:支持高效扫描和聚合,易于压缩数据。
  • 可伸缩的分布式系统:Druid自身实现可伸缩,可容错的分布式集群架构。部署简单。
  • 强大的并行能力:Druid各集群节点可以并行地提供查询服务。
  • 实时和批量数据摄入:Druid可以实时摄入数据,如通过Kafka。也可以批量摄入数据,如通过Hadoop导入数据。
  • 自恢复,自平衡,易于运维:Druid自身架构即实现了容错和高可用。不同的服务节点可以根据响应需求添加或减少节点。
  • 容错架构,保证数据不丢失:Druid数据可以保留多副本。另外可以采用HDFS作为深度存储,来保证数据不丢失。
  • 索引:Druid对String列实现反向编码和Bitmap索引,所以支持高效的filter和groupby。
  • 基于时间分区:Druid对原始数据基于时间做分区存储,所以Druid对基于时间的范围查询将更高效。
  • 自动预聚合:Druid支持在数据摄入期就对数据进行预聚合处理。

Druid架构蛮复杂的。其按功能将整个系统细分为多种服务,query、data、master不同职责的系统独立部署,对外提供统一的存储和查询服务。其以分布式集群服务的方式提供了一个底层数据存储的服务。

810f3b12dbdcf5fa80452bbf4b2139ff.png

Druid在架构上的设计很值得我们学习。如果你不仅仅对时间序列存储感兴趣,对分布式集群架构也有兴趣,不妨看看Druid的架构。另外Druid在segment(Druid的数据存储结构)的设计也是一大亮点,既实现了列式存储,又实现了反向索引。

Elasticsearch

Elasticsearch 是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名。

Elasticsearch以ELK stack被人所熟知。许多公司基于ELK搭建日志分析系统和实时搜索系统。之前我们在ELK的基础上开始开发metric监控系统。即想到了使用Elasticsearch来存储时间序列数据库。对Elasticserach的mapping做相应的优化,使其更适合存储时间序列数据模型,收获了不错的效果,完全满足了业务的需求。后期发现Elasticsearch新版本竟然也开始发布Metrics组件和APM组件,并大量的推广其全文检索外,对时间序列的存储能力。真是和我们当时的想法不谋而合。

Elasticsearch的时序优化可以参考一下这篇文章:《elasticsearch-as-a-time-series-data-store》

也可以去了解一下Elasticsearch的Metric组件:Elastic Metrics

Beringei

Beringei是Facebook在2017年最新开源的一个高性能内存时序数据存储引擎。其具有快速读写和高压缩比等特性。

2015年Facebook发表了一篇论文《Gorilla: A Fast, Scalable, In-Memory Time Series Database 》,Beringei正是基于此想法实现的一个时间序列数据库。

Beringei使用Delta-of-Delta算法存储数据,使用XOR编码压缩数值。使其可以用很少的内存即可存储下大量的数据。

如何选择一个适合自己的时间序列数据库

  • Data model
    时间序列数据模型一般有两种,一种无schema,具有多tag的模型,还有一种name、timestamp、value型。前者适合多值模式,对复杂业务模型更适合。后者更适合单维数据模型。
  • Query language
    目前大部分TSDB都支持基于HTTP的SQL-like查询。
  • Reliability
    可用性主要体现在系统的稳定高可用上,以及数据的高可用存储上。一个优秀的系统,应该有一个优雅而高可用的架构设计。简约而稳定。
  • Performance
    性能是我们必须考虑的因素。当我们开始考虑更细分领域的数据存储时,除了数据模型的需求之外,很大的原因都是通用的数据库系统在性能上无法满足我们的需求。大部分时间序列库倾向写多读少场景,用户需要平衡自身的需求。下面会有一份各库的性能对比,大家可以做一个参考。
  • Ecosystem
    我一直认为生态是我们选择一个开源组件必须认真考虑的问题。一个生态优秀的系统,使用的人多了,未被发现的坑也将少了。另外在使用中遇到问题,求助于社区,往往可以得到一些比较好的解决方案。另外好的生态,其周边边界系统将十分成熟,这让我们在对接其他系统时会有更多成熟的方案。
  • Operational management
    易于运维,易于操作。
  • Company and support
    一个系统其背后的支持公司也是比较重要的。背后有一个强大的公司或组织,这在项目可用性保证和后期维护更新上都会有较大的体验。

性能对比

TimescaleInfluxDBOpenTSDBDruidElasticsearchBeringeiwrite(single node)15K/sec470k/sec32k/sec25k/sec30k/sec10m/secwrite(5 node)128k/sec100k/sec120k/sec

总结

可以按照以下需求自行选择合适的存储:

  • 小而精,性能高,数据量较小(亿级): InfluxDB
  • 简单,数据量不大(千万级),有联合查询、关系型数据库基础:timescales
  • 数据量较大,大数据服务基础,分布式集群需求: opentsdb、KairosDB
  • 分布式集群需求,olap实时在线分析,资源较充足:druid
  • 性能极致追求,数据冷热差异大:Beringei
  • 兼顾检索加载,分布式聚合计算: elsaticsearch
  • 如果你兼具索引和时间序列的需求。那么Druid和Elasticsearch是最好的选择。其性能都不差,同时满足检索和时间序列的特性,并且都是高可用容错架构。

最后

之后我们可以来深入了解一两个TSDB,比如Influxdb,OpenTSDB,Druid,Elasticsearch等。并可以基于此学习一下行存储与列存储的不同,LSM的实现原理,数值数据的压缩,MMap提升读写性能的知识等。

链接:

十分钟了解Apache Druid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

concurrenthashmap实现原理_Mybatis:PageHelper分页插件源码及原理剖析

PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件,其实我并不想加上好用两个字,但是为了表扬插件作者开源免费的崇高精神,我毫不犹豫的加上了好用一词作为赞美。原本以为分页插件,应该是很简单的,然而PageH…

计算机网络dst,计算机网络基础课程—Socket接口

什么是TCP/IP------本课程的主要部分TCP/IP如何工作-----TCP/IP软件结构与实现如何用TCP/IP-------TCP/IP应用程序编程接口前面说过,TCP/IP标准并不指定应用程序与TCP/IP协议软件的接口,但并不是说没有提供任何指导,首先,它指定了…

python输入圆的半径公式_[图文]铁路曲线正矢的计算公式

一、圆曲线正矢的计算1.1 圆曲线正矢的计算公式取圆曲线上两点拉一直线,叫做弦。弦上任意点至曲线上的垂直距离叫矢或叫矢距。在弦中央点的矢距叫正矢(下图)。AB一弦;AC、CB一半弦;CD一正矢;EF一矢距正矢计算公式为其中: f-正矢 C-弦长 R-半径 式中单位均为m。公式用文字表示即…

docker 安装nacos_康过来!Nacos配置和管理微服务的使用

Nacos 具有如下特性:服务发现和服务健康监测:支持基于DNS和基于RPC的服务发现,支持对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求;动态配置服务:动态配置服务可以让您以中心化、外部化和动态化的方式管…

matlab中如何调用gpu进行并行计算_极致安卓-Termux/Aid learning开启WebGL手机GPU并行计算...

在我的之前的测评中,我利用Termux和Aid Learning测试过基于C/C的openmp并行程序,基于Java的并行程序,还有基于MPI以及基于Java的分布式集群并行。但是很遗憾,一直无法成功开发基于OpenCL的GPU并行编程。这是主要是因为Android并没…

python默认编码方式_关于设置python默认编码方式的问题

2019-8-27 07:45:36 本帖最后由 傻纸 于 2019-8-27 10:02 编辑 查了一会资料得出的结论是如果你用的是python3.x,那么就最好别去设置sys.defaultencoding或者sys.stdout.encoding 记住在需要编码的时候用encode,解码的时候decode就可以了。。。 这个问题…

计算机科学与技术是属于什么学科,计算机科学与技术专业属于什么大类 属于哪个学科...

近日,有很多人咨询小编计算机科学与技术专业属于什么大类 属于哪个学科?现在小编统一回复一下大家计算机科学与技术专业属于工学类,下面是关于计算机科学与技术专业详细的介绍。1计算机科学与技术专业门类及学科介绍专业名称专业代码门类学科…

matlab imread_MATLAB图像处理:29:在几何变换输出中指定填充值

本示例说明如何指定imwarp执行几何变换时使用的填充值。执行转换时,输出图像中通常会有一些像素不属于原始输入图像。必须为这些像素分配一些值,称为填充值。默认情况下,imwarp将这些像素设置为零,并显示为黑色。使用FillValues参…

micopython 18b20_MicroPython控制8*8LED点阵显示温度

MicroPython顾名思义就是可以在单片机上跑的Python,借助Micro Python,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,比如说控制LED灯泡、LCD显示器、读取电压、控制电机、访问SD卡等。目前支持MicroPython的开发板有好几种&#…

ip变更会影响账号登陆吗_【教程】PUBG账号被盗导致封禁申诉解封教程

很多朋友询问PUBG在被盗号后被盗号者开挂导致永封该如何申诉解封,现在结合一些玩家被盗号及成功申诉的经历,详列一下步骤。本方法只适用于被盗后开挂导致封禁的账号,那些自己开挂被封的孤儿不用往下看了。一.先向steam客服申诉 找回自己的ste…

滤镜怎么调_手机、电脑怎么剪辑视频?真心求推荐实用工具

自从加入了短视频自媒体运营这个行业以后,我就开始接触到各种各样的手机、电脑视频剪辑、制作软件,用它们来处理、完成被安排到的工作任务。很多时候,我也用它们来剪视频,借此来练练手、积累下素材。记得刚进入这个行业的时候&…

2021计算机基础知识题库,2021~2021计算机基础知识练习题

2021~2021计算机基础知识练习题 2021~2021计算机基础知识练习题 北京联合大学 2021~2021计算机基础知识练习题 一、选择题 1.记录在存储介质上的一组相关信息的集合称为______。 A)程序 B)磁盘 C)软件 D)文件 2.当一个文件更名后,文件的内容会______。 A)完全消失 B…

计算机背板知识,你知道背板的选购技巧吗?

原标题:你知道背板的选购技巧吗?背板就是母板,子板插在上面构成系统,计算机背板说成背板也成立,只不过背板更多的知识线路板而已,没有实际的器件,只起信号通路作用。背板在设备机箱的后面。一般…

git 切换分支_git 入门教程之分支总览

分支就是一条独立的时间线,既有分支,必有主干,正如一棵树谈到树枝,必有树干一样的道理.我们先前对git 的全部操作默认都是在主干上进行的,这个主干也是一种特殊的分支,名为 master 分支.无论是穿越历史还是撤销更改,我们都或多或少接触过时间线,git 管理的版本串在一起就组成了…

正在锁定计算机 win7转圈圈打不开,Win7网络连接图标一直转圈的原因和解决方法...

Win7网络连接图标一直转圈是什么情况?如果用户发现Win7系统中的网络图标一直处在转圈状态,则表示该网络不能正常加载,且无法识别,笔者通过检查发现网络依赖的服务Network List Service没有自动启动,启动之后可解决该问…

jvm内存模型和java内存模型_JVM运行时内存模型综述

JVM内存模型JVM分为五个区域:虚拟机栈、本地方法栈、方法区、堆、程序计数器。JVM不同区域的占用内存大小不同,一般情况下堆最大,程序计数器较小。JVM五个区中虚拟机栈、本地方法栈、程序计数器为线程私有,方法区和堆为线程共享区…

getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...

喜欢的可以收藏转发加关注“函数重载”指的是可以有多个同名的函数,因此 名称进行了重载。这两个术语指的是同一回事,但我们通常使用函数重载。可以通过函数重载来设计• 系列函数——它们完成相同的工作,但使用不同的参数列表。重载函数就像…

公关文秘专业要学计算机,文秘相关专业有哪些

文秘相关专业有哪些引导语:想必大多数人对文秘这个岗位都不陌生,那么与文秘相关专业有哪些呢?接下来是小编为你带来收集整理的文章,欢迎阅读!一、中文类专业:中文及相关专业主要包括汉语言文学、汉语言、中…

java seek指针 换行符_Java网络编程探究|乐字节

大家好,我是乐字节小乐,上次给大家讲述了Java中的IO流之输出流|乐字节,本文将会给大家讲述网络编程。主要内容如下:网络 网络分层 IP位置 端口port 网络编程一、 网络 1、概念网络即将不同区域的电脑连接到一起, 组成局…

switch 条件判断_C语言学习第7篇---C语言三大结构之一判断结构

if语句分析1.if语句用于根据条件选择执行语句2.else不能独立存在且总是与它最近的if想匹配3.else语句后可以接其他if语句if语句中零值比较的注意点---bool型变量应该直接出现在条件中,不要进行比较---变量和0值进行比较时,0值应该出现在比较符合左边---f…