热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

fieldlist什么意思_时序数据库有什么不一样?

前言如今在万物互联(IoT)兴起的推动下,时间序列数据(衡量事物随时间变化的数据)应用和场景激增,是增长最快的数据类型之一,比如监控指标数

前言

如今在万物互联(IoT)兴起的推动下,时间序列数据(衡量事物随时间变化的数据)应用和场景激增,是增长最快的数据类型之一,比如监控指标数据,传感器数据,日志,财务分析等等;时间序列数据具有特定的特征,例如通常以时间顺序形式出现,数据只能附加,并且查询总是在一个时间间隔内进行。虽然关系数据库可以存储这些数据,但是它们在处理这些数据时效率低下,因为它们缺乏优化,例如按时间间隔存储和检索数据。在这个时序数据库项目列表页有超 50种方案,比如 Apache Kudu/Cassandra,ClickHouse, Druid, EasticSearch, HBase, InfluxDB,Prometheus,TimescaleDB,Amazon Redshift/Timestream(预览),Google BigQuery,Facebook Scuba 等等;

很多上规模的客户在时序数据的摄入(Ingest)、分析和成本方面都会遇到很多挑战,本文我们先尝试理解下时序数据的特殊性和数据库选型问题。

时序数据怎么不一样?

关系数据库(OLTP)的出现是为了解决交易事务问题,比如电商订单,支付等场景,也就是数据表的事务更新,比如转账交易,用户从一个账号转出,而在另外一个账户入账;这对应数据库两行甚至两个字段的更新;由于任何两个账号之间都可能发生转账,因此这些记录在磁盘上随机分布;再让我们看看时序数据的场景:

  • 虚拟机/容器/应用监控数据:系统通常会收集不同服务器、容器或应用的度量值,比如 CPU 利用率,可用内存,可用磁盘,网络传输字节总量,每秒请求数等等,每个指标都关联相关的时间戳,服务器 ID,和一组描述所收集内容的属性;

    { “name”: “server.requestCount”, “status”: “200”, “endpoint”: “api”, “nf.app”: “fooserver”, “nf.cluster”: “fooserver-main”, “nf.stack”: “main”, “nf.region”: “us-east-1”, “nf.zone”: “us-east-1c”, “nf.node”: “i-12345678” }

  • 传感器数据:每个设备可以在每个时间段报告多个传感器读数;例如对于空气和环境质量检测,可能包含,温度、湿度、气压、有害物质、颗粒物等等的测量值;每组数据都与时间戳、唯一设备ID相关联,并且可能有其他元数据。

  • 证券行情数据:用时间戳的信息流表示,包含证券代码,当前价格,价格变化等等

  • 车队/资产管理:数据包含车辆/资产ID,时间戳,GPS 坐标,及可能的元数据

以上所有的场景,数据集都是连续的测量值,不断产生“新数据”插入到数据库,虽然由于网络延迟,可能存在数据到达后端的时候,比数据生成标记的时间戳要晚很多,不过这种情况属于异常情况,发生频率比较少;

对比来看,OLTP事务处理的数据写入和时序数据的写入有很大差异:

OLTP事务写入时序数据写入
主要是更新主要是插入
数据随机分布热点集中在最新的时间段数据
通常是基于主键的事务操作除了时间戳之外,还关联其他主键比如服务器ID,设备ID,账号ID,设备ID等等

时序数据堆积非常迅速,而通常关系数据库无法很好的扩展,因此,大多数开发人员选择时序数据库倾向于扩展性更好的 NoSQL 方案。

关系数据库为什么无法满足时序数据的存取需求?

摘自 TimescaleDB 团队对 PostgreSQL 插入性能测试,可以看出数据插入吞吐量随着表数据量的增加而下降,该测试基于 PostgreSQL 9.6.2 版本,SSD 磁盘,8 vCPU 存储优化云主机,客户端每次插入一行数据,包含12列:时间戳,随机主ID和10个其他指标数据);PostrgreSQL 开始以 15K每秒的速度插入,但随后在 50M 行后开始明显下降,性能变化差异巨大,有时仅仅 100次每秒插入性能;

