内存数据管理中日志恢复方法及其仿真系统的制作方法
【技术领域】
[0001] 本发明涉及数据管理技术领域,尤其涉及一种内存数据管理中日志恢复方法及其 仿真系统。
【背景技术】
[0002] 内存数据管理技术特别是内存数据库技术,将数据的运算和存储都依托于内存, 具有高并发、高吞吐量、低延时等特性,因此被广泛用于极高性能需求的场合。但是,由于内 存是一种易失性的存储介质,而内存数据库往往承担着高吞吐量、高速存取的任务,数据损 失的风险巨大。这种损失往往给数据库的使用者带来巨额的财产损失。
[0003] 近年来,随着硬件性能的大幅度提升、成本的大幅度降低,内存数据管理研究领域 的研究受到了更为广泛的关注。其中,由于内存易失性而带来的有关日志恢复的问题是主 要研究方向之一。日志文件读写中非易失存储器慢速I/O对于内存和CPU造成停滞是内存 数据库日志恢复需要解决的问题,并且,目前没有一个针对日志恢复有关的研究平台。
[0004] 为了保证数据库信息不丢失,事务提交之前必须将日志记录在稳定存储器中(一 般为磁盘),那么大容量内存、高负载环境容易使日志的读写成为瓶颈。一种直观的解决方 式是使用非易失性的存储器存储日志,它具有比磁盘更快存取速度且断电后数据不丢失的 特性,从而缩减了提交时间。然而类似于SSD这种存储器的价格仍然较高,不能得到广泛的 使用。
【发明内容】
[0005] 针对上述缺陷或不足,本发明的目的在于提供一种内存数据管理中日志恢复方法 及其仿真系统。
[0006] 为达到以上目的,本发明的技术方案为:
[0007] -种内存数据管理中日志恢复方法,包括以下步骤:
[0008] 主节点获取集群节点的节点编号,并对所述集群节点发送数据写入命令,所述集 群节点进行数据存储,主节点形成映射表;
[0009] 主节点根据节点编号,向与所述集群节点匹配的日志节点发送集群节点日志命 令,所述日志节点将日志存储,并将所述日志持久化,然后向主节点日志成功记录信息;
[0010] 在集群节点发生故障时,停止事务执行,主节点获取故障节点的编号,获取日志节 点中日志记录对集群节点进行恢复。
[0011] 进一步的,所述主节点获取集群节点的节点编号的具体过程为:
[0012] 当一个数据项被新插入存储集群时,首先需要在映射表中注册自己的键值,并取 得集群反馈回的节点编号,然后这个键值对被正放入集群中。
[0013] 进一步的,所述映射表使用Map容器实现。
[0014] 进一步的,所述集群节点进行数据存储为分布式存储方式。
[0015] 进一步的,所述日志持久化具体过程为:
[0016] 使用日志节点上的RDB持久化命令SAVE,将日志节点上的内容持久化到磁盘上, 并且返回成功或者失败,RDB持久化将内存中的数据完全以快照的形式录入磁盘中。
[0017] 进一步的,当进行物理日志恢复过程时:
[0018] 主节点获取需要恢复的集群节点的节点编号;
[0019] 主节点根据上述所获取的节点编号,取出该节点对应的red〇_l〇g日 redo_log 日志是日志节点上的集合日志;
[0020] 集群节点扫描所有的非redo_log日志链表,即还没有commit的事务的私有txn_ redo日志,并且销毁这些私有的txn_redo日志,txn_redo日志是针对某个具体事务编号的 事务私有日志;
[0021] 主节点取完所有故障节点的日志后,按照LSN将日志排列好再根据排列好后redo 日志重做事务片段,完成日志恢复。
[0022] 进一步的,当进行逻辑日志恢复时:
[0023] 主节点获取需要恢复的集群节点的节点编号;
[0024] 所有需要恢复的集群节点将redcUog日志取出,并且归并到主节点上;
[0025] 主节点按照LSN重新排列需要恢复的集群节点的redo_log日志;
[0026] 所有集群节点扫描所有非redo_log链表,销毁存在的私有txn_redo日志;
[0027] 主节点执行统一的恢复,完成日志恢复。
[0028] -种内存数据管理中日志恢复仿真系统,包括主节点以及Redis实例,其中;
[0029] 主节点包括映射列表、事务模拟器、恢复模拟器;
[0030] 映射列表存放了数据项和对应的集群中具体节点编号;
[0031] 事务模拟器随机产生出并发或是串行的事务;
[0032] 恢复模拟器通过与事务模拟器的合作,完成多种日志的生成和分发,也在故障后 重新收集日志换成恢复步骤;事务开始时,记录下LSN、事务编号、start标识,提交时记录 commit标识,中止时记录abort标识;
[0033] Redis实例包括作为存储节点的Redis集群和日志节点;
[0034] Redis集群中包括多个成为工作节点的Redis实例;
[0035] 日志节点由多个单独的Redis实例组成,日志节点接受主节点的日志并完成日志 的持久化任务。
[0036] 与现有技术比较,本发明的有益效果为:
[0037] 本发明提供了一种内存数据管理中日志恢复方法,还提供了一种内存数据管理中 日志恢复仿真系统RecoS,通过在集群环境下使用了 Redis作为底层的数据和日志存储,上 层使用客户端逻辑程序控制各个节点的协调工作。将发生在某个节点上的事务日志交给这 个节点去记录,达到了分配负载的效果,并采用类似ARIES日志记录的物理日志可以实现 多机并行恢复(parallel recovery),对发送故障的节点进行自己恢复的状态并且不需要 相互传递有关数据项的信息,降低了日志恢复的复杂性,提高日志恢复的速率和安全保障。
【附图说明】
[0038] 图1是本发明内存数据管理中日志恢复方法的流程框图;
[0039] 图2是本发明内存数据管理中日志恢复方法中主节点的结构示意图;
[0040] 图3是本发明内存数据管理中日志恢复方法中主节点的数据插入节点框图;其中 (a)为数据插入节点的步骤流程框图;(b)为另一种映射表表示方式;
[0041] 图4是本发明内存数据管理中日志恢复方法的仿真系统结构示意图。
【具体实施方式】
[0042] 下面结合附图对本发明做详细描述。
[0043] 实施例一
[0044] 本发明使用"集群环境"或者"多机环境"来表示一种分布式的概念,集群环境下 主要考虑将数据分到多台机器上存储。在集群环境下,每个机器节点称为node,由于现代 计算机的多核心CPU普遍使用,一些多线程的任务可以分别在一个node中的多个核心上运 行,CPU的一个核心称之为一个site。现有的内存数据库系统如VoltDB和SiloR中使用集 群和集群节点中多处理器的优势,将任务分布给多个线程,由于每个处理器的核心至少可 以处理一个线程(在超线程的CPU中可以处理两个线程)。系统将事务分类成为一个node 中的事务和跨node的事务,并且试图将相关的事务进程放到一个node的site中,这样如 果一个site中的事务回滚,只会影响到这个node而已。同样对于日志,在每个node中的 所有site都共享一个日志。
[0045] 如图1所示,本发明提供了一种内存数据管理中日志恢复方法,包括以下步骤:
[0046] 1)、主节点获取集群节点的节点编号,并对所述集群节点发送数据写入命令,所述 集群节点进行数据存储,主节点形成映射表;
[0047] 主节点是RecoS负责逻辑程序执行部分的主机节点,一般使用性能强悍的机器作 为主节点。工作节点是下层的Redis集群中负责存储的节点,由于在Redis集群的规范中 需要使用后备节点,这时的相应master节点称为"主节点",但是这里为了和RecoS的主节 点区分,称之为"工作节点"。而日志节点是为工作节点专门配备的用于记录日志的Redis 实例。
[0048] 如图2所示,图2为主节点的拓扑结构图,主节点通过网络连接保持对Redis实例 的控制和获取状态。主节点的程序运行在一台性能配置较高的计算机上,它主要用来负责 除了数据和日志存储之外的所有功能,包括发送读写命令、模拟事务的进行、控制日志的读 写时机等。主节点程序采用Redis推荐的Java程序语言客户端Jedis编写,Jedis可以调 用API来操控集群的运行。
[0049] 具体的,所述主节点获取集群节点的节点编号的过程为:
[0050] 当一个数据项被新插入存储集群时,首先需要在映射表中注册