一种只读内存数据库的实现方法和系统的制作方法

xiaoxiao2020-10-23  11

一种只读内存数据库的实现方法和系统的制作方法
【技术领域】
[0001] 本发明属于计算机及数据库技术领域中的内存数据库,具体而言,设及一种只读 内存数据库的实现方法和系统。
【背景技术】
[0002] 内存数据库是将数据驻留在主存储器的数据库系统。相对于磁盘,内存的数据读 写速率高得多,因此内存数据库具有比传统磁盘数据库性能好的多的优点,内存数据库也 因此得到了广泛的使用。
[0003] 在大数据分析、商业智能即0LAP的nlineAnal^icalProcessing,联机分析处 理)的使用场景下,内存数据库的访问特性和DW值ataWarehouse,数据仓库)类似,通常 表中的数据是批量装入的,不需要一条一条地插入;表中的数据通常不需要需修改;查询 通常需要遍历表的全部数据;表中数据不再使用时是批量删除的,不需要一条一条地删除。 在大数据分析、商业智能使用场景下内存数据库的大批量数据处理的特征非常明显。而内 存数据库为支持记录的一条一条地处理,如插入、修改、删除功能,需保证数据的一致性,而 一致性保证降低了内存数据库系统的使用并发度和性能,不太适合在大数据分析、商业智 能场景下使用。

【发明内容】

