一种Append-efficient的分布式多维索引DAER-Tree的制作方法

文档序号:27098984发布日期:2021-10-27 17:27阅读:179来源:国知局
一种Append-efficient的分布式多维索引DAER-Tree的制作方法
一种append

efficient的分布式多维索引daer

tree
技术领域
1.本发明涉及数据检索领域,具体涉及一种append

efficient的分布式多维索引daer

tree。


背景技术:

2.在如今所处的大数据时代,很多应用所产生的数据通常具有数据量大、数据连续的以高速进入系统、需要大规模的(集群)存储空间、需要快速对进入系统的数据建立索引以满足检索的需要等特点。典型应用包括:视频监控等各种监控类应用,各类数据流和传感器应用,以及需要对产生的大量(事件)日志进行分析的应用。在这些应用场景中,进入系统的需要存档的数据以后可能还将被继续检索和分析,为了提高数据访问性能,在对这些数据存档时通常会建立相应的(多维)索引。而传统的b+

tree和r*

tree类索引在叶子节点满了不能继续插入新数据的时候会进行i/o和计算代价很大的分裂操作,以保证索引的平衡。当需索引的数据量较大时,连续插入大量数据所产生的随机i/o开销是很大的,以至于很难准实时的完成索引的构建和更新。
3.为了解决连续的大规模数据的索引构建问题,有两种常见的技术路线。一种是以类似于流数据管理的方式,在数据进入系统时就进行大量的(聚集)分析,然后仅将分析后的结果存储起来并建立相应的索引。这类技术有两个问题:一是可能违背了企业的数据管理策略。企业可能需要保存更多的原始数据,以进行各种分析和查询。因为对于企业来说,应用所产生的各种数据是一种战略资源,加强数据收集、分析、利用,对企业的发展具有重要价值。数据的管理和维护已成为企业最不可缺少的基础管理。而在数据刚进入系统时进行部分分析后就抛除原始数据,其实是损失了企业的重要资源,可能导致应用系统缺少进行新的分析和查询的基础数据。二是对于传统流数据管理和索引技术来说,在数据进入系统的时候就进行各种分析,尤其是结合存档的历史数据进行各类分析(例如:分析型混合连续查询),实际上对系统的性能采用了很高的要求。需要系统在近乎实时地响应时间内对当前新进入系统的数据及其相关的大量历史数据进行数据访问和分析。而在当前的技术条件下,系统的性能还很难达到这样的目标。目前的流数据处理系统通常是假设历史数据上已经建立了合适的索引,当处理涉及历史数据的查询时,可以根据索引快速地对历史数据进行抽样,并在抽样的数据上获取近似的查询结果,从而减少访问历史信息的代价,保证对存档数据的处理速度能够满足准实时的要求。而对于本文所研究的课题来说,上述假设并不适用,因为课题研究本身的目标就是要解决大量数据的连续插入和索引构建问题。
4.第二种技术方案就是引入分布式系统来解决大规模连续数据的存储和索引。它将单节点高负载转换分发给集群中的多个节点共同承担,即利用集群中的各结点共同建立和维护一个分布式索引并存储相应的数据。在一定程度上,该方案是能够解决性能问题。但是当系统的负载增加到一定程度并使得分布式系统中的单节点负载仍然很重时,若此时分布式索引中仍然采用现有的类似于b
+

tree和r

tree的技术时,连续插入数据时所产生的索引结点分裂等开销依然会较大,并且影响到数据插入和索引构建的性能。


技术实现要素:

5.为了解决现有技术方案中连续插入大量数据时所引发的索引构建速度较慢的技术难题,本发明公开了一种分布式多维索引。
6.一种append

efficient的分布式多维索引daer

tree,所述daer

tree索引架构为global

local类型,所述append

efficient的分布式多维索引daer

tree包括global index及其local index;所述global index是基于can p2p网络构建,所述local index是基于存储在本地的多维数据构建的aer

tree。
7.上述的append

efficient的分布式多维索引daer

tree,在运行了daer

tree的share

nothing集群中,每个机器结点(cluster node)ni同时担任了两个角色storage node(n
si
)和overlay node(n
oi
);其中,storage node用于存储应用系统的部分数据并构建相应的本地多维索引;本地aer

