前言
如今在万物互联(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事务写入 | 时序数据写入 |
---|---|
主要是更新 | 主要是插入 |
数据随机分布 | 热点集中在最新的时间段数据 |
通常是基于主键的事务操作 | 除了时间戳之外 |