25 Star 159 Fork 33

pinusdb / pinusdb

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
Clone or Download
pinusdb_best_practice.md 72.19 KB
Copy Edit Web IDE Raw Blame History
pinusdb authored 2020-11-20 20:24 . 添加安装配置及最佳实践文档

松果时序数据库最佳实践

松果时序数据库(PinusDB)是一款以简单、易用、高性能为目标的开源时序数据库。本篇介绍如何让松果时序数据库以最佳的性能运行。

1.内存对松果时序数据库的影响

内存对松果时序数据库的性能有着至关重要的作用,配置不当会导致性能下降。

松果时序数据库配置文件(与服务程序处于同一目录下的config.ini)中cacheSize配置项(若实际的配置文件中无此项,则表示使用默认配置,若需要修改请参考松果时序数据库-用户手册相关章节)表示数据页缓存大小,单位为MB。

松果时序数据库在数据写入时,最少会为每个设备分配一个大小为64KB的数据页用于写入数据。如果数据页缓存过小而设备数量过大的话会导致频繁的对数据文件进行读写,导致写入性能急剧下降,所以就需要为松果时序数据库规划合适的数据缓存大小。

大多数情况下,也是最简单的配置,就是使用系统默认的cacheSize配置。并让服务器内存 大于等于 (设备数量 * 64KB * 4) ,若(设备数量 * 64KB * 4) 小于8GB,应使用8GB或以上的物理内存。
例如:
a.设备数量为1万台,(10000 * 64K * 4) 为2.5GB,故服务器内存为8GB。
b.设备数量为10万台,(100000 * 64K * 4) 为25GB,故服务器内存为32GB。

2.使用Real类型存储浮点数

在物联网场景中存在大量的浮点数据,并且,浮点数的编码并不利于压缩,但是,在物联网场景下的浮点数据具备两个显著的特点:数据范围和精度是已知的,数据是连续变化的。例如:车辆的GPS定位数据,速度,温度,等数据都会有明确的范围和精度。既然如此:松果时序数据库中提供了一组新的数据类型,用户可以当作double来使用,但是实际存储数据时按照一定的倍数放大后存储为整数。这样可以充分利用连续变化的特点,提高数据压缩。
松果时序数据库中提供四个这样的数据类型,实际读写数据时将他们当作double即可:
real2 取值范围 [-999,999,999.99 ~ +999,999,999.99]
real3 取值范围 [-999,999,999.999 ~ +999,999,999.999]
real4 取值范围 [-999,999,999.9999 ~ +999,999,999.9999]
real6 取值范围 [-999,999,999.999999 ~ +999,999,999.999999]
下面以一个简单的示例来说明采用real系列数据类型带来的好处,数据来源:微软GeoLift项目,下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=52367 选取数据集中Data\000\Trajectory\20081023025304.plt文件前10条位置数据。

image

实际存储时只需要存储第一条数据,以及后一条数据与前一条数据的差值,配合整数的zigzag以及varint编码,最后将一个数据块以zlib压缩,使用real系列类型我们将一组不易压缩的浮点数存储为一组极容易压缩的整数。实际用户使用时与使用double存储的数据无异(存在数据的范围和精度的差别,这个差别在前面已经介绍过)。

3. 高性能数据插入

松果时序数据库数据插入时支持文本协议和二进制协议,他们的区别如下:

文本协议:即SQL 的insert语句,利于书写,但是文本协议会占用更多的带宽,并且在数据库服务端需要解析SQL,性能较低。大量数据写入时不建议使用。

二进制协议:即客户端将数据封装为二进制数据发送到服务端,由于解析二进制数据性能较高,建议在项目中使用二进制协议完成数据插入。在 .Net SDK中使用以DataTable为参数执行插入即可。在JDBC中使用PreparedStatement配合addBatch来使用二进制协议,具体细节参考相关SDK文档即可。

注意:一般情况下,两种写入方式差别不大, 二进制协议的写入方式只有在资源有限并且需要更高性能情况下推荐使用。

4. 存储的配置

松果时序数据库有五个存储路径的配置,分别如下:

  • tabPath
    表目录路径,每创建一个表都会在这个目录下创建一个以表名为文件名以.dev为后缀的文件,他存储表的字段信息以及该表下所有设备信息。表目录下还包含table.json、user.json 文件,分别存放系统中所有的表信息和用户信息。

  • normalDataPath
    普通数据目录,存储普通数据文件,支持查询、添加、修改。会存在大量读写。

  • compressDataPath
    压缩数据目录,存储压缩数据文件,仅支持查询。松果时序数据库会将较早的数据转储为压缩文件。

  • commitLogPath
    数据提交日志,为了保证数据安全性和性能,松果时序数据库写入数据到内存后需要将数据写入日志,数据刷新到数据文件后会删除对应的数据日志文件。

  • sysLogPath
    系统日志,写入系统运行产生的日志。

在这五个目录中,normalDataPath 存储最近的数据,会有大量的读写,建议使用固态盘。 compressDataPath 会存储大量的历史数据,在文件中已经按设备将数据顺序存放,建议使用机械硬盘。
commitLogPath以及sysLogPath基本上都是顺序写入,所以存放在机械盘上即可。tabPath数据较少,存储在机械盘或固态盘皆可。

Comment ( 0 )

Sign in to post a comment

C++
1
https://gitee.com/pinusdb/pinusdb.git
git@gitee.com:pinusdb/pinusdb.git
pinusdb
pinusdb
pinusdb
master

Search

161121 f78d6d6f 1850385 154831 86f8c370 1850385