一种实现NoSQL的键值存储引擎的方法

文档序号:6363297阅读:298来源:国知局
专利名称:一种实现NoSQL的键值存储引擎的方法
技术领域
本发明涉及一种数据库领域,尤其涉及一种实现NoSQL (Not Only SQL,非关系型的,其是一种不同于关系型数据库的管理系统设计方式)的键值存储引擎的方法。
背景技术
经过几十年的发展,关系数据库管理系统(RDBMS)被广泛应用,但是同时暴露出很多先天缺陷,其性能无法适应最新的很多类型的应用需求。NoSQL是近年来发展壮大的新的数据存储管理技术,它试图避免RDBMS在超大数据量和大量多表连接的情况下性能低下的缺点。键值存储引擎(key/value storage engine)是NoSQL的一种技术方案,它存储无模式的键值数据(key/value pair),键值数据在存储引擎内部都是无结构的字节串,存储引擎内部不理解键值数据的内部结构,而由应用程序负责解析和处理键值数据。键值存储引擎需要支持完整的ACID事务语义和高效的键值数据的存储和访问方法,并且通过用户注册的回调函数理解键值数据的内部结构并且操作键值数据。现有的实现NoSQL的键值存储引擎,需要重新开发,不仅开发周期长,而且还费时费力,资源浪费严重。

发明内容
本发明的目的在于提供一种实现NoSQL的键值存储引擎的方法,以解决现有技术中需要重新开发,不仅开发周期长,而且还费时费力,资源浪费严重的技术问题。一种实现NoSQL的键值存储引擎的方法,利用现有RDBMS改造成为NoSQL的键值存储引擎,其进一步包括( 一 )得到 NoSQL 存储引擎 KeyValueSE ;Al 去除RDBMS中的无关模块,只保留其中的存储引擎子系统;A2:创建单列的字节串数据行结构作为所有存储引擎子系统中数据表的数据行结构;A3 设置存储引擎子系统的依赖方式为基于用户注册的回调函数的依赖;(二)将KeyValueSE改造为支持多进程多线的存储引擎Bl 将所有的全局变量放置到线程局部存储中;B2 把原有的进程间信号通信机制替换为线程间通信机制;B3 设置线程初始化函数和退出函数。其中,步骤Al进一步包括去除包括RDBMS的解析器、优化器、执行器、元数据管理以及类型支持系统以及服务器框架在内的模块代码,去除包括国际化支持,通信协议,编程接口在内的辅助功能的代码,只保留存储引擎子系统的代码。步骤A2进一步包括在存储引擎中定义一个固定的“字节串”数据类型和一个固定的单列的使用这个“字节串”类型的固定的属性对象,并且使用该属性对象创建一个固定的数据行结构描述符对象tupleDesc ;这个数据行结构描述符对象tupleDesc被所有的数据表使用来作为数据表的数据行结构,这样每个数据表的数据行结构都是统一的单列字节
串ο步骤A3进一步包括在存储引擎KeyValueSE中提供用户注册回调函数的接口,并且修改KeyValueSE存储引擎的代码,以使得使它在创建索引键和比较索引键的时候,使用用户注册的回调函数而不是基于类型系统来工作。步骤B2进一步包括利用互斥量和信号机制,在每个线程中设置一个专门的通知数据区,所述通知数据区用于让其他线程写入希望通知的信息;当一个线程Tl需要睡眠时就等待一个事件,而另一个线程T2需要唤醒Tl时就设置通知Tl这个事件,Tl即被T2唤醒,T2在Tl所属的数据区写入希望告知Tl的信息,Tl 即可在被唤醒后读取这些信息并做相应的处理。本发明可以最大程度地利用RDBMS系统的成熟的存储引擎实现来开发NoSQL的键值存储引擎,避免了大量重复开发工作,同时可以快速实现出高并发的,具有完整的ACID 事务语义和高效的数据存储和访问方法的NoSQL的键值存储引擎。并且,本发明用户通过注册回调函数的方式可以让键值存储引擎灵活地操作用户数据,还可以避免RDBMS的元数据管理系统和类型系统等子系统带来的额外的运行时资源 (CPU,内存)消耗,运行效率大大提高。