aed547c4c7831a5bc0d2f382bc8b514d.gif

这通常由关系数据库的特性决定的,关系数据库在磁盘上利用数据页来保存数据,比如 8KB大小单位,基于数据页,数据库系统构建数据结构比如 B+树,来快速索引和访问数据,利用索引,SQL 查询比如通过身份证ID 可以快速定位到磁盘上的数据,避免扫描整个数据表;如果整个索引比较小,可以全部放入内存操作,那性能非常好,但如果如果内存无法容纳所有的 B+树,更新树的一个随机部分,可能会导致严重影响性能的磁盘 I/O 操作,数据库系统需要从磁盘读取数据页到内存,在内存中更新,再写回磁盘;因此由于数据库系统以数据页为单位访问磁盘,哪怕很小的数据更新,都可能导致比如 8KB 大小的内存和磁盘的多次数据交换;

新型的 NoSQL 数据库比如 LevelDB、Cassandra,InfluxDB 等,为了避免低效的基于磁盘的 B+树索引数据结构(双倍的磁盘 I/O操作),引入了一种新型基于磁盘的 LSM(Log-Structure Merge)树结构,有效降低维护一个实时索引树的代价,提高了数据插入和删除效率,比较适合插入多于查询的场景比如历史记录表,日志表或时序数据;LSM 的优化逻辑是,减少碎片小数据写入操作,仅仅执行较大数据集及磁盘追加写入;与 B+数”就地“写入不一样,LSM 树将最近的更新包括删除操作排入内存队列(Sorted String Table-SSTable),当数据量足够大的时候,批量写回磁盘,这样就降低了磁盘 I/O 的成本;但 LSM 也引入一些弊端:

  • 更多内存需求:与 B+树不一样,LSM 树没有一个全局的排序树,因此基于个 Key 值进行一次查询变得复杂,首先,要检查内存中的 SSTable 是否有该 Key的最新值,否则还需要查询磁盘上的数据来定位到最新的 Key对应的数值;为了避免过多的磁盘 I/O 操作,所有的 SSTable的索引需要保存在内存中,这又增加了内存的需求;

  • 二级索引不支持:由于缺乏全局顺序,因此 LSM 树结构不支持二级索引;不同的系统做了一些变通,比如冗余复制一份数据但以不同的顺序存储,或者将主键构建为多个值的”串接“,等等;

两个典型时序数据库用户体验:TimescaleDB vs  InfluxDB

InfluxDB 是由 InfluxData 创建的,一个定制的、开源、 NoSQL 架构的时序数据库解决方案,基于 Go 语言开发,提供了一个类似 SQL 的查询语言 InfluxQL,同时也提供了一个定制的查询语言 Flux,从官方文档来解读这两者的差异,InfluxQL主要提供用户类似 SQL 的语法和InfluxDB进行交互,而 Flux 更加强大,基于函数语言范式,提供更强大的数据分析能力:

InfluxQL 查询语句样例:

> SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet"name: h2o_feet--------------time level description location water_level2015-08-18T00:00:00Z below 3 feet santa_monica 2.0642015-08-18T00:00:00Z between 6 and 9 feet coyote_creek 8.12[...]2015-09-18T21:36:00Z between 3 and 6 feet santa_monica 5.0662015-09-18T21:42:00Z between 3 and 6 feet santa_monica 4.938

Flux 查询样例,其中的 NOAA 数据集可以从这里下载:

from(bucket: “NOAA”) |> range(start: 2015-08-01T00:00:00Z, stop: 2015-10-01T00:00:00Z) |> filter(fn: (r) => r._measurement == "h2o_feet" and r._field == "water_level") |> aggregateWindow(every: 1mo, fn: mean)

在 InfluxDB 中任何一个度量值都包含一个时间戳,以及相关联的若干属性和标签(tag),属性表达真正的度量值并且只能是 floats,ints,strings 和布尔值类型;标签表达度量的元数据,标签数据都会被索引,而且不可更改。InfluxDB 非常容易上手,因为系统自动帮助用户创建表 Schema 和索引,但同时又有很多限制,比如无法创建额外的索引,一旦创建就无法更新标签值;

