APP下载

基于时序库的水电站监控系统设计与实现

2022-04-07边丽娟李金阳

水电站设计 2022年1期
关键词:压缩算法洪家数据模型

边丽娟,韩 兵,李金阳

(国电南京自动化股份有限公司,江苏 南京 210003)

0 前 言

水电站计算机监控系统在电站自动化控制中发挥着非常重要的作用,其监控数据为电站的运行分析、趋势判断和事故处理提供了有力手段。传统的监控数据的存储一般采用MySQL等关系型数据库,监控数据具有数据采集频次高,依照时间序列排序等特点,大量使用关系型数据库存储时会带来诸多问题[1]。

(1)存储成本大,写入吞吐低。洪家渡水电站大约有1万个测点,如果每秒采集一次,一天占用大约10~20 GB的磁盘存储空间,而对于大型水电站,则远不止1万个测点。普通磁盘阵列的容量很难满足上述海量数据的存储需求,且关系库对于时序数据压缩不佳,随着时间的推移会造成存储成本的不断提升。海量数据在写入关系数据库时耗费时间较长,很难满足时序数据千万级的写入需求。

(2)查询性能差。为了提高关系型数据库使用效率,一般采用分库分表、优化索引等技术,但随着存储空间的不断增长,其查询效率也会不断降低,难以在秒级甚至毫秒级获取所需要的数据[2]。同时,分表策略会增加查询业务的复杂性,如果按月分表,那么查询跨月数据需要通过多条SQL或联合查询才能获得所需结果。

针对水电厂监控系统中存储的数据大部分是时序数据的特点,本文提出了一种新的时序库BonitaDB,并实现了基于BonitaDB时序库存储的水电站计算机监控系统。实践表明,相比于关系型数据库,BonitaDB在存储数据和查询方面,尤其是聚合查询方面具有明显的性能优势。

1 计算机监控系统总体结构

洪家渡水电站位于贵州西北部黔西、织金两县交界处的乌江干流上,是乌江水电基地11个梯级电站中唯一对水量具有多年调节能力的“龙头”电站。电站安装3台立轴混流式水轮发电机组,装机总容量60万kW。为了保证水电站健康安全运行,需要实时监测电站运行情况,国电南自自主研发了SD8000C水电站监控系统(系统软件架构见图1),底层主要基于中标麒麟等国产化操作系统,数据库层包括自主研发的时序数据库以及实时数据库,接口层包括历史数据库查询接口、图形界面应用接口、SCADA系统应用接口以及第三方接口中间件,数据处理层部分包括数据处理、数据存储、数据监视、数据报警、数据统计、数据传输等模块,上位机监控系统软件系统包括人机界面、一览表、顺控流程、历史库、报表、光字牌等模块,高级应用部分主要包括AGC/AVC、智能报警、数据挖掘等模块。各层之间相互关联、相互支撑,从而构成功能强大、性能稳定的水电站监控系统软件[3]。

图1 SD8000C计算机监控系统软件架构

2 基于时序库监控数据存储系统

2.1 时序库数据存储系统

洪家渡水电站计算机监控系统采用BonitaDB作为时序库存储引擎,BonitaDB是作为 PostgreSQL 的扩展实现的。基于在SQL标准上增加一些针对时序数据的优化UDF,也可以很方便地在SQL关系代数的基础上处理时序数据。监控系统数据应用服务主要包括实时数据服务、历史数据服务、故障诊断预警服务、设备管理服务等。其中,实时、历史数据由时序库提供数据支持,通过C程序将监控数据发送给时序库存储。

2.2 时序库数据模型

BonitaDB支持灵活的数据模型,可以同时支持宽表和窄表模型,能够针对不同的用例进行优化。

在NoSQL时序数据库中,数据模型通常如图2所示,即一条数据中既包括了时间戳以及采集的数据,还包括设备的元数据(通常以Tagset体现)。

图2 NoSQL时序库数据模型

在BonitaDB中,数据模型必须以1个二维表的形式呈现,洪家渡水电站监控数据的二维表大致分为以下3种(见表1~3):

表1 项目配置project_cfg

表2 测点配置point_cfg

表3 时序数据htsdb_data_${point_cfg.vtype}

2.3 BonitaDB的特性

时序数据库的数据通常每秒记录一次,这导致数据增长很快。而对于PostgreSQL来说,由于大量地使用B+tree索引,当数据量到达一定量级后其写入性能就会出现明显的下降。而BonitaDB最核心的自动分区chunk完美地解决了这个问题。图3展示了BonitaDB的自动分区机制,用户创建一张普通的时序表后,随着不断地写入数据,以时序数据的时间戳为分区键自动分区,将时序数据表的数据分区存放,保证每一个分区的索引维持在一个较小规模,从而维持住写入性能。每次创建新的chunk时会计算这个chunk预计覆盖的时间戳范围(默认是1 d)。并且考虑到不同应用场景下时序数据写入速度及密度都不相同,当创建新chunk时,新chunk的时间戳范围会经过自适应算法进行计算,逐渐计算出应用场景下最适合的时间戳范围。查询时也可以快速定位到所需的数据分区,保证查询性能。因此,虽然BonitaDB的索引数据和表数据的存储都是沿用的PostgreSQL的存储机制,但上述自动分区特性完美解决了海量数据插入后表和索引增大的问题[4]。

图3 BonitaDB的自动分区机制概要

2.4 BonitaDB压缩机制

BonitaDB的压缩可以节省91%~96%的存储空间,极大节省了硬盘空间[5]。BonitaDB 的低级存储使用 PostgreSQL 的面向行的存储格式,数据经过压缩后转变成列式存储。构建列式存储的方法是每列都存储了一组有序数据,将这些数据转换为单行“数组”形式的数据。然后针对其数据类型,使用特定压缩算法对每个数组进行单独压缩。目前主要采用以下算法——floats:Gorilla压缩算法;timestamps和integer:Delta-of-delta压缩算法和run-length encoding 压缩算法;重复值很少的列:基于字典的LZ压缩算法;其他类型:LZ-based array压缩算法。

在压缩过程中,需要指定“order by”列和可选的“segment by”列,对于每个“order by”列,指定需压缩行的排序方式,BonitaDB会自动创建额外的列来存储该列的最小值和最大值,并且可以按特定列“segment by”列分割压缩行,以便每个压缩行对应某单个主键的数据,洪家渡水电站计算机监控系统中的时序表的“segment by”列是id列。这种机制能够确保只读取指定的压缩列,明显提高了查询的性能。

2.5 BonitaDB性能对比结果与分析

选取关系型数据库MySQL和时序数据库BonitaDB,对时序数据的写入和读取速度以及相同数据量下占用的存储空间进行对比。测试时,每次插入数据量统一为5 000,使用上文提及的时序数据表结构,并在id和time上建立索引,查询采用查询同一时间段内的均值。测试环境为:银河麒麟V10,HUAWEI,Kunpeng 920,内存256 GB。测试结果如表4所示。

表4 BonitaDB与MySQL,PostgreSQL性能比较

测试结果表明,针对时序数据来说,BonitaDB数据库在磁盘占用和数据读取方面优势明显,而且随着数据规模的扩大,查询速度没有明显的下降。虽然BonitaDB与PostgreSQL具有相同的存储机制,但BonitaDB的压缩机制使得它的磁盘空间占用约为 PostgreSQL的6%,因此使用BonitaDB作为系统的数据存储工具,能够满足水电站计算机监控系统中对海量数据存储的需求,保证系统的实时稳定性。

3 基于时序库的数据服务

洪家渡水电站监控系统的时序库主要用于曲线查询、报表查询等服务,根据相关的查询请求到时序库中查询相应的数据,生成相应的结果集返回。

3.1 报表查询

主要开发了时序数据采样、输出可选间隔时序数据的平均值、最大值、最小值、均值、越复限统计等功能,通过配置界面配置所需要的测点统计功能。

前端页面能够展示所需要的统计值,BonitaDB提供的聚合查询函数完全能够满足水电站监控系统的所需要的统计功能,并且请求时间均在1 s内。

3.2 曲线查询

系统可由时间序列数据库提供任意历史时间段的实时数据,供电站人员查询实时曲线,最多可同时查询12个测点的曲线,以便进行分析比较。

4 结 语

根据水电站监控系统海量数据分析的需求,文章分析了时序数据库在监控系统中作为数据存储平台的可行性,并以时序数据库BonitaDB为数据存储引擎,构建了一套时序库监控系统,实现了水电站监控系统数据的存储、实时数据采样,统计值查询等基本功能。该系统已经在洪家渡水电站投入实际运用,运行效果良好,为水电站的长期稳定运行提供了有效的支撑。

猜你喜欢

压缩算法洪家数据模型
洪家滩游记
基于区块链的微网绿电交易数据模型研究
基于人工智能技术的运动教学视频压缩算法
基于Pro/E 的发射装置设计数据快速转化方法
洪家光
洪家光
——“最美青工”
一种基于嵌入式实时操作系统Vxworks下的数据压缩技术
经济全球化对我国劳动收入份额影响机制研究——基于面板数据模型
基于HBASE的大数据压缩算法的研究
曲线数据压缩方法与实现