基于孩子节点的多粒度分布式读写锁的R树索引优化方法与流程

文档序号:17320382发布日期:2019-04-05 21:30阅读:357来源:国知局
基于孩子节点的多粒度分布式读写锁的R树索引优化方法与流程

本发明涉及数据库索引领域,具体的涉及一种基于孩子节点的多粒度分布式读写锁的r树索引优化方法。



背景技术:

基于位置服务(locationbasedservice,lbs)为代表的移动应用已经步入移动大数据时代,成为人们日常生活的重要组成部分,滴滴打车、高德地图,日益方便着人们的生活,提高了人们的生活质量。随着移动应用规模的扩大,移动服务中的查询也呈现鲜明的流式特征。现有的系统无法有效地处理在扩展性、实时性、可靠性及性能方面所面临的挑战。移动大数据时代的数据处理不仅需要存储与处理能力更强更灵活的计算平台,还需要依托于计算平台的相关移动服务的处理与优化技术。

在计算平台的处理与优化技术中,空间移动对象数据库起着重要的作用,它的核心功能旨在提供高效的查询与更新处理,与高性能的索引结构密切相关,因此,移动对象的查询处理和索引技术是移动对象数据库设计的核心部分。在多连续范围查询系统中,针对网格索引中空网格也要访问造成额外开销的问题,提出了基于hbase的支持频繁更新的节点重组r树的索引结构。将空间区域映射在平面上,进而划分为网格,然后将包含有移动对象的网格插入到r树中。

针对这种双层索引结构,在移动对象位置更新时,会出现性能以及读写锁之间、写锁和写锁之间的冲突问题。为了解决读写锁之间、写锁和写锁之间的冲突问题,采用zookeeper分布式读写锁在r树根节点加锁来解决多个进程对共享资源的访问。但是出现锁的阻塞等待和并发度低的问题,尤其是在查询和更新比较频繁、以及r树层级比较高的情况下。因为在使用r树索引时,是对r树根节点加锁,独占整个r树,导致很多不受更新影响的节点也不可以并发访问,降低了并行性,造成了很大的资源浪费。如图1所示,如果有一个查询是对20号网格内的数据,有一个更新是对63号网格内的数据,两个区域并不相交,在进行查询操作时,更新操作等待根锁,由此会造成资源利用率低下。



技术实现要素:

本发明提供一种基于孩子节点的多粒度分布式读写锁的r树索引优化方法。在r树索引构建稳定后,根节点就很难再分裂,基于此特点,本发明设置根节点容量和mbr的参数值,使其不再分裂,将锁加在孩子节点,既避免了多个操作并发等待锁,也保证了查询结果的正确性。解决了现有技术的不足。

本发明采用的技术方案:

一种基于孩子节点的多粒度分布式读写锁的r树索引优化方法,包括如下步骤:

步骤一,首先将整个空间区域进行规则划分,划分成大小相同的网格,将移动对象存储到网格的索引项里,建立起一个底层的网格索引;然后,用r树索引网格,r树的叶子节点存储网格的id;这样,就建立起了一个底层为网格索引,上层为r树索引的双层索引结构,如图3所示。调用r树程序获取范围查询内的网格,实现范围查询的加读锁过程;如果r树root节点有孩子节点并且root节点的mbr与查询范围相交,则继续获取与查询范围相交的孩子节点;然后对该孩子节点加读锁;逐层查找r树各层节点直至叶子节点;如果叶子节点的mbr与查询范围相交,则返回叶子节点的结果集合,否则就释放上述孩子节点的读锁;

步骤二,移动对象的位置更新过程中,在孩子节点加写锁,包括两个部分:

第一部分:在r树索引中插入节点时加写锁过程;

在r树索引中插入网格,首先计算出网格左下角坐标和右上角坐标;然后初始化r树root节点重要参数:mbr和节点容量;获取实例root节点,从root节点开始向下遍历找到与该网格相交的孩子节点;对孩子节点加写锁;逐层查找直到应该将该网格插入其中的叶子节点;对孩子节点释放写锁;

由于调整增大了根节点的容量和mbr的面积,不会导致根节点的分裂。所以加锁的过程中,保证了查询结果的正确性。

第二部分:在r树中删除r树节点时加写锁过程