图1为KeyValueSE的原理架构图;图2为一种实现NoSQL的键值存储引擎的方法的一种示例流程图。
具体实施例方式本发明提出一种把任意一种RDBMS改造为NoSQL的键值存储引擎的方法。这个方法分两大阶段,其中每个阶段分三个主要步骤,详述如下。第一阶段得到NoSQL存储引擎KeyValueSE。第一步将RDBMS的解析器,优化器,执行器,元数据管理器,类型支持系统以及服务器框架等模块去除,只保留其存储引擎。第二步是创建单列的字节串数据行结构作为所有数据表的数据行结构。第三步是从RDBMS的存储引擎中把对上述模块的依赖替换为基于用户注册的回调函数的依赖方式,也就是通过让用户注册回调函数给存储引擎,然后存储引擎通过调用这些回调函数来获取用户数据的有关信息。按照上述步骤依次操作可以将任何一种RDBMS 的存储引擎提取出来,得到一个不依赖于关系模式的,但是支持完整的事务语义和高效的数据存储和访问的NoSQL存储引擎,本文中称之为存储引擎KeyValueSE。第二阶段将存储引擎KeyValuSE改造为支持多进程多线程的存储引擎由于一般的RDBMS是多进程架构,每个进程内部是单线程的架构,所以本发明的第二阶段将第一阶段得到的多进程、单线程存储引擎KeyValueSE改造为多进程、多线程的存储引擎,这样就可以支持多进程多线程的架构,在工作模式上面具有更大的灵活性和更好的并发性能。第二阶段操作的方法也分三步。
第一步将所有的全局变量放置到线程局部存储中,这样原来每个进程内的每个进程范围的全局变量就变成专属于每个线程的线程范围的全局变量,线程之间同名的全局变量相互不影响,每个线程就仿佛是一个RDBMS后台进程,原有的代码逻辑就可以正确的工作。第二步是把原有的进程间信号通信机制替换为线程间通信机制。这是因为传统的信号机制只适用于进程间通信,无法用于位于同一个进程内的或者位于不同进程内的线程之间的通信。线程间通信机制主要需要做到让一个线程Tl可以唤醒一个正在睡眠的线程 T2,以及让Tl可以通知T2 —个事件信息。第三步是定义线程初始化函数和退出函数,初始化函数要在线程启动存储引擎时初始化存储引擎内部数据和状态并分配所需的资源,退出函数要在线程退出时释放存储引擎占用的资源。线程初始化包括进程全局初始化和线程局部初始化。全局初始化包括分配系统内存以及初始化各子系统的全局数据,主要包括buffer子系统的页数组和ha sh表,锁子系统的锁表,事务子系统的clog/subtrans/multixact等全局状态,日志恢复和日志子系统的日志缓存分配,以及bgwriter,autovacuum等后台进程的共享数据初始化等。全局退出函数用于执行与初始化相反的操作,包括释放各子系统分配的系统内存以及执行用户注册的全局退出回调函数。线程局部初始化数据主要包括线程运行模式与状态,分配线程私有的内存空间, 设置各子系统的共享数据区地址,各模块的运行时数据初始化;线程退出函数完成与初始化相反的操作,包括释放内存空间,调用各子系统注册的退出函数等。完成这些主要步骤后就可以得到一个多进程多线程的具备完整的事务语义的 NoSQL的键值存储引擎。最终的存储引擎KeyValueSE的架构如图1所示。图中主要模块的功能如下SMgr 提供统一的文件系统调用接口,包括文件的创建,删除,打开,关闭,读取,写入等操作;同时提供基于磁盘文件的接口实现;IPC 提供系统内存访问,信号量以及共享数据管理等功能;Buffer 页管理模块,向上层模块提供页面,缓存页面,管理缓存空间以及完成页面10。LMgr 锁管理模块,管理事务锁,以及轻量级锁,旋转锁,并且完成死锁检测。Transam&Log 事务管理,包括事务状态管理;事务的启动,提交,回滚;实现事务的ACID语义,特别是MVCC的实现;以及日志记录,数据恢复等。Bgffriter 后台数据写入进程,完成脏数据页写入,检查点写入等;Heap 堆数据存储和检索,数据的增删改查。Index&NBtree :Index 是统一的索弓丨接口,NBtree 是对 Index 接口的基于 Btree 的实现,它为heap数据表提供索引,与heap数据表协作。其上的模块基本来自于RDBMS的存储引擎子系统。实施例一上按照本发明提出的方法,基于PostgreSQL的源代码实现KeyValueSE的具体操作流程如下
SllO 去除PostgreSQL的解析器,优化器,执行器,元数据管理以及类型支持系统以及服务器框架等模块的代码,以及诸如国际化支持,通信协议,编程接口等辅助功能的代码,只保留存储引擎子系统的代码。S120:在存储引擎中定义一个固定的“字节串”数据类型和一个固定的单列的使用这个“字节串”类型的固定的属性对象,并且使用该属性对象创建一个固定的数据行结构描述符对象tupleDesc。关键代码片段如下
FormDa ta-pg-a ttribute text-attribute = { 0,
{ "text"}, 25, -1, -1, 1, 0, -1, -1, false, 'χ、'i', false, false, false, true, 0 , 100};
const int single-attribute = 1; TupleDesc single-a ttibute- tupDesc = NULL; TupleDesc toast—a ttibute— tupDesc = NULL;
//create the global single attibute re la tion descriptor
void fdxdb- Crea teSingeA ttTupleDesc () {single-att ibute- tupDesc = Crea teTempla teTupleDesc (single-attribute, false);
* (single-attibute- tupDesc->at trs) = &text-attr ibute;
}
void fdxb- Crea teToastA ttTupleDesc Q
ι
toast-attibute- tupDesc = Crea teTempla teTupleDesc (single-attribute,
false); }
//form coIum with one attribute;
HeapTuple fdxdb-heap-formtuple (const char *p, size- t len) {
Da turndvalues[1];
dva lues
= fdxdb- s tring-formda turn (p, len); TupleDesc tupDesc = Crea teTempla teTupleDesc (single-at tribute, false);
* (tupDesc->a t trs) = &text-at tribute;
HeapTuple tuple;A return tuple */
bool ^boolNulls = (bool palIoc (sizeof (bool));
boolNulls
= false;tuple = heap-form-tuple (tupDesc , dvalues, boolNul Is); ρ free (Da tumGetPointer (dvalues
)); ρ free (boolNul 1 s); ρ free (tupDesc);
return tuple;S130:使用数据行结构描述符对象tupleDesc对象作为所有的数据表的数据行结构,这样每个数据表的数据行结构都是统一的单列字节串。该步骤去除了存储引擎 KeyValueSE对PostgreSQL的元数据管理系统的依赖。S140 在存储引擎KeyValueSE中提供用户注册回调函数的接口,并且修改存储引擎KeyValueSE的代码。具体修改方式如下1. ScanKeyData结构中增加一个CompareCallback回调函数指针,用户创建 ScanKey数组的时候需要填充每一个kanKey的sk_compfun字段。CompareCallback 的原型如下typedef int (^CompareCallback)(char^strl, int lenl, char*str2, intlen2);2.在RelationData中增加一个split函数指针,它负责把一个数据行拆分为字段。这个函数指针的类型如下typedef RangeData(氺Split) (char*, int, int charlen);当需要创建索引键时,调用这个split函数拆分字段并按照索引列号取出所需要的字段构成索引键;需要比较索引键的时候,使用kanKey中的Sk_COmpfim回调函数指针调用比较函数得到比较结果。其中,kanKeyData描述了用于索引查找的一个查询条件,RelationData是描述一个表的运行时状态的对象JcanKey数组是存储引擎KeyValueSE中用于设置索引搜索条件的数据结构。这样,存储引擎在创建索引键和比较索引键的时候,使用用户注册的回调函数而不是基于类型系统来工作。该步骤去除了存储引擎对PostgreSQL的类型支持系统的依赖。 本步骤之后就得到了一个单线程的NoSQL键值存储引擎KeyValueSE。第一阶段至此完成, 下面进入第二阶段。S150 将KeyValueSE代码中所有的全局变量声明为线程局部存储的全局变量,这意味着在不同操作系统平台上面添加不同的编译器关键字。这样代码逻辑中同名字的全局变量的作用域变成了线程范围,线程之间没有共享任何数据,所以线程之间不会相互干扰而出错。S160:实现线程初始化函数用于数据状态初始化和资源分配实现线程退出函数用于释放资源。S170:实现线程间通信机制。利用互斥量和信号机制,在每个线程中设置一个专门的通知数据区,所述通知数据区用于让其他线程写入希望通知的信息;当一个线程Tl需要睡眠时就等待一个事件,而另一个线程T2需要唤醒Tl时就设置通知Tl这个事件,Tl即被 T2唤醒,T2在Tl的该数据区写入希望告知Tl的信息,Tl即可在被唤醒后读取这些信息并做相应的处理。第二阶段至此完成。本发明可以最大程度地利用RDBMS系统的成熟的存储引擎实现来开发NoSQL的键值存储引擎,避免了大量重复开发工作,同时可以快速实现出高并发的,具有完整的ACID 事务语义和高效的数据存储和访问方法的NoSQL的键值存储引擎。并且通过用户通过注册回调函数的方式可以让键值存储引擎灵活地操作用户数据,还可以避免RDBMS的元数据管理系统和类型系统等子系统带来的额外的运行时资源(CPU,内存)消耗,运行效率大大提尚ο以上公开的仅为本申请的几个具体实施例,但本申请并非局限于此,任何本领域的技术人员能思之的变化,都应落在本申请的保护范围内。
权利要求
1.一种实现NoSQL的键值存储引擎的方法,其特征在于,利用现有RDBMS改造成为 NoSQL的键值存储引擎,其进一步包括(一)得到NoSQL 存储引擎 KeyValueSE Al:去除RDBMS中的无关模块,只保留其中的存储引擎;A2:创建单列的字节串数据行结构作为所述存储引擎中数据表的数据行结构;A3:设置所述存储引擎的依赖方式为基于用户注册的回调函数的依赖,得到所述存储引擎 KeyValueSE;(二)将所述存储引擎KeyValueSE改造为支持多进程多线程的存储引擎Bi:将所有的全局变量放置到线程局部存储中;B2 把原有的进程间信号通信机制替换为线程间通信机制; B3 设置线程初始化函数和退出函数。
2.如权利要求1所述的方法,其特征在于,步骤Al进一步包括去除包括RDBMS的解析器、优化器、执行器、元数据管理以及类型支持系统以及服务器框架在内的模块代码,去除包括国际化支持,通信协议,编程接口在内的辅助功能的代码, 只保留所述存储引擎的代码。
3.如权利要求1或2所述的方法,其特征在于,步骤A2进一步包括在所述存储引擎中定义一个固定的“字节串”数据类型和一个固定的单列的使用所述 “字节串”类型的固定的属性对象,并且使用所述属性对象创建一个固定的数据行结构描述符对象 tupleDesc ;所有的数据表使用所述数据行结构描述符对象tupleDesc对象作为数据表的数据行结构,以使得每个数据表的数据行结构都是统一的单列字节串。
4.如权利要求1所述的方法,其特征在于,步骤A3进一步包括在所述存储引擎KeyValueSE中提供用户注册回调函数的接口,并且修改所述存储引擎KeyValueSE的代码,以使得所述存储引擎KeyValueSE在创建索引键和比较索引键的时候,使用用户注册的回调函数而不是基于类型系统来工作。
5.如权利要求1所述的方法,其特征在于,步骤B2进一步包括利用互斥量和信号机制,在每个线程中设置一个专门的通知数据区,所述通知数据区用于让其他线程写入希望通知的信息;当一个线程Tl需要睡眠时就等待一个事件,而另一个线程T2需要唤醒Tl时就设置通知Tl这个事件,Tl即被T2唤醒,T2在Tl所属的数据区写入希望告知Tl的信息,Tl即可在被唤醒后读取这些信息并做相应的处理。
6.如权利要求1所述的方法,其特征在于,步骤B3进一步包括线程初始化包括进程全局初始化和线程局部初始化,全局初始化包括分配系统内存以及初始化各子系统的全局数据;线程退出函数完成包括释放内存空间和调用各子系统注册的退出函数在内与初始化相反的操作。
7.如权利要求4所述的方法,其特征在于,进一步包括ScanKeyData结构中增加一个CompareCallback回调函数指针,用户创建kanKey数组的时候需要填充每一个kanKey的sk_ compfun字段;在RelationData中增加一个split函数指针,它负责把一个数据行拆分为字段,这个函数指针的类型如下:typedef RangeData OSplit) (char*, int, int charlen);当需要创建索引键时,调用这个split函数拆分字段并按照索引列号取出所需要的字段构成索引键;需要比较索引键的时候,使用kanKey中的Sk_COmpfim回调函数指针调用比较函数得到比较结果;其中,kanKeyData描述了用于索引查找的一个查询条件,RelationData是描述一个表的运行时状态的对象;^anKey数组是存储引擎KeyValueSE中用于设置索引搜索条件的数据结构。
全文摘要
一种实现NoSQL的键值存储引擎的方法,包括二个阶段(一)得到NoSQL存储引擎KeyValueSE:A1:去除RDBMS中的无关模块,只保留其中的存储引擎;A2:创建单列的字节串数据行结构作为所述存储引擎中数据表的数据行结构;A3:设置存储引擎的依赖方式为基于用户注册的回调函数的依赖;(二)将存储引擎KeyValueSE改造为支持多进程多线程的存储引擎B1:将所有的全局变量放置到线程局部存储中;B2把原有的进程间信号通信机制替换为线程间通信机制;B3设置线程初始化函数和退出函数。本发明可以最大程度地利用RDBMS系统的成熟的存储引擎实现来开发NoSQL的键值存储引擎,避免了大量重复开发工作,同时可以快速实现出高并发的,具有完整的ACID事务语义和高效的数据存储和访问方法的NoSQL的键值存储引擎。
文档编号G06F17/30GK102446226SQ20121001291
公开日2012年5月9日 申请日期2012年1月16日 优先权日2012年1月16日
发明者何齐, 关健, 刘钰, 孙伟丰, 徐邵稀, 李书淦, 王凤华, 王文军, 程仁波, 罗正海, 赖铮, 赵伟, 郑程光 申请人:上海方正数字出版技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1