CN116431598A - 一种基于Redis的关系型数据库全量内存化的方法 - Google Patents

一种基于Redis的关系型数据库全量内存化的方法 Download PDF

Info

Publication number
CN116431598A
CN116431598A CN202210401757.6A CN202210401757A CN116431598A CN 116431598 A CN116431598 A CN 116431598A CN 202210401757 A CN202210401757 A CN 202210401757A CN 116431598 A CN116431598 A CN 116431598A
Authority
CN
China
Prior art keywords
sql
data
redis
key
constraint
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202210401757.6A
Other languages
English (en)
Inventor
朱洲森
张俊
罗纯琦
赵倩
林露
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sichuan Normal University
Original Assignee
Sichuan Normal University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sichuan Normal University filed Critical Sichuan Normal University
Priority to CN202210401757.6A priority Critical patent/CN116431598A/zh
Publication of CN116431598A publication Critical patent/CN116431598A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/21Design, administration or maintenance of databases
    • G06F16/211Schema design and management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • G06F16/2282Tablespace storage structures; Management thereof
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/242Query formulation
    • G06F16/2433Query languages
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2458Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
    • G06F16/2471Distributed queries
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • Computational Linguistics (AREA)
  • Fuzzy Systems (AREA)
  • Probability & Statistics with Applications (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及一种基于Redis的关系型数据库全量内存化的方法,包括用多种存储转换模式将RDB中的数据、关系和约束转换为适合Redis存储的对象,通过迁移控制组件实现批量快速的数据库迁移;通过SQL解析器组件、操作预检查组件和SQL适配器组件对Redis进行标准SQL访问;分析Redis的离线RDB数据文件,通过解析RDB日志文件,将文件中的数据内容转换为关系型数据库支持的SQL语句,批量执行SQL实现数据从Redis到关系型数据库的备份存储。本发明构建出三种存储转换模式实现关系模型到键值模型的转换,结合数据分页、多线程和Redis批量命令技术实现数据库快速批量迁移。

Description

一种基于Redis的关系型数据库全量内存化的方法
技术领域
本发明涉及计算机数据处理技术领域,尤其涉及一种基于Redis的关系型数据库全量内存化的方法。
背景技术
在经历了人工管理、文件管理之后,数据管理技术在数据库阶段迎来了里程碑式的发展。数据库能够高效有序地存储大量数据信息,并方便用户进行有效检索、访问和管理,是信息技术发展过程中管理数据的主要方式。自2013年以来,排名前三位的数据库均是RDB(关系型数据库)。虽然目前非关系型数据库(Not Only Sql,NoSQL)发展迅速,但RDB仍然是大多数应用程序的数据存储介质,是整个社会的信息基础设施。为满足存储需求,数据库技术的发展中衍生出了以下几种数据库架构。
最简单的数据库架构是单体数据库,它使用单个数据库存储全部数据,并通过配置数据库连接池管理数据库连接,客户端可从连接池中获取连接管理数据库中的数据。在小型应用系统中,通过数据连接池直连RDB的方案比较常见。
为避免数据库单点故障和单个数据库压力过大,针对不同规模的读写请求出现了一主多从的数据库方案。但主从架构的读写分离方案存在写延迟的问题,会导致主从数据库实时数据不一致。为了降低数据呈指数级增长场景下的单个数据库的负载,分库分表技术应运而生。但分库分表技术会带来分布式事务和跨数据库JOIN等问题。数据库不同架构产生的本质原因在于RDB将数据存储在磁盘上,在频繁读写的高并发场景下会存在读写I/O瓶颈,带来操作效率低和高异常率等问题。综上所述,RDB在高并发场景下的读写和扩展性等方面具有自身局限性。
而随着NoSQL的发展,出现了在数据库层面使用缓存技术实现读写分离,利用内存组件减轻RDB的读压力,使得MMDB+RDB组合使用成为趋势。目前缓存方案广泛应用于企业信息管理,且缓存组件多使用NoSQL内存组件(MemCache)或NoSQL内存数据库(Redis)。在缓存式数据库架构中,RDB作为主库存储所有数据,缓存组件存储热点数据(高频率使用的数据),并设置内存数据淘汰策略来保证缓存的命中率。客户端每次从缓存中读取数据,缓存未命中的数据将从RDB中读取再写入缓存。缓存更新有多种策略,目前流行的有先删除缓存再更新RDB、先更新RDB再删除缓存、先更新RDB再更新缓存、缓存代理和写回(只更新缓存,缓存组件异步批量地更新RDB)五种策略。其中,前三种更新策略均无法避免脏数据的产生。第一种更新策略有明显的缺陷,当更新操作删除缓存但还没来得及更新RDB中的数据时,此时的查询操作会因为未命中缓存而读取RDB中旧的数据并写入缓存,导致写入缓存的数据变成脏数据。第二种更新策略是目前使用最广泛的,但也有小几率产生脏数据。第三种更新策略需要提前准备数据,比第二种更新策略具备更高的读性能,但要更新RDB和缓存两部分数据会导致其较低的写性能,也同样会产生脏数据。第四种更新策略不适用于高并发场景。第五种更新策略不保证强一致性,会造成部分数据丢失问题。
综上所述,在缓存读写分离架构中的读请求情况相对简单,但数据更新逻辑复杂,容易出现数据一致性问题,导致数据命中率降低。同时,缓存式读写分离方案不能避免高并发场景下更新RDB中的数据引起的I/O读写瓶颈问题。此外,当大量恶意请求故意查询不在缓存中的数据时会引发缓存穿透问题,导致所有的请求会同时转向请求RDB。目前最流行的解决缓存穿透的方案是增加前置布隆过滤器和设置无效缓存方案。但布隆过滤器会带来误识别率和删除困难问题,无效缓存方案在实际应用中情况复杂且会增加内存占用。缓存雪崩是缓存式方案存在的另一个问题,因为缓存具有时效性,缓存失效引发的缓存雪崩也会给RDB带来巨大压力,甚至导致系统崩溃。目前可以使用锁/队列、多级缓存和设置不同的缓存时效三种方案来减轻以上问题,但会降低应用整体性能且实际应用情况复杂。
近年来随着内存技术的发展,利用内存访问技术减少与磁盘之间的交互频率提升数据库实时响应能力成为一个研究热点。同时,随着动态随机存取存储器(DRAM)容量的增加,计算机内存可配置到TB级,在DRAM中存储和处理企业数据成为可能。一些商用数据库推出了企业级的内存化方案,但大多方案都存在配置复杂、系统过重、商业技术使用限制和硬件要求较高等问题。
发明内容
本发明的目的在于克服现有技术的缺点,提供了一种基于Redis的关系型数据库全量内存化的方法,利用开源轻量级Redis将MySQL内存化的全量式内存化方案(含数据、关系和约束),利用内存数据库高效的内存计算和数据处理能力解决高并发环境下MySQL的I/O读写瓶颈问题。
本发明的目的通过以下技术方案来实现:一种基于Redis的关系型数据库全量内存化的方法,所述方法包括:
构建基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM将RDB中的数据、关系和约束转换为适合Redis存储的对象,并通过迁移控制组件实现批量快速的数据库迁移;
设置SQL操作中间件,通过其中的SQL解析器组件、操作预检查组件和SQL适配器组件对Redis进行标准SQL访问;
设置数据备份架构,分析Redis的离线RDB数据文件,通过解析RDB日志文件,将文件中的数据内容转换为MySQL支持的SQL语句,批量执行SQL实现数据从Redis到MySQL的备份存储。
所述数据库迁移包括以下内容:
A1、从MySQL Schema中获取指定数据库中每个表的表对象,记录每个表的表名、列属性、主键属性和记录行数信息,然后将每个表的表对象组合为全局表对象;
A2、判断MySQL数据库中的所有关系是否转换完成,如果是,则跳转步骤A4,如果不是,则跳转步骤A3;
A3、使用存储转换模式中的关系转换算法实现所有关系转换,生成关系转换对象;
A4、判断MySQL数据库中所有表的约束是否转换完成,如果是,则跳转步骤A6,如果不是,则跳转步骤A5;
A5、使用存储转换模式中的约束转换算法实现所有约束转换,生成约束转换对象;
A6、判断MySQL数据库中的所有表的数据是否转换完成,如果是,则跳转步骤A8,如果不是,则选择任意未完成数据转换的表,跳转步骤A7;
A7、使用存储转换模式中的数据转换算法构建数据键值对象,生成数据转换对象;
A8、当需要迁移的转换结果对象个数超过预设的阈值时,通过迁移控制组件批量迁移关系转换对象、约束转换对象和数据转换对象;
A9、判断所有转换对象是否迁移完成,如果没有完成则跳转步骤A8。
所述基于对象的行式存储模式ORB-KVM中的数据转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure BDA0003600486770000031
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB、表名Ti和主键PKi,根据公式Ki=M(DB,Ti,PKi)拼接为Redis中的Key对象Ki
针对数据集djsonarr,jsonarr的长度为trlen,设置行对象为rowi,行记录中主键值为RKVali,行json对象为jrowi,根据公式jrow′i=R(jrowi,PKi)移除json对象中主键及其对应的值,根据公式
Figure BDA0003600486770000032
构建散列中的域字段field和域字段值value的集合NVali,再结合Ki通过公式DM=build(Ki,NVali)构建数据转换对象DM。
所述基于属性的行式存储模块ARB-KVM中的关系转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure BDA0003600486770000041
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB,表名Ti和主键PKi以及主键值PKVali,根据公式Ki=M(DB,Ti,PKi,PKVali)拼接为字符串对象Ki
针对数据集djsonarr,设置行对象rowi,行对象中的属性列长度为tcolcount,colk(k<tcolcount)和colValk(k<tcolcount)分别为rowi中的每个列字段和列值,根据公式
Figure BDA0003600486770000042
构建散列中的的域字段field和域字段值value的集合NVali,再结合Ki通过公式DM=build(Ki,NVali)构建数据转换对象DM。
所述分段列式键值交叉存储模式PCB-KVCM中的关系转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DM中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure BDA0003600486770000043
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB,表名Ti和主键PKi,针对每一个PK′i和分段S和E,根据公式
Figure BDA0003600486770000044
拼接为对应Redis中的Key对象Ki
针对数据集djsonarr,设置行记录rt(t<trcount),属性字段ci(i<trcount),属性值为v(t,i)
Figure BDA0003600486770000045
表示非主键列中当前行的主键值,vti表示ci列的所有数据集合,ci为Redis中的域字段field,vti为域字段值value,根据当前列是主键或者非主键两种情况分别对vti进行构建,最后结合Ki通过公式NVali=build(ci,vti)和DM=build(Ki,NVali)构建数据转换对象DM。
所述基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM中的关系转换算法包括:
根据全局表对象获取指定库中的所有外键信息,主要包括主表对象、从表对象和依赖的字段;
根据主表对象和从表对象以及依赖字段建立有向图模型,其中有向图模型中的顶点表示表对象,有向边表示被依赖关系,权重表示被依赖的字段,根据有向图的出度和入度判断依赖和被依赖对象,确定表中的外键个数;
深度遍历有向图,设置常量c标识外键,通过公式fk=M(Ki,c)和FM=build(fk,cid,Tc)按照遍历排序构建外键关系散列FM。
所述基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM中的约束转换算法包括主键约束、唯一约束、默认约束、外键约束和检查约束;所述主键约束、唯一约束、默认约束和检查约束分别采用单独的散列存储,内存化后对Redis数据的操作,对约束条件进行判断合法后再进行数据操作。
所述SQL操作中间件由三层组成,第一层为输入层包括标准SQL和Redis原生操作,第二层包括SQL解析组件、操作预检查组件和SQL适配组件,第三层为Redis集群数据层;其对Redis进行访问的步骤包括:
通过SQL解析组件获取SQL的详细信息,构建SQL解析对象;
根据SQL解析对象的内容通过操作预检查组件按照操作类型判断是是否符合已有约束和表数据之间的关系;
通过SQL适配组件根据SQL解析对象中的内容调用Redis原生接口完成对SQL表达的数据操作的内容一致性操作。
所述通过SQL解析组件获取SQL的详细信息,构建SQL解析对象包括:
对接收到的标准SQL语句首先按照操作类型进行分类,再按照标准的语法格式对SQL进行解析,对SQL语句的字符流进行处理;
然后将字符流划分为相应的单词流进行词法分析,构造出包括操作类型、字段列、表名和条件的SQL解析对象;
所述操作预检查组件按照操作类型判断是是否符合已有约束和表数据之间的关系包括:
解析所述SQl解析组件构建的SQL解析对象,识别此次SQL的操作类型,如果是SELECT,则直接略过,否则将进入操作预检查组件进行预检查;
如果是INSERT,则对多种约束组件进行判断,当全部约束组件都通过时,最终通过状态才会被标记为通过,否则标记为未通过;
如果是DELETE,则对外键约束组件进行判断,当满足外键关系删除时,最终通过状态才会被标记为通过,否则标记为未通过;
如果是UPDATE,则对多种约束组件进行判断,当全部约束组件都通过时,最终通过状态才会被标记为通过,否则标记为未通过。
所述数据备份架构包括RDB解析组件、JSON数据SQL化组件和批量SQL任务组件;所述RDB解析组件用于按照RDB文件的格式过滤文件中的非数据字符,批量将二进制数据文件转化为对应的JSON对象文件;所述JSON数据SQL化组件用于分析JSON文件的数据内容,按存储模式的逆过程将JSON对象解析为SQL语句;所述批量SQL任务组件用于使用队列存放SQL对象,当JSON数据SQL化组件生成的SQL对象被PUSH到队列中,到达指定时间后,组件按照先进先出的顺序从队列中取出预设阈值个数的SQL对象,然后调用MySQL的驱动程序,执行对应的批量操作API批量执行SQL存入到MySQL中。
本发明具有以下优点:一种基于Redis的关系型数据库全量内存化的方法,构建出三种不同的存储转换模式(ORB-KVM、ARB-KVM和PCB-KVCM)实现关系模型到键值模型的转换,存储转换模式中包括对数据、关系和约束的转换。并结合数据分页、多线程和Redis批量命令技术实现数据库快速批量迁移;针对内存化到Redis中的数据设计了标准SQL访问中间件,利用Java Stream流技术和Redis的数据结构特性对Redis原生接口进行扩展与封装。同时实现了基于数据日志文件将Redis中的数据备份到MySQL;
附图说明
图1为本发明的分层模型示意图;
图2为本发明的微服务架构示意图;
图3为数据库迁移流程图;
图4为ORB-KVM模型数据转换原理图;
图5为ORB-KVM模式中Redis的Key构建原理图;
图6为MySQL有向图的关系表示图;
图7为ARB-KVM模式数据转换原理图;
图8为ARB-KVM模式中Redis的Key构建原理;
图9为PCB-KVCM模型数据转换原理图;
图10为PCB-KVCM模式中Redis的Key构建原理图;
图11为SQL中间件架构图;
图12为操作预检查组件执行流程图;
图13为数据备份架构图;
图14为educloudman部分表E-R图;
图15为educloudman数据库关系有向图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本申请实施例的组件可以以各种不同的配置来布置和设计。因此,以下结合附图中提供的本申请的实施例的详细描述并非旨在限制要求保护的本申请的保护范围,而是仅仅表示本申请的选定实施例。基于本申请的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。下面结合附图对本发明做进一步的描述。
本发明核心思想是Redis作为主数据库使用,在业务系统生产环境中只使用Redis。因此,需要将RDB中的数据迁移到Redis中,这就带来全量式内存化方案中存在两个关键问题:一是数据库转换,二是数据的标准化访问。为了降低历史数据对Redis的依赖,可以选择将Redis中的数据备份回RDB中。其主要包括以下内容:
(1)构建存储转换模式实现RDB中的数据、关系和约束转换,借助模型转换结果实现批量数据库迁移;
(2)设计SQL中间件实现Redis对标准SQL操作的支持;
(3)设计备份服务组件实现Redis中的数据备份到RDB。
如图1所示,分为数据初始化层、标准访问层和数据备份层。数据初始化层构建出存储模型转换模式将RDB中的数据、关系和约束转换为适合Redis存储的对象,并使用迁移控制组件实现批量快速迁移。标准访问层使用标准SQL操作Redis中的数据,涉及SQL中间件组件。数据备份层将Redis中的数据使用备份组件备份到RDB中。
与传统单体应用相比,微服务架构中的每个服务是独立开发和部署的,使得系统在可扩展性、灵活性、容错性、可靠性和吞吐量等方面都有具有较大的优势,能够便捷高效地完成开发部署。
如图2所示,本发明在全量式内存化分层模型的基础上,借助微服务思想,整合Spring Cloud技术,共划分为三个服务,分别是数据初始化服务、标准SQL访问中间件和Redis数据备份服务。
首先使用数据初始化服务将RDB中的数据、关系和约束迁移到Redis中,此后处理客户端请求都通过SQL标准访问中间件操作Redis中的数据。请求通过SLB负载均衡设备分发到Nginx,再由Nginx转发到统一认证访问网关入口,验证通过后,再由网关均衡转发到对应的处理服务。同时可以通过标准SQL访问中间件使用标准SQL语言操作Redis中的数据。最后使用数据备份服务将Redis中的历史数据备份到RDB中进行存储。整个平台基于SpringCloud,使用异步非阻塞框架WebFlux,配合异步非阻塞数据库访问技术R2DBC,集成Hystrix熔断、动态路由和限流等技术,提供统一的访问认证网关入口和Session Token认证,大幅提升系统吞吐量的同时保证微服务平台的安全可靠。
在RDB中,表是数据库的基础单元,表与表之间存在多种关联关系,同时能通过约束保证数据的安全性和完整性。本发明的数据初始化服务实现MySQL数据库全量迁移到Redis中,但MySQL使用关系数据模型组织数据,Redis使用键值存储模型存储数据,为了实现不同存储模型之间的转换,本发明构建三种不同的存储转换模式(基于对象的行式存储模式:ORB-KVM,基于属性的行式存储模式:ARB-KVM,分段列式键值交叉存储模式:PCB-KVCM)实现MySQL数据库中数据、关系和约束的转换。其中,存储转换模式包括数据转换算法、关系转换算法和约束转换算法。
进一步地,数据库迁移步骤包括:
(1)MySQL Schema解析,通过MySQL驱动获取MySQL中元数据(Mete Data)和数据(Data)信息。
(2)以键值对的形式对MySQL中的数据、关系和约束建模,构建存储转换模式(ORB-KVM、ARB-KVM和PCB-KVCM)实现MySQL到Redis的数据、关系和约束转换。
(3)批量数据库迁移,根据转换模型的结果,连接Redis服务器和Java Redis驱动程序,利用多线程、数据分页技术和Redis Pipeline批量命令技术实现迁移。
MySQL数据库中的基本单元是表,为了实现数据库的迁移,针对MySQL中的每个表在内存中记录当前表对象,表对象部分属性下表1所示:
表1全局表对象部分属性
Figure BDA0003600486770000081
Figure BDA0003600486770000091
在数据库迁移过程中,针对MySQL数据库中每个表,使用对应表对象记录表中的行总数、列总数、列信息、外键关系及涉及的表、受检字段、受检字段值范围、唯一约束、默认约束和当前转换状态(curState),当前转换状态用于记录每一个环节的转换状态。然后将MySQL数据库中的所有表的表对象整合为Map类型的全局表对象,根据表名称即可获得表对象,从而获取对象的相关属性。
进一步地,如图3所示,数据库迁移的详细步骤包括:
(1)从MySQL Schema中获取指定数据库中每个表的表对象,记录每个表的表名、列属性、主键属性和记录行数等信息,然后将每个表的表对象组合为全局表对象。
(2)判断MySQL数据库中的所有关系是否转换完成;A、如果是,跳转步骤4;B、如果否,跳转步骤3。
(3)使用存储转换模式中的关系转换算法实现所有关系转换,生成关系转换对象,跳转步骤4。
(4)判断MySQL数据库所有表的约束是否转换完成;A、如果是,跳转步骤6;B、如果否,跳转步骤5。
(5)使用存储转换模式中的约束转换算法实现所有约束转换,生成约束转换对象,跳转步骤6。
(6)判断MySQL数据库中的所有表的数据是否转换完成;A、如果是,跳转步骤8;B、如果否,选择任意未完成数据转换的表,跳转步骤7。
(7)使用存储转换模式中的数据转换算法构建数据键值对象,生成数据转换对象,跳转步骤8。
(8)当需要迁移的转换结果对象个数超过预设定的阈值,使用迁移控制组件批量迁移关系转换对象、约束转换对象和数据转换对象。
(9)判断所有的转换对象是否迁移完成;A、如果是,算法结束;B、如果否,跳转步骤8。
进一步地,在ORB-KVM模式中,MySQL中的数据转换算法是关键。ORB-KVM数据转换算法的核心思想是将MySQL一个表的所有行记录存储为Redis的一个散列。使用Redis散列结构,将MySQL行记录的主键标识和移除主键标识后的JSON对象用于构建散列结构的域字段field和域值value,同时利用主键标识的唯一性保证散列结构中field的唯一性。如图4所示,item1、item2和item3表示MySQL中一个表的三行记录,利用ORB-KVM将item1、item2和item3转换为Redis散列数据。
在ORB-KVM模式数据转换算法中,为了保证key的唯一性和查询效率,key采用String类型,由四部分组成,包括:库名、数据表名、主键名。主键名用作标准SQL查询中间件查询主键的依据,减少扫描主键散列的次数;域字段field表示行记录中的主键值,域值value表示行记录JSON对象。
如图5所示,定义MySQL中数据库名称DB;定义数据库中所有表的个数为tcount,DB中的任一表表示为Ti(i<tcount)。数据转换算法包括如下内容:
1)init(DB)→(TabObjMap):输入数据库对象DB,初始化全局Map类型表对象TabObjMap,其中以表名称为键,值为表对象,表对象包括主键属性、字段列属性等。
2)GetTpk(TabObjMap)→(Tpk):输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk。定义Ti(i<tcount)中的主键为PKi,i为TabObjMap集合索引序列号,若主键存在,通过公式(4.1)中的Pi方法获取到表中的主键PKi,否则为默认值dpk。
Figure BDA0003600486770000101
3)BuildKey(DB,Ti,PKi)→(Ki):针对每一个数据库表,输入数据库名称DB,表名Ti(i<tcount)和主键PKi,利用公式(4.2)拼接为Redis中的Key对象Ki
Ki=M(DB,Ti,PKi) (4.2)
4)BuildVal(djsonarr)→(NVali):针对数据集djsonarr,jsonarr的长度为trlen,定义行对象rowi(i<tcount),行记录中主键值为PKVali,行json对象为jrowi,使用公式(4.3)中的R方法移除json对象中主键及其对应的值。然后由公式(4.4)构建散列中的域字段field和值value的集合NVali。最后,结合步骤三中的Ki,使用公式(4.5)构建数据转换对象DM。
jrow′i=R(jrowi,PKi) (4.3)
Figure BDA0003600486770000102
DM=build(Ki,NVali) (4.5)
本发明设计使用单独的散列记录Redis中的“外键”关系。例如:散列结构为(Ki:fk,cid,Tc)。此散列结构表示Ti(从表,含有外键的表)通过字段cid与Tc(主表,被依赖的表)中的主键cid建立关系,即cid是Ti中的外键,Ti中的cid依赖Tc中的cid。本发明在对Redis的操作过程中,若需要考虑数据完整性,可以根据外键散列查看是否满足外键关系,即当对Ti中的cid的记录操作时,需要首先考虑Tc中是否存在cid对应的记录。
因此,系转换算法的核心问题是如何建立关系散列,如何确定被引用的关系。本发明采用有向权重图模型表示表之间的关系。构建关系有向权重图的核心算法步骤如下:
1)根据全局表对象获取指定库中的所有的外键信息,其中主要包括主表对象(被依赖的表),从表(含有外键的表)对象和依赖的字段。
2)根据主表对象和从表对象以及依赖字段建立有向图模型。其中,有向图中顶点表示表对象,有向边表示被依赖关系,权重表示被依赖的字段。根据有向图的出度和入度判断依赖和被依赖对象,同时可以确定表中的外键个数。
3)深度遍历(DFS)有向图,定义常量c标识外键,使用公式(4.6)和(4.7),按照遍历排序构建外键关系散列FM。
fk=M(Ki,c) (4.6)
FM=build(fk,cid,Tc) (4.7)
如图6所示,圆圈类实体表示数据库表实体,有向图指向方向表示依赖关系,依赖的列字段为箭头上的权重,图中共有三种外键依赖关系,A表使用cid字段依赖B表,B表使用cid字段依赖C表。其中,MySQL中的外键关系可以演变为以下三种关系。
MySQL支持对数据表使用约束,约束可以更好地保证数据表中数据的完整性。约束分为主键约束、唯一约束、默认约束、外键约束和检查约束。其中,主键约束用于标识行记录,具有唯一性和非空特性,唯一约束用于标识唯一,默认约束用于设定数据的默认值,外键约束用于表示从表和主表的关系,检查约束用于限制数据范围或者数据格式。
为了实现和外键约束类似的灵活性,主键约束、唯一约束、默认约束和检查约束分别采用单独的散列存储,内存化后对Redis数据的操作,须先经过这几个约束条件判断,合法后再进行数据操作。其中,约束的构建公式与前面的外键关系散列构建一致。
(1)主键约束:针对于单主键的情况,如果是组合主键,在数据转换之前,将新增虚拟自增单主键。定义原MySQL中Ti中主键列为colk(k<tcolcount),主键最大值为val,则本发明设计的主键存储的散列结构为(Ki:pk,colk,val)(k<tcolcount)
(2)唯一约束:在唯一约束中定义原MySQL中Ti中的唯一约束列集合为uU={ucol0,……,ucolk-2,ucolk-1,ucolk}(k<tcolcount),其中ucolk∈uU(k<tcolcount)。所以,本发明设计的唯一约束存储的散列结构为(Ki:uc,colk,1)(k<tcolcount),其中,域值设置为1,并无实际意义。
(3)默认约束:在默认约束中定义原MySQL中Ti中的默认约束列集合为dU={dcol0,......,dcolk-2,dcolk-1,dcolk}(k<tcolcount),默认值集合为dvU={dv0,......,dvk-2,dvk-1,dvk}(k<tcolcount),其中dcolk∈dU(k<tcolcount),dvk∈dvU(k<tcolcount)。所以,本发明设计的唯一约束存储的散列结构为(Ki:dc,dcolk,dvk)(k<tcolcount)。
(4)检查约束:检查约束一般包括值的范围和值的类型。内存化后,数据存储的散列域的类型是支持多种类型的,因此本发明不再考虑检查约束的值类型,只对检查约束的取值范围做出限制。
定义原MySQL中Ti中受检约束列集合为cU={ccol0,......,ccolk-2,ccolk-1,ccolk}(k<tcolcount),受检范围值集合为cvU={cv0,……,cvk-2,cvk-1,cvk}(k<tcolcount),其中ccolk∈cU(k<tcolcount),cvk∈cvU(k<tcolcount)。所以,本发明设计的唯一约束存储的散列结构为(Ki:cc,ccolk,cvk)(k<tcolcount)。
基于属性的行式存储模式(ARB-KVM)中的关系转换算法和约束转换算法与ORB-KVM算法描述一致,其区别在于数据转换算法;ARB-KVM中的数据转换算法的核心思想是据将每个MySQL的行记录转换为Redis的一个散列,即对于关系数据库表T中的任意一条记录转换成Redis中的一个键值对象存储,利用散列结构直接操作域字段和域字段值的优势,使用散列中的域字段field存储MySQL行存储中行记录的字段名,散列中的域值value存储MySQL字段值。
MySQL的Tab表中包含三个属性,主键列pkcol,非主键列col1和col2,使用ARB-KVM模型转换的Redis散列如图7所示,Tab表中的属性列为散列中的域字段field,属性值为域字段对应的值value。
与ORB-KVM的数据转换算法类似,散列中Key不仅包含数据库名、表名、主键名,不同的是还需包含主键值,保证Redis中Key的唯一性。
如图8所示,ORB-KVM模型中的数据转换算法的具体步骤如下:
1)init(DB)→(TabObjMap):输入数据库对象DB,初始化全局Map类型表对象TabObjMap,其中以表名称为键,值为表对象,表对象包括主键属性、字段列属性等。
2)GetTpk(TabObjMap)→(Tpk):输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk。定义Ti(i<tcount)中的主键为PKi,若主键存在,通过公式(4.1)中的Pi方法获取到表中的主键PKi,否则为默认值dpk。
3)BuildKey(DB,Ti,PKi,PKVali)→(Ki):针对每一个数据库表,输入数据库名称DB,表名Ti(i<tcount)和主键部分PKi以及主键值PKVali,利用公式(4.8)拼接为字符串对象Ki
Ki=M(DB,Ti,PKi,PKVali) (4.8)
4)BuildVal(djsonarr)→(NVali):针对数据集djsonarr,定义行对象rowi,行对象中的属性列长度为tcolcount,colk(k<tcolcount)和colValk(k<tcolcount)分别为rowi中的每个列字段和列值。由公式(4.9)构建散列中的域字段field和域字段值value的集合NVali。最后,结合步骤三中的Ki,使用公式(4.10)构建数据转换对象DM。
Figure BDA0003600486770000131
DM=build(Ki,NValj) (4.10)
在PCB-KVCM中,关系转换和约束转换与前面两种算法一致,其区别在于数据转换算法;PCB-KVCM中的数据转换算法核心思想是每个散列的域字段值Value存储一个表中的所有数据,MySQL的一个表中的数据对应
Figure BDA0003600486770000132
个散列对象,散列中的域字段field存储MySQL行存储中表中的字段名,散列中的域值value存储属于该分段内的对应列的字段值。但当MySQL原始表数据较多时,转换后的散列结构将产生大value存储的问题,不仅影响Redis数据库的性能,也对数据访问有一定的影响。因此,本发明将采用在Redis的Key中加入分段信息,采用分段策略将表划分为多个散列,拆分大value存储保证Redis的性能。
如图9所示,MySQL的Tab表中包含三个属性,主键列pkcol,非主键列col1和col2,使用PCB-KVCM模型转换的Redis散列对象的Key包含分段信息,域field为MySQL中的属性,域值value对应MySQL属性在该行范围内的所有值的集合。同时为了确保每列值与原始行保持联系,将每列数据与对应行的主键值绑定为一个元素。
PCB-KVCM的库表的标识与ORB-KVM类似,都是利用Redis中的key标识库表信息,不同之处在于当表中的数据量N超过阈值T时,可以自定义分段值,并将N行数据存储为
Figure BDA0003600486770000133
个散列对象,每个散列的key的前缀信息包括每个分段的起始行和结束行,同时由于每个key中都包含了不同表对象的行记录信息,也保障key的唯一性。
如图10所示,PCB-KVCM模式中的数据转换算法的具体步骤如下:
1)init(DB)→(TabObjMap):输入数据库对象DB,初始化全局Map类型表对象TabObjMap,其中以表名称为键,值为表对象,表对象包括主键属性、字段列属性等。
2)GetTpk(TabObjMap)→(Tpk):输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk。定义Ti(i<tcount)中的主键为PKi,若主键存在,通过公式(4.1)中的Pi方法获取到表中的主键PKi,否则为默认值dpk。
3)BuildKey(DB,Ti,PKi,Sj,Ej)→(Ki)(j<trcount,i<tcount):针对每一个数据库表,输入数据库名称DB,表名Ti(i<tcount)和主键PKi,针对每一个PK′i和分段S和E,PK′i表示主键对应的数据值(Map映射),由公式(4.11)拼接Ki,对应Redis中的Key。
Figure BDA0003600486770000141
4)BuildVal(djsonarr)→(NVali):针对数据集djsonarr,使用以下算法构建散列中的域字段field和域值value集合NVali
定义行记录rt(t<trcount),属性字段ci(i<trcount),属性值为v(t,i)
Figure BDA0003600486770000142
表示非主键列中当前行的主键值,vti表示ci列的所有数据集合。此时,ci为Redis中的域字段field,vti为域字段值value,vti的构建需要区分当前列是主键和非主键两种情况,如公式(4.13)所示。
1、当ci=PKt,聚合ci列对应的所有值的集合;
2、当ci≠PKt,需要先通过公式(4.12)中的F函数融合当前列ci与当前行主键值得到T(t,i),对行非主键列的值绑定对应行主键值。
Figure BDA0003600486770000143
Figure BDA0003600486770000144
最后,使用步骤三中的Ki,使用公式(4.14)和(4.15)构建数据转换对象DM。
NVali=build(ci,vti) (4.14)
DM=build(Ki,NVali) (4.15)
本发明设计数据初始化中的迁移控制组件将转换结果批量迁移到Redis中存储。为了避免单个命令频繁与Redis服务器交互,降低通信开销,本发明使用Pipeline技术批量执行命令,优化命令逐条执行,将N条命令简化为一次传输;对于关系转换结果和约束转换结果,内容较少,可以一次性存储,但是数据转换结果数据较多,因此本发明设计在迁移控制器中配合使用数据分页技术,当数据量达到阈值则使用批量技术与Redis交互进行批量存储,降低与Redis服务器连接的频率,加速数据迁移过程,降低时间成本。同时,因为多个表之间的数据可以同时并行转换和迁移,因此可以使用多线程技术并行化迁移。
设数据库DB有n个表,r(r<<n)个表关系,c(c<<n)个约束关系,定义tn、tr和tc表示n个表、r个关系和c个约束的转换时间,Ttotal为未使用并行转化技术之前的转换的时间,Te为使用并行转换技术之后的时长,r为划分的子任务个数。Ttotal的计算公式如(4.16):
Ttotal=tn+tr+tc (4.16)
利用并行转换技术后,如公式(4.17)所示,实际时间Te<Ttotal
Figure BDA0003600486770000151
如图11所示,SQL查询中间件的整体架构共分为三层。第一层为输入层,包含标准SQL和Redis原生操作;第二层为Redis-SQL-API层,是本章的核心内容,需要对SQL语句进行解析然后对Redis API进行二次封装,最后返回操作结果;第三层为数据库层,即Redis集群。
SQL操作中间件主要包括SQL解析组件、操作预检查组件、SQL适配组件。使用SQL操作中间件操作Redis中的数据,首先需要使用SQL解析组件获取到SQL的详细信息,包括操作类型、涉及表、列、条件等,构建SQL解析对象;然后根据SQL解析对象的内容,通过操作预检查组件,按操作类型判断是否符合已有约束和表数据之间的关系等;若需要校验且校验成功,最后使用SQL适配组件根据SQL解析对象中的内容调用Redis原生接口完成对SQL表达的数据操作的内容一致的操作,否则直接返回对应的提示信息。
进一步地,SQL解析组件对接收到的标准SQL语句首先按照操作类型(CRUD)进行分类。其次按照标准的语法格式对SQL进行解析,即对SQL语句的字符流进行处理。然后将其划分为相应的单词流进行词法分析。最后构造出SQL解析对象,包括操作类型、字段列、表名、条件等属性。
定义标准SQL输入对象为sql,SQL的输入字符长度为sqlen,SQL解析组件的核心流程如下:
1)对标准输入SQL,利用公式(4.18)中函数P解析sql对象的各部分,得到结果集sqlPi,例如:操作类型、表名、列名、条件等。
Figure BDA0003600486770000152
2)使用步骤1得到的各部分结果集,利用(4.19)中函数G,构建SQL适配组件需要的中间对象ParseObj。
ParseObj=G(Pi) (4.19)
进一步地,约束预检查组件总共包括五个组件,分别是主键约束组件(PrePKUnit)、唯一约束组件(PreUQUnit)、外键约束组件(PreFKUnit)、默认约束组件(PreDFUnit)和检查约束组件(PreCCUnit)。操作预检查组件接收SQL解析组件构建的解析对象ParseObj,首先需要判断当前操作类型,根据操作类型来判断需要经过哪几个约束校验。
如图12所示,个SQL解析对象中根据操作类型,都需要内置不同的约束组件状态集合,以及最终是否通过状态变量。操作预检查组件的工作流程如下:
1)首先解析2.7.2节最终构建的SQL解析对象,识别此次SQL的操作类型,如果是SELECT,则直接略过,否则将进入操作预检查组件进行预检查。
2)如果是INSERT,则涉及到5个约束组件的判断,只有全部组件都通过,最终通过状态才会被标记为通过,否则标记为未通过。
3)如果是DELETE,则涉及到外键约束组件的判断,只有满足外键关系删除,才是合法的请求,最终通过状态才会被标记为通过,否则标记为未通过。
4)如果是UPDATE,则与INSERT类似,也涉及到5个约束组件的判断,仍然是5个组件的状态都通过,通过状态才会被标记,否则标记为未通过。
进一步地,SQL适配组件解析通过操作预检查组件的SQL解析对象(查询SQL对象除外),将SQL解析对象的内容转换为针对于高级程序设计语言相应的Redis原生操作,最后返回操作结果。SQL适配组件的核心在于如何调用Redis API实现数据操作。DML SQL操作分为查询和更新(插入、删除、修改)操作。适配器也是针对SQL解析对象属性中的操作类型,将对象属性中的数据内容与Redis底层API进行适配。
对Redis设置持久化配置后,当内存中的数据达到指定大小或存放超过指定时限将会被批量写入磁盘文件。全量式内存化方案中的数据全部使用Redis存储在内存中。为了降低历史数据存放成本,降低对Redis的依赖,同时提高数据安全性,本发明通过分析Redis的离线RDB数据文件,通过解析RDB日志文件,将文件中的数据内容转换为MySQL支持的SQL语句,然后批量执行SQL实现数据从Redis到MySQL的备份存储;来实现数据从Redis到MySQL的全量备份。
如图13所示,数据备份架构涉及RDB解析组件、JSON数据SQL化组件和批量SQL任务组件。RDB解析组件负责将RDB二进制文件转化为JSON数据文件,数据SQL化控制器负责将JSON数据文件转化为SQL文件,SQL任务执行组件负责批量执行SQL语句,完成数据备份。
其中,RDB解析组件的作用是将RDB二进制数据文件解析为JSON数据文件。RDB文件除了存储Redis的二进制数据文件,也有一些非数据文件。因此,RDB解析组件需要严格按照RDB文件的格式,过滤文件中的非数据字符,同时批量将二进制数据文件转化为对应的JSON对象文件。
数据备份的核心模块是SQL化JSON数据,首先使用RDB文件解析组件生成的JSON数据文件,分析JSON文件的数据内容,然后按存储模式的逆过程将JSON对象解析为SQL语句。
批量SQL定时任务执行组件使用队列(QUEUE)存放SQL对象,当JSON数据SQL化组件生成的SQL对象被PUSH到队列中,到达指定时间后,组件按照FIFO(先进先出)的顺序从队列中取出预设阈值个数的SQL对象,然后调用MySQL的驱动程序,执行对应的批量操作API批量执行SQL存入到MySQL中。
本发明以ORB-KVM模式为例,首先对MySQL中的元数据如何获取进行说明,再对存储转换模式中的关系和约束转换算法实现进行说明,最后对存储转换模式中的数据转换算法进行实现。
元数据(Metadata)是MySQL中用来描述数据库的数据信息。MySQL提供了三种方式获取数据库对象的元数据信息:(1)使用SQL语句查询MySQL的默认数据库NFORMATION_SCHEMA的表数据。(2)连接数据库后,执行SHOW命令。例如show tables用于列出默认数据库的所有表,show columns from tbl_name用于查看列信息等。(3)使用命令行程序,如MYSQLSHOW、MYSQLDUMP等。本发明使用INFORMATIONSCHEMA的方式具有更强的可移植性和灵活性,便于转换和迁移。在实现过程中需要获取相应数据库中的所有表名、字段名和表中的主键等信息,可以直接高效地从数据库中获取这些信息,通过元数据构建全局表对象。
如图14所示,其表示MySQL某教育云平台数据库(educloudman)中部分表的ER图,包括学生表、试卷表、考试表等。其中,一套试卷包括多个简答题信息;考试和学生使用考生表记录对应关系;一场考试含多个简答题答卷记录;考试成绩表记录一场考试的成绩信息。为了保证对Redis中转换后的数据操作的完整性,将MySQL的关系和约束构建为不同的散列存储在Redis中。为了表示表与表之间的关系,本发明解析表对象之间的关系,并基于有向图模型建立表对象关系有向图。
为了建立关系有向图,本发明使用有向权重图(EdgeWeightedDigraph),使用邻接表存储有向图,临接表中的每一个边都是DirectedEdge对象,v和w表示表节点,v→w表示v表指向w表的边,同时使用weight对象表示权重,EdgeWeightedDigraph提供公有方法addEdge(DirectedEdge e)创建有向图。为了构建关系有向图,本发明首先从全局表对象中获取所有依赖关系,然后使用公有方法addEdge构建有向图,公有方法addEdge传入参数有向边(DirectedEdge)实例对象e,使用e.from()方法获取到邻接表的下标,然后调用add方法将边e添加进去。最终构建的关系有向权重图如图15所示,对八个表使用0-7进行编号。有向图模型中的节点表示表,边表示表的依赖关系,边的权重表示依赖的字段。C→D和C→G对应于考生表(G)中的两个外键,分别表示考生表使用ExamID字段依赖考试表,使用StuNo字段依赖学生表,D→E表示考试表使用TestID字段依赖试卷表。通过dfs将有向图中的每条边映射为Redis中的一个散列实现关系转换。
进一步地,ORB-KVM的数据转换方法是利用Redis散列和对象属性的映射,将一个表中的行记录转换为Redis中的一个散列,Redis中的key为表对象和主键字段的组合,散列中的域字段field为主键值,域值为行记录去掉主键属性后的json对象。
数据转换方法参数包括主键pk_map,数据库名称database,表名称tab,数据开始行start,偏移长度len;方法返回ArrayList<HashMap<String,HashMap<String,Object>>>类型的实例对象arrayList。首先从全局表对象中根据表名获取表中的主键字段,使用MySQL分页技术获取包含起始行和偏移长度的json对象数据集。然后遍历数据集,对每个JSON对象使用remove方法移除主键属性及值,并根据主键值和移除主键后的JSON对象构建HashMap<String,Object>类型的Val对象。同时,根据数据库名和表名和主键表调用buildKey方法返回key对象。最后使用key对象和Val对象构建散列数据并加入到集合arrayList中并返回。
进一步地,ARB-KVM的数据转换方法是将每行记录转换为Redis中的一个散列,Redis中的key为表对象、主键字段和主键值的组合,散列中的域字段field为行记录中的字段属性,域值为属性字段对应的值。
方法参数和返回值跟ORB-KVM模式一样,在使用MySQL分页技术获取了包含起始行和偏移长度的json对象数据集后,遍历数据集。解析每个JSON对象的属性和属性对应的值构建Map<String,Object>类型的对象Val用于构建Redis的域值value,同时略过列值为null列的Val。然后并根据数据库名、表名、主键名使用buildKey方法构建Redis的Key。最后,使用Key和Val构建Redis散列,加入到集合arrayList后并返回。
进一步地,PCB-KVCM的数据转换方法是使用列式存储思想将每行记录转换为Redis中的一个散列,Redis中的key为表对象、主键字段和分段值的组合,散列中的域字段field为表中的字段属性,域值为字段对应的所有值的集合。
与ORB-KVM模式需要相同的参数之外,还需要分段信息参数,包括数据开始行s和数据结束行l,方法返回值仍然是集合arrayList。方法中获取主键和获取所有列的步骤与前面两种算法一致,区别在于Redis中的Key和Value的构建,其中Key由表对象、主键字段和分段值组合构成,Value调用方法buildNewVal完成,最后由Key和Value构成Redis散列,加入到集合arrayList并返回。
在buildNewVal方法中,需要针对每个属性字段,取出每个数据中该属性字段的值,并同时获取到当前行的主键值,使其与当前属性值组合,最后针对每一个属性字段,合并每行该字段属性的所有值成为Set集合。
本发明数据初始化服务中的迁移控制组件实现存储模型转换模式生成的关系转换对象、约束转换对象和数据转换对象批量迁移存储到Redis中。针对存储转换模返回的关系转换对象、约束转换对象和数据转换对象,本发明使用迁移控制组件,基于数据分页使用Pipeline批量命令与服务端进行交互。本发明使用Redis pipelining技术实现多条命令批量执行,使用executePipelined方式,在execute方法中使用Java8 Stream技术对集合arrayList进行遍历,最终使用Hash结构操作接口opsForHash进行一次性插入。
SQL操作中间件主要包括SQL解析组件、操作预检查组件和SQL适配组件。SQL解析组件需要对每个SQL进行语义分析并生成SQL解析对象;本发明选用在性能和灵活性上都有较大优势的国内开源软件Druid SQL Parser用作SQL解析组件。在使用Druid SQL Parser之前,首先需要引入相关maven依赖,使用JdbcConstants.MYSQL执行数据库为MySQL,通过SQLUtils的静态方法的parseStatements将对应的数据库类型(本节使用MySQL)和SQL语句解析成SQLStatement对象集合,其中每一个SQLStatement代表一条完整的SQL语句。
常见的SQL数据操作有CRUD四种操作,对应SQLStatement的四个实现类,包括SQLSelectStatement、SQLUpdateStatement、SQLDeleteStatement和SQLInsertStatement。不同的操作类型,具有不同的解析规则,使用SQL解析组件解析后的SQL解析对象不同。本发明首先构建ParseObj父抽象解析对象,针对不同的SQL操作使用BSELECTPalse、DELETEParse、INSERTParse和UPDATEParse分别对其进行实现。
针对操作预检查中的更新操作,需先根据SQL解析组件获得的解析对象获取更新列名并判断涉及哪几个约束组件的检查。除更新主键之外的其余列,均需要根据Redis中记录的唯一约束信息、外键信息和字段值检查约束信息判断条件是否符合。新增操作与更新操作类似,也是先根据解析对象获取更新列名判断涉及的约束组件,包括插入的值是否符合Redis中记录的唯一约束信息、外键信息和字段值检查约束信息。同时,对于新增表的主键值,根据Redis记录中的主键信息获取当前主键的最大值,自增后返回值即可。对于删除操作,需要根据Redis中记录的外键信息判断是否符合外键约束,依赖的表的符合条件记录是否存在,只有被依赖的记录不存在才能进行删除。通过操作预检查组件后,需要通过SQL适配组件使用Redis客户端的原生API操作数据散列结构,并返回结果。
SQL适配组件的核心是根据当前Redis中的数据结构,利用SQL解析对象将数据转换为Redis的原生操作,实现数据操作并返回相应结果。
针对单个主键的条件查询,在SQL适配组件中通过异步非阻塞Redis客户端对象reactiveStringRedisTemplate操作Hash结构,链式操作使用get方法,通过key和对应的field,获取对应的value即可。
针对非主键条件查询,可以结合Java Stream操作和Redis原生操作实现SQL适配组件。针对组合条件查询,在SQL适配组件中,首先分别用上述方法查询多个条件的单独主键集合,然后使用Redis客户端将多个条件的主键集合存储Set机构中,并设置过期时间,最后利用Redis集合的交操作intersect高效实现多个集合的交集操作。
针对聚合操作,首先利用组合条件查询查询出中符合条件的主键集合,再利用Java Stream流式操作实现集合中总分计算。
针对典型更新操作,首先利用SQL解析组件解析出SQL中的各部分值,包括需要更新的表和更新的列字段与新值,更新的字段及值为SQLUpdateSetItem对象集合。然后在SQL适配组件中利用上文条件查询的方式查询需要更新的主键值集合,并针对Redis中的数据,使用Redis客户端对象redisTemplatede的putAll方法更新数据。
对于典型新增操作,首先,需要查询Redis中记录的主键约束信息,根据表名获取到对应表的主键列和当前主键的最大值。其次,使用Redis的自增操作increment将当前主键的最大值加一用作新增数据的主键值。然后,根据提交的新增数据,根据ORB-KVM数据转换算法构建散列数据。最后使用Redis批量操作putAll将新增数据存储到Redis中。
对于典型删除操作,SQL适配组件首先需要根据SQL解析组件解析出SQL中的表名、主键条件列和条件值等,然后使用客户端工具类RedisTemplate对Redis中的散列数据执行delete操作删除散列数据即可。
本发明数据备份服务中,RDB文件解析组件需要将Redis存储在磁盘的RDB二进制数据文件格式化为JSON文件。本发明引入流行的RDB文件解析工具实现RDB文件解析器。通过使用JAVANIO操作dump.json文件得到的对应的SQL语句。为了解析以上文件,本节首先通过java nio的文件操作工具类Paths获取文件路径,并使用管道和缓存技术,利用FileChannel和BufferedReader读取文件中的所有内容。获取到所有数据内容之后,所有的数据都是json对象的属性和属性值,因此需要解析json对象的所有属性并通过StringBulider对象构建insert语句。最后,将上文解析的每一条SQL存储到任务队列中。使用定时任务实现批量备份,最终设置任务队列0.3s执行一次,使用异步响应式R2DBC技术执行INSERT语句实现数据库的备份。
以上所述仅是本发明的优选实施方式,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。