tree中的部分索引节点将被选中并发布到某些overlay node结点上,形成全局索引。
8.上述的append

efficient的分布式多维索引daer

tree,所述overlay node是基于c2覆盖网络进行组织;每个overlay node都接收、存储来自于多个storage node的索引信息,代表覆盖网络中的一个分区;来自于n
si
的索引发布请求后将被各n
oi
映射并路由至合适的overlay node。
9.上述的append

efficient的分布式多维索引daer

tree,所述daer

tree将查询处理划分为两个阶段:
10.第一阶段:负责将查询处理任务分发和映射到相应的can node;
11.第二阶段:基于检索到的索引信息,查询将被转发到相应的storage node,并通过检索本地aer

tree获取最终的查询结果。
12.上述的append

efficient的分布式多维索引daer

tree,所述daer

tree的运行机制包括映射机制、发布机制以及索引更新。
13.上述的append

efficient的分布式多维索引daer

tree,所述映射机制的工作流程如下:
14.对于一个aer

tree的节点n,首先将其映射到包含了n的中心的overlay node n
c
;如果n的半径大于r
max
,则n
c
将把n发送到所有与n的取值区域有重叠的overlay node。
15.上述的append

efficient的分布式多维索引daer

tree,所述daer

tree中全局索引的发布机制如下:
16.当某个storage node n
i
决定将一系列aer

tree索引节点集合s
i
发布出去后,s
i
中的每个aer

tree结点n都将被索引和发布出去。对于n
i
将计算出其中心c
n
和半径r
n
,然后根据所述映射机制将n发布到相应的overlay node中。
17.上述的append

efficient的分布式多维索引daer

tree,所述索引更新机制如下:
18.本地aer

tree的被发布到global index中的结点发生了split或者merge操作,则这些结点将被重新发布到c2覆盖网络中的相应结点中,并替换掉这些索引节点的过时版本。
19.上述的append

efficient的分布式多维索引daer

tree,所述aer

tree是一种r

tree的变体;所述aer

tree是为了解决含有单调(递增/递减)特性维度的大量多维数据的连续索引插入的效率问题;所述多维数据包括监控系统事件流数据、传感器流数据以及日
志数据。
20.上述的append

efficient的分布式多维索引daer

tree,所述aer

tree的叶子节点和中间节点数据结构包括:
21.(1)每个索引节点还有一个指针指向自己的父亲节点;
22.(2)aer

tree的叶子节点之间是通过一个双向链表连接起来的,每个叶子节点均可以直接访问到自己的左右兄弟节点,这样的设置有利于进一步提升aer

tree的顺序i/o性能;
23.(3)aer

tree还维护着一个直接指向最右的叶子节点的指针,以方便对aer

tree索引的insert操作。其有益效果主要体现在:基于监控类等应用所产生的数据的某些维度具有单调性(例如,包含了时间维度)的特点,突破索引技术必须保持索引树的高度是平衡的这一传统思维,采用了追加高效(append

efficient)的多维索引aer

tree(append

efficient r

tree),即(数据)追加高效的r树,并在其基础上,结合c2覆盖网络技术,设计并实现了一种分布式的追加高效的多维索引技术daer

tree(distributed append

efficient r

tree),即(数据)追加高效的r树分布式。daer

tree在索引构建速度、索引大小和存储空间利用率、查询响应时间、i/o开销等方面均较传统分布式多维索引技术有了较大的提升。
附图说明
24.图1为本发明实施例提供的运行daer

tree的集群的示意图;
25.图2为本发明实施例提供的发布本地aer

tree索引的一部分内容来构成全局索引的示意图;
26.图3为本发明实施例提供的overlay node所接收的全局索引信息的示意图;
27.图4为本发明实施例提供的一个2维c2 overlay的示例;
28.图5为本发明实施例提供的不同的rmax将导致不同的搜索空间的示意图;
29.图6为本发明实施例提供的daer

tree的indexpublication算法示意图;
30.图7为本发明实施例提供的aer

tree索引实例。
具体实施方式
31.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
32.本发明公开了一种append

efficient(追加高效)的分布式多维索引daer

tree,所述daer

tree索引架构为global

