一种海量历史数据的存储及索引方法

文档序号:6366093阅读:263来源:国知局
专利名称:一种海量历史数据的存储及索引方法
技术领域
本发明涉及到实时历史数据库领域,尤其涉及到实时历史数据库存储海量级历史数据和为之建立索引文件的方法。
背景技术
实时历史数据库在工控领域被普遍使用,涉及的行业包括电力、石油、冶金、化工等。实时历史数据库以测点作为基本单位来描述生产数据。一个数据库的测点对应现实世界的一个物理数据源,如某一条输电线的电压、某一个检测点的温度等。测点储存的数据是离散的量,其储存的数据都带有时间戳。从现场采集到的生产过程数据(如某个设备不同部位测点的电流电压、锅炉不同部位测点的水位水温等)经过一系列处理之后最终保存在实时历史数据库当中。此类数据通常在后续的过程回溯或者数据分析的过程中使用。 随着信息化建设的推进,越来越多的数据通过分布广泛的数据采集器进入到实时历史数据库系统,并最终以数据文件的形式保存,这些数据文件称之为历史数据文件。由于生产控制过程是24小时不间断运行的,因此随着时间的推移,历史数据总量不断累积,产生的历史数据文件总量可以达到TB甚至PB级别。当前的实时历史数据库系统主要部署于性能良好的单机上,单机能够满足一定的存储需求,但是面对持续增长的历史数据量,单机有限的磁盘空间就不再满足存储要求。虽然可以通过停机更换大容量磁盘来实现扩展,但这样不能保证服务的持续性。分布式数据库系统和集群数据库系统虽然可以实现存储空间动态扩容,但当前的产品均只能在离线方式下进行系统扩展,不适合历史数据产生的实际环境,更重要的是二者没有专门针对历史数据的特点进行数据存储的方案,因此这二者不适合海量历史数据的存储需求。近些年,数据库领域新兴的列数据库被广泛使用,其代表了基于云平台的新型数据库,并开始应用于大规模数据存储和处理过程。该类数据库系统可以实现在线扩展,即保证服务不间断的情况下实现添加节点的功能。但是,该类数据库也没有针对历史数据的特点而实施的数据存储方案,因此这类数据库也不完全适合历史数据的存储要求。综上所述,面对海量历史数据,目前尚无完整可用的实施方案既可以满足当前的数据存储要求,又保证系统具有动态扩展性来应对持续增长的数据存储和处理的需求。

发明内容
有鉴于此,本发明的目的在于提供一种海量历史数据的存储及索引方法,用于实现既满足当前海量历史数据文件的存储要求,更保证具有在线扩展的特性。本发明提供了一种海量历史数据的存储方法,该方法包括A、从实时历史数据库获取与测点数字标识Nid相对应测点的前一天全天的压缩数据,按时间升序连续排列构成一条测点历史数据记录的历史数据区,在所述历史数据区前加入该测点的元数据区信息构造一条测点历史数据记录R ;B、判断中间数据文件Ft的剩余空间是否小于R的长度&EN,如果是,则向Ft的剩余空间写入无效数据,并将Ft中的整块数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据所存入的文件块的全局数字标识BlockID,遍历保存测点数字标识的集合CID,每次取出一个测点数字标识赋值给临时变量TID,将日索引集合文件Fn第Tid个索引单元的文件块标识FileBlockID项的值置为BlockID,清空Cid和文件FT,并执行步骤C ;否则直接执行步骤C ;C、将R写入FT,记录下R在Ft中的起始偏移地址Offset,将Offset和Rra分别写 入Fti的第Nid个索引单元的数据偏移DataOffset项和数据长度DataLength项,将Nid的值存入集合Cid ;DjfNm的值执行加I操作,判断该Nid对应的测点是否存在,若存在则执行步骤A ;否则执行步骤E ;E、向Ft的剩余空间写入无效数据,将Ft中的数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据存入的BlockID,更新FTI,遍历CID,每次取出一个测点数字标识赋值给Tid,将Fti中第Tid个索引单元FileBlockID项的值置为BlockID,将Fti的数据追加写入年索引文件Fidx。本发明的实施例还提供了一种基于所述海量历史数据存储方法的索引方法,当索引测点Nid在同一天内的时间点Ts至Te时间段内的历史数据时,包括以下步骤解析时间Ts,获得年份Y和日期D,并打开Y对应的年索引文件Fidx ;将日期D转化为在一年366天中的天数K,K从I开始取值,在Fidx中定位到第K天的日索引集合的起始偏移地址Ha ;以Ha为起始地址,向后查找到第Nid个索引单元,读取该索引单元的三项信息FileBlockID, DataOffset, DataLength ;在分布式文件系统中读取FileBlockID对应文件块内偏移为DataOffset,长度为DataLength的历史数据记录Data ;根据Data的元数据区的数据,将Data的历史数据区的数据进行解压缩,得到按时间先后顺序排列的测点Nid —整天的历史数据集合DeData ;如果Ts等于Te,则执行下一步;否则,将DeData中满足时间戳不小于Ts并且不大于Te条件的数据集合按时间先后顺序排列后返回,结束本流程;在DeData中查找时间戳等于Ts的历史数据DA,如果找到Da则返回历史数据DA,结束本流程;否则返回索引无结果的信息,结束本流程。本发明根据分布式文件系统将大文件进行分块存储的特点,给出了一种简单高效的海量历史数据文件的存储方法和一种高效的分布式索引机制。该存储方法可以保证满足当前海量历史数据文件的存储要求,更保证具有在线扩展的特性;索引机制可以实现对海量历史数据的快速访问,同时在系统进行资源扩展以后,即底层物理存储发生变化时,该索引在无需修改的情况下依旧可以实现对数据的查找功能。


图I是本发明实施例中历史数据文件的组织结构示意图;图2是本发明实施例中的历史数据索引文件的结构示意图;图3是本发明实施例提供的历史数据存储和建立索引的方法流程图4是本发明实施例提供的索引一个测点在一个日期内某个时间段的历史数据的方法流程图;图5是本发明实施例提供的索引一个测点在任意时间段内历史数据的方法流程图。
具体实施例方式为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。为解决海量历史数据的存储问题,本发明实施例根据分布式文件系统将大文件进行分块存储的特点,给出了一种简单高效的海量历史数据文件的存储方法和一种高效的分布式索引机制。该存储方法可以保证满足当前海量历史数据文件的存储要求,更保证具有在线扩展的特性。本发明实施例提出的索引机制可以实现对海量历史数据的快速访问,同时在系统进行资源扩展以后,即底层物理存储发生变化时,该索引在无需修改的情况下依旧可以实现对数据的查找功能。本实施例提出的数据存储方法基于分布式文件系统实现,使得使用该方法的系统具备分布式文件系统可弹性扩展和数据高可用的特性。本实施例提出的数据存储方法的关键在于建立历史数据文件F,一整年的历史数据用一个历史数据文件F保存。历史数据文件F的命名规则如下历史数据文件F的文件名形如YYYY. dat (YYYY代表年),如2012. dat。历史数据文件F内部组织如图I所示,F由多个相同大小的数据块拼接而成,每个数据块的大小等于分布式文件系统默认的文件分块大小BlockSize,实现物理存储的分布式文件系统将文件F切分为多个文件块进行分布存储,一个数据块对应一个文件块。每个数据块内包含多条测点历史数据记录,一条测点历史数据记录只会保存在一个数据块内。本实施例的历史数据存储方法保证一条测点历史数据记录不会跨两个数据块保存,这是为了保证一条历史数据记录在分布式文件系统中进行物理存储时不被切分到两个不同的文件分块内造成索引数据的高开销和低效率。每一条测点历史数据记录又包含测点元数据区和测点历史数据区,测点元数据区包含实时历史数据库为每个测点分配的全局唯一的数字标识Nid (Nid从I开始分配)、测点的数据采集周期和测点历史数据区内第一个数据的时间戳,测点历史数据区则连续存储按时间升序排列的多个压缩数据。压缩需使用基于时间序列的算法,比如旋转门压缩算法。测点元数据区的信息则在解压历史数据过程中使用。本实施例的历史数据索引方法的关键在于建立年索引文件Fidx,年索引文件Fidx的文件名形如YYYY. idx(YYYY代表年),如2012. idx。年索引文件Fidx的结构如图2所示,由366个(考虑到闰年的存在)日索引集合组成,每个日索引集合包含M个索引单元(M等于系统支持最大点数),每个索引单元又包含三项信息FileBlockID,DataOffset,DataLength0 FileBlockID代表该条测点历史数据记录存储在分布式文件系统中文件分块的全局数字标识,DataOffset代表该条数据在文件分块内的起始偏移地址,DataLength代表该条数据的长度。年索引文件Fidx不是一次性完全建立,而是在数据存储的过程逐步建立,在每天对历史数据进行存储之前,先新建一个存储日索引集合的文件FTI,在历史数据存储过程中更新日索引集合文件Fn中每个测点历史数据记录对应的索引单元的三项信息,在历史数据存储完成之后,将文件Fti中的数据追加写入年索引文件Fidx,如此直至完成12月31日的历史数据存储,年索引文件才完全建立。本实施例的历史数据存储方法的基本思想是,每天将实时历史数据库中所有测点前一天整天的压缩数据按测点的Nid从小到大的顺序进行整理,每个测点整理后的测点历史数据记录顺次写入本地文件系统中的中间数据文件FT,Ft的大小等于分布式文件系统默认文件分块大小BlockSize,当文件&被写满时,将文件&中的数据追加写入保存在分布式文件系统中的历史数据文件F,然后清空文件Ft,继续整理后续测点的一整天的压缩数据。如此反复,直至所有测点的压缩数据全部存入历史数据文件F。向中间数据文件Ft写入数据时,可能遇到Ft剩余的空间不足以保存下一个测点整理后的一天的压缩数据的情况,此时向文件Ft的剩余空间填充无效数据(如图2中数据块内部结构图的阴影部分所示)使之被写满,然后将文件Ft的数据追加写入文件F,再清空文件FT,将下一个测点整理后的压缩数据写入,再继续整理后续测点的压缩数据。
本实施例提供的历史数据的存储和建立索引方法如图3所示,包括以下步骤步骤301、初始化。打开当前年对应的历史数据文件F,如果不存在则按照历史数据文件命名的规则新建一个空的历史数据文件;打开当前年对应的年索引文件Fidx,如果不存在则按照年索引文件命名的规则新建一个空的年索引文件;新建一个空的中间数据文件FT,FT的大小固定为分布式文件系统默认文件分块大小BlockSize ;新建一个包含M个索引单元的日索引集合文件Fn ^Nid赋值为1,新建一个保存测点数字标识的集合CID。步骤302、从实时历史数据库获取Nid对应测点前一天从O时O分O秒至23时59分59秒时间段内的压缩后的多个数据,将每个数据按时间升序连续排列构成一条测点历史数据记录的历史数据区,再在历史数据区前加入该测点的元数据区信息构造一条测点历史数据记录R,长度为Rra。步骤303、如果中间数据文件Ft剩余空间小于R_,执行步骤304 ;否则执行步骤305。步骤304、向中间数据文件Ft的剩余空间写入无效数据,将文件Ft中的整块数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据所存入的文件块的全局数字标识BlockID。遍历集合CID,每次取出一个测点数字标识赋值给Tid (Tid为临时变量),将日索引集合文件Fti第Tid个索引单元FileBlockID项的值置为BlockID。清空集合Cid和文件FT,并执行步骤305。步骤305、将测点历史数据记录R写入中间数据文件FT,记录下R在文件Ft中的起始偏移地址Offset,将Offset和Rra分别写入日索引集合文件Fti的第Nid个索引单元的DataOffset 和 DataLength 项。将 Nid 的值存入集合 CID。步骤306、对Nid的值执行加I操作,判断该新的Nid对应的测点是否存在,若存在则执行步骤302 ;若不存在则执行步骤307。步骤307、向中间数据文件&的剩余空间写入无效数据,将文件&中的数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据存入的文件块的全局数字标识BlockID。接着更新日索引集合文件Fn,遍历集合Cid,每次取出一个测点数字标识赋值给TID,将日索引集合文件Fti中第Tid个索引单元FileBlockID项的值置为BlockID。最后将日索引集合文件Fn的数据追加写入年索引文件Fidx。
由于在存储历史数据时将一个测点同一日期的压缩数据集中存放,故本实施例的索引方法可以快速定位一个测点一个日期内某时间段内的历史数据,也可以索引具体时刻的历史数据。根据本实施例提供的历史数据文件和年索引文件,索引测点Nid在时刻Ts至Te(Ts和Te必须为同一天内的时间点,且Te不早于Ts)时间段内的历史数据的方法如图4所示,包括以下步骤步骤401、解析时间Ts,获得年份Y和日期D,并打开Y对应的年索引文件Fidx。步骤402、将日期D转化为在一年366天中的天数K (K从I开始取值),在年索引文件Fidx中定位到第K天的日索引集合的起始偏移地址HA。 步骤403、以Ha为起始地址,向后查找到第Nid个索引单元,读取该索引单元的三项信息FileBlockID, DataOffset, DataLength0步骤404、在分布式文件系统中读取FileBlockID对应文件块内偏移为DataOffset,长度为DataLength的历史数据记录Data。步骤405、根据Data的元数据区的数据,调用与之前生成历史数据的压缩算法对应的解压缩算法将Data的历史数据区的数据进行解压缩,得到按时间先后顺序排列的测点Nid —整天的历史数据集合DeData。步骤406、如果Ts等于TE,则执行步骤407 ;否则,将DeData中满足时间戳不小于Ts并且不大于Te条件的数据集合按时间先后顺序排列后返回,结束本流程。步骤407、在DeData中查找时间戳等于Ts的历史数据DA,如果找到Da则执行步骤408 ;否则执行步骤409。步骤408、返回历史数据Da,结束本流程。步骤409、返回索引无结果的信息,结束本流程。进一步地,索引测点Nid在时刻Tbehn至TEND(TBEHN、TEND可以为任意时间点,但Tend不得早于Tbehn)时间段内的历史数据的流程如图5所示,包括以下步骤步骤501、将Tbehn至Tend的时间段按日期划分为N个不同日期内的时间段,且同一个日期内只有一个时间段。用Ti表示第i个时间段α从 开始计数)。步骤502、对时间段Ti采用图4的索引流程索引历史数据,时间段Ti对应的历史数据为RSi。步骤503、如果所有时间段都处理完成,执行步骤504 ;否则执行步骤502。步骤504、将N个时间段对应的结果数据集RSi按照日期先后进行合并,即得到测点Nid在时刻ΤΒ_至Tend的时间段内的历史数据。举例说明索引测点Nid在2012年3月I日12时O分O秒至2012年3月3日12时O分O秒时间段内的历史数据,则可以按日期划分为三个时间段,分别是2012年3月I日12时O分O秒至2012年3月I日23时59分59秒,2012年3月2日O时O分O秒至2012年3月2日23时59分59秒,2012年3月3日O时O分O秒至2012年3月3日12时O分O秒。然后分别采用图4的索引流程索引测点Nid在这三个时间段内的历史数据,最后将索引每个时间段得到的历史数据集按时间先后顺序进行合并,即可得到测点Nid在2012年3月I日12时O分O秒至2012年3月3日12时O分O秒内的历史数据。总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
权利要求
1.一种海量历史数据的存储方法,其特征在于,该方法包括 A、从实时历史数据库获取与测点数字标识Nid相对应测点的前一天全天的压缩数据,按时间升序连续排列构成一条测点历史数据记录的历史数据区,在所述历史数据区前加入该测点的元数据区信息构造一条测点历史数据记录R ; B、判断中间数据文件Ft的剩余空间是否小于R的长度R_,如果是,则向Ft的剩余空间写入无效数据,并将Ft中的整块数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据所存入的文件块的全局数字标识BlockID,遍历保存测点数字标识的集合CID,每次取出一个测点数字标识赋值给临时变量TID,将日索引集合文件FTi的第Tid个索引单元的文件块标识FileBlockID项的值置为BlockID,清空Cid和文件FT,并执行步骤C ;否则直接执行步骤C ; C、将R写入FT,记录下R在Ft中的起始偏移地址Offset,将Offset和&ΕΝ分别写入日索引集合文件Fti的第Nid个索引单元的数据偏移DataOffset项和数据长度DataLength项,将Nid的值存入集合测点数字标识的集合Cid ; D、对Nid的值执行加I操作,判断新Nid对应的测点是否存在,若存在则执行步骤A;否则执行步骤E ; Ε、向Ft的剩余空间写入无效数据,将Ft中的数据追加写入历史数据文件F,从分布式文件系统返回的结果中获取本次写入数据存入的文件块的全局数字标识BlockID,更新FTI,遍历CID,每次取出一个测点数字标识赋值给临时变量TID,将Fti中第Tid个索引单元文件块标识FileBlockID项的值置为BlockID,将Fn的数据追加写入年索引文件FIDX。
2.根据权利要求I所述的海量历史数据的存储方法,其特征在于,在步骤A之前,还进一步包括初始化操作的步骤,所述初始化操作的步骤具体包括 判断是否存在当前年对应的历史数据文件F,如果存在则打开该文件;不存在则按照历史数据文件命名的规则新建一个空的历史数据文件; 判断是否存在当前年对应的年索引文件Fidx,如果存在则打开该文件;不存在则按照年索引文件命名的规则新建一个空的年索引文件; 新建一个空的中间数据文件FT,Ft的大小固定为分布式文件系统默认文件分块大小BlockSize ; 新建一个包含M个索引单元的日索引集合文件FTI,M等于实时历史数据库系统支持最大点数; 将Nid赋值为1,新建一个保存测点数字标识的集合CID。
3.根据权利要求I或2所述的海量历史数据的存储方法,其特征在于,所述历史数据文件F的文件名为YYYY. dat,其中YYYY代表年;F由多个相同大小的数据块拼接而成,每个数据块的大小等于分布式文件系统默认的文件分块大小BlockSize,实现物理存储的分布式文件系统将数据文件F切分为多个文件块进行分布存储,一个数据块对应一个文件块。
4.根据权利要求3所述的海量历史数据的存储方法,其特征在于,所述测点历史数据记录R包含测点元数据区和测点历史数据区,所述测点元数据区包含实时历史数据库为每个测点分配的全局唯一的数字标识Nid、测点的数据采集周期和测点历史数据区内第一个数据的时间戳。
5.根据权利要求4所述的海量历史数据的存储方法,其特征在于,所述年索引文件Fidx的文件名为YYYY. i dx,其中YYYY代表年;Fidx由366个日索引集合组成,每个日索引集合包含M个索引单元,M等于实时历史数据库系统支持最大点数。
6.根据权利要求5所述的海量历史数据的存储方法,其特征在于,所述每个索引单元包含三项信息FileBlockID、DataOffset及DataLength,其中FileBlockID表不该条测点历史数据记录存储在分布式文件系统中文件分块的全局数字标识,DataOffset表示该条数据在文件分块内的起始偏移地址,DataLength表示该条数据的长度。
7.一种基于权利要求I所述海量历史数据存储方法的索引方法,其特征在于,当索引测点Nid在同一天内的时间点Ts至Te时间段内的历史数据时,包括以下步骤 解析时间Ts,获得年份Y和日期D,并打开Y对应的年索引文件Fidx ; 将日期D转化为在一年366天中的天数K,K从I开始取值,在Fidx中定位到第K天的日索引集合的起始偏移地址Ha ; 以Ha为起始地址,向后查找到第Nid个索引单元,读取该索引单元的三项信息FileBlockID, DataOffset, DataLength ; 在分布式文件系统中读取Fi IeBlockID对应文件块内偏移为DataOff set,长度为DataLength的历史数据记录Data ; 根据Data的元数据区的数据,将Data的历史数据区的数据进行解压缩,得到按时间先后顺序排列的测点Nid —整天的历史数据集合DeData ; 如果Ts等于Te,则执行下一步;否则,将DeData中满足时间戳不小于Ts并且不大于Te条件的数据集合按时间先后顺序排列后返回,结束本流程; 在DeData中查找时间戳等于Ts的历史数据DA,如果找到Da则返回历史数据DA,结束本流程;否则返回索引无结果的信息,结束本流程。
8.根据权利要求7所述的索引方法,其特征在于,当索引测点Nid在任意时间点1^_至Tend时间段内的历史数据时,包括以下步骤、将Tbehn至Tend的时间段按曰期划分为N个不同曰期内的时间段,且同一个曰期内只有一个时间段,用Ti表示第i个时间段,i从I开始计数; B'、对时间段Ti采用如权利要求7所述的索引方法索引历史数据,时间段Ti对应的历史数据为RSi ; C'、如果N个时间段都处理完成,则将N个时间段对应的结果数据集RSi按照日期先后进行合并,得到测点Nid在时刻Tbkin至Tend的时间段内的历史数据;否则执行步骤B'。
全文摘要
本发明公开了一种海量历史数据的存储及索引方法,属于实时历史数据库领域。该方法根据分布式文件系统将大文件进行分块存储的特点,给出了一种简单高效的海量历史数据文件的存储方法和一种高效的分布式索引机制。该存储方法可以保证满足当前海量历史数据文件的存储要求,更保证具有在线扩展的特性;索引机制可以实现对海量历史数据的快速访问,同时在系统进行资源扩展以后,即底层物理存储发生变化时,该索引在无需修改的情况下依旧可以实现对数据的查找功能。
文档编号G06F17/30GK102646130SQ20121006341
公开日2012年8月22日 申请日期2012年3月12日 优先权日2012年3月12日
发明者王 章, 王非, 黄本雄 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1