时间序列数据定义
比如一台机器的CPU监控数据、或者是一个人的心跳数据,这类数据在时间轴上滑动延伸,某个被测量的主体在一个时间点上就会产生一个测量值。
时间序列数据的特点
1、写多读少。
2、写入平稳、持续且数量巨大。基本不存在更新和删除。
3、读取冷热分明,最新的数据最可能被读取,或者读取一段周期的数据。
时间序列数据的模型
从上面说的定义部分—某个被测量的主体在一个时间点上就会产生一个测量值,
可知,对时间序列数据进行建模,需要包含三个重要部分,分别是主体,时间戳和测量值。
目前主流时序数据库建模的方式会分为两种,按数据源建模和按指标建模,以两个例子来说明这两种方式的不同。
按数据源建模
如图所示,同一个数据源在某个时间点的所有指标的测量值会存储在同一行。InfluxDB采用这种模式。
按指标建模
如图所示,其中每行数据代表某个数据源的某个指标在某个时间点的测量值。prometheus采用这种模式。
这两种模型的选择没有明确的优劣。
时间序列适合的存储模型—LSM
LSM树(Log-Structured-Merge-Tree)是比较通用的适合时间序列数据模型的存储结构。
其架构图大致如下:
1、数据写入先写入WAL(write ahead log),防止数据丢失。
2、数据写入内存的memtable,当memtable达到一定大小,转化为immutable,immutable不可写。
3、immutable刷入磁盘,刷入磁盘时进行格式转化,转化为更适合读的存储格式。
4、磁盘级别的存储块采用分层格式,后台会进行compaction进行块合并,块合并时进行比如压缩、合并数据、删除标记为删除的数据,格式转化使更适合读取。
LSM也是把磁盘离散写改为顺序写的优化思路,新增数据时,WAL是磁盘顺序写的,其他的数据块的维护是在memtable内存内完成,待memtable转化为immutable落盘时,又是顺序写的方式。对于读操作,每个SSTable块相当于一个小数据库,存储一个时间区间的所有数据,对于时间序列数据的查询场景(某个时刻的数据或者某个时间片段的数据),只要扫描命中块就可以了。