时序存储引擎的热数据管理方法及系统与流程
未命名
08-29
阅读:168
评论:0

技术领域:
:,具体地说是时序存储引擎的热数据管理方法及系统。
背景技术:
::2.时序数据库是时间序列数据库的简称,时间序列数据库主要用于处理按照时间顺序变化的数据。时间序列数据的典型特点是:产生频率快、测点多信息量大。时序数据往往是由百万级甚至千万级终端设备产生的,写入并发量比较高,属于海量数据场景。3.在时序数据库持续写入的场景下,早先写入的时序数据的查询频率会随着时间推移而逐渐降低,这样的数据通常被称为“冷数据”。相对的,最近写入的时序数据被称为“热数据”。这些时序数据的时间戳往往距离当前很近,在时序应用的场景中会被频繁查询。4.在时序应用的场景中,冷数据的数据量往往非常庞大,但是极少用于查询。随着冷数据体量的不断变大,存储成本也会水涨船高。因此,我们需要设计一种合理的时序存储引擎的热数据管理机制,对数据进行分级存储,从而降低冷数据存储成本,提升热数据读取性能。5.如何设计一种合理的时序存储引擎的热数据管理机制,对数据进行分级存储,从而优化存储引擎的内存使用,降低冷数据存储成本,提升热数据读取性能,是需要解决的技术问题。技术实现要素:6.本发明的技术任务是针对以上不足,提供时序存储引擎的热数据管理方法及系统,来解决大量冷数据增加存储成本和影响读取性能的技术问题,实现优化存储引擎的内存使用,在不增加存储成本的前提下,提高时序数据库的查询性能。7.第一方面,本发明一种时序存储引擎的热数据管理方法,其特征在于,包括如下步骤:8.定义一个参数active_time,以表粒度进行配置,所述参数active_time用于控制一个表中尽量保存在内存的数据的时间范围,所述参数active_time的大小根据数据存储量和查询时间覆盖范围,在创建完表对象后,所述参数active_time的值能够进行调整;9.每个表对应一个table对象,每个table对象都维护一个block数组,block是一块固定大小的内存空间,所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列,recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列;如果内存使用空间已经超过阈值,删除recycle队列中的block对象,释放内存空间;10.为确保active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机,一个block对象要想进入recycle队列,需要满足如下两个时机条件:内存空间已经被写满;写入的最后一条数据的时间戳已经在active_time时间范围之外,即block对象中存放的数据都已经不再属于热数据。11.作为优选,基于block对象要想进入recycle队列需要满足的两个时机条件,基于热数据管理机制将block对象加入recycle队列,热数据管理机制的实现方式为:12.block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组;13.由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历;14.维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量;每一次遍历时,从记录的偏移量的下一个block对象开始遍历。15.作为优选,如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放,在这种情况下,时序数据库无法再正常写入数据,基于时序数据库无法再正常写入数据的情况,执行如下:16.在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。17.作为优选,由于block加入recycle队列发生在数据写入时,可能存在如场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据的block对象也一直无法进入recycle队列,当出现内存不足的情况,需要释放部分内存;同样的,在写入数据时,如果因为内存不足而写入失败,那么在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。18.作为优选,table对象维护另外一个参数actual_active_time,参数actual_active_time表示table中实际存放的热数据时间范围,参数actual_active_time在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。19.第二方面,本发明一种时序存储引擎的热数据管理系统,所述系统用于执行如第一方面任一项所述的时序存储引擎的热数据管理方法,所述系统包括参数配置模块和存储设计模块,20.所述参数配置模块用于执行如下:定义一个参数active_time,以表粒度进行配置,所述参数active_time用于控制一个表中尽量保存在内存的数据的时间范围,所述参数active_time的大小根据数据存储量和查询时间覆盖范围,在创建完表对象后,所述参数active_time的值能够进行调整;21.所述存储设计模块用于执行如下:22.每个表对应一个table对象,每个table对象都维护一个block数组,block是一块固定大小的内存空间,所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列,recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列;如果内存使用空间已经超过阈值,删除recycle队列中的block对象,释放内存空间;23.为确保active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机,一个block对象要想进入recycle队列,需要满足如下两个时机条件:内存空间已经被写满;写入的最后一条数据的时间戳已经在active_time时间范围之外,即block对象中存放的数据都已经不再属于热数据。24.作为优选,基于block对象要想进入recycle队列需要满足的两个时机条件,基于热数据管理机制将block对象加入recycle队列,热数据管理机制的实现方式为:25.block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组;26.由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历;27.维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量;每一次遍历时,从记录的偏移量的下一个block对象开始遍历。28.作为优选,如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放,在这种情况下,时序数据库无法再正常写入数据,基于时序数据库无法再正常写入数据的情况,所述存储设计模块用于执行如下:29.在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。30.作为优选,由于block加入recycle队列发生在数据写入时,可能存在如场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据的block对象也一直无法进入recycle队列,当出现内存不足的情况,需要释放部分内存;同样的,在写入数据时,如果因为内存不足而写入失败,所述存储设计模块用于执行如下:在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。31.作为优选,参数配置模块还用于执行如下:table对象维护另外一个参数actual_active_time,参数actual_active_time表示table中实际存放的热数据时间范围,参数actual_active_time在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。32.本发明的时序存储引擎的热数据管理方法及系统具有以下优点:将时序数据划分为冷数据和热数据,通过对数据进行分级存储,尽量保证所有的热数据都存放在内存中,通过充分利用时序数据的特性,在不增加存储成本的前提下,来实现时序存储引擎查询性能的提升。附图说明33.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。34.下面结合附图对本发明进一步说明。35.图1为时序存储引擎的热数据管理方法的实现原理框图。具体实施方式36.下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定,在不冲突的情况下,本发明实施例以及实施例中的技术特征可以相互结合。37.本发明实施例提供时序存储引擎的热数据管理方法及系统,用于解决大量冷数据增加存储成本和影响读取性能的技术问题,实现优化存储引擎的内存使用,在不增加存储成本的前提下,提高时序数据库的查询性能。38.实施例1:39.本发明一种时序存储引擎的热数据管理方法,旨在优化存储引擎的内存使用,在不增加存储成本的前提下,提高时序数据库的查询性能。40.针对本技术的方法,从业务层面和存储设计实现两方面进行陈述。41.冷热数据是一个业务层面的定义,由用户指定。本实施例定义一个参数active_time,以表粒度进行配置,该参数控制一个表中尽量保存在内存的数据的时间范围。用户可以根据数据存储量和查询时间覆盖范围,确定参数active_time的大小。在创建完表对象后,也可以根据实际情况对active_time的值进行调整。42.参数active_time是表粒度的,每个表对应一个table对象。每个table对象都维护一个block数组,block是一块固定大小的内存空间,是最基本的存储单元。所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列。recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列。如果内存使用空间已经超过阈值,就可以删除recycle队列中的block对象,释放内存空间。43.想要保证active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机。理论上,一个block对象在写满后就可以进入recycle队列。一旦block对象进入recycle队列,它就随时都有可能被删除。那么,该block对象中存放的数据是否还保留在内存中就变得不可控,这与我们要在内存中保存一段时间内的热数据的想法相悖。44.因此,需要控制block对象进入recycle队列的时机。一个block对象要想进入recycle队列,需要满足两个条件:1、内存空间已经被写满;2、写入的最后一条数据的时间戳已经在active_time时间范围之外,也就是说该block对象中存放的数据都已经不再属于热数据。45.热数据管理机制的实现方式:block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组。由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历。维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量。每一次遍历时,从记录的偏移量的下一个block对象开始遍历。46.如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放。在这种情况下,时序数据库无法再正常写入数据,这是一种非常严重的情况。处理方法:在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。47.由于block加入recycle队列发生在数据写入时,那么可能存在这样一种场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据的block对象也一直无法进入recycle队列。当出现内存不足的情况,就需要释放掉这部分内存。同样的,也是在写入数据时,如果因为内存不足而写入失败,那么在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。48.综上,本实施例公开的方法也只是尽量保证每个table对象的热数据都保存在内存中,并不能一定保证时时刻刻都满足这个要求。因此,table维护另外一个参数actual_active_time,表示table中实际存放的热数据时间范围,该参数在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。49.实施例2:50.本发明一种时序存储引擎的热数据管理系统,包括参数配置模块和存储设计模块,该系统执行实施例公开的方法实现热数据管理。51.参数配置模块用于执行如下:定义一个参数active_time,以表粒度进行配置,所述参数active_time用于控制一个表中尽量保存在内存的数据的时间范围,所述参数active_time的大小根据数据存储量和查询时间覆盖范围,在创建完表对象后,所述参数active_time的值能够进行调整。52.冷热数据是一个业务层面的定义,由用户指定。本实施例参数配置模块在业务层面定义一个参数active_time,以表粒度进行配置,该参数控制一个表中尽量保存在内存的数据的时间范围。用户可以根据数据存储量和查询时间覆盖范围,确定参数active_time的大小。在创建完表对象后,也可以根据实际情况对active_time的值进行调整。53.存储设计模块用于执行如下:每个表对应一个table对象,每个table对象都维护一个block数组,block是一块固定大小的内存空间,是最基本的存储单元;所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列,recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列;如果内存使用空间已经超过阈值,删除recycle队列中的block对象,释放内存空间。54.想要保证active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机,理论上,一个block对象在写满后就可以进入recycle队列。一旦block对象进入recycle队列,它就随时都有可能被删除。那么,该block对象中存放的数据是否还保留在内存中就变得不可控,这与我们要在内存中保存一段时间内的热数据的想法相悖。55.因此,需要控制block对象进入recycle队列的时机。一个block对象要想进入recycle队列,需要满足两个条件:1、内存空间已经被写满;2、写入的最后一条数据的时间戳已经在active_time时间范围之外,也就是说该block对象中存放的数据都已经不再属于热数据。56.基于上述两个时机条件,热数据管理机制的实现方式为:block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组。由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历。维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量。每一次遍历时,从记录的偏移量的下一个block对象开始遍历。57.如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放。在这种情况下,时序数据库无法再正常写入数据,这是一种非常严重的情况。处理方法:在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。58.由于block加入recycle队列发生在数据写入时,那么可能存在这样一种场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据的block对象也一直无法进入recycle队列。当出现内存不足的情况,就需要释放掉这部分内存。同样的,也是在写入数据时,如果因为内存不足而写入失败,那么在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。59.综上,上述实施例也只是尽量保证每个table对象的热数据都保存在内存中,并不能一定保证时时刻刻都满足这个要求。因此,参数配置模块还用于执行如下:table对象维护另外一个参数actual_active_time,表示table中实际存放的热数据时间范围,该参数在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。60.上文通过附图和优选实施例对本发明进行了详细展示和说明,然而本发明不限于这些已揭示的实施例,基与上述多个实施例本领域技术人员可以知晓,可以组合上述不同实施例中的手段得到本发明更多的实施例,这些实施例也在本发明的保护范围之内。当前第1页12当前第1页12
技术特征:
1.一种时序存储引擎的热数据管理方法,其特征在于,包括如下步骤:定义一个参数active_time,以表粒度进行配置,所述参数active_time用于控制一个表中尽量保存在内存的数据的时间范围,所述参数active_time的大小根据数据存储量和查询时间覆盖范围,在创建完表对象后,所述参数active_time的值能够进行调整;每个表对应一个table对象,每个table对象都维护一个block数组,block是一块固定大小的内存空间,所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列,recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列;如果内存使用空间已经超过阈值,删除recycle队列中的block对象,释放内存空间;为确保active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机,一个block对象要想进入recycle队列,需要满足如下两个时机条件:内存空间已经被写满;写入的最后一条数据的时间戳已经在active_time时间范围之外,即block对象中存放的数据都已经不再属于热数据。2.根据权利要求1所述的时序存储引擎的热数据管理方法,其特征在于,基于block对象要想进入recycle队列需要满足的两个时机条件,基于热数据管理机制将block对象加入recycle队列,热数据管理机制的实现方式为:block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组;由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历;维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量;每一次遍历时,从记录的偏移量的下一个block对象开始遍历。3.根据权利要求1所述的时序存储引擎的热数据管理方法,其特征在于,如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放,在这种情况下,时序数据库无法再正常写入数据,基于时序数据库无法再正常写入数据的情况,执行如下:在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。4.根据权利要求1所述的时序存储引擎的热数据管理方法,其特征在于,由于block加入recycle队列发生在数据写入时,可能存在如场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据的block对象也一直无法进入recycle队列,当出现内存不足的情况,需要释放部分内存;同样的,在写入数据时,如果因为内存不足而写入失败,那么在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。5.根据权利要求1所述的时序存储引擎的热数据管理方法,其特征在于,table对象维护另外一个参数actual_active_time,参数actual_active_time表示table中实际存放的
热数据时间范围,参数actual_active_time在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。6.一种时序存储引擎的热数据管理系统,其特征在于,所述系统用于执行如权利要求1-5任一项所述的时序存储引擎的热数据管理方法,所述系统包括参数配置模块和存储设计模块,所述参数配置模块用于执行如下:定义一个参数active_time,以表粒度进行配置,所述参数active_time用于控制一个表中尽量保存在内存的数据的时间范围,所述参数active_time的大小根据数据存储量和查询时间覆盖范围,在创建完表对象后,所述参数active_time的值能够进行调整;所述存储设计模块用于执行如下:每个表对应一个table对象,每个table对象都维护一个block数组,block是一块固定大小的内存空间,所有内存的申请、回收和释放都通过写缓存进行管理,写缓存维护一个recycle队列,recycle队列中一个元素就是一个block对象,只有当block对象中存放的数据可以在内存中清除时,才可以加入recycle队列;如果内存使用空间已经超过阈值,删除recycle队列中的block对象,释放内存空间;为确保active_time时间范围内的热数据尽量存放在内存中,则需要优化block对象进入recycle队列的时机,一个block对象要想进入recycle队列,需要满足如下两个时机条件:内存空间已经被写满;写入的最后一条数据的时间戳已经在active_time时间范围之外,即block对象中存放的数据都已经不再属于热数据。7.根据权利要求6所述的时序存储引擎的热数据管理系统,其特征在于,基于block对象要想进入recycle队列需要满足的两个时机条件,基于热数据管理机制将block对象加入recycle队列,热数据管理机制的实现方式为:block对象加入recycle队列发生在写数据时,每次完成向table对象写入数据后,遍历该table对象的block数组,如果一个block对象已经写满且最后一条数据的时间戳已经不在active_time的时间范围内,则将该block对象加入recycle数组;由于时序数据是顺序的,如果一个block对象内的数据还包含热数据,那么其后续的block对象也一定包含,所以可以停止遍历;维护一个参数记录block数组中最后一个加入recycle队列的block对象的偏移量;每一次遍历时,从记录的偏移量的下一个block对象开始遍历。8.根据权利要求6所述的时序存储引擎的热数据管理系统,其特征在于,如果保证每个table对象都在内存中存放active_time时间范围内的数据,那么有可能会将所有的内存空间都写满,而且无法被释放,在这种情况下,时序数据库无法再正常写入数据,基于时序数据库无法再正常写入数据的情况,所述存储设计模块用于执行如下:在向一个table对象写入数据时,如果因为内存空间不足导致写入失败,则牺牲table本身的热数据存放,依次淘汰block数组中最旧的block,用于写入新数据,再将其重新加入队尾,通过block重新使用的方法解决内存不足的问题。9.根据权利要求6所述的时序存储引擎的热数据管理系统,其特征在于,由于block加入recycle队列发生在数据写入时,可能存在如场景:一个table对象在写入一部分数据后不再写入新数据了,所以即使该table对象内所有数据都已经不再是热数据,但是存放数据
的block对象也一直无法进入recycle队列,当出现内存不足的情况,需要释放部分内存;同样的,在写入数据时,如果因为内存不足而写入失败,所述存储设计模块用于执行如下:在上层遍历所有的table对象,如果一个table内的数据都已经不再是热数据,那么将该table对象的所有block对象加入recycle队列,释放内存。10.根据权利要求6所述的时序存储引擎的热数据管理系统,其特征在于,参数配置模块还用于执行如下:table对象维护另外一个参数actual_active_time,参数actual_active_time表示table中实际存放的热数据时间范围,参数actual_active_time在内存充足时有可能比active_time更大,在内存不足时有可能比active_time更小。
技术总结
本发明公开了时序存储引擎的热数据管理方法及系统,属于时序数据库领域,要解决的技术问题为如何提供一种有效的热数据管理机制,对数据进行分级存储,以优化存储引擎的内存使用,在不增加存储成本的前提下,提高查询性能。包括如下步骤:定义一个参数ACTIVE_TIME,以表粒度进行配置,将时序数据划分为热数据和冷数据;每个表在存储引擎中对应一个table对象,每个table对象维护一个block数组,每个block对象是最基本的存储单元;写缓存管理内存申请、回收和释放,写缓存维护一个recycle队列,如果一个block对象存放的数据已经不属于热数据,将该block加入recycle队列,回收内存空间。回收内存空间。回收内存空间。
技术研发人员:刘梦真
受保护的技术使用者:上海沄熹科技有限公司
技术研发日:2023.04.25
技术公布日:2023/8/14
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:VR手柄和头戴显示设备的制作方法 下一篇:一种滤棒物理指标二次验证系统的制作方法