日志包重演方法、装置、电子设备及存储介质与流程

文档序号:29561505发布日期:2022-04-09 01:01阅读:105来源:国知局
日志包重演方法、装置、电子设备及存储介质与流程

1.本发明实施例涉及数据库管理技术领域,尤其涉及一种日志包重演方法、装置、电子设备及存储介质。


背景技术:

2.共享存储集群中的多个实例都可以访问、修改数据页,并且每个实例修改数据页产生的重做日志是分别生成、保存到当前实例的联机日志文件以及归档日志文件中。在共享存储集群重演重做日志等日志时,可能会出现节点中与重演日志相关联的归档日志文件不完整等情况,如节点中的归档日志文件缺失、或者被删除等情况,从而导致重演日志的进程无法顺利完成。
3.为了保证重演日志的进程可以顺利完成,在重演日志时,需要对节点中的归档日志文件完整性进行检查判断。目前,对节点中的归档日志文件完整性进行检查的方法是,扫描并解析所有的归档日志文件,检查与重演日志相关联的归档日志文件是否存在和完整。但是,上述方法需要解析大量的归档日志文件,效率不高。


技术实现要素:

4.本发明实施例提供了一种日志包重演方法、装置、电子设备及存储介质,以提高日志包重演的效率。
5.第一方面,本发明实施例提供了一种日志包重演方法,包括:
6.初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息;
7.依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;
8.各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
9.第二方面,本发明实施例还提供了一种日志包重演装置,包括:
10.内存对象初始化模块,设置为初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息;
11.确定模块,设置为依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;
12.重演模块,设置为各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
13.第三方面,本发明实施例还提供了一种电子设备,包括:
14.一个或多个处理器;
15.存储装置,用于存储一个或多个程序;
16.所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明实施例提供的日志包重演方法。
17.第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现本发明实施例提供的日志包重演方法。
18.本发明实施例提供了一种日志包重演方法、装置、电子设备及存储介质,初始化集群中每个节点的内存对象,内存对象中加载有日志包,日志包关联于日志依赖信息;在此基础上,依次扫描各所内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;各内存对象扫描完毕之后,对最优待重演日志包进行重演。该方法通过初始化集群中每个节点的内存对象,并且每个日志包可以对应关联于一个日志依赖信息,在此基础上根据日志依赖信息确定最优待重演日志包,并在各内存对象扫描完毕之后,对最优待重演日志包进行重演,能够保证日志包根据日志依赖信息依次重演,从而提高了日志包重演的效率。
附图说明
19.图1为本发明实施例一提供的一种日志包重演方法的流程示意图;
20.图2为本发明实施例一提供的一种调整后的rlog_pkg格式的示意图;
21.图3为本发明实施例一提供的一种内存对象初始化的示意图;
22.图4为本发明实施例二提供的一种日志包重演装置的结构示意图;
23.图5为本发明实施例三提供的一种电子设备的结构示意图。
具体实施方式
24.下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。
25.在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操作(或步骤)描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。此外,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
26.本发明使用的术语“包括”及其变形是开放性包括,即“包括但不限于”。术语“基于”是“至少部分地基于”。术语“一个实施例”表示“至少一个实施例”。
27.需要注意,本发明中提及的“第一”、“第二”等概念仅用于对相应内容进行区分,并非用于限定顺序或者相互依存关系。
28.需要注意,本发明中提及的“一个”、“多个”的修饰是示意性而非限制性的,本领域技术人员应当理解,除非在上下文另有明确指出,否则应该理解为“一个或多个”。
29.为了更好地理解本发明实施例,下面对相关术语进行介绍。
30.重做日志:即redo日志,忠实记录了所有物理页的修改,在系统故障重启时,通过重做redo日志,可以将数据库恢复到故障时的状态。
31.物理事务(physical transaction,简称ptx):数据库内部一系列修改物理数据页的操作的集合。
32.lsn:英文全称为log sequence number,是指唯一标识每次修改数据页的操作或事务的日志序列号,其中lsn是由数据库系统自动维护的bigint类型数值,具有自动递增、全局唯一的特性,每一个lsn值代表着数据库系统内部产生的一个物理事务。例如,本次修改数据页所对应的lsn值为1000,则下一次修改数据页所对应记录的lsn值为1001。
33.日志包(即可表示为rlog_pkg):是指数据库保存日志的数据单元。其中,redo日志包是指数据库保存redo日志的数据单元,一个日志包内可保存一个或多个ptx产生的redo日志,redo日志中的每一条日志记录对应一个lsn。
34.日志包序号(即可表示为pkg_seqno):每个rlog_pkg都有对应的序号属性,称之为日志包序号,日志包生成时按照日志包序号连续递增。
35.共享存储集群的多个实例都可以访问、修改数据页,并且每个实例修改数据页产生的redo日志是分别生成、保存到当前实例的联机日志文件以及归档日志文件中。数据页头部中存在fresh_ep字段,实例在修改数据页时,会将实例号记录到该数据页的fresh_ep字段中,不管是从磁盘加载数据页,还是已经刷盘的数据页,都可以从数据页头部中读取到fresh_ep信息,明确数据页的前序修改节点号。
36.当一个数据页被多个实例修改后,故障重启或备库重演各实例的redo日志时,必须严格按照redo日志的生成顺序,依次重演各个实例对该数据页修改的redo日志,才能正确恢复数据页内容。为此,共享存储集群在修改数据页时,会生成数据页同步日志(即page_sync日志),用来确定前序修改数据页的实例和lsn值,以确保redo日志的重演顺序。
37.page_sync日志上记录了fresh_ep和fresh_lsn信息,其中fresh_ep可表示上次修改数据页的节点号,fresh_lsn可表示上次修改数据页对应的lsn值。重演redo日志时,依次解析日志记录,会先重演page_sync日志,然后再重演修改数据页的redo日志。在重演page_sync日志时,会读取数据页的page_lsn(即指数据页对应的lsn,可理解为数据页当前已重演的最大lsn值),将其与page_sync日志中记录的fresh_lsn进行比较。若数据页的page_lsn大于等于fresh_lsn,说明当前page_sync日志中记录的fresh_lsn对应的redo日志已经重演完成,可以继续重演后续修改数据页的redo日志。若数据页的page_lsn小于fresh_lsn,说明当前page_sync日志中记录的fresh_lsn对应的redo日志还未重演完成,此时需要等待对应节点先重演当前fresh_lsn对应的redo日志后,再继续重演后续修改数据页的redo日志。
38.在共享存储集群的备库重演主库redo日志时,可能出现主库page_sync日志所记录的fresh_ep节点上归档缺失的情况(比如归档日志文件被删除),或者共享存储集群主库未发送page_sync日志所依赖的其他日志到备库,从而导致备库重演page_sync日志时由于缺少依赖的日志而等待超时,最终重演无法结束。同理,共享存储集群进行还原恢复时也可能出现相同的情况。
39.针对上述问题,共享存储集群在同步日志到异步备库,或者还原恢复共享存储集群时,需要提前检查所有节点中归档日志的完整性。一种完整性检查可选的方案是,扫描所有归档日志文件,解析redo日志,依次检查page_sync日志依赖的redo日志是否存在。但是,这种方案需要解析大量的redo日志,效率不高。
40.本发明实施例提供一种高效的日志完整性校验方法,在redo日志包(即rlog_pkg)中设置日志依赖信息,并根据日志依赖信息,判断全局日志是否完整,确保按照规定次序将
所有待重演日志依次发送重演。
41.需要说明的是,page_sync日志是redo日志的一种,在ptx提交(即ptx commit)时生成,并且会插入到修改数据页的redo日志之前。
42.page_sync日志记录的格式可表示为:
43.[ts_id,file_id,page_no,fresh_ep,fresh_lsn],
[0044]
其中,fresh_ep表示上次修改数据页的节点号,fresh_lsn表示上次修改数据页对应的lsn值,其余属性与本发明无关,故在此不做介绍。
[0045]
由于page_sync日志是在ptx commit时生成,在ptx commit时会先将日志内容写入到redo日志包rlog_pkg中,因此本发明实施例可先将page_sync日志中的日志依赖信息传递到rlog_pkg中,然后再将rlog_pkg写入到日志文件中。
[0046]
实施例一
[0047]
图1为本发明实施例一提供的一种日志包重演方法的流程示意图,该方法可适用于对每个节点中未重演的日志包进行重演的情况,该方法可以由日志包重演装置来执行,其中该装置可由软件和/或硬件实现,并一般集成在电子设备上,在本实施例中电子设备包括但不限于:台式计算机、笔记本电脑和服务器等设备。
[0048]
如图1所示,本发明实施例一提供的一种日志包重演方法,该方法包括如下步骤:
[0049]
s110、初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息。
[0050]
在本实施例中,集群可以指共享存储集群;共享存储集群可理解为一个单数据库、多实例的集群系统,其数据库部署在共享存储上,供所有节点访问。内存对象可以指每个节点中用于加载相应日志包的数据包。日志包可以指数据库保存日志的数据单元。日志依赖信息可以理解为某个日志所依赖的其他日志信息。
[0051]
本实施例中,在初始化集群中每个节点的内存对象之前,还可以通过未重演的日志包确定每个节点中可以从中加载日志包至内存对象的归档日志文件。
[0052]
可选的,在初始化每个节点的内存对象之前,还包括:对于每个节点,记录该节点已重演的第一最大日志包序号以及第一最大lsn;扫描该节点上的归档日志文件,每个归档日志文件的头信息中包括该归档日志文件中的日志包的第二最大日志包序号以及第二最大lsn;若第二最大日志包序号大于第一最大日志包序号,且第二最大lsn大于第一最大lsn,则将该归档日志文件添加至该节点的归档日志文件链表中。
[0053]
其中,归档日志文件链表可以指用于记录归档日志文件的数据结构,在本实施例中,归档日志文件链表中可以用于记录符合特定条件的归档日志文件,其中特定条件可以是第二最大日志包序号大于第一最大日志包序号,且第二最大lsn大于第一最大lsn。在数据库中,重做日志文件需要及时的做归档,即备份保留,在该过程中所形成的归档文件可称为归档日志文件。一个节点可以包括多个归档日志文件;一个归档日志文件中可以包括多个日志包,且日志包序号依次递增;一个日志包中可以包括多条日志(即日志记录),一条日志记录可以对应一个lsn,且lsn值依次递增。
[0054]
在共享存储集群中,每个节点都可以独立维护一个apply_seq和一个apply_lsn,即[apply_seq,apply_lsn],其中apply_seq可表示该节点当前已发送重演的最大日志包序号pkg_seqno(即第一最大日志包序号),apply_lsn可表示该节点当前已发送重演的最大
lsn值(即第一最大lsn)。即,在初始化每个节点的内存对象之前,首先对于每个节点,可以记录该节点已重演的第一最大日志包序号以及第一最大lsn。
[0055]
然后,依次扫描该节点上的归档日志文件。每个归档日志文件的头信息中可以包含信息[next_seq,clsn],其中,next_seq可表示该归档日志文件中的日志包的最大日志包序号(即第二最大日志包序号);clsn可表示该归档日志文件中的日志包的最大lsn值(即第二最大lsn)。
[0056]
最后,可以通过比较[next_seq,clsn]和[apply_seq,apply_lsn],将该节点上可能存在未重演日志包的归档日志文件添加至一个归档日志文件链表中。示例性的,对于某个归档日志文件,若next_seq大于apply_seq(即第二最大日志包序号大于第一最大日志包序号),且clsn大于apply_lsn(即第二最大lsn大于第一最大lsn),则可将该归档日志文件添加至当前对应节点的归档日志文件链表中。例如,假设某节点当前已发送重演的最大日志包序号(即第一最大日志包序号)为10,最大lsn值(即第一最大lsn)为1001,其可表明在此之前,该节点上日志包序号小于等于10的日志包中,lsn值小于等于1001的日志记录已被重演;在这种情况下,若一个归档日志文件的日志包的第二最大日志包序号为11(11>10),第二最大lsn值为1010(1010>1001),则可以说明该归档日志文件的日志包中存在还未重演的日志记录,此时可将该归档日志文件添加至该节点的归档日志文件链表中,以便于后续从归档日志文件链表中加载未重演的日志包至内存对象中。
[0057]
需要说明的是,在将归档日志文件添加至对应归档日志文件链表的过程中,还可以校验归档日志文件的连续性;若校验成功,则可以继续后续操作;若校验失败,归档日志文件不连续,则可以直接报错返回,不再进行后续所有操作。此处不对归档日志文件校验的具体方法进行限定。
[0058]
可选的,还包括:根据日志包中记录的修改数据页的节点号和相应节点对应的最大lsn值确定每个日志包的日志依赖信息。
[0059]
其中,数据页同步日志可以指page_sync日志。page_sync日志上记录了fresh_ep和fresh_lsn信息,其中,fresh_ep可表示上次修改数据页的节点号,fresh_lsn可表示上次修改数据页所对应的lsn值。
[0060]
示例性的,在ptx commit生成page_sync日志的同时,可将page_sync日志中的fresh_lsn登记到当前ptx的dps_lsn_arr数组中,数组下标可为page_sync日志中的fresh_ep。在登记时,可取当前fresh_lsn和下标为fresh_ep的数组项中已登记的lsn值中较大的一个进行登记。
[0061]
ptx commit可以触发一个日志写入动作,此时会先将该ptx产生的page_sync日志写入到日志包(即rlog_pkg)缓存中。在日志写入时,可以将当前ptx的dps_lsn_arr数组内容登记到rlog_pkg缓存的dps_lsn_arr数组中。与ptx上的dps_lsn_arr数组相同,rlog_pkg缓存中的dps_lsn_arr数组下标也为节点号。登记时,可取ptx和rlog_pkg日志包缓存中的dps_lsn_arr数组对应节点的lsn值中较大的一个进行登记。
[0062]
图2为本发明实施例一提供的一种调整后的rlog_pkg格式的示意图。如图2所示,可通过调整rlog_pkg格式,以增加日志依赖信息。调整过程可以是:rlog_pkg可由日志包头和日志包体组成,日志包头上增加字段rlog_pkg_n_depends(其中rlog_pkg_n_depends也可表示为n_dps),可用于记录该rlog_pkg依赖的共享存储集群节点数;日志包体的尾部可
用于记录该rlog_pkg的日志依赖信息。图2中,日志依赖信息可包括多个[dps_ep,dps_lsn]数据组,其中dps_ep可表示前序修改数据页的节点对应的节点号;dps_lsn可表示每个节点修改数据页对应的最大lsn值。即根据rlog_pkg中记录的修改数据页的节点号和相应节点对应的最大lsn值,可以确定每个日志包的日志依赖信息。
[0063]
在ptx commit或产生检查点时,触发rlog_pkg刷盘(即将rlog_pkg缓存中的dps_lsn_arr数组内容写入到磁盘中)。刷盘时,可按照图2中的rlog_pkg格式,将该rlog_pkg依赖的共享存储集群节点数写入日志包头的rlog_pkg_n_depends字段中,并将rlog_pkg缓存中的dps_lsn_arr数组内容写入日志包尾的日志依赖信息中。可通过调整日志包有效日志长度data_off,以增加实际写入的rlog_pkg的dps_lsn_arr数组的长度。
[0064]
本实施例中,在确定内存对象和内存对象加载的日志包所对应的日志依赖信息之后,可以初始化集群中每个节点的内存对象,并且内存对象中加载有相应的日志包。
[0065]
可选的,初始化集群中每个节点的内存对象,包括:对于每个节点,依次扫描该节点的归档日志文件链表中的归档日志文件中的日志包;将首个满足以下条件的日志包加载至该节点的内存对象中:日志包的日志包序号大于已重演的第一最大日志包序号,并且该日志包中的最大lsn值大于已重演的第一最大lsn。
[0066]
其中,初始化每个节点的内存对象(内存对象可表示为rarch_ep),用于管理该节点的日志同步/恢复信息。首先,对于每个节点,可以依次扫描该节点的归档日志文件链表中的归档日志文件,并对于每个归档日志文件,依次扫描其中的日志包。然后,将该节点上第一个满足条件的日志包加载到该节点的rarch_ep中;其中上述所需满足的条件可以为:日志包的日志包序号(即pkg_seqno)大于该节点的apply_seq(即已重演的第一最大日志包序号),并且该日志包中的最大lsn值大于该节点的apply_lsn(即已重演的第一最大lsn)。例如,假设某节点当前已重演的第一最大日志包序号为10,已重演的第一最大lsn为1001,在这种情况下,日志包序号大于10且最大lsn值大于1001的日志包都是还未被重演的日志包,则由于对于多个未被重演的日志包,可以按照日志包序号和lsn的由小到大顺序依次重演,且每次重演一个日志包,因此可以只选取首个满足条件的未重演日志包加载至内存对象中。
[0067]
需要说明的是,对于每个节点,依次扫描该节点的归档日志文件链表中的归档日志文件中的日志包,将首个满足以下条件的日志包加载至该节点的内存对象中;其中,依次扫描可理解为,当首个满足以下条件的日志包加载至该节点的内存对象中且重演之后会继续扫描,当再次扫描时,原本第二个满足以下条件的日志包就可认为是首个满足以下条件的日志包,以此类推,直至所有节点的待重演日志全部重演完成。
[0068]
需要说明的是,在将日志包加载至该节点的rarch_ep的过程中,可以对日志包尾的日志依赖信息进行解析,解析出对应的n_dps组[dps_ep,dps_lsn]数据组。为进行区分,可将加载至rarch_ep中的日志包命名为rpkg。加载完相应的日志包后,还可将[apply_seq,apply_lsn]存储到该节点的rarch_ep中。当所有节点的rarch_ep初始化完成后,此时各个节点rarch_ep中均已加载好零个或一个初始日志包rpkg。
[0069]
图3为本发明实施例一提供的一种内存对象初始化的示意图。如图3所示,以节点1和节点2为例,每个节点的归档日志文件链表中可包括n个归档日志文件,针对于每个节点,通过比较该节点对应的[apply_seq,apply_lsn]与归档日志文件中日志包的日志包序号和
日志包中最大的lsn值,可以从每个节点归档日志文件链表的n个归档日志文件中确定可加载至内存对象中的日志包rpkg,加载至内存对象中的日志包rpkg上又可带有[dps_ep,dps_lsn]数据组。
[0070]
s120、依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包。
[0071]
s130、各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
[0072]
在本实施例中,首先,可以将共享存储集群中的各个节点中的内存对象(即rarch_ep)整合为一个数组,数组可用rarch_ep_arr表示;其中数组下标可表示各节点号(即各内存对象所对应的节点号);数组rarch_ep_arr可记录在共享存储集群的控制节点中。然后,可以依次扫描数组rarch_ep_arr中的数组项(数组项可指数组中的每个rarch_ep),其中经初始化后的每个rarch_ep中都加载了零个或一个日志包rpkg。最后,在每次扫描过程中,判断各个rarch_ep上是否存在rpkg;若不存在rpkg则可继续扫描下一个rarch_ep;若存在rpkg,则可根据当前扫描的rarch_ep对应的日志依赖信息确定最优待重演日志包,在各rarch_ep扫描完毕之后,对最优待重演日志包进行重演。
[0073]
可选的,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包,包括:依次扫描当前扫描的内存对象对应的日志依赖信息中的每个数据组,对于当前扫描的数据组,从各内存对象中找到与当前扫描的数据组中的节点号一致的目标内存对象,以及目标内存对象对应的已重演的第一最大lsn;若目标内存对象对应的已重演的第一最大lsn大于或等于当前扫描的数据组中的lsn值,则当前扫描的数据组对应的日志已重演,否则,当前扫描的数据组对应的日志未重演;若当前扫描的内存对象对应的日志依赖信息中存在一个或多个数据组对应的日志未重演,则继续扫描下一个内存对象;若当前扫描的内存对象对应的日志依赖信息中的每个数据组对应的日志均已重演,则根据当前扫描的内存对象更新目标节点号、目标最小lsn以及目标最大lsn,其中,目标节点号、目标最小lsn以及目标最大lsn分别用于记录最优待重演日志包所在的节点号、最优待重演日志包内的最小lsn值以及最优待重演日志包内的最大lsn值。
[0074]
其中,当前扫描的rarch_ep对应的日志依赖信息包括多个[dps_ep,dps_lsn]数据组,首先可以依次扫描该日志依赖信息中的每个数据组;对于当前扫描的数据组[dps_ep,dps_lsn],在数组rarch_ep_arr的各rarch_ep中找到节点号与dps_ep(即当前扫描的数据组中的节点号)一致的rarch_ep作为目标rarch_ep(目标rarch_ep可记为rarch_ep')。
[0075]
然后,获取rarch_ep'上对应记录的apply_lsn(即已重演的第一最大lsn),以判断apply_lsn是否大于或等于dps_lsn(即当前扫描的数据组中的lsn值)。若是,则可说明当前扫描的数据组[dps_ep,dps_lsn]对应的日志已发送重演;若否,则可说明当前扫描的数据组[dps_ep,dps_lsn]对应的日志未发送重演。最后,在此基础上,若当前扫描的rarch_ep对应的日志依赖信息中存在一个或多个数据组对应的日志未重演,则可以继续扫描下一个rarch_ep;若当前扫描的rarch_ep对应的日志依赖信息中的每个数据组对应的日志均已重演,则可根据当前扫描的rarch_ep更新目标节点号、目标最小lsn以及目标最大lsn,其中,目标节点号、目标最小lsn以及目标最大lsn可分别用于记录最优待重演日志包所在的节点号、最优待重演日志包内的最小lsn值以及最优待重演日志包内的最大lsn值。
[0076]
在本实施例中,可以设置变量ep、min_lsn和max_lsn,分别用于表示目标节点号、
目标最小lsn以及目标最大lsn。上述各个变量ep、min_lsn和max_lsn的初始值可均设为-1。根据当前扫描的rarch_ep所在的节点号以及rarch_ep加载的日志包中的最小lsn值和最大lsn值,可以更新ep、min_lsn和max_lsn。
[0077]
可选的,根据当前扫描的内存对象更新目标节点号、目标最小lsn以及目标最大lsn,包括:若目标节点号为初始值,则将目标节点号设置为当前扫描的内存对象所在的节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn;若目标节点号非初始值,则比较目标最小lsn和当前扫描的内存对象加载的日志包中的最小lsn:若目标最小lsn小于当前扫描的内存对象加载的日志包中的最小lsn,则目标节点号、目标最小lsn、目标最大lsn保持不变;若目标最小lsn大于当前扫描的内存对象加载的日志包中的最小lsn,则将目标节点号设置为当前扫描的内存对象所在的当前节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn;若目标最小lsn等于当前扫描的内存对象加载的日志包中的最小lsn,则比较目标最大lsn和当前扫描的内存对象加载的日志包中的最大lsn;若目标最大lsn小于或等于当前扫描的内存对象加载的日志包中的最大lsn,则目标节点号、目标最小lsn、目标最大lsn保持不变;若目标最大lsn大于当前扫描的内存对象加载的日志包中的最大lsn,则将目标节点号设置为当前扫描的内存对象所在的当前节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn。
[0078]
其中,根据当前扫描的rarch_ep更新ep、min_lsn和max_lsn的具体过程如下:
[0079]
判断变量ep是否为初始值-1,若变量ep是初始值-1,则可将ep设为当前扫描的rarch_ep所在的节点号,将min_lsn设为当前扫描的rarch_ep加载的日志包中的最小lsn值,将max_lsn设为当前扫描的rarch_ep加载的日志包中的最大lsn。
[0080]
若变量ep不是初始值-1,则可比较min_lsn和当前扫描的rarch_ep加载的日志包中的最小lsn,比较结果可分为以下几种:
[0081]
若min_lsn小于当前扫描的rarch_ep加载的日志包中的最小lsn值,则ep、min_lsn和max_lsn可保持不变;
[0082]
若min_lsn大于当前扫描的rarch_ep加载的日志包中的最小lsn值,则可将ep设置为当前扫描的rarch_ep所在的当前节点号,将min_lsn设为当前扫描的rarch_ep加载的日志包中的最小lsn,将max_lsn设为当前扫描的rarch_ep加载的日志包中的最大lsn;
[0083]
若min_lsn等于当前扫描的rarch_ep中加载的日志包的最小lsn,则可比较max_lsn和当前扫描的rarch_ep加载的日志包中的最大lsn;
[0084]
若max_lsn小于或等于当前扫描的rarch_ep加载的日志包中的最大lsn,则ep、min_lsn、max_lsn保持不变;
[0085]
若max_lsn大于当前扫描的rarch_ep加载的日志包中的最大lsn,则可将ep设置为当前扫描的rarch_ep所在的当前节点号,将min_lsn设为当前扫描的rarch_ep加载的日志包中的最小lsn,将max_lsn设为当前扫描的rarch_ep加载的日志包中的最大lsn。
[0086]
可选的,各内存对象扫描完毕之后,对最优待重演日志包进行重演,包括:各内存对象扫描完毕之后,若目标节点号非初始值,则将目标节点号对应的内存对象中加载的日
志包重演;根据重演的日志包更新目标节点号对应的内存对象中登记的已重演的第一最大日志包序号,以及已重演的第一最大lsn,清空目标节点号对应的内存对象中已加载的日志包;若目标节点号为初始值,则判断各内存对象中是否均未加载日志包;若是,则各节点的日志均已重演完成;否则,存在一个或多个节点的日志包依赖的其他日志丢失,停止重演日志包,返回报错信息。
[0087]
其中,若ep不是初始值-1,则可将ep对应的rarch_ep中加载的日志包rpkg重演;根据当前重演的rpkg,将当前扫描的rarch_ep中登记的已重演的第一最大日志包序号(即apply_seq)更新为当前重演的rpkg的日志包序号,将当前扫描的rarch_ep中登记的已重演的第一最大lsn(即apply_lsn)更新为当前重演的rpkg中的最大lsn值(即当前对应的max_lsn)。在此基础上,可以清空当前扫描的rarch_ep中已加载的日志包rpkg。若ep是初始值-1,则可表明数组rarch_ep_arr扫描结束。
[0088]
需要说明的是,清空当前扫描的rarch_ep中已加载的日志包之后,可继续将下一个满足条件(条件为日志包的日志包序号大于已重演的第一最大日志包序号,并且该日志包中的最大lsn值大于已重演的第一最大lsn)的日志包加载至目标节点号对应的内存对象中,然后执行“依次扫描各内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包,各内存对象扫描完毕之后,对最优待重演日志包进行重演”的操作,直至将所有节点的待重演日志全部重演完成。
[0089]
若ep为初始值-1,则可以判断所有内存对象中是否均未加载日志包,若是,则可说明所有节点的待重演日志均已重演完成;若否,则可说明存在一个或多个节点的日志包依赖的其他日志丢失(如可能是该日志所在的归档日志文件被人为删除了),此时可停止重演日志包,并向用户返回相应的报错信息。其中,假设根据日志包a相关联的日志依赖信息发现日志包a依赖其他某条日志b,则日志包a依赖的其他日志丢失可理解为日志包a依赖的日志b丢失了。
[0090]
需要说明的是,此处对所有内存对象中是否均未加载日志包的具体判断方法不作限定,例如,可以通过设置一个标记flag并初始化为0来判断,具体的,在扫描所有内存对象的过程中,若内存对象中存在加载的日志包,则可将flag设置为1,否则flag保持初始值0不变;待所有的内存对象扫描完毕之后,判断此时的flag是否为0,若为0,则可说明所有内存对象中均未加载日志包。
[0091]
本发明实施例一提供的一种日志包重演方法,初始化集群中每个节点的内存对象,内存对象中加载有日志包,日志包关联于日志依赖信息;在此基础上,依次扫描各所内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;各内存对象扫描完毕之后,对最优待重演日志包进行重演。该方法通过初始化集群中每个节点的内存对象,并且每个日志包可以对应关联于一个日志依赖信息,在此基础上根据日志依赖信息确定最优待重演日志包,并在各内存对象扫描完毕之后,对最优待重演日志包进行重演,能够保证日志包根据日志依赖信息依次重演,从而提高了日志包重演的效率。
[0092]
实施例二
[0093]
图4为本发明实施例二提供的一种日志包重演装置的结构示意图,该装置可由软件和/或硬件实现。如图4所示,该装置包括:内存对象初始化模块310、确定模块320和重演
模块330;
[0094]
其中,内存对象初始化模块310,设置为初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息;
[0095]
确定模块320,设置为依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;
[0096]
重演模块330,设置为各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
[0097]
在本实施例中,该装置通过内存对象初始化模块310,初始化集群中每个节点的内存对象,内存对象中加载有日志包,日志包关联于日志依赖信息;通过确定模块320,依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;通过重演模块330,各内存对象扫描完毕之后,对最优待重演日志包进行重演。该装置通过初始化集群中每个节点的内存对象,并且每个日志包可以对应关联于一个日志依赖信息,在此基础上根据日志依赖信息确定最优待重演日志包,并在各内存对象扫描完毕之后,对最优待重演日志包进行重演,能够保证日志包根据日志依赖信息依次重演,从而提高了日志包重演的效率。
[0098]
可选的,内存对象初始化模块310,具体包括:
[0099]
日志包扫描单元,设置为对于每个节点,依次扫描该节点的归档日志文件链表中的归档日志文件中的日志包;
[0100]
日志包加载单元,设置为将首个满足以下条件的日志包加载至该节点的内存对象中:日志包的日志包序号大于已重演的第一最大日志包序号,并且该日志包中的最大lsn值大于已重演的第一最大lsn。
[0101]
可选的,所述装置还包括:
[0102]
记录模块,设置为在初始化每个节点的内存对象之前,对于每个节点,记录该节点已重演的第一最大日志包序号以及第一最大lsn;
[0103]
归档日志文件扫描模块,设置为扫描该节点上的归档日志文件,每个归档日志文件的头信息中包括该归档日志文件中的日志包的第二最大日志包序号以及第二最大lsn;
[0104]
添加模块,设置为若所述第二最大日志包序号大于所述第一最大日志包序号,且所述第二最大lsn大于所述第一最大lsn,则将该归档日志文件添加至该节点的归档日志文件链表中。
[0105]
可选的,所述装置还包括:
[0106]
信息确定模块,设置为根据日志包中记录的修改数据页的节点号和相应节点对应的最大lsn值,确定每个日志包的日志依赖信息。
[0107]
可选的,确定模块320,具体包括:
[0108]
数据组扫描单元,设置为依次扫描当前扫描的内存对象对应的日志依赖信息中的每个数据组,对于当前扫描的数据组,从各所述内存对象中找到与当前扫描的数据组中的节点号一致的目标内存对象,以及所述目标内存对象对应的已重演的第一最大lsn;
[0109]
重演判定单元,设置为若所述目标内存对象对应的已重演的第一最大lsn大于或等于当前扫描的数据组中的lsn值,则当前扫描的数据组对应的日志已重演,否则,当前扫描的数据组对应的日志未重演;
[0110]
扫描单元,设置为若所述当前扫描的内存对象对应的日志依赖信息中存在一个或多个数据组对应的日志未重演,则继续扫描下一个内存对象;
[0111]
更新单元,设置为若所述当前扫描的内存对象对应的日志依赖信息中的每个数据组对应的日志均已重演,则根据当前扫描的内存对象更新目标节点号、目标最小lsn以及目标最大lsn,其中,所述目标节点号、所述目标最小lsn以及所述目标最大lsn分别用于记录最优待重演日志包所在的节点号、最优待重演日志包内的最小lsn值以及最优待重演日志包内的最大lsn值。
[0112]
可选的,更新单元,具体设置为:
[0113]
若所述目标节点号为初始值,则将所述目标节点号设置为当前扫描的内存对象所在的节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn;
[0114]
若目标节点号非初始值,则比较目标最小lsn和当前扫描的内存对象加载的日志包中的最小lsn:
[0115]
若目标最小lsn小于当前扫描的内存对象加载的日志包中的最小lsn,则目标节点号、目标最小lsn、目标最大lsn保持不变;
[0116]
若目标最小lsn大于当前扫描的内存对象加载的日志包中的最小lsn,则将目标节点号设置为当前扫描的内存对象所在的当前节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn;
[0117]
若目标最小lsn等于当前扫描的内存对象加载的日志包中的最小lsn,则比较目标最大lsn和当前扫描的内存对象加载的日志包中的最大lsn;
[0118]
若目标最大lsn小于或等于当前扫描的内存对象加载的日志包中的最大lsn,则目标节点号、目标最小lsn、目标最大lsn保持不变;
[0119]
若目标最大lsn大于当前扫描的内存对象加载的日志包中的最大lsn,则将目标节点号设置为当前扫描的内存对象所在的当前节点号,将目标最小lsn设为当前扫描的内存对象加载的日志包中的最小lsn,将目标最大lsn设为当前扫描的内存对象加载的日志包中的最大lsn。
[0120]
可选的,重演模块330,具体设置为:
[0121]
各所述内存对象扫描完毕之后,若所述目标节点号非初始值,则将所述目标节点号对应的内存对象中加载的日志包重演;
[0122]
根据重演的日志包更新所述目标节点号对应的内存对象中登记的已重演的第一最大日志包序号,以及已重演的第一最大lsn,清空目标节点号对应的内存对象中已加载的日志包;
[0123]
若所述目标节点号为初始值,则判断各所述内存对象中是否均未加载日志包;
[0124]
若是,则各所述节点的日志均已重演完成;否则,存在一个或多个节点的日志包依赖的其他日志丢失,停止重演日志包,返回报错信息。
[0125]
上述日志包重演装置可执行本发明任意实施例所提供的日志包重演方法,具备执行方法相应的功能模块和有益效果。
[0126]
实施例三
[0127]
图5为本发明实施例三提供的一种电子设备的结构示意图。如图5所示,本发明实施例四提供的电子设备包括:存储装置42和一个或多个处理器41;该电子设备中的处理器41可以是一个或多个,图5中以一个处理器41为例;存储装置42用于存储一个或多个程序;所述一个或多个程序被所述一个或多个处理器41执行,使得所述一个或多个处理器41实现如本发明实施例中任一项所述的日志包重演方法。
[0128]
所述电子设备还可以包括:通信装置43、输入装置44和输出装置45。
[0129]
电子设备中的处理器41、存储装置42、通信装置43、输入装置44和输出装置45可以通过总线或其他方式连接,图5中以通过总线连接为例。
[0130]
该电子设备中的存储装置42作为一种计算机可读存储介质,可用于存储一个或多个程序,所述程序可以是软件程序、计算机可执行程序以及模块,如本发明实施例一所提供日志包重演方法对应的程序指令/模块(例如,附图4所示的日志包重演装置中的模块,包括:内存对象初始化模块310和重演模块320)。处理器41通过运行存储在存储装置42中的软件程序、指令以及模块,从而执行电子设备的各种功能应用以及数据处理,即实现上述方法实施例中日志包重演方法。
[0131]
存储装置42可包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据电子设备的使用所创建的数据等。此外,存储装置42可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置42可进一步包括相对于处理器41远程设置的存储器,这些远程存储器可以通过网络连接至电子设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
[0132]
通信装置43可以包括接收器和发送器。通信装置43设置为根据处理器41的控制进行信息收发通信。
[0133]
输入装置44可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。输出装置45可包括显示屏等显示设备。
[0134]
并且,当上述电子设备所包括一个或者多个程序被所述一个或者多个处理器41执行时,程序进行如下操作:初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息;依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
[0135]
实施例四
[0136]
本发明实施例四提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时用于执行日志包重演方法,该方法包括:初始化集群中每个节点的内存对象,所述内存对象中加载有日志包,所述日志包关联于日志依赖信息;依次扫描各所述内存对象,在每次扫描过程中,根据当前扫描的内存对象对应的日志依赖信息确定最优待重演日志包;各所述内存对象扫描完毕之后,对所述最优待重演日志包进行重演。
[0137]
可选的,该程序被处理器执行时还可以用于执行本发明任意实施例所提供的日志包重演方法。
[0138]
本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读
存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(random access memory,ram)、只读存储器(read only memory,rom)、可擦式可编程只读存储器(erasable programmable read only memory,eprom)、闪存、光纤、便携式cd-rom、光存储器件、磁存储器件、或者上述的任意合适的组合。计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0139]
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于:电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0140]
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆或无线电频率(radio frequency,rf)等等,或者上述的任意合适的组合。
[0141]
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如java、smalltalk、c++,还包括常规的过程式程序设计语言,诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(lan)或广域网(wan),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0142]
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1