Claims (10)

1.一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述方法包括:
构建基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM将RDB中的数据、关系和约束转换为适合Redis存储的对象,并通过迁移控制组件实现批量快速的数据库迁移;
设置SQL操作中间件,通过其中的SQL解析器组件、操作预检查组件和SQL适配器组件对Redis进行标准SQL访问;
设置数据备份架构,分析Redis的离线RDB数据文件,通过解析RDB日志文件,将文件中的数据内容转换为MySQL支持的SQL语句,批量执行SQL实现数据从Redis到关系型数据库的备份存储。
2.根据权利要求1所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述数据库迁移包括以下内容:
A1、从MySQL Schema中获取指定数据库中每个表的表对象,记录每个表的表名、列属性、主键属性和记录行数信息,然后将每个表的表对象组合为全局表对象;
A2、判断MySQL数据库中的所有关系是否转换完成,如果是,则跳转步骤A4,如果不是,则跳转步骤A3;
A3、使用存储转换模式中的关系转换算法实现所有关系转换,生成关系转换对象;
A4、判断MySQL数据库中所有表的约束是否转换完成,如果是,则跳转步骤A6,如果不是,则跳转步骤A5;
A5、使用存储转换模式中的约束转换算法实现所有约束转换,生成约束转换对象;
A6、判断MySQL数据库中的所有表的数据是否转换完成,如果是,则跳转步骤A8,如果不是,则选择任意未完成数据转换的表,跳转步骤A7;
A7、使用存储转换模式中的数据转换算法构建数据键值对象,生成数据转换对象;
A8、当需要迁移的转换结果对象个数超过预设的阈值时,通过迁移控制组件批量迁移关系转换对象、约束转换对象和数据转换对象;
A9、判断所有转换对象是否迁移完成,如果没有完成则跳转步骤A8。
3.根据权利要求2所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述基于对象的行式存储模式ORB-KVM中的数据转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure FDA0003600486760000021
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB、表名Ti和主键PKi,根据公式Ki=M(DB,Ti,PKi)拼接为Redis中的Key对象Ki
针对数据集djsonarr,jsonarr的长度为trlen,设置行对象为rowi,行记录中主键值为PKVali,行json对象为jrowi,根据公式jrow′i=R(jrowi,PKi)移除json对象中主键及其对应的值,根据公式
Figure FDA0003600486760000022
构建散列中的域字段field和域字段值value的集合NVali,再结合Ki通过公式DM=build(Ki,NVali)构建数据转换对象DM。
4.根据权利要求2所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述基于属性的行式存储模块ARB-KVM中的关系转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure FDA0003600486760000023
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB,表名Ti和主键PKi以及主键值PKVali,根据公式Ki=M(DB,Ti,PKi,PKVali)拼接为字符串对象Ki
针对数据集djsonarr,设置行对象rowi,行对象中的属性列长度为tcolcount,colk(k<tcolcount)和colValk(k<tcolcount)分别为rowi中的每个列字段和列值,根据公式
Figure FDA0003600486760000024
构建散列中的的域字段field和域字段值value的集合NVali,再结合Ki通过公式DM=build(Ki,NVali)构建数据转换对象DM。
5.根据权利要求2所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述分段列式键值交叉存储模式PCB-KVCM中的关系转换算法包括:
输入数据库对象DB,初始化全局Map类型表对象TabObjMap,以表名称为键,以表对象为值;
输入全局表对象TabObjMap,输出DB中的所有表的自增主键Tpk,设置Ti(i<tcount)中的主键为PKi,若主键存在,则通过公式
Figure FDA0003600486760000025
获取到表中的主键PKi,否则为主键值为默认值dpk;
针对每一个数据库表,输入数据库名称DB,表名Ti和主键PKi,针对每一个PK′i和分段S和E,根据公式
Figure FDA0003600486760000031
拼接为对应Redis中的Key对象Ki
针对数据集djsonarr,设置行记录rt(t<trcount),属性字段ci(i<trcount),属性值为v(t,i)
Figure FDA0003600486760000032
表示非主键列中当前行的主键值,vti表示ci列的所有数据集合,ci为Redis中的域字段field,vti为域字段值value,根据当前列是主键或者非主键两种情况分别对vti进行构建,最后结合Ki通过公式NVali=build(ci,vti)和DM=build(Ki,NVali)构建数据转换对象DM。
6.根据权利要求2所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM中的关系转换算法包括:
根据全局表对象获取指定库中的所有外键信息,主要包括主表对象、从表对象和依赖的字段;
根据主表对象和从表对象以及依赖字段建立有向图模型,其中有向图模型中的顶点表示表对象,有向边表示被依赖关系,权重表示被依赖的字段,根据有向图的出度和入度判断依赖和被依赖对象,确定表中的外键个数;
深度遍历有向图,设置常量c标识外键,通过公式fk=M(Ki,c)和FM=build(fk,cid,Tc)按照遍历排序构建外键关系散列FM。
7.根据权利要求2所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述基于对象的行式存储模式ORB-KVM、基于属性的行式存储模块ARB-KVM和分段列式键值交叉存储模式PCB-KVCM中的约束转换算法包括主键约束、唯一约束、默认约束、外键约束和检查约束;所述主键约束、唯一约束、默认约束和检查约束分别采用单独的散列存储,内存化后对Redis数据的操作,对约束条件进行判断合法后再进行数据操作。
8.根据权利要求1所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述SQL操作中间件由三层组成,第一层为输入层包括标准SQL和Redis原生操作,第二层包括SQL解析组件、操作预检查组件和SQL适配组件,第三层为Redis集群数据层;其对Redis进行访问的步骤包括:
通过SQL解析组件获取SQL的详细信息,构建SQL解析对象;
根据SQL解析对象的内容通过操作预检查组件按照操作类型判断是是否符合已有约束和表数据之间的关系;
通过SQL适配组件根据SQL解析对象中的内容调用Redis原生接口完成对SQL表达的数据操作的内容一致性操作。
9.根据权利要求8所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述通过SQL解析组件获取SQL的详细信息,构建SQL解析对象包括:
对接收到的标准SQL语句首先按照操作类型进行分类,再按照标准的语法格式对SQL进行解析,对SQL语句的字符流进行处理;
然后将字符流划分为相应的单词流进行词法分析,构造出包括操作类型、字段列、表名和条件的SQL解析对象;
所述操作预检查组件按照操作类型判断是是否符合已有约束和表数据之间的关系包括:
解析所述SQl解析组件构建的SQL解析对象,识别此次SQL的操作类型,如果是SELECT,则直接略过,否则将进入操作预检查组件进行预检查;
如果是INSERT,则对多种约束组件进行判断,当全部约束组件都通过时,最终通过状态才会被标记为通过,否则标记为未通过;
如果是DELETE,则对外键约束组件进行判断,当满足外键关系删除时,最终通过状态才会被标记为通过,否则标记为未通过;
如果是UPDATE,则对多种约束组件进行判断,当全部约束组件都通过时,最终通过状态才会被标记为通过,否则标记为未通过。
10.根据权利要求1所述的一种基于Redis的关系型数据库全量内存化的方法,其特征在于:所述数据备份架构包括RDB解析组件、JSON数据SQL化组件和批量SQL任务组件;所述RDB解析组件用于按照RDB文件的格式过滤文件中的非数据字符,批量将二进制数据文件转化为对应的JSON对象文件;所述JSON数据SQL化组件用于分析JSON文件的数据内容,按存储模式的逆过程将JSON对象解析为SQL语句;所述批量SQL任务组件用于使用队列存放SQL对象,当JSON数据SQL化组件生成的SQL对象被PUSH到队列中,到达指定时间后,组件按照先进先出的顺序从队列中取出预设阈值个数的SQL对象,然后调用MySQL的驱动程序,执行对应的批量操作API批量执行SQL存入到MySQL中。
CN202210401757.6A 2022-04-18 2022-04-18 一种基于Redis的关系型数据库全量内存化的方法 Pending CN116431598A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210401757.6A CN116431598A (zh) 2022-04-18 2022-04-18 一种基于Redis的关系型数据库全量内存化的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210401757.6A CN116431598A (zh) 2022-04-18 2022-04-18 一种基于Redis的关系型数据库全量内存化的方法