TimescaleDB 是底层基于关系数据库 PostgreSQL,针对时序数据特性进行改良,提升了数据插入性能,因此原生完整支持 SQL 语法,因此对于熟悉关系数据库技术的人而言,没有任何学习曲线,同时可以利用 PG 的很多工具支持数据备份恢复,高可用等特性:在 TimescaleDB 中,每一条数据都拥有一个时间戳,关联任意多个其他字段,可以是 PG 支持的任意数据类型,同时用户可以基于某个字段或者组合字段构建索引,如果要保存元数据,可以利用外键创建一个新的元数据表。因此你需要预先设计你的表结构及索引。

-- Information about each 15-min period for each location-- over the past 3 hours, ordered by time and temperatureSELECT time_bucket('15 minutes', time) AS fifteen_min, location, COUNT(*), MAX(temperature) AS max_temp, MAX(humidity) AS max_hum FROM conditions WHERE time > NOW() - interval '3 hours' GROUP BY fifteen_min, location ORDER BY fifteen_min DESC, max_temp DESC;

选择一个时序数据库需要关注哪些点?

时序数据库的选择考虑的点很多,主要包括:

  • 数据模型

  • 查询语言

  • 可靠性

  • 性能

  • 开发者和工具链生态

  • 运维支撑

  • 商业和社区支持

数据模型

数据库是基于特定场景优化的,选择什么样的数据模型,以及如何存储,决定了后续你可以如何操作这些数据。如上的两个典型时序数据库就是完全不同的数据模型,一个延续了关系数据库数据模型,一种是如 InfluxDB ,自定义数据模型。

关系数据库的数据模型大家都很熟悉,用在时序数据上,如 TimescaleDB 下图的数据结构,每一条时序数据存储一行,优势是(1)支持宽表还有窄表,根据时序数据字段和元数据数量(2)自定义索引加速查询(3)度量数据和元数据分离存储在不同的表中(4)数据值类型校验或者利用 JSON blob 存储 Schemaless 数据;缺点是事先要规划表结构和索引:

ef0625296049ce9674132490133087ed.png

