一种时序数据快速存储和查询的方法与流程
- 国知局
- 2024-07-31 22:59:18
本发明涉及数据库,具体地说是一种时序数据快速存储和查询的方法。
背景技术:
1、时序数据是按照时间递增顺序入库,但由于网络延迟、设备故障、离线导入数据、并发插入等原因,导致进入数据库的时序数据不是按时间戳递增的,我们称这些数据为乱序数据。乱序数据是一种普遍现象,用户离线导入数据也可能是乱序的。因此,乱序数据处理也是时序数据库必须支持的场景。当时序数据库有乱序数据时,不能直接使用折半搜索进行快速定位。
2、乱序数据会使得时序数据库查询数据时性能受到很大影响,主要有如下方面问题:
3、1、遍历全部数据,会使得查询算法的性能很低,并且增加了磁盘的io;
4、2、如果进行全部数据重排,会耗费很长时间,而且会占用很多的内存资源;
5、3、如果每次查询加载数据时构建索引,也会消耗很多的资源;
6、4、last函数的实现也需要遍历所有数据。
技术实现思路
1、本发明的技术任务是针对以上不足之处,提供一种时序数据快速存储和查询的方法,能够快速定位数据位置,不必遍历所有数据;对过期数据的清理,并且使得mmap文件映射的内存地址始终有效,不必加锁保护,提升插入和查询的性能。
2、本发明解决其技术问题所采用的技术方案是:
3、一种时序数据快速存储和查询的方法,
4、使用固定大小的mmap文件,这样不会发生remap文件扩容现象,mmap文件对应的内存地址会始终有效,就不需要加锁控制mmap文件,从而能够提升整体性能;
5、将时序数据与索引数据分离,并且将时序数据与索引数据分割到多个不同文件中,用以实现对已过期时序数据的清理;
6、时序数据存入mmap技术打开的数据文件中,数据文件划分成多个block块,每个block块都由rt基数树进行索引;用户插入的时序数据按照顺序依次放入block块中;
7、在查询时序数据时,先根据rt基数树快速找到满足条件的第一个block块对应的叶子节点,然后通过该叶子节点内的指针快速找到下一个叶子节点,从而减少了遍历的block数量,提升了查询性能。
8、在sql中采用last函数获取最大时间戳的时序数据,根据rt基数树找到最后一个叶子节点,遍历这个节点以及正在写入的节点对应的block就能找到最大时间戳的时序数据。
9、本方法通过mmap技术能够充分利用系统资源提升io效率;rt基数树能够快速定位数据位置,不必遍历所有数据,从而提升查询性能;通过将rt基数树使用mmap技术存储的方式实现数据索引的高效持久化;通过固定大小的mmap文件的方式,实现过期数据的清理,并且使得mmap文件映射的内存地址始终有效,不必加锁保护,提升插入和查询的性能。
10、优选的,所述使用rt基数树快速索引block块,通过将rt基数树结构存入mmap技术打开的索引文件中,从而使得rt基数树索引可以被高效持久化,提升整体的性能。
11、进一步的,将存储的文件划分为mmap数据文件和mmap索引文件,mmap数据文件用于存放用户插入的时序数据;mmap索引文件用于存放快速查询用途的rt基数树结构;
12、所述mmap数据文件使用mmap技术进行读写,mmap数据文件存储的时序数据条数可配置,比如1千万条;将mmap数据文件划分为多个block块,block块存储的时序数据条数也可配置,比如10000条;程序运行时每条记录的长度都是固定的(时序数据基本都是定长类型的字段),因此,每个block块大小固定,每个mmap数据文件大小也固定;
13、用户插入的时序数据,会按照顺序依次存放到mmap数据文件的block块中,当block块满时,会继续写入mmap数据文件的下一个block块;当mmap数据文件写满时,会继续写入到新生成的mmap数据文件的第一个block块中,通过调用sync函数将mmap数据文件立即同步到磁盘中;
14、所述mmap索引文件使用mmap技术进行读写,mmap索引文件大小可以配置,比如10m;第一个mmap索引文件的前64个字节存储元数据结构体(metaheader),元数据结构体中包含:已分配到的文件位置(allocate offset)、当前正在插入数据的块对应的叶子节点的文件位置(current leaf node offset)、起始文件编码(start file id)、rt基数树根节点的文件位置(root node offset)、当前block块已经写入的记录条数(currentblockrows);
15、mmap索引文件编码从0开始,第一个mmap索引文件编码为0,并且这个mmap索引文件会一直存在,不会被清理掉。
16、进一步的,已分配到的文件位置(allocate offset):用于存储当前mmap索引文件已经写入到文件的哪个位置,下次再分配空间时会从这个位置继续申请;
17、当前正在插入数据的块对应的叶子节点的文件位置(current leaf nodeoffset):正在插入的数据写入到的block块对应的叶子节点所在文件的位置,新的叶子节点会在向新的block块申请空间时创建出来,用于快速索引这个block块;
18、起始文件编码(start file id):随着时序数据不断过期,会将过期数据的索引文件删除,mmap索引文件的文件编码会递增创建;此字段存储还在使用的最小索引文件编码,以便在重启时能够感知文件是否被误删;第一个mmap索引文件不会删除,因此,该字段从第二个mmap索引文件的编码开始。
19、rt基数树根节点的文件位置(root node offset):rt基数树根节点在mmap索引文件的位置;
20、rt基数树会不断申请新的空间用于存储树结构,当前mmap索引文件空间不足时,会新建mmap索引文件,并从新的mmap索引文件中申请空间,申请空间成功后更新元数据结构体(metaheader)中的已分配到的文件位置(allocate offset)。
21、进一步的,rt树中节点间不再通过指针的方式连接,而是通过mmap索引文件的位置信息连接,通过文件位置计算出节点结构体所在mmap索引文件以及在mmap索引文件的偏移量;
22、假设节点对应mmap索引文件位置为v,所有mmap索引文件对应的内存首地址形成的数组为mems,每个索引文件的大小为m;则节点的内存地址为:
23、
24、进一步的,rt基数树数据结构为rt基数树通过key快速检索到相应的value的一种数据结构,key与value一一对应;存储value的节点是叶子节点,key被分解存储到每层的中间节点中;rt基数树的key值为block块内最大的数据时间戳;
25、rt基数树的节点包括:
26、rootnode:根节点,根节点是rt基数树的第一个节点,检索时根据第一个节点逐层向下寻找;
27、middlenode:中间节点,rt基数树的中间节点用于快速定位叶子节点;
28、leafnode:叶子节点,存储value值;value是个结构体,用于存放对应的mmap数据文件block块信息,包含:block块在哪个mmap数据文件(data file id)、第几个block块(block id)、block块内数据时间戳最大值(max timestamp)、block块内数据时间戳最小值(min timestamp)、下一个叶子节点的文件位置(next leaf node offset)、当前叶子节点状态(status)等信息。
29、rt基数树的key对应于mmap数据文件中block块中时序数据的最大时间戳,当两个或多个block块中数据最小时间戳相同时,也就是有多个叶子节点的key相同时,只在rt基数树上挂载一个叶子节点,通过设置叶子节点结构体的“下一个叶子节点位置”将剩余相同key的叶子节点串联起来。
30、进一步的,用户插入一条数据时,如果元数据结构体(metaheader)中的当前block块已经写入的记录条数(current blockrows)小于block块数据容量,则该条数据可以写入到当前block块中,写入数据并更新当前block块已经写入的记录条数(currentblockrows)值后退出;
31、如果block容量不足,则判断mmap数据文件是否存在未使用的block块,如果没有,则需要创建新的mmap数据文件,并将mmap产生的地址放到数据文件地址的数组中;
32、每个mmap数据文件的文件编码与数据文件地址数组的下标对应,向mmap数据文件中申请新的block块,并创建叶子节点指向这个block块;将元数据结构体(metaheader)中的当前正在插入数据的块对应的叶子节点的文件位置(current leaf node offset)对应的叶子节点挂载到rt基数树中,同时修改元数据结构体(metaheader)的当前正在插入数据的块对应的叶子节点的文件位置(current leaf node offset)为新创建的叶子节点的文件位置,修改元数据结构体(metaheader)中的当前block块已经写入的记录条数(currentblockrows)为0;最后从新的block块中申请一个数据的空间,写入数据并更新当前block块已经写入的记录条数(current blockrows)值后退出。
33、进一步的,范围查询的方式如下:
34、第一步:根据查询的最小时间戳,到rt基数树中找大于等于这个时间戳的第一个叶子节点;
35、第二步:如果叶子节点为不存在,查询结束并返回;
36、第三步:判断该叶子节点内最小时间戳(min timestamp)是否大于查询范围的最大时间戳,如果是,则进入第五步;
37、第四步:遍历该叶子节点对应的mmap数据文件的block块中的所有数据,过滤出时间戳在查询范围内的时序数据;
38、第五步:获取到该叶子节点对应的下一个叶子节点,并跳转到第二步;
39、查询最新记录的方式如下:
40、从rt基数树中找到最后一个叶子节点,遍历这个叶子节点、通过下一个叶子节点的文件位置(next leaf node offset)关联的所有叶子节点以及metaheader结构体中的当前正在插入数据的块对应的叶子节点的文件位置(current leaf node offset)对应的叶子节点中的block块的所有数据,找到时间戳最大的时序数据,就是要查询的数据;
41、过期数据清理方式如下:
42、启动后台线程定期检查并清理过期数据和文件,
43、计算过期数据的时间点,然后到rt基数树中寻找大于等于这个时间点的叶子节点,假设为节点using;
44、从rt基数树的第一个叶子节点开始遍历所有叶子节点;
45、如果叶子节点在节点using之前,将叶子节点的状态status置为已失效;
46、遍历过程中,统计每个mmap数据文件的block对应的叶子节点状态是否都是已失效,如果都已失效,说明该mmap数据文件中的数据都已经过期,可以删除掉这个mmap数据文件;将这些文件存储到待删除文件数组中;
47、遍历过程中,统计出所有有效的叶子节点的位置的最小值,然后分析这个最小值处于哪个mmap索引文件中,小于文件编码的mmap索引文件都可以删除掉,第一个mmap索引文件需要保留;将这些索引文件存储到待删除文件数组中;
48、清理rt树,将节点using之前所有的叶子节点及不再使用的中间节点都删除掉;剩余的中间节点如果在待删除的文件数组中,则迁移到在mmap索引文件中重新申请的空间中;
49、遍历待删除文件数组,清理掉文件对应的mmap内存映射关系,然后删除数组中的所有文件。
50、本发明还要求保护一种时序数据快速存储和查询装置,包括:至少一个存储器和至少一个处理器;
51、所述至少一个存储器,用于存储机器可读程序;
52、所述至少一个处理器,用于调用所述机器可读程序,实现上述的方法。
53、本发明还要求保护一种计算机可读介质,所述计算机可读介质上存储有计算机指令,所述计算机指令在被处理器执行时,实现上述的方法。
54、本发明的一种时序数据快速存储和查询的方法与现有技术相比,具有以下
55、有益效果:
56、本发明通过使用mmap和rt技术,提出了一种乱序时序数据快速存储和查询的方法。通过mmap技术能够充分利用系统资源提升io效率;rt基数树能够快速定位数据位置,不必遍历所有数据,从而提升查询性能;通过将rt基数树使用mmap技术存储的方式,实现数据索引的高效持久化;通过固定大小的mmap文件的方式,实现过期数据的清理,并且使得mmap文件映射的内存地址始终有效,不必加锁保护,提升了插入和查询的性能。通过rt基数树索引极大提升了last函数的处理速度。
本文地址:https://www.jishuxx.com/zhuanli/20240730/195620.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。