一种基于InfluxDB的高基数内存优化方法及改进InfluxDB

    专利查询2025-06-07  59


    本发明涉及数据库,具体涉及一种基于influxdb的高基数内存优化方法及改进influxdb。


    背景技术:

    1、时序数据是指按照时间顺序索引的数据点,这些数据通常由同一来源在一个固定的时间间隔内的连续测量组成,用于跟踪随时间而产生的变化。时序数据由测量指标(metric)、标签集(tag set)、测量字段集(field set)和时间戳(timestamp)构成。时序数据作为一种重要的数据形式,广泛应用于各类监控系统、物联网和金融数据分析等领域。

    2、时序数据库是用于管理时序数据的一类数据库,至少应该具有写入(write)和查询(query)操作,有些时序数据库也提供更新(update)和删除(delete)操作。write将一个或者一批时序数据点写入时序数据库;query从时序数据库中查询数据,需要支持基于时间范围和标签组合的过滤查询;update更新具有相同标签值和时间戳的时序数据;delete根据时间范围、标签值和字段从数据库中删除数据。时序数据库需要面对每秒数百万数据点的写入,不断增加的时序数据导致存储成本快速增加,同时,由于大量查询将导致时序数据库消耗大量的内存。高负载下的内存消耗问题使得influxdb的读写性能大幅下降。对部分特殊负载,influxdb在执行单个查询任务时,其内存消耗可达几十gb乃至几百gb,严重时将导致influxdb崩溃。

    3、时序数据的持续高吞吐量读写、多维度元数据管理等特性,使得时序数据库产生高基数问题。由于一个时间序列可以包含多个索引列,且每个索引列可包含多个唯一值,因此每当索引列增加,或某个索引列中的唯一值数量增加时,都将导致时间序列基数成倍数增长,从而导致时序数据库的高基数问题。高基数问题,一方面使得时序数据库定位唯一值所需时间增加,不但导致查询性能降低,而且也会引起写入吞吐量下降;另一方面,高基数引起索引数量呈倍数增长,进而造成内存消耗过多的问题。

    4、为解决上述问题,不同时序数据库分别在时序数据模型、索引结构和元数据存储架构等方面做出了改进,这些改进通常是做出折中,如在查询效率和资源占用之间做出折中,以尽可能提升时序数据库可管理的时间序列基数。比如为了解决时序数据高基数问题,influxdb重新设计了存储引擎iox,将每个标签(tag)和字段(field)存储为一个列,减少了列的总数,从而提高了性能。然而influxdb在高基数场景下,内存消耗问题影响了运行时的稳健性。


    技术实现思路

    1、为了解决上述现有技术中存在的问题,本发明提供了一种基于influxdb的高基数内存优化方法及改进influxdb,解决现有技术无法通过对influxdb的业务流程进行合理改造,降低influxdb在高基数场景下的内存消耗,使influxdb能够承受更高基数的数据负载的技术问题。

    2、一种基于influxdb的高基数内存优化方法,包括:通过对compaction流程优化实现在高基数查询场景下减少必须驻留在内存中的时序数据量,并且基于时间线间的数据分布的偏斜性对数据块定位流程、迭代器读取数据的流程进行优化延迟非必要数据块的读取。

    3、进一步地,所述compaction流程优化包括:根据某一时刻写入缓存的时间线基数来动态地控制influxdb落盘时的每条时间线对应的数据块大小,从而实现在查询时根据某一时刻内的时间线基数大小动态调整迭代器读入缓冲区的数据条目数量。

    4、进一步地,为influxdb中cache的落盘时机限定一个占用内存大小的阈值m,一旦cache中的各时间线的数据量之和达到这一阈值,便触发一次强制落盘,使得在并行写入的时间线基数较高的场景下,单条时间线内的数据量在未达到数据块的原始大小上限前就会被落盘;而在并行写入的时间线基数较低的场景下,数据块的大小不会受到影响,若并发写时间线的基数量为n,要达到阈值,则平均每条时间线需写入约m/n的数据量才会触发提前的强制落盘。

    5、进一步地,所述compaction流程优化还包括:在高基数场景下,在数据库对tsm文件进行compaction的过程中,取消tsm树在高层的compaction仅保留低层compaction,避免数据块在高层合并,使得数据块的大小得到控制。

    6、进一步地,对数据块定位流程优化包括:在查询初始化阶段,时间线迭代器不再获取所有与待查时间范围重叠的数据块信息,而仅获取包含查询起始时刻时戳的数据块信息。

    7、进一步地,将数据块分阶段读取,用于同步时间范围有重叠的数据块的读取进度,防止失序;利用tsm文件中数据块有序的特性,读取包含当前时间范围的时间起点curts的数据块信息后,再读取后一个数据块的信息,将后一个数据块的起始时间戳,作为当前时间范围的时间终点nextts;在当前时间范围内的时序数据读取完毕后,需要启动新一轮的数据块定位流程,此时迭代器将原时间范围的时间终点nextts的值作为当前新时间范围的时间起点curts。

    8、进一步地,对迭代器读取数据的流程优化包括:在上层迭代器完成构建后,发起一次预读,预读并不真正触发数据块的读取,而是比较迭代器树底层各时间线迭代器最近已读取或即将读取的时间戳,选择各迭代器间的最早时戳。在预读过程中,将选择结果回传至底层时间线迭代器,以指导底层时间线迭代器触发i/o操作预取数据的时机。

    9、进一步地,预读操作由merger迭代器发起,用于在查询准备阶段,嗅探待排序的时间线迭代器中的最早时戳值;merger迭代器以各时间线迭代器作为底层子迭代器输入,首先比较各子迭代器返回的时戳大小,保留最早的时戳,该时戳对应的数据条目作为merger迭代器的当前返回值。随后在调用merger迭代器的next方法时,继而级联调用子迭代器即时间线迭代器的next方法,获取下一条数据。调用子迭代器的next方法时附带merger迭代器的当前时戳信息;当底层迭代器的缓冲区中没有数据时,若发现merger迭代器传入的当前时戳与底层迭代器当前时间范围的起始时戳curts差距大于一个数据块的时间宽度时,则不会发起i/o操作来读取数据块;若merger迭代器传入的时戳与底层迭代器持有的当前时间范围的起始时戳curts的差距小于一个数据块的时间宽度,则该底层迭代器便发起i/o操作预取数据,预取回的数据块暂时不进行解压缩,当且仅当需要访问时,才对数据块进行解压。

    10、一种改进influxdb,应用一种基于influxdb的高基数内存优化方法,在数据块大小方面采用根据各个时刻的时间线基数大小动态调整数据块大小的方法进行优化,在数据块预取策略方面采用延迟当前查询阶段非必要数据的读取与解压进行优化,从而降低influxdb在高基数场景下的内存消耗。

    11、本发明的有益效果包括:

    12、针对高基数场景下,influxdb内存占用过大的问题,对influxdb的compaction流程、数据块定位流程及迭代器读取数据的流程进行了优化,并对优化后的influxdb系统进行了测试,对比了相同负载下的读写性能和内存占用情况,测试数据表明,本发明在高基数场景下,可有效降低influxdb执行查询操作所需的内存开销,提升了influxdb的稳健性。


    技术特征:

    1.一种基于influxdb的高基数内存优化方法,其特征在于,包括:通过对compaction流程优化实现在高基数查询场景下减少必须驻留在内存中的时序数据量,并且基于时间线间的数据分布的偏斜性对数据块定位流程、迭代器读取数据的流程进行优化延迟非必要数据块的读取与解压。

    2.根据权利要求1所述的一种基于influxdb的高基数内存优化方法,其特征在于,所述compaction流程优化包括:根据某一时刻写入缓存的时间线基数动态地控制influxdb落盘时的每条时间线对应的数据块大小。

    3.根据权利要求2所述的一种基于influxdb的高基数内存优化方法,其特征在于,为influxdb中cache的落盘时机限定一个占用内存大小的阈值m,一旦cache中的各时间线的数据量之和达到这一阈值,便触发一次强制落盘。

    4.根据权利要求1所述的一种基于influxdb的高基数内存优化方法,其特征在于,所述compaction流程优化还包括:在高基数场景下,在数据库对tsm文件进行compaction的过程中,取消tsm树在高层的compaction仅保留低层compaction。

    5.根据权利要求1所述的一种基于influxdb的高基数内存优化方法,其特征在于,对数据块定位流程优化包括:在查询初始化阶段,时间线迭代器不再获取所有与待查时间范围重叠的数据块信息,而仅获取包含查询起始时刻时戳的数据块信息。

    6.根据权利要求5所述的一种基于influxdb的高基数内存优化方法,其特征在于,将数据块分阶段读取,用于同步时间范围有重叠的数据块的读取进度;利用tsm文件中数据块有序的特性,读取包含当前时间范围的时间起点curts的数据块信息后,再读取后一个数据块的信息,将后一个数据块的起始时间戳,作为当前时间范围的时间终点nextts;在当前时间范围内的时序数据读取完毕后,需要启动新一轮的数据块定位流程,此时迭代器将原时间范围的时间终点nextts的值作为当前新时间范围的时间起点curts。

    7.根据权利要求1所述的一种基于influxdb的高基数内存优化方法,其特征在于,对迭代器读取数据的流程优化包括:在上层迭代器完成构建后,发起一次预读,所述预读为比较迭代器树底层各时间线迭代器最近已读取或即将读取的时间戳,选择各迭代器间的最早时戳作为选择结果,在预读过程中,将选择结果送至底层时间线迭代器,以指导底层时间线迭代器触发i/o操作预取数据的时机。

    8.根据权利要求7所述的一种基于influxdb的高基数内存优化方法,其特征在于,预读操作由merger迭代器发起,用于在查询准备阶段,嗅探待排序的时间线迭代器中的最早时戳值;merger迭代器以各时间线迭代器作为底层子迭代器输入,首先比较各子迭代器返回的时戳大小,保留最早的时戳,该时戳对应的数据条目作为merger迭代器的当前返回值;随后在调用merger迭代器的next方法时,继而级联调用子迭代器即时间线迭代器的next方法,获取下一条数据;调用子迭代器的next方法时附带merger迭代器的当前时戳信息;当底层迭代器的缓冲区中没有数据时,若发现merger迭代器传入的当前时戳与底层迭代器当前时间范围的起始时戳curts差距大于一个数据块的时间宽度时,则不会发起i/o操作来读取数据块;若merger迭代器传入的时戳与底层迭代器持有的当前时间范围的起始时戳curts的差距小于一个数据块的时间宽度,则该底层迭代器便发起i/o操作预取数据,预取回的数据块暂时不进行解压缩,当且仅当需要访问时,才对数据块进行解压。

    9.一种改进influxdb,其特征在于,应用权利要求1-8任一项所述的一种基于influxdb的高基数内存优化方法,在数据块大小方面采用根据各个时刻的时间线基数大小动态调整数据块大小的方法进行优化,在数据块预取策略方面采用延迟当前查询阶段非必要数据的读取与解压进行优化,降低influxdb在高基数场景下的内存消耗。


    技术总结
    本发明公开一种基于InfluxDB的高基数内存优化方法及改进InfluxDB,涉及数据库技术领域,解决如何通过对InfluxDB的存储与查询流程进行合理改造,降低InfluxDB在高基数场景下的内存消耗,使InfluxDB能够承受更高基数的数据负载的技术问题;本发明包括通过对InfluxDB的Compaction流程优化实现在高基数查询场景下减少必须驻留在内存中的时序数据量,并且基于时间线间数据分布的偏斜性对数据块定位流程及迭代器读取数据的流程优化延迟非必要数据块的读取与解压;本发明在保持低基数场景数据库读写性能的前提下,能大幅降低InfluxDB在高基数场景下的所需的内存资源,提高了InfluxDB稳健性。

    技术研发人员:侯卓含,聂晓文,黄麒之,宋元凤,范淑焕
    受保护的技术使用者:电子科技大学
    技术研发日:
    技术公布日:2024/11/26
    转载请注明原文地址:https://tc.8miu.com/read-29187.html

    最新回复(0)