先计算出网格左下角坐标和右上角坐标;获取实例root节点;初始化栈s1和s2,s1保存查找路径上的节点,s2保存需合并的节点;从root节点开始向下遍历找到与该网格相交的孩子节点;对孩子节点加写锁;逐层遍历过程中将包含该网格的节点压入栈s1;将该网格信息删除;更新节点信息;利用s1和s2对r树进行合并压缩、重新插入操作;对孩子节点释放写锁。

由于先查找与删除节点范围相交的root节点的孩子节点,对其加写锁。在向上调整以及重新插入的过程中,均不会造成根节点的分裂,保证了结果的正确性。

上述r树是一种与b树类似的空间高度平衡树。这种空间索引是动态的,不需要定期重建。基于其高效的特性,很多空间问题都可以使用r树索引来解决,大大提高了效率。r树运用了空间分割的思想,使用一种称为mbr最小边界矩形的方法,从节点开始,用矩形将空间框起来,逐层向上,框住的空间依次增大,以此对空间进行分割,如图2所示。

上述r树的非叶子节点包括root节点和孩子节点,每个非叶子节点包含指向子节点的指针,称之为child-pointer,其mbr表示能框住其子节点的最小n维矩形;r树的叶子节点包含指向空间对象的条目,称之为tuple-identifier,其mbr表示能框住其tuple所对应的空间对象的最小n维矩形。

本发明提供了一种基于孩子节点的多粒度分布式读写锁的r树索引优化方法,基于孩子节点建立了读写锁,降低了锁的粒度,支持较高的并行度,提高了查询和更新等操作的执行效率。此外,随着查询范围的增大,以及移动对象密度的增大,查询的索引节点数目增多,也会导致查询效率的降低。但整体效果优于r树根节点的分布式读写锁。

附图说明

图1是树根节点分布式锁示意图。

图2是mbr示意图。

图3是索引结构示意图。

图4本发明的r树孩子节点分布式锁示意图。

具体实施方式

为使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及具体实例,对本发明做进一步详细说明。这些实例仅仅是说明性的,而并非对本发明的限制。

面向r树孩子节点分布式读写锁的具体的实施步骤:

步骤一,调用r树程序获取范围查询内的网格,实现范围查询的加读锁过程。如果r树root节点有孩子节点并且root节点的mbr与查询范围相交,则继续获取与查询范围相交的孩子节点;然后对该孩子节点加读锁;逐层查找r树各层节点直至叶子节点;如果叶子节点的mbr与查询范围相交,则返回叶子节点data列族的结果集合,否则就释放上述孩子节点的读锁。

步骤二,移动对象的位置更新过程中,在孩子节点加写锁,包括两个部分。

第一部分:在r树索引中插入节点时加写锁过程

在r树索引中插入网格,首先计算出该网格左下角坐标和右上角坐标。然后初始化r树root节点重要参数:mbr和节点容量;获取实例root节点,从root节点开始向下遍历找到与该网格相交的孩子节点;对孩子节点加写锁;逐层查找直到应该将该网格插入其中的叶子节点;对孩子节点释放写锁。

由于调整增大了根节点的容量和mbr的面积,不会导致根节点的分裂。所以加锁的过程中,保证了查询结果的正确性。

第二部分:在r树中删除r树节点时加写锁过程

先计算出网格左下角坐标和右上角坐标;获取实例root节点;初始化栈s1和s2,s1保存查找路径上的节点,s2保存需合并的节点;从root节点开始向下遍历找到与网格相交的孩子节点;对孩子节点加写锁;逐层遍历过程中将包含该网格的节点压入栈s1;将该网格信息删除;更新节点信息;利用s1和s2对r树进行合并压缩、重新插入操作;对孩子节点释放写锁。

由于先查找与删除节点范围相交的root节点的孩子节点,对其加写锁。在向上调整以及重新插入的过程中,均不会造成根节点的分裂,保证了结果的正确性。

如图4所示,在查询或者更新13号叶子节点所包含的移动对象时,只需对其上层节点(即r树中间节点)加锁,左侧的r树节点可以正常被访问而无需加锁。这样能就降低了锁的阻塞,减小了查询和更新代价。

通过本发明,既降低了节点频繁存储更新造成的磁盘访问的代价,也减少了锁的等待时间。通过测试,本发明和之前的方法相比,具有广泛的使用价值和较高的稳定性。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1