CN117633105A - 基于时间分区索引的时序数据存储管理方法及系统 - Google Patents

基于时间分区索引的时序数据存储管理方法及系统 Download PDF

Info

Publication number
CN117633105A
CN117633105A CN202311524797.0A CN202311524797A CN117633105A CN 117633105 A CN117633105 A CN 117633105A CN 202311524797 A CN202311524797 A CN 202311524797A CN 117633105 A CN117633105 A CN 117633105A
Authority
CN
China
Prior art keywords
data
time
partition
file
data block
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202311524797.0A
Other languages
English (en)
Inventor
王永炎
裴春峰
于暄
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shandong Inspur Database Technology Co Ltd
Original Assignee
Shandong Inspur Database Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shandong Inspur Database Technology Co Ltd filed Critical Shandong Inspur Database Technology Co Ltd
Priority to CN202311524797.0A priority Critical patent/CN117633105A/zh
Publication of CN117633105A publication Critical patent/CN117633105A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/27Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
    • G06F16/278Data partitioning, e.g. horizontal or vertical partitioning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2228Indexing structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2455Query execution
    • G06F16/24553Query execution of query operations
    • G06F16/24554Unary operations; Data partitioning operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2458Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
    • G06F16/2474Sequence data queries, e.g. querying versioned data
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0602Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
    • G06F3/061Improving I/O performance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/064Management of blocks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0643Management of files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0638Organizing or formatting or addressing of data
    • G06F3/0644Management of space entities, e.g. partitions, extents, pools
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F3/00Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
    • G06F3/06Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
    • G06F3/0601Interfaces specially adapted for storage systems
    • G06F3/0628Interfaces specially adapted for storage systems making use of a particular technique
    • G06F3/0646Horizontal data movement in storage systems, i.e. moving data in between storage devices or systems
    • G06F3/0647Migration mechanisms
    • G06F3/0649Lifecycle management
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Human Computer Interaction (AREA)
  • Data Mining & Analysis (AREA)
  • Computational Linguistics (AREA)
  • Software Systems (AREA)
  • Fuzzy Systems (AREA)
  • Mathematical Physics (AREA)
  • Probability & Statistics with Applications (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了基于时间分区索引的时序数据存储管理方法及系统,属于物联网时序数据存储管理技术领域,本发明要解决的技术问题为如何实现高速时序数据入库,高效处理乱序数据,并提高时序数据库查询性能,采用的技术方案为:该方法是根据物联网应用系统的时序数据入库特点和查询检索特征,对设备数据进行分片管理,在分片内时序数据按照时间进行分区,相同时间段内的数据放到一起连续存储;并对相同时间分区内的数据,按照入库先后顺序以数据库方式依次存储,在数据块内进行统计计算,预存聚合数据,提高时序数据查询性能。该系统包括分片模块、分片管理模块、入库模块、周期管理模块、查询模块及压缩模块。

Description

基于时间分区索引的时序数据存储管理方法及系统
技术领域
本发明涉及物联网时序数据存储管理技术领域,具体地说是一种基于时间分区索引的时序数据存储管理方法及系统。
背景技术
近年来随着物联网和大数据的发展,时序数据的应用呈现爆发式增长,包括工业制造领域、环境监控领域、农业生产领域、智慧城市领域、经济金融领域、医学领域、硬件和软件系统监控等各方面,存在大量使用时序数据,揭示研究对象的趋势性、规律性、异常性,而在5G与人工智能的浪潮下,时序数据作为大数据、机器学习、实时预测、预警的基础数据的作用更加显著,因此,对时序数据的研究与应用更为深入。
自出现了以OpenTSDB、KairosDB为代表的基于分布式存储的时序数据库,这类时序数据库在继承通用存储优势的基础上,针对时间进行优化。传统关系型数据库主要是采用B tree,是随机读写的模式,会在寻道上消耗较多时间,使用SSD具有更快的寻道时间,但并没有从根本上解决这个问题。对于大部分场景是写入的时序数据库来说效率太低,Btree很明显是不合适的,所以时序数据库的主流是采用LSM Tree(Log-Structured MergeTree,结构化合并树)替换B Tree,比如KairosDB(底层使用Cassandra的单机模式)、openTSDB(底层使用Hbase)、LevelDB等,其核心思想是放弃部分读的能力换取写的能力最大化。OpenTSDB底层依赖于HBase集群存储,根据时序的特征对数据进行压缩,节省存储空间;用TSD进行读写,对时序数据的常用查询进行封装,提供数据聚合、过滤等操作。这类专用于时序数据的数据库相比第一代时序数据库在存储和查询性能有明显的提高,但是这类数据库也有许多不足,比如低效的全局UID机制,依赖Hadoop和HBase环境,部署及维护成本高。
故如何实现高速时序数据入库,高效处理乱序数据,并提高时序数据库查询性能是目前亟待纠解决的技术问题。
发明内容
本发明的技术任务是提供一种基于时间分区索引的时序数据存储管理方法及系统,来解决如何实现高速时序数据入库,高效处理乱序数据,并提高时序数据库查询性能的问题。
本发明的技术任务是按以下方式实现的,一种基于时间分区索引的时序数据存储管理方法,该方法是根据物联网应用系统的时序数据入库特点和查询检索特征,对设备数据进行分片管理,在分片内时序数据按照时间进行分区,相同时间段内的数据放到一起连续存储;并对相同时间分区内的数据,按照入库先后顺序以数据库方式依次存储,在数据块内进行统计计算,预存聚合数据,提高时序数据查询性能。
作为优选,该方法具体如下:
设备数据分片:对设备按照设备名进行划分,将海量设备划分到多个分片中;
基于时间戳分片的时序数据管理:在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
时序数据入库:在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
生命周期管理;
时序数据查询;
基于分区数据文件的数据压缩。
更优地,对设备数据分片是在分布式数据库场景下,根据数据分片将设备数据分布到不同的节点上进行存储管理,提高物联网应用系统的线性扩展能力;设备所在的分片编号根据hash值和分片个数计算得到,公式如下:
Index(DeviceName)=HashVal(DeviceName)%SliceCount+1;
其中,SliceCount表示分片个数,分片编号为1、2、3、…、SliceCount;DeviceName表示设备名称;HashVal(DeviceName)表示设备名称为DeviceName的hash值;Index(DeviceName)表示设备所在的分片编号;
设备名称为DeviceName的设备数据将被分配到编号为Index(DeviceName)的分片中进行存储管理;同样的,当对设备名称为DeviceName的设备进行历史数据查询时,直接到编号为Index(DeviceName)的分片中去查询数据。
更优地,基于时间戳分片的时序数据管理具体如下:
分区划分:每个分片中的设备数据,将按照时间戳分区将不同时间段的数据分布到不同的分区分别进行存储管理;通常情况下,每个分区的时间范围设置为大概一天,根据物联网应用系统时间对数据进行时间分区,即每天划一次分区,每天写入的数据写到同一个分区中,并持久化到对应的一个分区数据文件中;由于不同设备的采集时间戳会有些差异,因此,相同的分区内不同设备的时间范围有可能不同,且每个设备对应每个分区文件都有其相应的时间范围,即开始时间和结束时间;
分区时间范围文件记录每个设备在每个分区文件中存储的时间范围,其中以数组方式依次存储每个设备的所有分区时间范围;设分片中有设备1、设备2、设备3、…、设备d,共计d个设备,时序数据生命周期为c天,即数据将被保存c天,c天之前的历史数据将被自动删除,每个设备都记录该设备在每个分区的时间范围;每个设备的分区时间范围数组大小为c+1,该数组是随着时间推移循环写入的,当新的分区形成时,将覆盖最旧的分区,而最旧的分区数据也将被删除;同一个分片内所有设备的所有分区对应的时间范围持久化道单独的一个分区时间范围文件中,与存储数据的分区文件分开,每个分区对应一个分区数据文件,c+1个分区就对应着c+1个分区数据文件;
设当天分区(即最新分区)对应的数组中第i个元素,当天分区时间结束,开始下一天的分区时,i将更新为(i+1)%(c+1)+1,下一天的分区时间范围将写入第(i+1)%(c+1)+1个数组元素,当i为c+1时,下一个i将是1,如此循环覆盖;任意分区数据文件k,设备1在分区数据文件k中的时间范围是其分区时间范围数组中的第k个元素[start_timek,end_timek],即分区数据文件k中存储的设备1数据的时间范围在start_timek到end_timek之间,包含边界时间点,设设备1在分区数据文件k中的数据集为Dk,即必须满足:
start_timek≤valtimestamp≤end_timek
但是,在某个分区时间范围内的数据并不一定都存储在该分区内。在时序场景中,通常情况下,数据入库都是顺序的;但是,有时候会存在乱序数据入库,以及补录历史数据的情况,在这种情况下,乱序数据和历史数据将被存储在当天分区内,但是,当天分区的时间范围就会变得比较大,也就是说,任意两个分区时间范围,交集有可能不为空,即:
[start_timek,end_timek]∩[start_timel,end_timel]≠Φ;
分区内数据块结构:同一个分区的所有设备数据均保存到同一个分区文件中,所有的数据都是以数据库块方式进行存储,每个数据库块中的数据都是同一个设备的数据;在分区文件中,一个设备存储有多个数据块,每个数据块之间采用单向链表方式进行存储;设分区数据文件k中的所有数据块集合为Bk,则其中任意数据块的时间范围在该分区时间范围内,即:
数据块内数据结构:每个数据块中头部包括开始时间、结束时间和指针;其中,开始时间是数据块中存储的最小时间戳,结束时间是数据块中存储的最大时间戳,指针则是指向下一个数据块的地址;紧随数据块头部的是数据部分,数据部分包括聚合数据和存储每一条记录的行存数据;
设备有m+1个列,除了时间戳之外,其他m个列都是该设备中的采集点,一个数据块中的聚合数据部分存储所有聚合数据,包括count、min、max和sum,除了时间戳,每个列都有其min、max和sum,分别记录其在该数据块中存储的最小值、最大值和总和;数据块中的行存数据部分以行存方式存放每一条记录,记录个数为聚合数据部分的count,每条记录包含bits和colij;其中,bits是null bitmap,标记当前记录的每个采集点col是否为空,colij则是当前记录第j个column数值。
更优地,时序数据入库具体如下:
顺序数据入库:每个设备在内存中缓存一个数据块;在数据入库时,往内存数据块中追加新的数据,并进行数据块内聚合数据计算和更新,包括count,以及各个采集点col的min、max和sum,同时更新数据块中的开始和结束时间戳;若数据块已满,则触发聚合计算,再将数据块追加到当前分区文件的末尾;若写入数据块开始时间小于当前分区时间范围的开始时间,则将当前分区时间范围的开始时间更改为写入数据块开始时间;落盘后,内存数据块中的数据将被清空,同时更新新的分区时间范围,开始时间和结束时间都设置为无穷大;
分区切换:每天定时触发分区切换,分区切换时,先将所有设备的当前分区时间范围数组的结束时间更新并落盘,再判断下一个分区数据文件(即最旧分区数据文件)是否已经存在:
若存在,则将分区数据文件删除,并重新创建新的分区数据文件;
分区切换时,内存数据块缓存的数据不会落盘,该内存数据块缓存的数据将随同后续写入的数据写入新的空分区文件,故创建新的分区数据文件后,需要将新的分区时间范围的开始和结束时间设置为各个设备内存数据块的开始和结束时间;
分区切换过程中,内存数据块将被推迟到下一个新的分区文件进行落盘,一方面,可以减少分区切换耗时,另外一方面,可以尽量保证每个数据块的大小是满了之后再落盘,减少小数据块的写入和读取;
乱序数据入库:有些物联网场景存在乱序数据或者补录历史数据的情况,此时,数据入库流程与顺序数据入库流程相同,包括聚合数据计算和块内开始时间及结束时间,均完全根据块内所有数据进行计算;
正常情况下,数据都是顺序入库的,数据读取过程中的数据也是有序的,查询结果无需排序,但是,当出现乱序数据时,需要对数据进行排序,以确保查询返回的数据是有序的。
更优地,时序数据查询具体如下:
原始历史数据查询:对指定设备在给定时间范围内的历史数据进行查询,要求返回该设备在给定时间范围内的所有历史数据;具体为:设查询时间范围为[Qstart,Qend],查询过程中,首先检查该时间范围与哪些分区时间范围有交集,并对有交集的分区进行分区数据文件的查询;
进行分区文件查询时,通过链表方式对该设备的所有数据块进行遍历,在访问每个数据块时,先检查该数据块的时间范围是否与[Qstart,Qend]有交集:
若有交集,则需要把整个数据块读取出来,并遍历数据块中的每一条记录,过滤出所有在[Qstart,Qend]时间范围内的记录;
历史数据插值查询:对指定设备在给定时间范围内进行指定时间间隔的插值查询,要求返回该设备在给定时间范围内每隔一个时间间隔返回一条记录;具体为:设查询时间范围为[Qstart,Qend],时间间隔为Qinterval,则返回的记录数是每个时间点为Qstart+interval,Qstart+2*interval,…;查询过程中,首先,为数组Closest分配count个元素,每个元素包含对应时间点的前后记录,分别记为Closest[i].left和Closest[i].right,总共存储2*count个记录;其次,根据分区时间范围和分区内数据块时间范围来遍历所有满足条件的记录,并根据记录时间戳,更新对应的时间点前后记录及其数值;
设当前处理的记录为record,如果该记录的时间戳左边更接近于Closest[i],即:Closest[i].left.timestamp<record.timestamp≤Qstart+i*interval;
那么,将Closest[i].left更新为record,即Closest[i].left=record;若该记录的时间戳右边更接近于Closest[i],即:
Qstart+i*interval≤record.timestamp<Closest[i].right.timestamp;
那么,将Closest[i].right更新为record,即Closest[i].right=record;
当所有满足条件的记录都遍历完成后,首先生成结果集ResultSet,并设置每个元素对应的时间戳:Results[i].timestamp=Qstart+i*interval;
然后,根据如下表达式进行插值计算出结果集ResultSet中每个时间点上的数值:
历史聚合数据查询:对指定设备在给定时间范围内进行聚合数据查询,按照时间间隔分组,要求返回该设备在给定时间范围内每个时间段内的聚合结果;若查询中的聚合函数是count、min、max、sum相关,则在将启用数据块的聚合数据来加速聚合数据查询;若数据块在其中任一个时间段内,则直接读取数据块中对应的聚合数据即可,无需读取数据块内的数据然后进行聚合计算;
若现有的聚合数据无法加速聚合数据查询,比如说数据块中没有存储相应的聚合数据,则将读取每个满足条件的数据块,遍历数据块中的每一条记录进行聚合计算,生成聚合结果。
更优地,生命周期管理具体如下:
物联网环境下的时序数据持续不断的产生,历史数据不断膨胀,生命周期管理是指允许用户定义历史数据保存的时间,通常以天为单位,设生命周期为c天,则c天之后其历史数据将被删除;分区文件是循环覆盖写的,每次切换新的分区时,都会将下一个分区文件,即最旧的分区文件删除,即c天前的数据文件,同时,所有设备的分区时间范围数组中对应分区的开始时间将更新为新分区的开始时间,结束时间则为无穷大;生命周期管理以入库时间为准进行数据删除,并非以采集时间戳进行删除的,即c天前入库的数据将被生命周期管理自动删除,而非c天前采集的数据被自动删除;
基于分区数据文件的数据压缩具体如下:
分区数据文件压缩:当前分区数据文件写入完毕,切换新的分区时,原来的分区数据文件将不再写入数据,此时将对整个分区数据文件进行压缩,再删除原来未压缩的分区数据文件;
分区数据文件解压:在数据读取过程中,并不对整个历史分区数据文件进行解压缩,而是根据需要读取的数据页面进行部分数据解压缩。
一种基于时间分区索引的时序数据存储管理系统,该系统包括:
分片模块,用于对设备按照设备名进行划分,将海量设备划分到多个分片中;
分片管理模块,用于在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
入库模块,用于在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
周期管理模块,用于根据时间分区对数据进行生命周期管理;
查询模块,用于根据设备分片、时间分区以及数据块进行历史数据检索,在进行历史聚合数据查询时,有条件的情况下将读取数据块内的聚合数据来加速查询;
压缩模块,用于根据时间分区对分区数据文件进行压缩。
一种电子设备,包括:存储器和至少一个处理器;
其中,所述存储器上存储有计算机程序;
所述至少一个处理器执行所述存储器存储的计算机程序,使得所述至少一个处理器执行如上述的基于时间分区索引的时序数据存储管理方法。
一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,所述计算机程序可被处理器执行以实现如上述的基于时间分区索引的时序数据存储管理方法。
本发明的基于时间分区索引的时序数据存储管理方法及系统具有以下优点:
(一)本发明提供一种基于时间戳的索引方法,针对物联网入库特点,在自动建立时间戳索引的同时,实现时序数据的快速入库,满足物联网应用的入库性能要求;
(二)本发明针对物联网历史数据查询特征,同一设备的连续时间段的数据以数据块方式进行连续存储,并按照时间戳进行顺序检索,实现海量时序历史数据的快速检索,提高物联网应用查询性能;
(三)本发明在每个数据块中存储聚合数据,在物联网应用中进行时间范围的聚合数据查询时,无需读取数据块中的每一条记录进行聚合计算,只需读取聚合数据就可以完成大部分数据块的聚合计算,大幅提升聚合数据查询性能;
(四)本发明以系统时间为准,定期进行时间分区,并建立时间分区索引,不但可以减少数据读取量,而且可以高效实现生命周期管理;
(五)本发明提供设备分片管理,支持分布式多节点的分片数据管理,实现物联网海量设备数据的线性扩展能力;
(六)本发明能够实现高速时序数据入库,高效处理乱序数据,并且通过预聚合数据提高时序数据查询性能,为时序数据库系统提供一种高效的时序数据存储和管理方法;
(七)本发明针对海量时序数据场景,为其建立简单快速的索引机制,在入库的时候保证其写入速度,同时这类索引能够结合时序场景的查询特征,发挥其在查询检索中的作用,有效提升数据检索性能,同时提供高性能的海量时序数据场景的入库和查询处理;
(八)本发明通过时间戳索引,提高数据查询检索速度,优化系统整体性能;
(九)本发明面向海量时序数据,以时间戳建立简单高效的历史数据索引,能够高效处理时序数据的乱序数据,支持局部聚合数据,在提供高速时序数据的入库性能的同时,大大提高时序历史数据的查询性能。
附图说明
下面结合附图对本发明进一步说明。
附图1为基于时间分区索引的时序数据存储结构图;
附图2为分区时间范围示意图;
附图3为分区数据文件示意图;
附图4为数据块示意图。
具体实施方式
参照说明书附图和具体实施例对本发明的基于时间分区索引的时序数据存储管理方法及系统作以下详细地说明。
实施例1:
本实施例提供一种基于时间分区索引的时序数据存储管理方法,该方法是根据物联网应用系统的时序数据入库特点和查询检索特征,对设备数据进行分片管理,在分片内时序数据按照时间进行分区,相同时间段内的数据放到一起连续存储;并对相同时间分区内的数据,按照入库先后顺序以数据库方式依次存储,在数据块内进行统计计算,预存聚合数据,提高时序数据查询性能;具体如下:
S1、设备数据分片:对设备按照设备名进行划分,将海量设备划分到多个分片中;
S2、基于时间戳分片的时序数据管理:在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
S3、时序数据入库:在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
S4、生命周期管理;
S5、时序数据查询;
S6、基于分区数据文件的数据压缩。
本实施例步骤S1中的对设备数据分片是在分布式数据库场景下,根据数据分片将设备数据分布到不同的节点上进行存储管理,提高物联网应用系统的线性扩展能力;设备所在的分片编号根据hash值和分片个数计算得到,公式如下:
Index(DeviceName)=HashVal(DeviceName)%SliceCount+1;
其中,SliceCount表示分片个数,分片编号为1、2、3、…、SliceCount;DeviceName表示设备名称;HashVal(DeviceName)表示设备名称为DeviceName的hash值;Index(DeviceName)表示设备所在的分片编号;
设备名称为DeviceName的设备数据将被分配到编号为Index(DeviceName)的分片中进行存储管理;同样的,当对设备名称为DeviceName的设备进行历史数据查询时,直接到编号为Index(DeviceName)的分片中去查询数据。
本实施例步骤S2中的基于时间戳分片的时序数据管理具体如下:
S201、分区划分:每个分片中的设备数据,将按照时间戳分区将不同时间段的数据分布到不同的分区分别进行存储管理;通常情况下,每个分区的时间范围设置为大概一天,根据物联网应用系统时间对数据进行时间分区,即每天划一次分区,每天写入的数据写到同一个分区中,并持久化到对应的一个分区数据文件中;由于不同设备的采集时间戳会有些差异,因此,相同的分区内不同设备的时间范围有可能不同,且每个设备对应每个分区文件都有其相应的时间范围,即开始时间和结束时间;
如附图1所示,分区时间范围文件记录每个设备在每个分区文件中存储的时间范围,其中以数组方式依次存储每个设备的所有分区时间范围;设分片中有设备1、设备2、设备3、…、设备d,共计d个设备,时序数据生命周期为c天,即数据将被保存c天,c天之前的历史数据将被自动删除,每个设备都记录该设备在每个分区的时间范围;每个设备的分区时间范围数组大小为c+1,该数组是随着时间推移循环写入的,当新的分区形成时,将覆盖最旧的分区,而最旧的分区数据也将被删除;同一个分片内所有设备的所有分区对应的时间范围持久化道单独的一个分区时间范围文件中,与存储数据的分区文件分开,每个分区对应一个分区数据文件,c+1个分区就对应着c+1个分区数据文件;
如附图2所示,设当天分区(即最新分区)对应的数组中第i个元素,当天分区时间结束,开始下一天的分区时,i将更新为(i+1)%(c+1)+1,下一天的分区时间范围将写入第(i+1)%(c+1)+1个数组元素,当i为c+1时,下一个i将是1,如此循环覆盖;任意分区数据文件k,设备1在分区数据文件k中的时间范围是其分区时间范围数组中的第k个元素[start_timek,end_timek],即分区数据文件k中存储的设备1数据的时间范围在start_timek到end_timek之间,包含边界时间点,设设备1在分区数据文件k中的数据集为Dk,即必须满足:
start_timek≤valtimestamp≤end_timek
但是,在某个分区时间范围内的数据并不一定都存储在该分区内。在时序场景中,通常情况下,数据入库都是顺序的;但是,有时候会存在乱序数据入库,以及补录历史数据的情况,在这种情况下,乱序数据和历史数据将被存储在当天分区内,但是,当天分区的时间范围就会变得比较大,也就是说,任意两个分区时间范围,交集有可能不为空,即:
[start_timek,end_timek]∩[start_timel,end_timel]≠Φ;
S202、分区内数据块结构:同一个分区的所有设备数据均保存到同一个分区文件中,所有的数据都是以数据库块方式进行存储,每个数据库块中的数据都是同一个设备的数据;在分区文件中,一个设备存储有多个数据块,每个数据块之间采用单向链表方式进行存储,如附图3所示;
设分区数据文件k中的所有数据块集合为Bk,则其中任意数据块的时间范围在该分区时间范围内,即:
S203、数据块内数据结构:每个数据块中头部包括开始时间、结束时间和指针;其中,开始时间是数据块中存储的最小时间戳,结束时间是数据块中存储的最大时间戳,指针则是指向下一个数据块的地址;紧随数据块头部的是数据部分,数据部分包括聚合数据和存储每一条记录的行存数据;
如附图4所示,设备有m+1个列,除了时间戳之外,其他m个列都是该设备中的采集点,一个数据块中的聚合数据部分存储所有聚合数据,包括count、min、max和sum,除了时间戳,每个列都有其min、max和sum,分别记录其在该数据块中存储的最小值、最大值和总和;数据块中的行存数据部分以行存方式存放每一条记录,记录个数为聚合数据部分的count,每条记录包含bits和colij;其中,bits是null bitmap,标记当前记录的每个采集点col是否为空,colij则是当前记录第j个column数值。
本实施例步骤S3中的时序数据入库具体如下:
S301、顺序数据入库:每个设备在内存中缓存一个数据块;在数据入库时,往内存数据块中追加新的数据,并进行数据块内聚合数据计算和更新,包括count,以及各个采集点col的min、max和sum,同时更新数据块中的开始和结束时间戳;若数据块已满,则触发聚合计算,再将数据块追加到当前分区文件的末尾;若写入数据块开始时间小于当前分区时间范围的开始时间,则将当前分区时间范围的开始时间更改为写入数据块开始时间;落盘后,内存数据块中的数据将被清空,同时更新新的分区时间范围,开始时间和结束时间都设置为无穷大;
S302、分区切换:每天定时触发分区切换,分区切换时,先将所有设备的当前分区时间范围数组的结束时间更新并落盘,再判断下一个分区数据文件(即最旧分区数据文件)是否已经存在:
若存在,则将分区数据文件删除,并重新创建新的分区数据文件;
分区切换时,内存数据块缓存的数据不会落盘,该内存数据块缓存的数据将随同后续写入的数据写入新的空分区文件,故创建新的分区数据文件后,需要将新的分区时间范围的开始和结束时间设置为各个设备内存数据块的开始和结束时间;
分区切换过程中,内存数据块将被推迟到下一个新的分区文件进行落盘,一方面,可以减少分区切换耗时,另外一方面,可以尽量保证每个数据块的大小是满了之后再落盘,减少小数据块的写入和读取;
S303、乱序数据入库:有些物联网场景存在乱序数据或者补录历史数据的情况,此时,数据入库流程与顺序数据入库流程相同,包括聚合数据计算和块内开始时间及结束时间,均完全根据块内所有数据进行计算;
正常情况下,数据都是顺序入库的,数据读取过程中的数据也是有序的,查询结果无需排序,但是,当出现乱序数据时,需要对数据进行排序,以确保查询返回的数据是有序的。
本实施例步骤S5中的时序数据查询具体如下:
S501、原始历史数据查询:对指定设备在给定时间范围内的历史数据进行查询,要求返回该设备在给定时间范围内的所有历史数据;具体为:设查询时间范围为[Qstart,Qend],查询过程中,首先检查该时间范围与哪些分区时间范围有交集,并对有交集的分区进行分区数据文件的查询;
进行分区文件查询时,通过链表方式对该设备的所有数据块进行遍历,在访问每个数据块时,先检查该数据块的时间范围是否与[Qstart,Qend]有交集:
若有交集,则需要把整个数据块读取出来,并遍历数据块中的每一条记录,过滤出所有在[Qstart,Qend]时间范围内的记录;
S502、历史数据插值查询:对指定设备在给定时间范围内进行指定时间间隔的插值查询,要求返回该设备在给定时间范围内每隔一个时间间隔返回一条记录;具体为:设查询时间范围为[Qstart,Qend],时间间隔为Qinterval,则返回的记录数是每个时间点为Qstart+interval,Qstart+2*interval,…;查询过程中,首先,为数组Closest分配count个元素,每个元素包含对应时间点的前后记录,分别记为Closest[i].left和Closest[i].right,总共存储2*count个记录;其次,根据分区时间范围和分区内数据块时间范围来遍历所有满足条件的记录,并根据记录时间戳,更新对应的时间点前后记录及其数值;
设当前处理的记录为record,如果该记录的时间戳左边更接近于Closest[i],即:Closest[i].left.timestamp<record.timestamp≤Qstart+i*interval;
那么,将Closest[i].left更新为record,即Closest[i].left=record;若该记录的时间戳右边更接近于Closest[i],即:
Qstart+i*interval≤record.timestamp<Closest[i].right.timestamp;
那么,将Closest[i].right更新为record,即Closest[i].right=record;
当所有满足条件的记录都遍历完成后,首先生成结果集ResultSet,并设置每个元素对应的时间戳:Results[i].timestamp=Qstart+i*interval;
然后,根据如下表达式进行插值计算出结果集ResultSet中每个时间点上的数值:
S503、历史聚合数据查询:对指定设备在给定时间范围内进行聚合数据查询,按照时间间隔分组,要求返回该设备在给定时间范围内每个时间段内的聚合结果;若查询中的聚合函数是count、min、max、sum相关,则在将启用数据块的聚合数据来加速聚合数据查询;若数据块在其中任一个时间段内,则直接读取数据块中对应的聚合数据即可,无需读取数据块内的数据然后进行聚合计算;
若现有的聚合数据无法加速聚合数据查询,比如说数据块中没有存储相应的聚合数据,则将读取每个满足条件的数据块,遍历数据块中的每一条记录进行聚合计算,生成聚合结果。
本实施例步骤S4中的生命周期管理具体如下:
物联网环境下的时序数据持续不断的产生,历史数据不断膨胀,生命周期管理是指允许用户定义历史数据保存的时间,通常以天为单位,设生命周期为c天,则c天之后其历史数据将被删除;如附图2所示,分区文件是循环覆盖写的,每次切换新的分区时,都会将下一个分区文件,即最旧的分区文件删除,即c天前的数据文件,同时,所有设备的分区时间范围数组中对应分区的开始时间将更新为新分区的开始时间,结束时间则为无穷大;生命周期管理以入库时间为准进行数据删除,并非以采集时间戳进行删除的,即c天前入库的数据将被生命周期管理自动删除,而非c天前采集的数据被自动删除。
本实施例步骤S6中的基于分区数据文件的数据压缩具体如下:
为了减少海量历史数据的存储空间,支持基于分区数据文件的压缩方法;
S601、分区数据文件压缩:当前分区数据文件写入完毕,切换新的分区时,原来的分区数据文件将不再写入数据,此时将对整个分区数据文件进行压缩,再删除原来未压缩的分区数据文件;
S602、分区数据文件解压:在数据读取过程中,并不对整个历史分区数据文件进行解压缩,而是根据需要读取的数据页面进行部分数据解压缩。
实施例2:
本实施例提供了一种基于时间分区索引的时序数据存储管理系统,该系统包括:
分片模块,用于对设备按照设备名进行划分,将海量设备划分到多个分片中;
分片管理模块,用于在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
入库模块,用于在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
周期管理模块,用于根据时间分区对数据进行生命周期管理;
查询模块,用于根据设备分片、时间分区以及数据块进行历史数据检索,在进行历史聚合数据查询时,有条件的情况下将读取数据块内的聚合数据来加速查询;
压缩模块,用于根据时间分区对分区数据文件进行压缩。
该系统针对物联网环境下的海量时序数据管理需求,对设备数据按照设备名进行分片存储管理,在分片内按照时间戳进行分区存储管理;在数据查询过程中,将根据设备名到指定的分片中,根据分区时间范围进行数据查询。
本实施例中,根据设备名计算hash值,并以hash值为依据进行分片管理:
(1)允许用户指定分片个数,将所有的设备划分到SliceCount个分片中,在分布式场景下,每个分区将被分布到分布式系统中的一个节点中进行存储管理;
(2)根据设备名DeviceName,计算其hash值HashVal(DeviceName);
(3)根据每个设备的hash值,确定其所属的分片,分片编号为HashVal(DeviceName)%SliceCount+1。
本实施例中,在分片内,根据物联网应用系统时间对写入的数据进行分区管理:
(1)允许用户指定数据的生命周期c天,历史数据将在c天之后将被自动删除,磁盘空间将被回收利用;
(2)依据生命周期,每个设备维护一个分区时间范围数组,记录每个分区在该分区内存储的时间范围,分片内的所有设备数据在不同分区的时间范围以数组方式存放在一个分区时间范围文件中;
(3)假设当天分区(即最新分区)对应的数组中第i个元素,当天分区时间结束,开始下一天的分区时,i将更新为(i+1)%(c+1)+1,下一天的分区时间范围将写入第(i+1)%(c+1)+1个数组元素,当i为c+1时,下一个i将是1,如此循环覆盖;
(4)每天生成一个分区,将这一天写入的所有数据存储到一个分区数据文件中,分区数据文件中的所有数据时间戳都在其对应的分区时间范围内。
本实施例中,分区内的数据以数据块形式进行链式存储管理:
(1)同一个分区的所有设备数据都存储于同一个分区数据文件中,所有的数据都是以数据块方式进行存储,每个数据块中的数据都是同一个设备的数据;
(2)在分区数据文件中,一个设备存储有多个数据块,每个数据块之间采用单向链表方式进行存储。
本实施例中,分区内的数据块用于存储一个设备在某个时间范围内的数据:
(1)每个数据块的头部包括开始时间、结束时间和指针,其中,开始时间是数据块中存储的最小时间戳,结束时间是数据块中存储的最大时间戳,指针则是指向下一个数据块的地址;
(2)数据块中的头部指针将该分区数据文件中的同一个设备的所有数据块以链表方式串联起来。
(3)紧随数据块头部的是数据部分,包括聚合数据和行存数据。
本实施例中数据块内的聚合数据存储包括count、min、max和sum在内的聚合数据:
(1)每个数据块只有一个count,记录该数据块中存储了多少条记录;
(2)每个数据块中存储了每个采集点在此数据块中的聚合数据,如果该设备有m个采集点,那么数据块中将记录m个min、max和sum聚合数据。
本实施例中,数据块内的行存数据以行存方式存储每一条记录:
(1)数据块中的记录个数为聚合数据部分的count;
(2)每条记录包含bits和colij,其中,bits是null bitmap,标记当前记录的每个采集点col数值是否为空,colij则是当前记录第j个column数值。
本实施例中,时序数据入库时,数据先写入缓存块,缓存满了之后再写入分区数据文件中:
(1)每个设备在内存中缓存一个数据块。在数据入库时,往内存数据块中追加新的数据,并进行数据块内聚合数据计算和更新,包括count,以及各个采集点col的min、max和sum,同时更新数据块中的开始和结束时间戳;
(2)如果数据块满了,则会触发聚合计算,然后将数据块追加到当前分区数据文件的末尾。如果写入数据块开始时间小于当前分区时间范围的开始时间,则将当前分区时间范围的开始时间更改为写入数据块开始时间;
(3)数据块落盘之后,内存数据块中的数据将被清空,同时更新新的分区时间范围,开始时间和结束时间都设置为无穷大。
本实施例中,以系统时间为准,定期进行分区切换:
(1)分区切换时间可以配置,通常每天进行一次;
(2)定期触发分区切换时,将所有设备的当前分区时间范围数组的结束时间更新并落盘,然后判断下一个分区数据文件(即最旧分区数据文件)是否已经存在,如果存在则将其删除,并重新创建新的分区数据文件;
(3)分区切换时,内存数据块缓存的数据不会落盘,这些数据将随同后续写入的数据存储到新的空分区文件,为此,创建新的分区数据文件之后,需要将新的分区时间范围的开始和结束时间设置为各个设备内存数据块的开始和结束时间。
本实施例中,乱序数据入库处理流程与顺序数据入库流程一致,只是在查询过程中发现乱序数据时需要进行排序。
本实施例中,根据时间分区对数据进行生命周期管理:
(1)用户可以配置数据生命周期,其单位通常为天。
(2)每次切换新的分区时,自动将最旧的分区文件删除。由于时间分区是以入库的系统时间为准进行分区的,因此删除的是最旧入库的数据。
本实施例中,历史数据查询将根据设备分片、时间分区以及数据块进行检索:
(1)根据设备名及其hash值得到分片编号,找到该设备对应的分片;
(2)根据查询时间范围遍历设备对应的分区时间范围数组,来确定需要访问读取哪些分区数据文件;
(3)原始历史数据查询过程中,将对所有有交集的分区数据文件进行访问,通过链表方式,对该设备的所有数据块进行遍历,并过滤出所有在查询时间范围内的记录;
(4)历史数据插值查询过程中,根据插值时间点对所有有交集的分区数据文件进行访问,通过链表方式,对该设备的所有数据块进行遍历,并根据每条记录时间戳来更新插值时间点前后的数据,遍历完所有记录之后,根据插值时间点前后数据还原插值出相应数值。
本实施例中,在进行历史聚合数据查询时,有条件的情况下将读取数据块内的聚合数据来加速查询:
(1)如果查询中的聚合函数是count、min、max、sum相关,那么将启用数据块的聚合数据来加速聚合数据查询;如果数据块在某个时间段内,则直接读取数据块中对应的聚合数据即可,无需读取数据块内的数据然后进行聚合计算;
(2)如果现有的聚合数据无法加速聚合数据查询,比如说数据块中没有存储相应的聚合数据,那么将读取每个满足条件的数据块,遍历数据块中的每一条记录进行聚合计算,生成聚合结果。
本实施例中,根据时间分区对分区数据文件进行压缩:
(1)当前分区数据文件写入完毕,切换新的分区时,原来的分区数据文件将不再写入数据,此时将对整个分区数据文件进行压缩,然后删除原来未压缩的分区数据文件;
(2)在数据读取过程中,并不对整个历史分区数据文件进行解压缩,而是根据需要读取的数据页面进行部分数据解压缩。
实施例3:
本实施例还提供了一种电子设备,包括:存储器和处理器;
其中,存储器存储计算机执行指令;
处理器执行所述存储器存储的计算机执行指令,使得处理器执行本发明任一实施例中的基于时间分区索引的时序数据存储管理方法。
处理器可以是中央处理单元(CPU),还可以是其他通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通过处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器可用于储存计算机程序和/或模块,处理器通过运行或执行存储在存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现电子设备的各种功能。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器还可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,只能存储卡(SMC),安全数字(SD)卡,闪存卡、至少一个磁盘存储期间、闪存器件、或其他易失性固态存储器件。
实施例4:
本实施例还提供了一种计算机可读存储介质,其中存储有多条指令,指令由处理器加载,使处理器执行本发明任一实施例中的基于时间分区索引的时序数据存储管理方法。具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。
在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。
用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RYM、DVD-RW、DVD+RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上下载程序代码。
此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。
此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展单元中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展单元上的CPU等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (10)

1.一种基于时间分区索引的时序数据存储管理方法,其特征在于,该方法是根据物联网应用系统的时序数据入库特点和查询检索特征,对设备数据进行分片管理,在分片内时序数据按照时间进行分区,相同时间段内的数据放到一起连续存储;并对相同时间分区内的数据,按照入库先后顺序以数据库方式依次存储,在数据块内进行统计计算,预存聚合数据,提高时序数据查询性能。
2.根据权利要求1所述的基于时间分区索引的时序数据存储管理方法,其特征在于,该方法具体如下:
设备数据分片:对设备按照设备名进行划分,将海量设备划分到多个分片中;
基于时间戳分片的时序数据管理:在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
时序数据入库:在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
生命周期管理;
时序数据查询;
基于分区数据文件的数据压缩。
3.根据权利要求2所述的基于时间分区索引的时序数据存储管理方法,其特征在于,对设备数据分片是在分布式数据库场景下,根据数据分片将设备数据分布到不同的节点上进行存储管理,提高物联网应用系统的线性扩展能力;设备所在的分片编号根据hash值和分片个数计算得到,公式如下:
Index(DeviceName)=HashVal(DeviceName)%SliceCount+1;
其中,SliceCount表示分片个数,分片编号为1、2、3、…、SliceCount;DeviceName表示设备名称;HashVal(DeviceName)表示设备名称为DeviceName的hash值;Index(DeviceName)表示设备所在的分片编号;
设备名称为DeviceName的设备数据将被分配到编号为Index(DeviceName)的分片中进行存储管理;同样的,当对设备名称为DeviceName的设备进行历史数据查询时,直接到编号为Index(DeviceName)的分片中去查询数据。
4.根据权利要求2所述的基于时间分区索引的时序数据存储管理方法,其特征在于,基于时间戳分片的时序数据管理具体如下:
分区划分:每个分片中的设备数据,将按照时间戳分区将不同时间段的数据分布到不同的分区分别进行存储管理;每个分区的时间范围设置为一天,根据物联网应用系统时间对数据进行时间分区,即每天划一次分区,每天写入的数据写到同一个分区中,并持久化到对应的一个分区数据文件中;相同的分区内不同设备的时间范围不同,且每个设备对应每个分区文件都有其相应的时间范围,即开始时间和结束时间;
分区时间范围文件记录每个设备在每个分区文件中存储的时间范围,其中以数组方式依次存储每个设备的所有分区时间范围;设分片中有设备1、设备2、设备3、…、设备d,共计d个设备,时序数据生命周期为c天,即数据将被保存c天,c天之前的历史数据将被自动删除,每个设备都记录该设备在每个分区的时间范围;每个设备的分区时间范围数组大小为c+1,该数组是随着时间推移循环写入的,当新的分区形成时,将覆盖最旧的分区,而最旧的分区数据也将被删除;同一个分片内所有设备的所有分区对应的时间范围持久化道单独的一个分区时间范围文件中,与存储数据的分区文件分开,每个分区对应一个分区数据文件,c+1个分区就对应着c+1个分区数据文件;
设当天分区对应的数组中第i个元素,当天分区时间结束,开始下一天的分区时,i将更新为(i+1)%(c+1)+1,下一天的分区时间范围将写入第(i+1)%(c+1)+1个数组元素,当i为c+1时,下一个i将是1,如此循环覆盖;任意分区数据文件k,设备1在分区数据文件k中的时间范围是其分区时间范围数组中的第k个元素[start_timek,end_timek],即分区数据文件k中存储的设备1数据的时间范围在start_timek到end_timek之间,包含边界时间点,设设备1在分区数据文件k中的数据集为Dk,即必须满足:
start_timek≤valtimestamp≤end_timek
任意两个分区时间范围,交集不为空,即:
[start_timek,end_timek]∩[start_timel,end_timel]≠Φ;
分区内数据块结构:同一个分区的所有设备数据均保存到同一个分区文件中,所有的数据都是以数据库块方式进行存储,每个数据库块中的数据都是同一个设备的数据;在分区文件中,一个设备存储有多个数据块,每个数据块之间采用单向链表方式进行存储;设分区数据文件k中的所有数据块集合为Bk,则其中任意数据块的时间范围在该分区时间范围内,即:
数据块内数据结构:每个数据块中头部包括开始时间、结束时间和指针;其中,开始时间是数据块中存储的最小时间戳,结束时间是数据块中存储的最大时间戳,指针则是指向下一个数据块的地址;紧随数据块头部的是数据部分,数据部分包括聚合数据和存储每一条记录的行存数据;
设备有m+1个列,除了时间戳之外,其他m个列都是该设备中的采集点,一个数据块中的聚合数据部分存储所有聚合数据,包括count、min、max和sum,除了时间戳,每个列都有其min、max和sum,分别记录其在该数据块中存储的最小值、最大值和总和;数据块中的行存数据部分以行存方式存放每一条记录,记录个数为聚合数据部分的count,每条记录包含bits和colij;其中,bits是null bitmap,标记当前记录的每个采集点col是否为空,colij则是当前记录第j个column数值。
5.根据权利要求2所述的基于时间分区索引的时序数据存储管理方法,其特征在于,时序数据入库具体如下:
顺序数据入库:每个设备在内存中缓存一个数据块;在数据入库时,往内存数据块中追加新的数据,并进行数据块内聚合数据计算和更新,包括count,以及各个采集点col的min、max和sum,同时更新数据块中的开始和结束时间戳;若数据块已满,则触发聚合计算,再将数据块追加到当前分区文件的末尾;若写入数据块开始时间小于当前分区时间范围的开始时间,则将当前分区时间范围的开始时间更改为写入数据块开始时间;落盘后,内存数据块中的数据将被清空,同时更新新的分区时间范围,开始时间和结束时间都设置为无穷大;
分区切换:每天定时触发分区切换,分区切换时,先将所有设备的当前分区时间范围数组的结束时间更新并落盘,再判断下一个分区数据文件是否已经存在:
若存在,则将分区数据文件删除,并重新创建新的分区数据文件;
分区切换时,内存数据块缓存的数据不会落盘,该内存数据块缓存的数据将随同后续写入的数据写入新的空分区文件,故创建新的分区数据文件后,需要将新的分区时间范围的开始和结束时间设置为各个设备内存数据块的开始和结束时间;
分区切换过程中,内存数据块将被推迟到下一个新的分区文件进行落盘;
乱序数据入库:数据入库流程与顺序数据入库流程相同,包括聚合数据计算和块内开始时间及结束时间,均完全根据块内所有数据进行计算。
6.根据权利要求2所述的基于时间分区索引的时序数据存储管理方法,其特征在于,时序数据查询具体如下:
原始历史数据查询:对指定设备在给定时间范围内的历史数据进行查询,要求返回该设备在给定时间范围内的所有历史数据;具体为:设查询时间范围为[Qstart,Qend],查询过程中,首先检查该时间范围与哪些分区时间范围有交集,并对有交集的分区进行分区数据文件的查询;
进行分区文件查询时,通过链表方式对该设备的所有数据块进行遍历,在访问每个数据块时,先检查该数据块的时间范围是否与[Qstart,Qend]有交集:
若有交集,则需要把整个数据块读取出来,并遍历数据块中的每一条记录,过滤出所有在[Qstart,Qend]时间范围内的记录;
历史数据插值查询:对指定设备在给定时间范围内进行指定时间间隔的插值查询,要求返回该设备在给定时间范围内每隔一个时间间隔返回一条记录;具体为:设查询时间范围为[Qstart,Qend],时间间隔为Qinterval,则返回的记录数是每个时间点为Qstart+interval,Qstart+2*interval,…;查询过程中,首先,为数组Closest分配count个元素,每个元素包含对应时间点的前后记录,分别记为Closest[i].left和Closest[i].right,总共存储2*count个记录;其次,根据分区时间范围和分区内数据块时间范围来遍历所有满足条件的记录,并根据记录时间戳,更新对应的时间点前后记录及其数值;
设当前处理的记录为record,如果该记录的时间戳左边更接近于Closest[i],即:Closest[i].left.timestamp<record.timestamp≤Qstart+i*interval;
那么,将Closest[i].left更新为record,即Closest[i].left=record;若该记录的时间戳右边更接近于Closest[i],即:
Qstart+i*interval≤record.timestamp<Closest[i].right.timestamp;
那么,将Closest[i].right更新为record,即Closest[i].right=record;
当所有满足条件的记录都遍历完成后,首先生成结果集ResultSet,并设置每个元素对应的时间戳:Results[i].timestamp=Qstart+i*interval;
然后,根据如下表达式进行插值计算出结果集ResultSet中每个时间点上的数值:
历史聚合数据查询:对指定设备在给定时间范围内进行聚合数据查询,按照时间间隔分组,要求返回该设备在给定时间范围内每个时间段内的聚合结果;若查询中的聚合函数是count、min、max、sum相关,则在将启用数据块的聚合数据来加速聚合数据查询;若数据块在其中任一个时间段内,则直接读取数据块中对应的聚合数据即可,无需读取数据块内的数据然后进行聚合计算;
若现有的聚合数据无法加速聚合数据查询,则将读取每个满足条件的数据块,遍历数据块中的每一条记录进行聚合计算,生成聚合结果。
7.根据权利要求2-6中任一项所述的基于时间分区索引的时序数据存储管理方法,其特征在于,生命周期管理是指允许用户定义历史数据保存的时间,以天为单位,设生命周期为c天,则c天之后其历史数据将被删除;分区文件是循环覆盖写的,每次切换新的分区时,都会将下一个分区文件,即最旧的分区文件删除,即c天前的数据文件,同时,所有设备的分区时间范围数组中对应分区的开始时间将更新为新分区的开始时间,结束时间则为无穷大;生命周期管理以入库时间为准进行数据删除,并非以采集时间戳进行删除的;
基于分区数据文件的数据压缩具体如下:
分区数据文件压缩:当前分区数据文件写入完毕,切换新的分区时,原来的分区数据文件将不再写入数据,此时将对整个分区数据文件进行压缩,再删除原来未压缩的分区数据文件;
分区数据文件解压:在数据读取过程中,根据需要读取的数据页面进行部分数据解压缩。
8.一种基于时间分区索引的时序数据存储管理系统,其特征在于,该系统包括:
分片模块,用于对设备按照设备名进行划分,将海量设备划分到多个分片中;
分片管理模块,用于在每个分片中,对时间戳进行分区,设备数据将根据时间戳分区写入到不同的文件中;
入库模块,用于在每个时间戳分区文件中,设备数据按照数据块方式依次写入到数据文件中;其中,每个数据块的头部包括多个聚合数据,记录每个数据块内的统计信息;在查询过程中,若涉及到数据块内所有数据的聚集查询,则只需读取聚合数据;
周期管理模块,用于根据时间分区对数据进行生命周期管理;
查询模块,用于根据设备分片、时间分区以及数据块进行历史数据检索,在进行历史聚合数据查询时,有条件的情况下将读取数据块内的聚合数据来加速查询;
压缩模块,用于根据时间分区对分区数据文件进行压缩。
9.一种电子设备,其特征在于,包括:存储器和至少一个处理器;
其中,所述存储器上存储有计算机程序;
所述至少一个处理器执行所述存储器存储的计算机程序,使得所述至少一个处理器执行如权利要求1至7任一项所述的基于时间分区索引的时序数据存储管理方法。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,所述计算机程序可被处理器执行以实现如权利要求1至7中任一项所述的基于时间分区索引的时序数据存储管理方法。
CN202311524797.0A 2023-11-16 2023-11-16 基于时间分区索引的时序数据存储管理方法及系统 Pending CN117633105A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311524797.0A CN117633105A (zh) 2023-11-16 2023-11-16 基于时间分区索引的时序数据存储管理方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311524797.0A CN117633105A (zh) 2023-11-16 2023-11-16 基于时间分区索引的时序数据存储管理方法及系统

Publications (1)

Publication Number Publication Date
CN117633105A true CN117633105A (zh) 2024-03-01

Family

ID=90027913

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311524797.0A Pending CN117633105A (zh) 2023-11-16 2023-11-16 基于时间分区索引的时序数据存储管理方法及系统

Country Status (1)

Country Link
CN (1) CN117633105A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118550920A (zh) * 2024-07-24 2024-08-27 浙江浙能数字科技有限公司 一种基于时序数据计算点的计算方法与装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN118550920A (zh) * 2024-07-24 2024-08-27 浙江浙能数字科技有限公司 一种基于时序数据计算点的计算方法与装置

Similar Documents

Publication Publication Date Title
US11238098B2 (en) Heterogenous key-value sets in tree database
US9798754B1 (en) Method to efficiently track I/O access history using efficient memory data structures
US9965394B2 (en) Selective compression in data storage systems
CN107423422B (zh) 基于网格的空间数据分布式存储及检索方法和系统
KR102564170B1 (ko) 데이터 객체 저장 방법, 장치, 및 이를 이용한 컴퓨터 프로그램이 저장되는 컴퓨터 판독가능한 저장 매체
US8738572B2 (en) System and method for storing data streams in a distributed environment
US11429630B2 (en) Tiered storage for data processing
US20200409925A1 (en) Data processing method and apparatus, storage medium and electronic device
US10061834B1 (en) Incremental out-of-place updates for datasets in data stores
US10509769B1 (en) Method to efficiently track I/O access history
CN108140040A (zh) 存储器中数据库的选择性数据压缩
JP3416502B2 (ja) 配列維持方法
US20190087437A1 (en) Scheduling database compaction in ip drives
CN112262379B (zh) 存储数据项并且标识存储的数据项
CN117633105A (zh) 基于时间分区索引的时序数据存储管理方法及系统
US6745198B1 (en) Parallel spatial join index
CN112148736A (zh) 缓存数据的方法、设备及存储介质
CN116204130A (zh) 一种键值存储系统和键值存储系统的管理方法
CN108021562B (zh) 应用于分布式文件系统的存盘方法、装置及分布式文件系统
CN113641681B (zh) 一种空间自适应的海量数据查询方法
US10416901B1 (en) Storage element cloning in presence of data storage pre-mapper with multiple simultaneous instances of volume address using virtual copies
CN112711564B (zh) 合并处理方法以及相关设备
JP2023531751A (ja) 車載データ記憶方法およびシステム
WO2015015727A1 (ja) ストレージ装置、データアクセス方法およびプログラム記録媒体
CN115454353A (zh) 一种面向空间应用数据的高速写入及查询方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination