时序数据库是为了高效处理实体在时间维度状态变化而优化的专业数据库。这里的实体可以是某部电梯、共享单车、汽车、充电桩、风力发电机等等... 随着5G+IoT 的普及越来越多的智能设备通过互联网连接,这些智能设备无时无刻不在产生数据。因此:我们认为时序数据库将会是未来的新趋势,于是,我们研发并开源了松果时序数据库,定位于以简单、易用、高性能的特点解决中小规模时序数据处理场景。这里中小规模指每天产生的数据量在20亿条以下。松果时序数据库充分吸收关系数据库、NoSQL、时序数据库的特点完全自主设计、研发。
您可以在我们的官方网站上下载已编译好的服务:http://www.pinusdb.cn 或在github上下载源码: http://github.com/pinusdb/pinusdb 如果您在使用过程中有任何问题或建议欢迎在github上提交issue或发邮件给我们: zhangquan@pinusdb.cn 。
下面从几方面来介绍松果时序数据库:
数据模型
其他的时序数据库会采用metric,data point, timestamp, field 和tag来表示时序数据,与之不同的是松果时序数据库以表为单位进行管理,数据模型更像关系型数据库,只是对表有特别的约束。每个表必须有一个类型为bigint的设备ID(devid)列以及一个datetime的时间戳(tstamp)列,这两个列构成数据的主键。
例如,以一个常见的实例来说明之间的差别:
metric为Wind,每一个数据点都具有一个timestamp,两个field:风向(direction)和风速(speed),两个tag:设备编号(sensor),所在城市(city)一组数据如下:
数据类型
松果时序数据库支持常用的 bool, bigint, dtetime, double, string, blob 数据类型。
由于物联网场景中有大量的浮点数数据,但是浮点数的编码并不利于压缩。不过,通过简简单分析就可以得出两个很显著的特点:
(1)数据范围、精度是已知的。
(2)数据是连续变化的。
既然精度和范围是已知的,那么就可以将浮点数乘以一个倍数存储为整数;数据是连续变化,除了第一个数其他数据都存储与前一个数的差值即可,大大提高了数据的压缩。
下面是一个典型的实例:实际存储第一个数和后面数的差值即可。
有鉴于此,松果时序数据库提供了real系列数据类型,real系列数据类型使用与double一样但是会对数据精度和范围有约束:
real2 精确到小数点后2位,值范围:[-999,999,999.99 ~ +999,999,999.99]
real3 精确到小数点后3位,值范围:[-999,999,999.999 ~ +999,999,999.999]
real4 精确到小数点后4位,值范围:[-999,999,999.9999 ~ +999,999,999.9999]
real6 精确到小数点后6位,值范围:[-999,999,999.999999 ~ +999,999,999.999999]
数据存储
松果时序数据库对每个表,每天的数据存储为一个文件。这样即使存储很长时间、大量的数据也能根据时间快速定位到对应的文件上,实现高效的查询和插入。系统根据配置将较早的数据进行整理压缩,并使每个设备在该天的所有数据在磁盘上连续存储,极大提高数据查询性能。
松果时序数据库也支持对单个文件进行管理,比如:将某个表某天的数据从一台服务器上转移到另一台服务器上。相关内容请查看使用文档数据文件管理相关内容。
简单、易用
松果时序数据库使用SQL进行操作,数据模型与关系库类似,极大方便了学习和使用。整个服务代码大约3万行左右,是代码量最少的时序数据库,并且开源。
高性能
目前在i3-7100 8G内存,120G SSD + 1TB HDD ,Windows Server 2016 的环境下能支持每秒插入20万条数据(每条数据8个字段),查询统计最高达到5000万条/秒。
高安全性
写入数据时会写commit日志,系统宕机后从commit日志中恢复数据。Commit日志每3秒或写入2M日志后刷新到磁盘,系统宕机或断电后仅会有最新的少量数据丢失。
所有数据同步到数据文件都会采用doublewrite,避免写磁盘时系统宕机导致数据页损坏。
更多信息请下载源码:http://github.com/pinusdb/pinusdb
或在关注官方网站:http://www.pinusdb.con
当然您可以给我们发邮件:zhangquan@pinusdb.cn