(图片来自 https://dwz.cn/KCEmDmVY)

而 InfluxDB 的数据模型是自定义的,一个度量包含一个时间戳,和若干标签(自动索引,无法更新)、若干字段(度量值),如果时序数据完全切合该结构,使用起来非常方便;虽然看起来不需要定义数据结构,但本质上它自动根据数据创建了 Schema,所以不属于 Schemaless 数据库;另外如果有需要额外索引,或在连续值字段比如数值型字段创建索引都是不支持的;

比如 temperature,machine=unit42,type=assembly internal=32,external=100 1434055562000000035 其中度量是 temperature, 元数据即标签数据是 machine=unit42,type=assembly,度量值有,internal=32,external=100;一个 InfluxDB 的数据库是包含用户,数据保留策略(数据保留多久,自动清除过期数据;以及集群模式下需要几份复制)以及具体的度量条目;同样的数据保留策略,度量和标签数据归属于一个时序数据集(series); InfluexDB 的持久化策略和关系数据库类似,基于 WAL 日志,同时保留近期数据在内存中以 TSM 格式存储,TSM 基于 LSM 树结构,所以兼顾到数据持久化到磁盘以及近期数据查询的性能(缓存在内存);

3fe22e01d911150a179fb607cdef2683.png(图片来自 https://dwz.cn/KCEmDmVY)

时序数据库数据模型
TimescaleDBSQL 数据模型
Influx DB度量,标签(索引),度量值(字段)
Prometheus度量,标签(Labels)
Druid度量,标签(Labels)
Elasticsearch度量,标签(Labels)

查询语言

4c9aa52454abc82a3fd25429007676bb.png

(图片来自 https://dwz.cn/KCEmDmVY)

通常时序数据库提供的查询接口两个极端,一端是 SQL,另外一个极端是 NoSQL(全新的查询分析方法),取折衷方案就是类 SQL 查询语言;对于绝大多数客户而言,原生 SQL 语言支持是比较合适的一种选择,SQL 有广泛的基础和生态工具支撑,采用和学习一个全新的查询语言需要团队衡量学习成本和收益。

时序数据库支持的查询语言
TimescaleDBSQL
Influx DBInfluxSQL 和 Flux
PrometheusPromQL
Druid(4)JSON style Query Language.
ElasticsearchJSON style Query Language.

可靠性

对于一个数据库而言,可靠性意味着,你的数据不容丢失或者损坏。InfluxDB 是一个基于 GO 语言构建的全新的时序数据库引擎,早期版本底层存储支持可插拔的多种开源引擎 LevelDB,RocksDB,等等,但 2015年底,InfluxDB团队决定重写一个优化的存储引擎,支持数据压缩,列式存储,并引入了 Facebook 的 Gorilla 编码等特性,极大了减少了[存储开销](https://www.influxdata.com/blog/new-storage-engine-time-structured-merge-tree/)最多 98%的节约相对于 0.9.4版本引擎。InfluxDB 是一个无服务器架构的新式数据库系统,在生产级关键应用场景,还需要经过时间和规模的长期考验。InfluxDB 的所有工具都是从头开始构建,比如开源版本一开始支持数据库复制和高可用,不过很快就被移到企业版,开源版不再可用,它的备份工具支持全量备份和按时间点恢复,但增量备份需要很多手工操作。

相对而言,TimescaleDB 只是扩展了 PostgreSQL 数据库,并没有重复造轮子,该数据库经历了 25年多的社区发展和实际案例应用,被验证可用在高可靠要求的应用程序场景,围绕 PG 的生态和工具集也是非常丰富。

性能

TSDB 时序数据库的测试可以借助于开源工具比如

  • https://github.com/timescale/tsbs

  • https://github.com/influxdata/influxdb-comparisons

网上也有不少性能对比测试的结果 比如:https://severalnines.com/database-blog/which-time-series-database-better-timescaledb-vs-influxdb

时序数据库性能(单节点写入,参考值)参考文档
TimescaleDB300k~2.5M/Secondhttps://dwz.cn/KCEmDmVY
Influx DB470K/secondhttps://www.influxdata.com/blog/influxdb-vs-cassandra-time-series/
Prometheus200K/secondhttps://fabxc.org/tsdb/
Druid200~800K/secondhttp://static.druid.io/docs/druid.pdf
Elasticsearch458K/secondhttps://dwz.cn/G3ep4Sf8

4a0b492a9034f7487d1682735f681aeb.png



推荐阅读
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • Spring Boot 应用中实现观察者模式的深度解析与实践
    在 Spring Boot 应用中,观察者模式是一种常用的设计模式,用于建立对象间的依赖关系。当某一对象的状态发生改变时,所有依赖该对象的对象会自动接收到通知并进行相应的更新。本文将深入探讨观察者模式的实现原理,并通过具体实例展示如何在 Spring Boot 项目中有效应用这一模式,以提高系统的解耦性和可维护性。 ... [详细]
  • 本文源自极分享,详细内容请参阅原文。技术债务如同信用卡负债,随着时间推移,修复成本会越来越高,因此程序员必须对此有深刻认识。此外,团队应致力于培养一种持续维护和优化代码的文化,以减少技术债务的累积。 ... [详细]
  • 本文介绍了在 Spring Boot 中使用 JPA 进行数据删除操作时遇到的 SQL 错误及其解决方法。错误表现为:删除操作失败,原因是无法打开 JPA EntityManager 以进行事务处理。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在 PHP 中使用 Restler 3 框架为不同方法添加身份验证时,可以根据方法参数的特定值来限制访问。例如,在 `Simple.php` 文件中定义的 `Simple` 类中,可以通过检查 `$name` 参数的值来决定是否允许调用 `item` 方法。这种细粒度的认证机制可以提高系统的安全性和灵活性。具体实现方式包括在方法内部进行条件判断,并结合框架提供的认证工具来实现访问控制。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
author-avatar
手机用户2502938297
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有