local(全局

本地)类型,包括global index(全局索引)及其local index(本地索引);所述global index是基于can(控制器局域网络)这一p2p网络构建,所述local index是基于存储在本地的多维数据构建的aer

tree(append

efficient r

tree)。
33.具体的,can是一种广泛应用的具有较好扩展性和自组织结构特性的p2p覆盖网络;优选的,如图1所示,在运行了daer

tree的share

nothing集群中,每个机器结点
(cluster node,集群节点)n
i
同时担任了两个角色storage node(存储节点,n
si
)和overlay node(覆盖节点,n
oi
);其中,storage node用于存储应用系统的部分数据并构建相应的本地多维索引(local aer

tree)。各本地aer

tree中的一部分索引节点将被选中并发布到某些overlay node结点上,从而形成全局索引。
34.在本发明提供的一个实施例中,如图2所示,本地节点192.168.1.24中的索引节点2、6和7被选择出来用于发布和构成全局索引。发布到overlay的索引信息的格式为(ip,mbr)。其中,ip是该storage node的ip地址,mbr表示与本地aer

tree索引的minimum bounding rectangle(最小边界矩形)所对应索引节点。
35.进一步的,在daer

tree中,所有的overlay node都是基于c2覆盖网络进行组织。在daer

tree中,每个overlay node中都接收、存储了来自于多个storage node的索引信息,它代表了覆盖网络中的一个分区。来自于storage node n
si
的索引发布请求后将被各n
oi
映射并路由至合适的overlay node。具体的,当overlay node n
oi
收到了storage node n
si
的索引信息发布请求后,n
oi
将首先检查自己是否就是那个需要接收该索引信息的结点,如果是,则保存该部分aer

tree索引信息并将其置于内存之中从而与其他overlay node一同构成global index。即:daer

tree的全局索引是由各storage node上的本地aer

tree的某些索引结点组合构成的。如果overlay node n
oi
发现自己并不是保存申请发布的索引信息的适位置,n
oi
将根据覆盖网络的路由协议将这些索引信息路由、转发到更加靠近合适位置的overlay node上继续处理。
36.在本发明提供的另一个实施例中,如图3所示,作为overlay node的地址为192.168.1.24节点上存储了地址为192.168.1.25和192.168.1.26的两个storage node发布的索引信息。这两个storage node分别将本机上与mbr5、mbr6和mbr9对应的索引节点发布为全局索引的组成部分。由于can这种覆盖网络的路由开销较大,在daer

tree的实现中,can的变体c2被采用作为用于数据路由和映射的覆盖网络。c2是一种具备了chord和can特性的混合覆盖网络。在can的基础上,c2在每一维度上添加了chord类系统中所采用的neighbor link。具体来说,在每一维上,距离为20,21,

的节点之间都被加上了neighbor link(相邻链路)。
37.在本发明提供的另一个实施例中,如图4所示,图4显示了一个由64个机器节点组成的二维c2覆盖网络的示例;在图4中,由于节点a和节点b,c,d在水平方向上的距离分别是20,21和22,系统在a和b、c、d自己创建了neighbor link。类似地,节点a与节点e,f,g,h,i,j和k之间也有着neighbor link。总的来说,在一个d维的c2覆盖网络中,每个c2节点在每一维上维护着个neighbor link;因此,c2覆盖网络中所有的neighbor的数量是oc2覆盖网络实际维护着与其他覆盖网络中数量相同的routing neighbor,但是它将路由所需的平均跳转(hop)数降低至o
38.进一步的,daer

tree的全局索引可以视为一种构建于各storage node之上的二级索引。daer

tree的global

local架构设计将数据的存储和索引构建同基于索引的查询处理分割开;
39.更进一步的,daer

tree将查询处理划分为两个阶段:
40.第一阶段:主要负责将查询处理任务分发和映射到相应的can node(内容可寻址网络节点);所述can node在其内存中检索它们所维护的aer

tree索引节点信息,并返回符合查询条件的索引结点集合;
41.第二阶段:基于检索到的索引信息,查询将被转发到相应的storage node,并通过检索本地aer

tree获取最终的查询结果。
42.所述daer

tree的核心运行机制包括映射机制、发布机制以及索引更新;
43.具体的,为了便于进行索引发布,所述daer

tree中设计了一个映射函数用于规定storage node发布的aer