Publications (1)

Publication Number Publication Date
CN116431598A true CN116431598A (zh) 2023-07-14

Family

ID=87084238

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210401757.6A Pending CN116431598A (zh) 2022-04-18 2022-04-18 一种基于Redis的关系型数据库全量内存化的方法

Country Status (1)

Country Link
CN (1) CN116431598A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117076431A (zh) * 2023-10-13 2023-11-17 云筑信息科技(成都)有限公司 一种用于系统升级数据迁移的方法
CN117112549A (zh) * 2023-10-20 2023-11-24 中科星图测控技术股份有限公司 一种基于布隆过滤器的大数据归并方法

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117076431A (zh) * 2023-10-13 2023-11-17 云筑信息科技(成都)有限公司 一种用于系统升级数据迁移的方法
CN117076431B (zh) * 2023-10-13 2024-03-12 云筑信息科技(成都)有限公司 一种用于系统升级数据迁移的方法
CN117112549A (zh) * 2023-10-20 2023-11-24 中科星图测控技术股份有限公司 一种基于布隆过滤器的大数据归并方法
CN117112549B (zh) * 2023-10-20 2024-03-26 中科星图测控技术股份有限公司 一种基于布隆过滤器的大数据归并方法

Similar Documents

Publication Publication Date Title
US11475034B2 (en) Schemaless to relational representation conversion
US10956448B2 (en) Systems, methods, and apparatus for hierarchical database
US10853396B2 (en) Intelligent natural language query processor
US10713589B1 (en) Consistent sort-based record-level shuffling of machine learning data
US20200034742A1 (en) Consistent filtering of machine learning data
US10366053B1 (en) Consistent randomized record-level splitting of machine learning data
JP3914662B2 (ja) データベース処理方法及び実施装置並びにその処理プログラムを記憶した媒体
KR20170019352A (ko) 데이터 질의 방법 및 장치
CN116431598A (zh) 一种基于Redis的关系型数据库全量内存化的方法
JP7105982B2 (ja) 構造化レコード取得
US10599614B1 (en) Intersection-based dynamic blocking
US20150081745A1 (en) Database insert with deferred materialization
CN111221785A (zh) 一种多源异构数据的语义数据湖构建方法
CN116483850A (zh) 数据处理方法、装置、设备以及介质
CN113468209A (zh) 一种电网监控系统高速内存数据库访问方法
CN112970011A (zh) 记录查询优化中的谱系
CN111125216A (zh) 数据导入Phoenix的方法及装置
US11847121B2 (en) Compound predicate query statement transformation
CN115292285A (zh) 一种基于分布式架构的数据专题管理方法及系统
CN112800054A (zh) 数据模型的确定方法、装置、设备及存储介质
US20170031909A1 (en) Locality-sensitive hashing for algebraic expressions
CN113221528A (zh) 基于openEHR模型的临床数据质量评估规则的自动生成与执行方法
US20190303460A1 (en) Transaction-based pseudo-script generation for scheduling and implementing database schema changes
CN115687309B (zh) 非侵入式卷烟出入库全流程数据血缘构建方法、装置
Gupta et al. Correlation and comparison of nosql specimen with relational data store

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination