时间序列数据库的模式转换方法及装置与流程

文档序号:19350270发布日期:2019-12-06 21:18阅读:191来源:国知局
本发明属于计算机数据管理
技术领域
:,尤其涉及一种时间序列数据库的模式转换方法及装置。
背景技术
::作为一种nosql(notonlystructuredquerylanguage,不仅是结构化查询语言)数据库,时间序列数据库已广泛应用于工业生产、医疗、金融等领域。通过使用时间序列数据库,用户可以方便、高效地存储和检索来自各种设备传感器的时间序列数据。不同时间序列数据库软件产品的时间序列模式管理方式存在差异。目前国际市场上存在的时间序列数据库有很多,这些数据库唯一标识一条时间序列的方式主要有两种。一种是基于度量(metric)和标签(tags)的标识方法,如influxdb、kairosdb等数据库系统的数据模式使用这种方式;另一种是基于路径(path)的标识方法,如apacheincubatoriotdb。下面用一个例子来介绍这两种数据库模式。假设用户需要用时间序列数据库管理两辆列车上的两种传感器的数据,即温度传感器和速度传感器的读数。第一辆列车的所属地为上海,另一辆列车的所属地为北京。记第一辆列车为device1,第二辆列车为device2,温度传感器为temperature,速度传感器为speed。在使用基于度量和标签的标识方法的时间序列数据库系统中,第一辆列车的温度传感器数据对应的时间序列用如下的json字符串来标识:其中,度量(metric)表示某一类度量指标,如某种传感器的读数值。标签(tags)是对该度量的一些描述信息,包含至少一个标签字段和标签值的键值对,不同标签字段之间没有顺序性。在使用基于路径的标识方法的时间序列数据库系统中,这条时间序列可以用如下的路径字符串来标识:root.shanghai.device1.temperature;其中root是默认的公共根路径节点,中间节点是对该传感器的描述信息,路径的最后一层,即叶子节点是传感器的读数。实际应用中,用户往往会根据实际业务增长的需要去升级和替换使用的软件系统。当升级前后所使用的时间序列数据库系统的数据模式不同时,就需要进行不同时间序列数据库的模式转换,以便进行历史数据的迁移,以及上层应用系统对新的底层数据存储的适配。现有方法只能通过手动方式将时间序列数据库中的数据进行模式转换,费事费力,且容易出错。技术实现要素:为克服上述现有的手动方式对时间序列数据库中的数据进行模式转换费事费力且容易出错的问题或者至少部分地解决上述问题,本发明实施例提供一种时间序列数据库的模式转换方法及装置。根据本发明实施例的第一方面,提供一种时间序列数据库的模式转换方法,包括:将基于度量和标签数据模式的时间序列转换为二元组;其中,所述二元组包括所述时间序列中的度量名称,以及一个或多个标签,每个所述标签包括标签字段和标签字段的标签值;若预先创建的双层映射表中存在所述度量名称,则从所述双层映射表中获取所述度量名称对应的子映射表;若所述子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空,则创建路径,将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置,并在所述路径的最后位置添加所述度量名称。根据本发明实施例第二方面提供一种时间序列数据库的模式转换装置,包括:转换模块,用于将基于度量和标签数据模式的时间序列转换为二元组;其中,所述二元组包括所述时间序列中的度量名称,以及一个或多个标签,每个所述标签包括标签字段和标签字段的标签值;获取模块,用于在预先创建的双层映射表中存在所述度量名称时,从所述双层映射表中获取所述度量名称对应的子映射表;创建模块,用于在所述子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空时,创建路径,将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置,并在所述路径的最后位置添加所述度量名称。根据本发明实施例的第三个方面,还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器调用所述程序指令能够执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的时间序列数据库的模式转换方法。根据本发明实施例的第四个方面,还提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的时间序列数据库的模式转换方法。本发明实施例提供一种时间序列数据库的模式转换方法及装置,该方法通过将基于度量和标签数据模式的时间序列转换为二元组,在预先创建的双层映射表中存在度量名称时,从双层映射表中获取度量名称对应的子映射表,若二元组中所有标签字段在子映射表中对应的路径位置不为空,则创建路径,将不同的标签字段对应的标签值填入到路径的相应位置,并在路径的最后一层填入度量名称,从而实现度量和标签数据模式到路径数据模式的转换,且只需要维护每个度量的标签字段关键字和路径位置的对应信息,具有很小的内存和硬盘持久化存储开销。附图说明为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例提供的时间序列数据库的模式转换方法整体流程示意图;图2为本发明又实施例提供的时间序列数据库的模式转换方法流程示意图;图3为本发明实施例提供的时间序列数据库的模式转换装置整体结构示意图;图4为本发明实施例提供的电子设备整体结构示意图。具体实施方式为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在本发明实施例之前,先介绍本发明的发明思路。设基于度量和标签数据模式的时间序列为smt,基于路径数据模式的时间序列为sp,若干时间序列的集合其中,tsi表示第i条时间序列,表示整数,n表示集合中时间序列的总条数。对于不同的数据模式,tsi的表示方式不同。在度量和标签数据模式下,将一条时间序列表示为一个带下标的标签键值对的集合,即其中,smt(tsi)为时间序列tsi在度量和标签数据模式下的表示,tj表示第j个标签,m为标签总数,标签集合的下标mi表示度量名称,表示正整数,kj表示第j个标签中的标签字段,vj表示第j个标签中的标签值。在路径模式下,将一条时间序列表示为以“/”为分隔符的路径字符串,即其中,sp(tsi)为时间序列tsi在路径数据模式下的表示,root为路径的根节点,vj表示路径的中间路径节点,为时间序列tsi中的描述信息,si是表示传感器的叶子结点。本实施例提供的时间序列数据库的模式转换方法fmt→p是将给定的时间序列tsi在度量和标签数据模式下的表示smt(tsi)转换为时间序列tsi在路径模式下的表示sp(tsi),即fmt→p(smt(tsi))=sp(tsi)。本质上是一种将一个集合中的元素组织成树型结构的映射。在本发明的一个实施例中提供一种时间序列数据库的模式转换方法,图1为本发明实施例提供的时间序列数据库的模式转换方法整体流程示意图,该方法包括:s101,将基于度量和标签数据模式的时间序列转换为二元组;其中,所述二元组包括所述时间序列中的度量名称,以及一个或多个标签,每个所述标签包括标签字段和标签字段的标签值;其中,基于度量和标签数据模式的时间序列一般用json或其他与json等价的字符串表示。对于当前待处理的基于度量和标签数据模式下的时间序列tsi,对其度量和标签数据模式下的字符串进行解析,将其转换为二元组<度量,标签>=<mi,smt(tsi)>,其中:s102,若预先创建的双层映射表中存在所述度量名称,若是,则从所述双层映射表中获取所述度量名称对应的子映射表;在对时间序列tsi进行模式转换之前,创建一个用于存放关键字标签字段和标签字段在路径模式下的路径位置之间对应关系的数据结构,记为table。table的数据结构为一个双层映射表,即map<string,map<string,integer>>。该双层映射表的键为度量名称,值为度量名称对应的标签中的各标签字段和各标签字段对应的路径位置之间的对应关系,即子映射表map<string,integer>。在对时间序列集合中的各时间序列进行模式转换时,增量式地对双层映射表的内容进行更新。具体通过判断双层映射表table中是否存在当前待处理时间序列tsi的度量名称mi,如果不存在度量名称mi,则说明tsi的度量名称是新出现的,创建新出现的度量名称对应的双层映射表;如果存在度量名称mi,则说明tsi的度量名称对应的双层映射表已创建过,从该双层映射表中获取度量名称mi对应的子映射表tagkeyordermap,即tagkeyordermap=table.get(mi),table.get为将度量名称mi作为参数,从双层映射表中获取度量名称mi对应的子映射表的函数。s103,若所述子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空,则创建路径,将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置,并在所述路径的最后位置添加所述度量名称。对于二元组中的任一标签tj=<kj,vj>,从子映射表tagkeyordermap中获取标签字段kj对应的路径位置order,即order=tagkeyordermap.get(kj),tagkeyordermap.get为将标签字段kj作为参数,从子映射表中获取标签字段kj对应的路径位置的函数。判断order是否为空,若order为空则说明当前的kj为新的标签字段,在子映射表中添加当前kj和其对应的路径位置之间的对应关系,从而增量式地构建每个度量的标签字段和路径位置之间的对应关系。若所有标签字段对应的order均不为空,则创建路径path,path=newpath(root),path为将根节点root作为参数创建路径的函数。对于子映射表中的任一路径位置,将该路径位置对应的标签字段的标签值添加到路径中该路径位置处,并在路径的最后位置添加度量名称。本实施例通过将基于度量和标签数据模式的时间序列转换为二元组,在预先创建的双层映射表中存在度量名称时,从双层映射表中获取度量名称对应的子映射表,若二元组中所有标签字段在子映射表中对应的路径位置不为空,则创建路径,将不同的标签字段对应的标签值填入到路径的相应位置,并在路径的最后一层填入度量名称,从而实现度量和标签数据模式到路径数据模式的转换,且只需要维护每个度量的标签字段关键字和路径位置的对应信息,具有很小的内存和硬盘持久化存储开销。在上述实施例的基础上,本实施例中若所述子映射表中所述二元组的所有标签字段在路径数据模式下的路径位置均不为空,则创建路径的步骤之前包括:对所述二元组中的所有标签进行排序;根据排序结果确定每个所述标签中的标签字段在路径数据模式下的路径位置;相应地,将基于度量和标签数据模式的时间序列转换为二元组的步骤之后还包括:若所述双层映射表中不存在所述度量名称,则对于所述二元组中任一标签,将该标签中的标签字段作为子映射表的键,将该标签中的标签字段在路径数据模式下的路径位置作为所述子映射表的值,存入所述子映射表;将所述度量名称作为所述双层映射表的键,将所述子映射表作为所述双层映射表的值,存入所述双层映射表。具体地,在对时间序列进行解析的过程中还对标签进行排序,本实施例不限于排序的方法。然后根据排序的先后顺序确定每个标签中的标签字段kj的下标j,将下标j作为标签字段kj在路径模式下的路径位置。如果双层映射表中不存在度量名称mi,则说明mi是新出现的。创建子映射表tagkeyordermap,子映射表的数据类型为map<string,integer>。对二元组smt(tsi)中的标签tj进行遍历,对于二元组中的任一标签tj=<kj,vj>,将其键kj作为子映射表的键,kj的下标j作为子映射表的值,存入子映射表中,即调用tagkeyordermap.put(kj,j)。其中,tagkeyordermap.put为将标签字段kj和其下标作为参数,将标签字段kj和其下标存入子映射表的函数。将度量名称mi作为双层映射表的键,将子映射表tagkeyordermap作为双层映射表的值,存入双层映射表table中,即table.put(mi,tagkeyordermap)。table.put为将度量名称mi和子映射表tagkeyordermap作为参数,将度量名称mi和子映射表tagkeyordermap存入双层映射表table的函数。在上述实施例的基础上,本实施例中对所述二元组中的所有标签进行排序的步骤具体包括:根据各所述标签在基于度量和标签数据模式的时间序列中出现的先后顺序,对所述二元组中的所有标签进行排序;或者,根据预设字典顺序,对所述二元组中的所有标签进行排序。具体的,可以根据标签在度量和标签数据模式下时间序列的字符串中出现的先后顺序对标签进行排序。若同一个度量名称对应的标签不会增加,则可以使用全局的字典顺序对标签进行排序。字典顺序可以为根据标签中标签字段首字母的字母表排序对标签字段的排序结果,但不限于这种字典排序。在上述各实施例的基础上,本实施例中还包括:对于所述二元组的任一标签字段,若所述子映射表中该标签字段在路径数据模式下的路径位置为空,则设置该标签字段在路径数据模式下的路径位置为所述子映射表中的路径位置总个数加1;将该标签字段和该标签字段在路径数据模式下的路径位置添加到所述子映射表中。具体地,如果任一标签字段在子映射表中对应的路径位置order为空,则说明该标签字段kj为新的标签字段。设置新的标签字段kj对应的路径位置为子映射表中的路径位置总个数加1,即order=tagkeyordermap.size()+1。其中,tagkeyordermap.size为获取子映射表tagkeyordermap中路径位置总个数的函数。将该标签字段和标签字段对应的路径位置添加到子映射表中,即table.put(mi,tagkeyordermap.put(kj,order))。在上述各实施例的基础上,本实施例中将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置的步骤具体包括:对于所述子映射表中任一路径位置,将该路径位置作为单层映射表中的键,将该路径位置对应的标签字段作为所述单层映射表中的值,添加到所述单层映射表;按照所有所述路径位置从前到后的顺序遍历所述单层映射表,获取各所述路径位置对应的标签字段;从所述二元组中获取各所述路径位置对应的标签字段的标签值;将每个所述路径位置对应的标签字段的标签值添加到所述路径的各路径位置。具体地,创建一个单层映射表ordertagkeymap,单层映射表的数据类型为map<integer,string>。对于子映射表中任一路径位置order,将该路径位置order作为单层映射表中的键,将该路径位置对应的标签字段kj作为单层映射表中的值,添加到单层映射表,即ordertagkeymap.put(order,kj),ordertagkeymap.put为将路径位置order和order对应的标签字段kj添加到单层映射表的函数。按照路径位置从前到后的顺序遍历单层映射表,获取各路径位置对应的标签字段。从二元组中获取各路径位置对应的标签字段的标签值。将各路径位置对应的标签字段的标签值添加到路径的相应路径位置处,如将第二个路径位置对应的标签字段的标签值添加到路径的第二个路径位置处。在上述各实施例的基础上,本实施例中将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置的步骤还包括:若任一所述路径位置对应的标签字段为空,则获知该路径位置对应的标签字段缺省,在该路径位置添加缺省默认值。具体地,对于任一路径位置i,i的范围为1到maxorder,若路径位置i对应的标签字段为空,说明该标签字段缺省。在该路径位置添加缺省默认值,即path.append(“default”),default为缺省默认值,path.append为在该路径位置添加缺省默认值的函数。若路径位置i对应的标签字段ki=ordertagkeymap.get(i)不为空,则在路径位置i添加ki对应的标签值vi,ordertagkeymap.get为获取路径位置i对应的标签字段的函数。在路径的最后位置添加度量名称mi,即path.append(mi)。path.append为在路径的最后位置添加度量名称的方法。最后完成路径的构键,即stringseriespath=path.build()。接着,对下一个时间序列进行处理,直到处理完时间序列集合中的所有时间序列。本实施例通过填充默认缺省路径,利用基于路径数据模式支持通配符“*”的路径查询,保留了基于度量和标签的数据模式的模糊查询特性。本实施例中时间序列数据库的模式转换方法流程图如图2所示。例如,基于度量和标签数据模式的时间序列的json字符串为:其中,度量名称为archive_file_tracked,标签包括<host,server1>,<data_center,dc1>,其中:smt(tsi)={<host,server1>,<data_center,dc1>}archive_file_tracked;判断table中是否存在键值archive_file_tracked,若不存在,则创建子映射表tagkeyordermap对smt(tsi)中的tj进行遍历,执行tagkeyordermap.put(host,1),tagkeyordermap.put(data_center,2),然后将keyordermap加入到table中。创建映射表ordertagkeymap,对smt(tsi)中的tj进行遍历,执行ordertagkeymap.put(1,host),ordertagkeymap.put(2,data_center)。创建路径path=newpath(root),maxorder=2,fori=1:2,若ordertagkeymap.get(i)不为空,填入对应的标签字段值。ordertagkeymap.get(1)的值为host,不为空,在路径后添加对应host字段的值,即path.append(server1)。ordertagkeymap.get(2)的值data_center,不为空,在路径后添加对应data_center字段的值,即path.append(dc1)。最后,在路径中添加度量名称,即path.append(archive_file_tracked)。从而构成出路径stringseriespath=path.build()=root/server1/dc1/archive_file_tracked。当前时间序列模式转换结束,处理下一条时间序列。在本发明的另一个实施例中提供一种时间序列数据库的模式转换装置,该装置用于实现前述各实施例中的方法。因此,在前述时间序列数据库的模式转换方法的各实施例中的描述和定义,可以用于本发明实施例中各个执行模块的理解。图3为本发明实施例提供的时间序列数据库的模式转换装置整体结构示意图,该装置包括转换模块301、获取模块302和创建模块303,其中:转换模块301用于将基于度量和标签数据模式的时间序列转换为二元组;其中,所述二元组包括所述时间序列中的度量名称,以及一个或多个标签,每个所述标签包括标签字段和标签字段的标签值;其中,基于度量和标签数据模式的时间序列一般用json或其他与json等价的字符串表示。对于当前待处理的基于度量和标签数据模式下的时间序列tsi,转换模块301对其度量和标签数据模式下的字符串进行解析,将其转换为二元组<度量,标签>=<mi,smt(tsi)>。获取模块302用于在预先创建的双层映射表中存在所述度量名称时,则从所述双层映射表中获取所述度量名称对应的子映射表;获取模块302在预先创建的双层映射表中存在度量名称mi时,说明tsi的度量名称对应的双层映射表已创建过,从该双层映射表中获取度量名称mi对应的子映射表。创建模块303用于在所述子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空时,创建路径,将各所述路径位置对应的标签字段的标签值添加到所述路径中相应的路径位置,并在所述路径的最后位置添加所述度量名称。对于二元组中的任一标签tj=<kj,vj>,从子映射表中获取标签字段kj对应的路径位置order。若所有标签字段对应的order均不为空,则创建模块303创建路径。具体对于子映射表中的任一路径位置,将该路径位置对应的标签字段的标签值添加到路径中该路径位置处,并在路径的最后位置添加度量名称。本实施例通过将基于度量和标签数据模式的时间序列转换为二元组,在预先创建的双层映射表中存在度量名称时,从双层映射表中获取度量名称对应的子映射表,若二元组中所有标签字段在子映射表中对应的路径位置不为空,则创建路径,将不同的标签字段对应的标签值填入到路径的相应位置,并在路径的最后一层填入度量名称,从而实现度量和标签数据模式到路径数据模式的转换,且只需要维护每个度量的标签字段关键字和路径位置的对应信息,具有很小的内存和硬盘持久化存储开销。在上述实施例的基础上,本实施例中还包括排序模块,用于:对所述二元组中的所有标签进行排序;根据排序结果确定每个所述标签中的标签字段在路径数据模式下的路径位置;相应地,获取模块还用于:若所述双层映射表中不存在所述度量名称,则对于所述二元组中任一标签,将该标签中的标签字段作为子映射表的键,将该标签中的标签字段在路径数据模式下的路径位置作为所述子映射表的值,存入所述子映射表;将所述度量名称作为所述双层映射表的键,将所述子映射表作为所述双层映射表的值,存入所述双层映射表。在上述实施例的基础上,本实施例中转换模块进一步用于:根据各所述标签在基于度量和标签数据模式的时间序列中出现的先后顺序,对所述二元组中的所有标签进行排序;或者,根据预设字典顺序,对所述二元组中的所有标签进行排序。在上述各实施例的基础上,本实施例中创建模块还用于:对于所述二元组的任一标签字段,若所述子映射表中该标签字段在路径数据模式下的路径位置为空则设置该标签字段在路径数据模式下的路径位置为所述子映射表中的路径位置总个数加1;将该标签字段和该标签字段在路径数据模式下的路径位置添加到所述子映射表中。在上述各实施例的基础上,本实施例中创建模块具体用于:对于所述子映射表中任一路径位置,将该路径位置作为单层映射表中的键,将该路径位置对应的标签字段作为所述单层映射表中的值,添加到所述单层映射表;按照所有所述路径位置从前到后的顺序遍历所述单层映射表,获取各所述路径位置对应的标签字段;从所述二元组中获取各所述路径位置对应的标签字段的标签值;将每个所述路径位置对应的标签字段的标签值添加到所述路径的各路径位置。在上述各实施例的基础上,本实施例中创建模块还用于:若任一所述路径位置对应的标签字段为空,则获知该路径位置对应的标签字段缺省,在该路径位置添加缺省默认值。本实施例提供一种电子设备,图4为本发明实施例提供的电子设备整体结构示意图,该设备包括:至少一个处理器401、至少一个存储器402和总线403;其中,处理器401和存储器402通过总线403完成相互间的通信;存储器402存储有可被处理器401执行的程序指令,处理器调用程序指令能够执行上述各方法实施例所提供的方法,例如包括:将基于度量和标签数据模式的时间序列转换为二元组;其中,二元组包括时间序列中的度量名称,以及一个或多个标签,每个标签包括标签字段和标签字段的标签值;若预先创建的双层映射表中存在度量名称,则从双层映射表中获取度量名称对应的子映射表;若子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空,则创建路径,将各路径位置对应的标签字段的标签值添加到路径中相应的路径位置,在路径最后位置添加度量名称。本实施例提供一种非暂态计算机可读存储介质,非暂态计算机可读存储介质存储计算机指令,计算机指令使计算机执行上述各方法实施例所提供的方法,例如包括:将基于度量和标签数据模式的时间序列转换为二元组;其中,二元组包括时间序列中的度量名称,以及一个或多个标签,每个标签包括标签字段和标签字段的标签值;若预先创建的双层映射表中存在度量名称,则从双层映射表中获取度量名称对应的子映射表;若子映射表中二元组的所有标签字段在路径数据模式下的路径位置均不为空,则创建路径,将各路径位置对应的标签字段的标签值添加到路径中相应的路径位置,在路径最后位置添加度量名称。本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:rom、ram、磁碟或者光盘等各种可以存储程序代码的介质。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1