tree中的部分索引节点将由哪些overlay node来维护。其中,本地aer

tree中的待发布的索引节点的中心和半径将被用作映射的重要标准:如果半径小于某个阈值r
max
,该索引节点将被发布到一个overlay结点;否则,该索引信息将被发布到多个overlay node。
44.进一步的,所述daer

tree的映射机制(mapping schema)的工作流程如下:对于一个aer

tree的节点n,首先将其映射到包含了n的中心的overlay node n
c
;如果n的半径大于r
max
,则n
c
将把n发送到所有与n的取值区域有重叠的overlay node;在daer

tree的索引发布过程中,中心位置相近的overlay node将有更高的几率存储相似的数据。
45.更进一步的,通过上述映射机制,那些取值范围较大(半径大于r
max
)的待发布的aer

tree索引信息将被创建多个副本。
46.所述daer

tree的映射机制的出发点主要是需要综合考虑到global index的更新开销和检索开销;取值范围较小的aer

tree索引结点通常有更高的概率是叶子节点,而叶子节点上通常比位于较高层次的中间节点更容易产生更新操作。若对叶子节点在c2覆盖网络中维护多个副本,将产生更大的更新开销。而对于那些取值范围较大的索引节点,若只维护一份数据,那么所有对该区域的查询每次都需要访问同一个overlay node,这将损害查询性能。由此可见,r
max
将显著的影响到一个查询的搜索空间。若r
max
设置得较大,查询处理过程中通常将访问到更多的c
2 overlay node。
47.在本发明提供的一个实施例中,如图5所示,图5给出了不同的r
max
将导致不同的搜索空间的一个实例。图5中显示了在一个二维can覆盖网络中进行对点查询q(key)时,不同的r
max
将产生不同的搜索空间。图5中的圆圈表示当r
max
设置为r1和r2时的查询结果搜索空间。r
max
增大时,查询处理过程中将需要访问更多的计算机结点以获取到完整的查询结果。进一步的,r
max
是一个可调的参数,在daer

tree中,取值较大的r
max
可能会降低查询处理的性能;但是取值较小的r
max
将会导致创建更多的索引信息副本从而增加daer

tree的更新维护开销。作为折中,选择一个比大部分aer

tree叶子节点的平均半径大的r
max
值可能会在查询性能和索引更新开销上取得较好地平衡。
48.所述daer

tree中全局索引的发布机制如下:
49.在daer

tree初始化的时候,由于缺乏查询模式和更新频率信息,daer

tree无法应用代价模型较好的选择合适的本地aer

tree发布到各overlay node中,从而无法在系统刚开始运行时就获得较好的更新和查询性能。在daer

tree的实现中,初始化时的索引策略如下:对于高度为l的aer

tree,选择将其l

1层的中间节点发布到overlay node中。这样做的原因是:l

1层的索引节点的更新频率较叶子节点要小,而且比起其他更高层的中间节点来说,产生false positive访问的概率也要小些。
50.当某个storage node n
i
决定将一系列aer

tree索引节点集合s
i
发布出去后,s
i
中的每个aer

tree结点n都将被索引和发布出去。对于n
i
将计算出其中心c
n
和半径r
n
,然后根据之前介绍的映射机制将n发布到相应的overlay node中。
51.在本发明提供的一个实施例中,假设集群中的节点n
i
要把二维aer

tree中的某一范围为[l1,u1],[l2,u2]的索引节点n发布出去构建全局索引,那么n
i
将首先计算出n的中心c
n
和半径r
n
,其中,和半径c
n
将被用作aer

tree索引节点n的key,记为key
n
=c
n
。如果daer

tree所在的覆盖网络的维度can(d)大于搜索空间的维度d',则n
i
将生成一个(d

d')维的向量v
n
附加在原来的key
n
后面,从而形成一个长度为d的key'
n
=(v
n
,key
n
)。经过上述处理后,aer

tree结点n将被发布到那些管辖区域包含了c
n
的overlay node上。
[0052]
在本发明提供的另一个实施例中,如图6所示,给出了集群节点n
i
如何把一个aer

tree索引项n发布出去的算法;具体的,如果n.radius〉r
max
,则所有与n的区域有重叠的overlay node都需要在各自负责的gloal index中保存和维护索引项n。在图6中,算法的第1行中,aer

tree的一部分索引项被选择出来用于发布到global index中。在第5行和第8行中,将应用c2覆盖网络的路由协议来获取与n重叠的集群节点。
[0053]
进一步的,对于index publication(索引发布)算法,给定一个key k,将其对应的索引项路由到对应的overlay node平均需要次消息传递,其中n是集群节点的数量。因此,对于该算法,若有n的半径r
n
〈r
max
,则索引项发布的消息传递开销就是否则,若r
n
≥r
max
,则消息传递的开销变为其中m是与n重叠的overlay node的数目。通过上述分析可以得知,发布索引项集合s
i
到global index的总开销是o(s
i
logn)。
[0054]
所述daer

tree索引更新是为了解决在daer

tree中新进入storage node的数据将触发本地aer

tree执行相应的索引更新操作,导致daer

tree的global index中的部分数据失效。如果本地aer

tree的被发布到global index中的结点发生了split或者merge操作,则这些结点将被重新发布到c2覆盖网络中的相应结点中,并替换掉这些索引节点的过时版本;保证global index和本地aer

tree索引信息的同步。
[0055]
进一步的,为了减少这类更新操作所带来的开销,每个storage node的本地索引只有一部分被挑选出来发布到某些overlay node上。如果像传统的p2p系统那样将本地节点上的所有(叶子节点对应的)索引信息都发布到overlay结点中,那么本地数据上的所有更新操作都将触发对global index的更新。为了能够部分解决这个问题,daer

tree的处理如下:(1)挑选storage node的本地aer

tree索引的部分叶子节点发布到c2覆盖网络中;(2)挑选storage node的本地aer

tree索引的层次较高的中间节点发布到c2覆盖网络中。
[0056]
所述append

efficient的分布式多维索引daer

tree的local index是基于存储在本地的多维数据构建的aer

tree;所述aer

tree是一种r

tree的变体;所述aer

tree是为了解决含有单调(递增/递减)特性维度的大量多维数据的连续索引插入的效率问题。多维数据包括监控系统事件流数据、传感器流数据、日志数据等;所述多维数据有两个公共特
性:(1)均包含了像“时间维”这样的具有单调特性数据维度;(2)数据进入系统后,在其生命周期内,数据基本上不会被修改,只被检索和分析,即数据是append

only的。
[0057]
aer

tree索引的叶子节点和中间节点数据结构包括:
[0058]
(1)每个索引节点还有一个指针指向自己的父亲节点;
[0059]
(2)aer

tree的叶子节点之间是通过一个双向链表连接起来的,每个叶子节点均可以直接访问到自己的左右兄弟节点,这样的设置有利于进一步提升aer

tree的顺序i/o性能;
[0060]
(3)aer

tree还维护着一个直接指向最有的叶子节点的指针,以方便对aer

tree索引的insert操作。
[0061]
aer

tree的中间节点n可以被表示为如下形式:
[0062]
n:(id,lb,ru,#objects,#subregions,e)
[0063]
e
i
:(lb
i
,ru
i
,#objects
i
,pointer
i
),其中1≤i≤n,n
min
≤n≤n
max
,且n=#subregions;
[0064]
进一步的,aer

tree的中间节点n包括节点id、中心c、mbr的边界信息(左下角lb和右上角ru),所包含的数据对象的数量(#objects),以及孩子元组集合e1,

,e
n
(n
min
≤n≤n
max
)。其中n
max
是中间节点所允许包含的元组数目的上限;n
min
是中间节点中所允许存储的索引项的最少数目;中间节点的每条元组e
i
对应着它所包含的一个孩子结点,e
i
由四部分组成:mbr的范围信息(lb
i
和ru
i
),所包含的数据对象的数量(#objects
i
)以及指向孩子结点的指针pointer
i

[0065]
更进一步的,aer

tree叶子节点l还可以被表示为如下形式:
[0066]
l:(id,lb,ru,#objects,e)
[0067]
e
i
:(pointer
i
),其中1≤i≤n,l
min
≤n≤l
max
,且n=#objects
[0068]
在此形式中,aer

tree的叶子节点由节点id,mbr的边界信息(左下角lb和右上角ru),所包含的数据对象的数量(#objects),以及元组集合e1,...,e
n
(l
min
≤n≤l
max
),其中l
max
是中间节点所允许包含的元组数目的上限;lmin是叶子节点中所允许存储的数据项的最少数目,每个e
i
包含了指向数据对象的指针pointer
i

[0069]
上述aer

tree的中间节点和叶子节点数据结构的定义中,aer

tree允许中间节点和叶子节点中存储任意数目的索引项或数据,与r

tree中要求(m
n
是中间节点的扇出)和(m
l
是中间节点的扇出)不同的是。进一步的,在aer

tree中,当某个索引节点需要分裂时,并不会发生像r

tree那样需要根据某种策略把节点中一半的数据放置到新的节点中那样的处理,也不需要进行像r*

tree那样将待分裂的节点中的一半数据reinsert到索引树中的操作。因此,aer

tree的索引插入操作的效率要比传统r

tree类索引的开销小得多。
[0070]
更进一步的,aer

tree的特性如下:
[0071]
(1)对于根节点,它最多有m
n
个孩子,最少有2个孩子;除非整个索引中只有根节点,那么此时根节点是没有孩子的;
[0072]
(2)除了根节点外,所有的中间节点最多有m
n
个孩子,最少有2个孩子;
[0073]
(3)对于中间节点,存储的索引项的数量比其孩子数量要少1;
[0074]
(4)对于一个根节点有n(n>0)个孩子且高度为h的aer

tree索引,其前n

1个孩子是根节点的符合下述条件的子树:
[0075]
·
高度均为h

1;
[0076]
·
每棵子树的中间节点最多可以存放(m
n

1)个索引项;
[0077]
(5)对于以根节点的第n个孩子为根节点子树,它符合下述条件:
[0078]
·
高度最低为1,最多为h

1;
[0079]
·
当其高度达到h

1,且每个节点都已经满了而无法存放新数据时,则下一次数据插入将导致整个aer

tree索引的高度增加1。
[0080]
aer

tree的特性使得在aer

tree索引成为一种部分平衡的索引结构;除根节点的最右子树外,aer

tree的所有子树均是保持平衡的,且高度为h

1。
[0081]
如图7所示,图7给出了一个aer

tree索引实例,其中,r1

r4都是中间节点索引项,对应着多维空间中的mbr,叶子节点成的a到m均为多维数据对象。从中可以看到:(1)对于根节点的最右子树,其高度为1,比其它子树的高度要低;(2)整个aer

tree是一颗除最右子树外均为平衡结构的树形结构索引;(3)所有的叶子节点中,除右子树的节点外,存储空间利用率均为100%,即:aer

tree具有更高的存储空间利用率。
[0082]
视频监控是一类典型的多媒体传感器应用,它连续不断的将检测出来的事件及其相关信息(例如:事件的视频片段对应的多维视觉特征、时间、地点及摄像头编号等信息)构成的多维数据保存到数据库中进行存档,并更新对应的多维索引。对于大规模的多媒体传感器器应用系统,通常会产生海量的数据。为了提供对海量多维数据的快速插入和检索的支持。本发明采用了基于p2p网络的分布式追加高效(append

efficient)的索引daer

tree,由分布在c2overlay结点上的global index和位于storage node上的local index两部分构成。基于云数据库系统hbase上的tb级的实验证明,daer

tree在索引构建速度、索引大小和存储空间利用率、i/o开销等方面均较传统分布式多维数据有了显著地提升。其中,daer

tree的append性能要比基于r*

tree类的传统分布式多维索引快百倍以上。
[0083]
本发明突破了索引必须保持平衡、索引的各子树的高度必须一致的传统思维,针对应用数据的特性,采用了保证除最右子树外的所有子树必定保持平衡的分布式多维索引daer

tree,从而具备了传统多维索引所欠缺的索引构建速度快、开销小、存储空间利用率高的优点。
[0084]
以上只通过说明的方式描述了本发明的某些示范性实施例,毋庸置疑,对于本领域的普通技术人员,在不偏离本发明的精神和范围的情况下,可以用各种不同的方式对所描述的实施例进行修正。因此,上述附图和描述在本质上是说明性的,不应理解为对本发明权利要求保护范围的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1