一种基于数据分区的内存网格数据加载方法与流程

文档序号:14303555阅读:128来源:国知局
在本发明涉及一种基于数据分区的内存网格数据加载方法,属于软件
技术领域
:。
背景技术
::随着网络技术的发展,数据量和网络流量出现了爆炸性的增长,网络应用面临着大规模存储和高并发访问的需求。在大规模的数据存储和高并发读写业务下,传统关系型数据库在海量数据存储、高并发访问和系统扩展等方面存在多方面的局限性,非关系型数据库得以高速发展。内存数据网格作为一种分布式内存数据对象管理中间件,内存数据网格主要有如下特点:(1)灵活的存储模型:基于key-value存储,用户可以灵活的定义value的内部组成和结构而不应影响数据存储,而且数据的存储之间并无紧密的关联,具有很高的扩展性,在处理海量数据方面具有很大优势。同时,内存数据网格支持分布式队列,分布式集合等数据结构,进一步提升了其数据存储的灵活性,可以很大程度上适应现有的数据存储需求;(2)动态扩展的集群:由于内存数据网格各节点的对等性以及数据存储的无关联性,用户可以弹性的增删内存数据网格的节点。同时,各节点的高效数据备份机制为其动态扩展提供了高可靠性;(3)高效的内存存储:内存数据网格将数据存储在内存中,避免了磁盘io访问性能低的瓶颈,极大提升了数据存储访问的性能,可以更好的应对大数据背景下的高并发数据访问请求。内存数据网格在数据加载、内外存融合、数据访问接口等方面仍存在一些不足,主要表现在以下几个方面:(1)数据加载性能低:内存数据网格基于内存存储,在系统初次启动时,需要将数据从关系型数据库加载到内存数据网格中。在应对大规模数据场景时,如何高效地将关键数据加载到多节点组成的内存数据网格中,诸多内存数据网格方案在应对该问题时仍缺少完整的方案,加载性能整体较低;(2)内外存融合不够完善:内存数据网格与关系型数据库相对独立,两者数据的一致性问题是系统应用的关键。目前主流的内存数据网格产品通过read-through方式将数据从磁盘读取到内存数据网格中,同时通过write-through/write-behind方式将数据从内存数据网格通过同步或异步方式持久化到磁盘中(jis,wangw,yec,etal.constructingadataaccessinglayerforin-memorydatagrid;proceedingsoftheproceedingsofthefourthasia-pacificsymposiumoninternetware,f,2012[c].acm.),或通过应用程序自己来维护缓存和数据库的数据一致性(gaurn,kaplingerte,bhogalks,etal.dynamicmaptemplatediscoveryandmapcreation[m].googlepatents.2013.)。但是,当不能感知内存数据网格的第三方应用直接更新后台磁盘数据库时,由于内存数据网格以及应用程序并不能感知数据的变更,容易存在过时缓存问题(gwertzmanj,seltzermi.worldwidewebcacheconsistency;proceedingsoftheusenixannualtechnicalconference,f,1996[c].),内外存融合有待进一步的完善。(3)缺乏统一的数据访问接口:内存数据网格在数据存储方面有很高的灵活性,但灵活的数据存储导致了数据访问接口的不统一。目前主流的内存数据网格产品大多缺乏对遗留系统的兼容,特别是对结构化查询语言的兼容。虽然主流内存数据网格产品支持部分sql语法,但是由于其支持的sql语法仍不完善,数据访问方式与传统的数据库开发模式存在一定差异,这在很大程度上限制了内存数据网格的进一步发展,开发人员需要针对具体的业务和具体的内存数据网格产品做二次开发,增加了额外的开发代价和学习成本。技术实现要素:本发明的目的:通过扩展对jdbc接口、sql语言的支持和sql请求处理流程的改进,进一步提升内存数据网格的数据访问集成能力。本发明的原理:基于数据分区信息的并行加载方案。根据网格数据分区信息自动为各节点分配加载任务,仅加载本地数据,避免集群通信和数据迁移代价,提升数据加载性能,此外,通过对非关键数据的过滤,提升内存利用率。在内存数据网格初次启动时,需要将数据从后台加载到内存数据网格,从而应用可以直接访问内存数据网格的数据,提升系统的性能。数据加载是系统初始化过程中的一项重要工作,高效的实现一个数据加载方案能有效的提升网格初始化的性能。一个完整的数据加载方案需要考虑如下几个方面的问题:(1)加载哪些数据:后台数据库中存储了各个业务不同的数据,数据加载过程中应只加载迁移到内存数据网格上的业务相关数据,如何有效的定义关键数据,过滤掉不相干的数据,是加载过程中提升资源效率和系统性能的关键之一;(2)数据模型转换:内存数据网格以key/value形式存储数据,有利于网格节点的横向扩展,其中key和value均为数据对象,而在关系型数据库中,数据以表的形式进行存储,因此要讲数据从关系型数据库加载到内存数据网格,首先要实现关系型数据模型向key/value数据模型的自动转换;(3)如何分配网格节点的加载任务:内存数据网格是一个可横向扩展的分布式系统,各节点存储的数据没有明显的关联性,在数据加载过程中,如何为每个节点分配加载任务,高效的利用各节点的cpu资源和内存资源,使得整个网格的数据加载效率最高,是数据加载的另一关键。第一步,数据模型转换。发明实现了数据加载过程中的数据模型自动转换方法,主要包括key的生成,value的生成和索引的建立,在key的生成中,主要考虑两个问题:(1)key的唯一性:由于内存数据网格数据一般以map的结构存在,key的唯一性是map存储数据的必要条件;(2)key的易用性:内存数据网格中,会计算key的哈希值从而确定数据的具体分布,一个合理的key需保障哈希值的易计算,同时,内存数据网格的数据读取都以key为基础,如果key的生成过于复杂,在数据读取时都会带来不必要的性能开销。为了保证key的唯一性和易用性,发明中的key都以字符串的形式存在,对于数据库中的单一主键情形,直接选取数据库表中的主键作为数据对象的key,对于数据库表中的多主键情况,将多列主键通过特殊间隔符组合拼接,生成单一的key,对数据库表中没有明确指定主键的情况,采用主键自增方式,为每个value对象维护一个整数自增变量作为对应的key值。在value的生成中,重点需考虑的是value的通用性。由于关系型数据库中不同表的数据含有不同的结构,如何将不同表数据统一生成map中的value,是重点考虑的问题。发明将一张数据库表映射转换成一个map,数据库表中的一条记录对应map中的一组key/value键值对。通过数据库表的元信息为每个表动态生成一个数据对象类,类中属性的类型和关系型数据库属性的类型一一对应,所有数据对象类含有同一父类,这样,为数据库表的每条记录生成的每个对象实例,都能存储到同一结构的map中。关系型数据库中的索引信息是提供高效数据访问的正确手段。发明为了将关系型数据库的索引信息同步到内存数据网格,专门设计了索引管理器。在数据同步到内存数据网格之前,首先会利用数据库表的元信息创建对应的分布式map,同时会提取数据库列索引信息,在map中加入对应的索引。在基于索引的查询过程中,加入索引的map可以快速寻址到对应的value对象。第二步,数据均匀化加载。在将原有单节点加载方案应用到内存数据网格集群时,由于只有主节点在加载数据,并将数据重新分发到各从节点,这样很容易形成单节点瓶颈,而且所有任务都在主节点执行,造成了资源利用不均匀的情况,因此,发明设计实现了数据均匀化加载方案。在数据均匀化加载方案中,首先内存数据网格选举出master节点,master节点读取关系型数据库元信息,并将其注入内存数据网格,各slave节点读取元信息并按照模型转换方法自动生成本地类,然后master节点读取数据库数据量信息,并将数据均匀分片,将数据分片信息和节点相对应,master节点分发各节点加载任务,各节点加载各自数据分片的数据,完成数据均匀化加载方案。第三步,业务模板设计基于数据分区信息的并行加载方案可通过关键业务模板的配置,来加载与关键业务相关的数据,从而使得数据加载具有更高度的灵活性,同时提升系统加载的性能和内存的利用效率,发明主要从如下三个粒度来配置关键业务数据。(1)按照数据库表名:通过配置文件配置与关键业务相关的数据库表名,在数据加载过程中,仅读取与关键业务相关的数据库表,不相干的表会直接被过滤,不会加载到内存数据网格中。(2)按照字段类型:在关系型数据库中,含有很多特殊类型的字段,譬如blob,clob等,典型的blob是一张图片或一个声音文件,由于它们的尺寸,在关系型数据库中必须使用特殊的方式来处理,clob字段一般为大的字符对象,如xml文档等。由于这些字段自身的特殊属性,加载到内存后会极大影响性能。在业务模板的设计中,用户可设置类型字段的过滤,过滤掉这些影响内存存储效率和访问性能的数据,提升系统性能。(3)按照sql过滤:用户可自定义数据查询语句,在数据加载过程中,加载方案会自动按照用户定义的查询语句来来加载指定的数据,而不是全局的数据。第四步,基于数据分区信息的并行加载。为解决内存数据网格现有数据均匀化加载方案的不足,进一步提升数据加载的性能和内存的使用效率,发明提出基于数据分区信息的并行加载方案,其特点主要表现在:(1)master节点通过网格数据分区信息高效为各网格节点分配加载任务,使得各节点仅加载通过一致性哈希计算后存储在本地的数据,从而避免数据在各节点迁移代价和集群通信代价,提升数据加载性能;(2)仅加载与关键业务相关的数据,关键业务可从事先设计好的业务模板来配置。为了降低数据均匀化加载方案中的网络通信开销和数据迁移代价,发明提出基于数据分区信息的并行加载方案。在基于数据分区信息的并行加载方案中,首先启动内存数据网格集群,并由集群选举出master节点,master节点获得分布式锁;master节点读取关系型数据库数据的主键信息,根据网格数据分区信息,将主键信息分配成不同的集合使得数据加载后存储在本地节点,并释放分布式锁;各网格节点获取数据库metadata,并动态生成本地类;所有网格节点并发从分布式数据结构中获取自身节点需要加载数据的主键信息,根据主键信息生成加载逻辑,并发加载数据。本发明与现有技术相比具有如下优点:根据网格数据分区信息计算数据的分布位置,为各网格节点分配加载任务,使得各节点仅加载存储在本地的数据,从而避免集群通信代价和数据迁移代价,提升数据加载的性能。此外,加载过程中仅加载由用户配置的关键业务数据,充分利用内存资源。附图说明图1为内存数据网格系统架构。具体实施方式以下结合具体实施例和附图对本发明进行详细说明,作为本发明实施例方法的使用环境,如图1所示。通过对基于数据分区信息的并行加载方案、变化数据捕获机制和数据访问集成技术的研究,发明在内存数据网格基础上实现了面向cache-aside模式的内存数据网格系统,其系统架构图和应用场景。系统架构展示了系统内部的模块组成和相关组件,以及各模块在具体业务场景下的请求访问流关系和数据流关系,下面将详细说明系统的运行机理。首先,启动内存数据网格各节点,当个节点满足用户自定义的集群条件后,集群开始加载数据,在集群环境下,默认的数据加载方案是基于数据分区信息的并行加载方案,该方案下会自动为各节点分配加载任务,加载的数据会按照一致性哈希算法分布到本地节点,没有额外的集群通信和数据迁移代价。同时,加载过程中会自动过滤掉与用户定义的业务无关的数据,充分利用内存资源,最大程度上提升系统初始化加载的性能。然后,启动cdc组件,实时捕获数据库数据变更,并将变更数据传送到内存数据网格,保持内存数据网格数据和后台关系型数据库的数据一致性。最后,用户将jdbc驱动替换掉原有业务系统中数据库驱动,启动应用服务器,用户请求通过内存数据网管的jdbc驱动的sql分离器时,若该请求内存数据网格支持且属于用户自定义的业务,则通过sql编译器和执行引擎等交由内存数据网格执行,否则直接转交给数据库执行。交由内存数据网格执行的sql请求,若使得网格数据发生变更,则通过同步或者异步方式持久化到后台数据库;而交由数据库执行的sql请求,若使得用户定义的数据发生了变更,则cdc组件会捕获该数据变更并同步到内存数据网格,在cache-aside模式下,内存数据网格和数据库是一种双向同步的机制,进一步完善了内外存的融合方案。该系统架构是一种内外存融合的架构,一定程度上了利用了内存数据网格的高并发性能,能较好的将内存数据网格适配到现有系统中,是内存数据网格系统一次新的尝试。下文将介绍各关键技术的具体实现方式。一个完整的数据加载流程包括元数据加载、模型转换、索引加载和数据加载。下面将详细介绍数据加载的详细过程。元数据加载,即loadmetadata()方法的实现。首先连接数据库,并通过jdbc的resultset类的getmetadata方法获取数据库数据表的元信息,然后将元信息转换为开源工具cglib中的beangenerator对象。cglib是一个强大的,高性能,高质量的code生成类库,它可以在运行期扩展java类与实现java接口,许多知名的开源工具如spring,hibernate等用它来实现字节码的动态生成。在将元信息转换为beangenerator对象的同时,将元信息存储到tablemeta类中,以存储主键等额外信息,beangenertor主要用于后续模型转换中类的动态生成,而tablemeta主要用于提供数据加载过程中需要的主键信息、表名、列名等额外信息。模型转换即populatebeanmap()方法的实现。模型转换过程主要利用元数据加载后得到的beangenerator对象和tablemetadata对象中的元信息和cglib中的beanmap类,来动态的构造类内存数据网格object,该类所有数据实体类的父类。索引加载即加载数据库表的索引信息。由于内存数据网格实现了索引管理器,在数据加载过程中,可以通过jdbc接口提取数据库的索引信息,在map中加入对应的索引,提高value查询的性能。当元数据加载、模型转换和索引加载都完成后,最后进行数据库数据的加载,在基于数据分区信息的并行加载方案中,元数据加载、模型转换和索引加载如上文所述,在具体数据加载过程中,各节点针对数据库的数据,判断该数据是否该存储到本地,如果是,则加载,从而保证加载的数据都是存储到本地数据。由于内存数据网格的数据路由表中存储了集群信息和各节点的分区信息,根据数据id可很容易判断其所在分区,从而进一步判断其所在节点。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1