[0004] 为了更好地满足商业智能场景下内存数据库的使用需求,本发明提出一种只读内 存数据库的实现方法和系统。
[0005] -种只读内存数据库的实现方法和系统,其特征在于W大批量数据处理的方式为 主。包括:
[0006] (1)将数据批量加载到内存表中;
[0007] (2)遍历表的全部数据W实现条件查询、聚合运算;
[000引 (3)表中的数据批量卸载;
[0009] (4)不支持表中记录逐条加载或删除;
[0010] (5)不支持表中数据的更新操作。
[0011] 一种只读内存数据库的实现方法和系统,包括模块及内存组织:
[0012] 模块完成特定功能,如图1所示。
[0013] 连接监听模块,用于在特定的TCP端口上监听、等待客户端发起连接请求,在系统 配置的最大连接数未到达时接受连接,并把连接描述符写入到传递连接描述符用的共享队 列,供多个计算模块抢夺并为之提供终生的数据查询服务。连接传递过程如图3所示。
[0014] 运行监控模块,用于诊断只读内存数据库系统的运行健康状况。在运行时每1秒 钟采集一次所有计算模块的执行S化计数、S化快照,并WUDP包的形式发送给配置的监 控主机特定端口。运行监控模块还可W接收UDP的监控命令,按要求采集数据并W约定的 格式进行反馈。
[00巧]HA保证模块,用于和本机的另一个名为guard的守护进程通信w便在只读内存数 据库失效时,自动重启,保持只读内存数据库系统的高可用性。HA保证模块和guard守护进 程通信方式是HA保证模块每1秒钟将共享内存中的一个屯、跳计数器减1。守护进程guard 每秒将该个计数器加1,如果guard发现计数器值大于等于2则说明只读内存数据库已经失 效,该时便重新生成只读内存数据库进程,保证只读内存数据库进程一直存在并有效工作。 HA保证模块和guard守护进程对屯、跳计数器的修改是互斥进行的。
[0016] 统一日志模块,用于收集只读内存数据库系统中其他模块准备写到日志文件的日 志,集中、缓冲地写出到日志文件,减少写盘的次数。统一日志模块还负责监控日志文件的 尺寸,根据配置的日志文件大小、循环保留的文件个数,自动的轮换写入的日志文件并清理 过期的日志文件,避免日志文件占用空间不断生长,降低维护工作量。日志的收集及统一缓 冲写出过程如图4所示。
[0017] 计算模块,用于完成针对表进行的所有操作,包括:创建表并批量装入数据、全表 遍历查询、卸载表中全部数据、删除表等。计算模块有n个(n是在配置文件中指定的系统 最大并发连接数,配置要求n大于等于3)。n个计算模块执行相同的代码,但服务的连接不 同,在服务过程中所使用的临时空间不同。计算模块的真正工作从接收查询语句开始,之后 解析执行查询语句。实现创建表并批量装入数据,实现全表遍历查询,实现卸载表中全部数 据,实现删除表等操作,即计算模块的工作是由客户端查询请求驱动的。
[0018]内存组织用于存储系统参数、系统表、应用表数据,如图2所示。其中系统参数包 括在配置文件中定义的参数,也包括只读内存数据库为运行时管理而定义、存储的参数,如 工作目录、系统时间、系统对象、传递描述符的共享队列等。
[0019] 一种只读内存数据库的实现方法和系统,包括步骤:
[0020] 步骤1,启动只读内存数据系统
[0021] (1)只读内存数据库系统启动并置后台W守护进程的方式运行;
[0022] (2)只读内存数据库系统计算工作目录,确定、读取并解析配置文件,根据配置的 参数生成模块的执行线程。包括生成运行监控线程、生成HA保证线程、生成统一日志线程、 循环生成n个计算线程;
[0023] (3)主线程创建系统表、系统对象并加载元数据。元数据中包括只读内存数据库系 统支持的命令、函数及环境变量,如表1 ;
[0024]
[00 巧]
[0026] 表1函数、命令、环境变量列表
[0027] (4)主线程创建应用表并加载表数据;
[0028] (5)主线程监听TCP连接端口,成为连接监听线程。
[0029] 步骤2,只读内存数据库提供查询服务。本阶段持续的时间较长,根据需要可W是 几天、几个月。
[0030] (1)连接监听线程等待并接受客户端的连接,把建立好的连接传递给计算线程;
[0031] (2)计算线程针对客户端连接提供终生的表查询、汇总服务,即不断地接收客户端 的查询请求,解析、执行、返回结果集数据。计算模块的运行过程如图7所示;
[0032] (3)客户端静默超时后计算线程关闭连接,计算线程阻塞在读取描述符的共享队 列中,在有新客户端连接请求到来时,阻塞的计算线程可W重新投入服务提供的过程中。
[0033] 步骤3,只读内存数据库终止服务
[0034] (1)某个客户端发送了终止服务命令"halt址3s";
[00巧](2)某个计算线程解析到终止服务命令,设置服务终止标志,清理环境后调用pt虹ead_exit(0)退出;
[0036] (3)运行监控线程、统一日志线程、其他计算线程发现服务终止标志设置,都清理 环境后调用pt虹eatexit(O)退出;
[0037] (4)HA保证线程发现服务终止标志设置,通知guard系统正常退出,阻止自动启 动,清理环境后调用pt虹eatexit(O)退出;
[0038] (5)连接监听线程发现服务终止标志设置,等待所有线程退出,最最后的全局环境 清理后调用exit(O)退出,只读内存数据库进程消失,正常退出。
【附图说明】
[0039] 图1为只读内存数据库系统的模块组成示意图
[0040] 图2为只读内存数据库内存使用示意图
[0041] 图3为连接监听模块和计算模块传递连接的示意图
[0042] 图4为统一日志模块收集日志经缓冲后写出过程示意图
[0043] 图5为应用表创建创建过程示意图
[0044] 图5A为分配内存、将数据批量装入内存示意图
[0045] 图6为表内存使用示意图
[0046] 图7为计算模块执行过程示意图
[0047] 图8为全表查询执行过程示意图
[0048] 图9为卸载表中全部数据过程示意图
【具体实施方式】
[0049] -种只读内存数据库的实现方法和系统中,计算模块用于完成针对表进行的所有 操作,包括创建表并批量装入数据、全表遍历查询、卸载表中全部数据、删除表等。
[0050] 计算模块的【具体实施方式】如下:
[0051] (1)创建表并批量装入数据,包括创建存放元数据的系统表和存放业务数据的应 用表,两种表的创建都是从解析其表定义配置开始。表结构定义如表2所示。
[0052]
[0053] 表2表结构定义示意
[0054] 创建表流程如图5所示
[0055] 图5中501生成的表字段定义是数据结构定义如表3所示。当字段数量、字段名、 数据类型不同时生成的数据结构定义做相应的变化。
[0056]
[0057] 表3表数据结构定义示意
[0058] 图5中503根据新生成的表定义生成操作该表所需的源代码,包括生成表结构定 义、动态库中全局变量定义及初始化、字符串转结构、结构转串、插入行、数据初始化的函 数。
[0059]使用gcc-m64-shared-巧IC-0libsyst油le. so syst油le.C生成动态链接库。图 5中504使用dlopen("syst油le. so",RTLD_LOCAL|RTLD_LAZY);将生成本表操作代码动态 链接库装入内存。
[0060] 图5中505系统表对象增加表对象并先记录操作表的函数,函数执行代码指向装 入动态库中对应的代码。系统对象的结构、用途定义如表4所示。
[0061]
[0062] 表4系统对象的结构定义示意
[0063]函数指针的赋值如;obj- >Init=dlsym化andle,"Init");
[0064] 图5中506调用对象的函数分配内存、将数据批量装入内存,语句如 [00巧]ret = obj- > Init (data_dir,obj,&bytes,&alloc);
[0066] 数据装入过程如图5A所示。其中图5A中5A04步骤,将根据源数据存储类型,调 用相应的函数将数据批量装入内存中,即顺序地将取得的一行数据,存为一个结构记录,全 部数据读取完毕也刚好将结构存满,不多不少,次序一致,实现了批量数据的装入。
[0067] 据装入表之后,表内存使用情况如图6所示。
[0068] (2)全表遍历查询,处理流程如图8所示
[0069] 其中801所示命令解析、校验,由于是只读内存数据库,不支持insert、delete、 update语句,只按select的语法结构进行检查,检查包括关键字是否正确,表名是否存在, 字段名是否存在,函数是否存在,表达式是否合法等。
[0070] 其中802所示生成源码、编译,包括将where子句的逻辑表达式生成源代码;将 select子句中多个计算表达式生成源代码;并生成执行计划源代码,逐一扫描目标表的每 一个记录,判断是否满足where条件,满足的求解select子句中的每一个表达式结果,并拼 成一个结果字符串,写到结果集缓冲区;生成的源码在一个源文件中,一次完成全部代码的 编译,生成动态链接库。
[0071] 其中803装入执行代码是将编译的动态链接库装入内存。
[0072] 其中804只取其中的执行计划代码调用,即可完成全表数据的扫描、判断、生成结 果集并输出。全部记录扫描完成可能已经反馈了相当多的结果给客户端程序,反馈结果结 束之前,检查结果集缓冲区,如果还有数据则也需发送给客户端程序。其中804环境清理、 发送日志步骤,将动态链接库卸出内存,释放临时变量占用空间,关闭不用的连接描述符。
[0073] (3)卸载表中全部数据就是释放分配的内存并让表不可见,处理流程如图9所示。 卸载的表只是在内存中不见,不能进行查询及计算,但表的定义文件、数据文件都还保留, 下次只读内存数据库启动时还可W将表装入进行使用。
[0074] (4)删除表,将表的定义文件及数据文件删除,下次只读内存数据库启动也不能复 现该表。
【主权项】
1. 一种只读内存数据库的实现方法和系统,其特征在于以大批量数据处理的方式为 主,包括: (1) 将数据批量加载到内存表中; (2) 遍历表的全部数据以实现条件查询、聚合运算; (3) 表中的数据批量卸载; (4) 不支持表中记录逐条加载或删除; (5) 不支持表中数据的更新操作。2. 如权利要求1所述方法,其特征在于(1)所述过程还包括针对表定义的解析来生成 系统对象元素、表数据结构定义,并进一步动态生成表处理所需的代码,代码在运行时编译 为动态链接库,动态链接库装入内存,其中表处理所需的代码赋值到系统对象上,通过调用 系统对象指向代码实现将数据批量加载到表对应的结构数组的目的。3. 如权利要求1所述方法,其特征在于(2)所述过程还包括查询语句的解析生成查询 计划、查询计划编译并装入、查询计划的执行等几个步骤,数据批量加载到内存表必须且只 经历一次编译操作。4. 如权利要求1所述方法,其特征在于(3)所述数据批量卸载就是释放建表及批量装 入数据时分配的内存,不多也不少,并在系统对象上进行适当的标记。5. 如权利要求2所述方法,生成表处理所需的代码其特征在于包括全局变量定义、字 符串转结构代码、结构转串代码、插入行代码、数据初始化代码,所述代码可以是函数,也可 以是方法或者脚本。6. 如权利要求2所述方法,代码在运行时编译为动态链接库,是将所有代码合并在一 起一次性编译完成。7. 如权利要求3所述方法,查询语句泛指只读内存数据库系统客户端发来的请求,请 求从统计上以查询语句为主,但也包括非查询语句、命令,非查询语句、命令在解析时识别 并进行相应的处理,不经过编译、装入、调用的这一执行过程。
【专利摘要】一种只读内存数据库的实现方法和系统是以大批量数据处理方式为主的内存数据库系统。方法包括将数据批量加载到内存表中;遍历表的全部数据以实现条件查询、聚合运算;表中的数据批量卸载;不支持表中记录逐条加载或删除;不支持表中数据的更新操作。本发明尤其适用商业智能场景下大规模数据的高频查询和计算,不但查询、计算的效率高,而且支持高并发访问。
【IPC分类】G06F17/30
【公开号】CN104881465
【申请号】CN201510271140
【发明人】冯昱川
【申请人】北京挺软科技有限公司
【公开日】2015年9月2日
【申请日】2015年5月26日
转载请注明原文地址:https://www.famiwei.com/read-8138610.html

最新回复(0)