一种SCADA分布式历史数据存储方法及系统与流程

文档序号:17160724发布日期:2019-03-20 00:40阅读:571来源:国知局
一种SCADA分布式历史数据存储方法及系统与流程
本发明属于计算机
技术领域
,涉及一种历史数据存储方法及系统,具体涉及一种scada(数据采集与监视控制,supervisorycontrolanddataacquisition)分布式历史数据存储方法及系统。
背景技术
:在大规模应用中,scada系统涉及的数据点很多,有时达百万级,其中很多点都需要进行历史数据存储,一般都会采用分布式架构、部署多个存储节点(从采集节点的实时库获取数据点数据,并保存到物理存储介质;采集节点:通过工业控制总线,采集plc、rtu等工业控制装置的数据点实时数据,并保存到实时库。),每个节点负责存储一部分数据点历史数据。但每个存储节点所负责的数据点一般都是先通过配置工具进行配置,这种配置过程随着设备和点位数目的增多越发繁复耗时,且如果存储节点出现故障不能存储历史数据,则需要将故障存储节点所负责的这部分数据点重新配置给其它正常运行的存储节点,这样会导致存储业务中断较长时间、效率较低。另外,数据点历史数据通常会保存到传统的关系数据库中,但关系型数据库的冗余及多副本操作比较复杂;且随着数据量的增多,关系型数据库的扩展也比较费劲,还会出现读写性能下降。即使采用如hbase分布式数据库,海量数据的存储也可能会出现读写性能下降,往往通过分表操作来改进,但这种操作多半需手动进行,存储可扩展性较差。技术实现要素:为了解决上述技术问题,本发明提供了一种scada分布式历史数据存储方法及系统。本发明的方法所采用的技术方案是:一种scada分布式历史数据存储方法,其特征在于:包括数据点分配方法及历史数据入库方法;所述数据点分配方法,具体实现包括以下步骤:步骤a1:生成数据点uuid和存储节点uuid,其中uuid表示通用唯一识别码;步骤a2:对存储节点uuid进行排序编号;步骤a3:计算数据点uuid目标位数值;步骤a4:根据数据点与存储节点映射关系分配数据点到存储节点;步骤a5:存储管理节点根据存储节点运行状态重新分配数据点;其中存储管理节点为存储节点管理者,给存储节点分配数据点;所述历史数据入库方法,具体实现包括以下步骤:步骤b1:生成数据点uuid;步骤b2:选择数据点uuid目标位最大值和区间长度进行分区,得到若干分区节点;步骤b3:根据分区节点生成hbase原始历史数据表;步骤b4:根据数据点uuid目标位数值将数据保存到对应历史数据表;步骤b5:根据历史数据表记录数上限值分割当前历史数据表。本发明的系统所采用的技术方案是:一种scada分布式历史数据存储系统,其特征在于:包括uuid生成模块、存储节点排序模块、数据点uuid目标位数值计算模块、数据点分配模块、存储节点运行状态监测模块、uuid分区模块、历史数据库初始化模块、历史数据保存模块、历史数据分割模块;所述uuid生成模块,用于生成数据点uuid和存储节点uuid,其中uuid表示通用唯一识别码;所述存储节点排序模块,用于对存储节点uuid进行排序编号;所述数据点uuid目标位数值计算模块,用于计算数据点uuid目标位数值;所述数据点分配模块,用于根据数据点与存储节点映射关系分配数据点到存储节点;所述存储节点运行状态监测模块,用于存储管理节点根据存储节点运行状态重新分配数据点;其中存储管理节点为存储节点管理者,给存储节点分配数据点;所述uuid分区模块,用于选择数据点uuid目标位最大值和区间长度进行分区,得到若干分区节点;所述历史数据库初始化模块,用于根据分区节点生成hbase原始历史数据表;所述历史数据保存模块,用于根据数据点uuid目标位数值将数据保存到对应历史数据表;所述历史数据分割模块,用于根据历史数据表记录数上限值分割当前历史数据表。本发明针对scada历史数据存储,提出一种分布式存储方案,其中基于uuid,实现了一种自适应给存储节点分配数据点的方法;通过事先根据存储规模设定部分参数自适应分割hbase数据表的机制。最大限度提高了scada分布式存储系统的工作效率。附图说明图1为本发明实施例的数据点分配方法流程图;图2为本发明实施例的历史数据入库方法流程图。具体实施方式为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。本实施例中配置管理系统负责配置scada数据点及其它业务节点,数据采集节点采集控制终端的实时数据到自身实时数据库。而存储节点、存储管理节点、hbase历史数据库集群组成分布式历史数据存储系统。存储管理节点负责监控存储节点的运行,给存储节点分配数据点,建立、分割历史数据表。存储节点根据所分担的数据点,向数据采集节点请求数据,并将数据保存到hbase历史数据库中。请见图1和图2,本发明提供的一种scada分布式历史数据存储方法,包括数据点分配方法及历史数据入库方法;其中数据点分配方法,具体实现包括以下步骤:步骤a1:生成数据点uuid和存储节点uuid,其中uuid表示通用唯一识别码;uuid是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。uuid格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,共32个x,其中每个x是0-9或a-f范围内的一个十六进制数字,不同操作系统平台都会提供生成api。生成的uuid去掉其中分隔符“-”,成为本实施例中uuid格式“xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”。配置管理系统(配置管理系统负责配置数据点及其它业务节点)为每个数据点和存储节点生成一个系统uuid。配置管理系统为每个数据点和存储节点生成一个uuid(32位格式xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个x是0-9或a-f范围内的一个十六进制数字)。存储管理节点从配置管理系统获取数据点和存储节点的uuid,将存储节点按uuid排序并从1开始编号。截取数据点uuid的若干连续位并按16进制计算其数值,将该值和存储节点编号进行映射,根据映射结果将数据点分配给相应的存储节点。另外,uuid某连续k位16进制理论最大值16k记为maxv,以2j做为区间长度记为seclen,所有分区节点依次是seclen、2×seclen、...、maxv,hbase首次建立历史数据表名称是his_seclen、his_2×seclen、...、his_maxv。存储节点根据每个数据点uuid相应连续k位16进制数值所在区间,将该点数据保存到对应的历史数据表中。运行中,自动根据表记录数上限maxrecord分割当前数据表,分割后的区间长度是2(j-1)。步骤a2:对存储节点uuid进行排序编号;存储管理节点从配置管理系统获取所有存储节点的uuid,然后根据uuid字符串的字典序从小到大进行排序,并按照排序结果给存储节点进行编号,节点编号从1开始。如果系统有n个存储节点,则排序后的编号依次是1,2,...,n。步骤a3:计算数据点uuid目标位数值;基于操作的便利性,选取k个连续位进行计算,k的选取应该满足以下条件:设存储节点数目是t,则16k>t,k为正整数。如:存储节点数是10,可以选择至少1个连续位;存储节点数是20,可以选择至少2个连续位。然后按照16进制计算这k个连续位的数值。步骤a4:根据数据点与存储节点映射关系分配数据点到存储节点;存储管理节点从配置管理系统获取所有数据点的uuid,然后计算每个数据点uuid目标位数值,记为v,存储节点数为n,对v和n进行映射,映射通过取模运算完成,即vmodn=i,则i+1即为该数据点映射的存储节点。存储管理节点据此完成所有数据点的分配工作,并保存每个数据点uuid目标位数值。步骤a5:存储管理节点根据存储节点运行状态重新分配数据点;其中存储管理节点为存储节点管理者,给存储节点分配数据点;存储管理节点需要监测存储节点的运行状态,存储管理节点通过心跳来监测存储节点是否在线。当存储节点宕机时,存储管理节点与该存储节点之间的心跳异常,这时,存储管理节点启动数据点重新分配流程。即对当前剩余存储节点排序,再根据每个数据点uuid目标位数值重新映射存储节点,重新分配。由于存储管理节点已经保存了每个数据点的uuid目标位数值,因此重新分配时直接使用该数值就可以了,不必重新计算。当存储节点恢复运行时,存储管理节点与该存储节点之间的心跳恢复,这时,存储管理节点也启动数据点重新分配流程。重新分配流程与宕机时重新分配流程一样。当系统需要增加存储节点时,配置管理系统将新增的存储节点信息通知存储管理节点,存储管理节点会启动数据点重新分配流程。重新分配流程与之前一样当系统增加数据点时,配置管理系统将新增的数据点uuid通知存储管理节点,存储管理节点将这些新增的数据点分配给对应的存储节点。分配流程与之前一样。历史数据入库方法,具体实现包括以下步骤:步骤b1:生成数据点uuid;步骤b2:选择数据点uuid目标位最大值和区间长度进行分区,得到若干分区节点;初始化时,基于操作的便利性,存储管理节点选取m个连续位作为uuid目标位,目标位的最大数值记为maxv,maxv=16m;同时选取区间长度seclen,seclen=2j;maxv应该远大于seclen(即seccount=maxv/seclen,seccount>=2n,其中n为从4开始的正整数。即seccount=16,32,64…)。据此,分区后的区间数目seccount=maxv/seclen,所有分区节点依次是seclen,2×seclen,...,maxv;对应的seccount个区间依次是0~seclen,seclen~2×seclen,(seccount-1)×seclen~maxv,每个区间不包括区间终点。同时,存储管理节点需要将此分区信息设置给所有存储节点。步骤b3:根据分区节点生成hbase原始历史数据表;存储管理节点根据uuid分区结果建立原始历史数据表,表的名称以分区节点进行命名。上述seccount个分区对应的表依次是his_seclen,his_2×seclen,...,his_maxv。表记录字段中应包含uuid信息。步骤b4:根据数据点uuid目标位数值将数据保存到对应历史数据表;系统运行时,存储节点首先计算其上所有数据点的所在分区;具体如下:步骤b4.1:计算数据点uuid目标位数值v;步骤b4.2:查找数据点所在区间;遍历所有seccount个区间,如果v落在某个区间[(i-1)×seclen,i×seclen)内,则该点属于此区间,其对应的历史数据表是his_i×seclen;步骤b4.3:保存数据点和历史数据表之间的对应关系;当存储节点从采集节点获取到数据点数据时,将数据保存到其所在的历史数据表中;其中采集节点,通过工业控制总线,采集工业控制装置的数据点实时数据,并保存到实时库。步骤b5:根据历史数据表记录数上限值分割当前历史数据表;存储管理节点需要监控历史数据表记录数变化,以便实施数据表分割。由于数据持续写入数据库,历史数据表中的记录数会不断增加。以1百万数据点存储为例,若每分钟生成1条记录,则每天的记录数是1000000×24×60=1440000000。如果uuid分区选择末尾5位作为目标位,maxv=165=1048576;且选择区间长度seclen=214=16384;则原始分区数seccount=1048576/16384=64,每个历史数据表1天的记录数是1440000000/64=22500000,1个月的记录数是22500000×30=675000000,接近10亿级别。如果设置数据表记录数上限maxrecord=675000000,则数据表分割条件相当于每月分割一次。以当前数据表his_i×seclen为例,对应区间[(i-1)×seclen,i×seclen),其记录数记为record,具体分割步骤是:步骤b5.1:比较record和数据表记录数上限值maxrecord(数据表记录数上限值,可根据数据点存储规模设置,如若干数据点一个月的存储记录数;也可直接设定如1亿、5亿、10亿),如果record≥maxrecord,则对当前数据表进行分割;步骤b5.2:分割区间;将数据表对应分区按照新的区间长度分割成两个新区间,新区间长度是原来长度的一半,即seclen/2,新区间是[(i-1)×seclen/2,i×seclen/2)、[i×seclen/2,i×seclen);新区间对应的历史数据表是his_i×seclen/2、his_i×seclen,his_i×seclen已经存在,只需要生成his_i×seclen/2即可;步骤b5.3:同步分区信息;存储管理节点完成区间分割后,将新的分区信息保存并同步到所有存储节点,存储节点据此重新计算确定所有数据点所在分区、与数据表的对应关系;步骤b5.4:分割数据表;存储节点按照新的分区关系将数据写到历史数据表中,原来his_i×seclen表中部分数据需要迁移到his_i×seclen/2表中;由于his_i×seclen表每条记录中包含了节点uuid信息,所以根据记录包含uuid计算目标位数值,判断是否需要迁移到表his_i×seclen/2中。以上述1百万数据点存储所设定的各项参数为例,每次分割后的情况如下表所示:分割次数区间长度表数目表时间跨度(月)016384641181921282240962564320485128410241024165512204832由此可见,随着表的分割,区间长度减小、表数目增多、在表记录上限不变的情况下,表的数据周期不断扩大,存储可持续扩展。实际应用中,数据不会一直存储,都有固定的存储周期,因而,我们可以根据实际情况将数据表记录上限调低,以便始终保持良好的读写性能。本发明还提供了一种scada分布式历史数据存储系统,包括uuid生成模块、存储节点排序模块、数据点uuid目标位数值计算模块、数据点分配模块、存储节点运行状态监测模块、uuid分区模块、历史数据库初始化模块、历史数据保存模块、历史数据分割模块;uuid生成模块,用于生成数据点uuid和存储节点uuid,其中uuid表示通用唯一识别码;存储节点排序模块,用于对存储节点uuid进行排序编号;数据点uuid目标位数值计算模块,用于计算数据点uuid目标位数值;数据点分配模块,用于根据数据点与存储节点映射关系分配数据点到存储节点;存储节点运行状态监测模块,用于存储管理节点根据存储节点运行状态重新分配数据点;其中存储管理节点为存储节点管理者,给存储节点分配数据点;uuid分区模块,用于选择数据点uuid目标位最大值和区间长度进行分区,得到若干分区节点;历史数据库初始化模块,用于根据分区节点生成hbase原始历史数据表;历史数据保存模块,用于根据数据点uuid目标位数值将数据保存到对应历史数据表;历史数据分割模块,用于根据历史数据表记录数上限值分割当前历史数据表。本发明提供的scada系统中的每个数据点、存储节点都拥有一个唯一标识uuid。系统初始化过程中,存储管理节点基于uuid的离散性特点,根据数据点分配算法将数据点相对均衡地分配给每个存储节点;如果系统运行过程中存储节点宕机,存储管理节点会将该节点分担的数据点根据分配算法重新分配给其它正常运行的存储节点;如果系统运行过程中增加数据点,存储管理节点也会根据分配算法将新增数据点分配给存储节点。存储节点从采集节点实时库获取数据点数据后保存到系统hbase历史数据库中,系统初始化过程中,基于uuid离散性,根据历史数据表生成算法,生成若干原始历史数据表;如果系统运行中数据点扩容或者数据表记录数达到阈值,将按照分表算法分割原来的数据表。scada分布式存储系统采用基于uuid的数据点分配算法、数据表生成和分割算法,极大减少了人工操作,具有较强的自适应性、提高了整个系统的工作效能。应当理解的是,本说明书未详细阐述的部分均属于现有技术。应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1