持久性主存储器中的日志的尾部的制作方法

文档序号:15104556发布日期:2018-08-04 16:33阅读:92来源:国知局

出于多种多样的原因,计算系统经常保存某些事件的日志。这些日志可能有助于诊断出现的或存在的问题、从计算系统的故障中恢复、执行计算系统的增量备份、跟踪计算性能、评估安全性等等。

一些日志被保存在磁盘上以便在系统故障时幸存。毕竟,一些日志的目的是在系统发生故障后(诸如当用于恢复或诊断故障原因时)使用。当日志被保存在磁盘上时,事件通常会首先写入易失性存储器中的易失性日志高速缓存(通常称为“LC”)。每个日志高速缓存的大小通常使得可以被串行化并且在单个I/O操作中被写入磁盘,从而保留磁盘的I/O通道的使用。使用这种日志缓存有助于减少对磁盘的I/O操作次数。

一旦日志高速缓存被填满(或在一定时间过去之后),日志高速缓存的内容被串行化并且被写入到磁盘,并且另一空日志高速缓存可用于捕获(至少在易失性存储器中)其他事件。重复此过程,从而通过若干个日志高速缓存循环。一旦特定日志高速缓存的内容被确认为写入到磁盘上的日志,发起将事件写入该日志高速缓存中的一个或多个线程,然后这些线程被释放回到一个或多个事件提供者。当线程正在等待释放时,它们可能经常处于睡眠状态,以减少与线程相关联的开销。

本文中所要求保护的主题不限于解决任何缺点的实施例或仅在诸如上文所描述的环境之类的环境中操作的实施例。相反,该

背景技术:
仅被提供以说明其中可以实施本文中所描述的一些实施例的一个示例性技术领域。



技术实现要素:

本文中所描述的至少一些实施例涉及一种使用持久性主存储器以便保存尚未被写入持久性存储装置的日志的事件的系统。当事件要被写入持久性存储装置的日志中时,事件被写入持久性主存储器中以便在恢复的情况下可解释。比如,事件可以与标识事件处于特定日志高速缓存结构中的其他状态、特定日志高速缓存结构内事件的位置、以及除了被写入特定日志高速缓存结构的事件之外的事件的次序一起被写入持久性主存储器中的日志高速缓存结构中。

一旦事件和对应状态被写入持久性主存储器,发起写入的线程就可以立即返回。这是因为即使事件在持久性存储装置中的日志中未被冲刷(例如,与日志高速缓存结构的其他内容一起),也可以基于持久性主存储器的内容来对该事件执行恢复。这将线程发起写入的时间和释放线程用于其他工作的时间之间的时延极大地减少了多个数量级。通常,发起将事件写入日志高速缓存的任何线程都必须等待日志高速缓存的内容已经被写入持久性存储装置的确认。这不仅导致从I/O操作到持久性存储装置本身的时延,而且还导致从等待日志高速缓存被充分填充到起初发起该I/O操作的时延。

尽管不是必需的,但是在一些实施例中,对应的日志高速缓存也可以存在于易失性存储器中,该日志高速缓存镜像持久性主存储器中的日志高速缓存结构。这允许日志高速缓存的内容被预串行化和串行化,正如通常从易失性日志高速缓存中那样(不考虑用于预串行化和串行化的确切机构),仍允许持久性主存储器的内容在导致易失性存储器内容丢失的故障的情况下使用。因此,这些实施例使对使用易失性存储器日志高速缓存的现有事件记录基础结构的影响最小化。更进一步地,由于持久性主存储器不需要追踪每个可能的预串行化状态,因此这些实施例减少了持久性主存储器所需的改变次数。

为了恢复,对持久性存储装置中的日志进行评估以标识所存储的日志的结尾。然后,通过标识一个或多个日志高速缓存结构来在持久性主存储器中标识日志的尾部,该一个或多个日志高速缓存结构在所存储的日志的结尾之后具有事件并且可以有效地用于恢复(例如,其具有原子事件写入操作之间的状态)。然后,这些已标识的日志高速缓存结构中的每个日志高速缓存结构的内容会一次采用一个日志高速缓存结构进行串行化,最早的优先。比如,如果还使用易失性日志高速缓存,则可以将内容复制到易失性日志高速缓存中,之后,易失性日志高速缓存按照正常情况进行预先串行化和串行化。这缓解了持久性主存储器自身必须在预先串行化期间跟踪日志高速缓存状态的需要。

提供本概述是为了以简化形式介绍将在以下具体实施方式中进一步描述的概念选择。本发明内容并非旨在确定所要求保护的主题的关键特征或基本特征,也不旨在用作确定所要求保护的主题的范围的辅助手段。

附图说明

为了描述可以获得本发明的上述和其他优点和特征的方式,上文所简要描述的本发明的更具体描述将通过参考在附图中被图示的其具体实施例再现。应当理解,这些附图仅描绘了本发明的典型实施例,并且因此不被认为是对其范围的限制,本发明将通过使用附图以附加的特征和细节而被描述和解释,其中

图1图示了其中可以采用本文中所描述的原理的示例计算系统;

图2图示了根据本文中所描述的原理的系统,其中日志管理组件可以以如果发生故障则恢复组件可以成功恢复的方式记录具有低时延的事件;

图3图示了用于记录计算系统的事件以便使得计算系统能够从可能的故障中恢复的方法的流程图;

图4图示了用于将日志高速缓存串行化到持久性存储装置的日志中的方法的流程图;

图5图示了用于将事件成功写入持久性存储器的方法的流程图;

图6A至图6C图示了持久性主存储器的各部分的连续状态,这些部分包括日志高速缓存数据结构、日志高速缓存描述符和一个或多个槽结构,它们以描述日志高速缓存结构的状态并且保留事件写入的次序的方式相互关联;以及

图7图示了用于使用在持久性存储器以及持久性主存储器中持久化的日志来恢复计算系统的方法的流程图。

具体实施方式

本文中所描述的至少一些实施例涉及一种使用持久性主存储器以便保存尚未被写入持久性存储装置的日志的事件的系统。当事件要被写入持久性存储装置的日志中时,事件被写入持久性主存储器中以便在恢复的情况下可解释。比如,事件可以与标识事件处于特定日志高速缓存结构中的其他状态、特定日志高速缓存结构内事件的位置、以及除了被写入特定日志高速缓存结构中的其他事件之外的事件的次序一起被写入持久性主存储器中的日志高速缓存结构中。

一旦事件和对应状态被写入持久性主存储器,发起写入的线程就可以立即返回。这是因为即使事件在持久性存储装置中的日志中未被冲刷(例如,与日志高速缓存结构的其他内容一起),也可以基于持久性主存储器的内容来针对该事件执行恢复。这将线程发起写入的时间和释放线程用于其他工作的时间之间的时延极大地减少了多个数量级。通常,发起将事件写入日志高速缓存的任何线程都必须等待日志高速缓存的内容已经被写入持久性存储装置的确认。这不仅导致从I/O操作到持久性存储装置本身的时延,而且还导致从等待日志高速缓存被充分填充到起初发起该I/O操作的时延。

尽管不是必需的,但是在一些实施例中,对应的日志高速缓存也可以存在于易失性存储器中,该日志高速缓存镜像持久性主存储器中的日志高速缓存结构。这允许日志高速缓存的内容被预串行化和串行化,正如通常从易失性日志高速缓存中那样(不考虑用于预串行化和串行化的确切机构),仍允许持久性主存储器的内容在导致易失性存储器内容丢失的故障的情况下使用。因此,这些实施例使对使用易失性存储器日志高速缓存的现有事件记录基础结构的影响最小化。更进一步地,由于持久性主存储器不需要追踪每个可能的预串行化状态,因此这些实施例减少了持久性主存储器所需的改变次数。

为了恢复,对持久性存储装置中的日志进行评估以标识所存储的日志的结尾。然后,通过标识一个或多个日志高速缓存结构来在持久性主存储器中标识日志的尾部,该一个或多个日志高速缓存结构在所存储的日志的结尾之后具有事件并且可以有效地用于恢复(例如,其具有原子事件写入操作之间的状态)。然后,这些已标识的日志高速缓存结构中的每个日志高速缓存结构的内容都会一次采用一个日志高速缓存结构进行串行化,最早的优先。比如,如果还使用易失性日志高速缓存,则可以将内容复制到易失性日志高速缓存中,之后,易失性日志高速缓存按照正常情况进行预先串行化和串行化。这缓解了持久性主存储器自身必须在预先串行化期间跟踪日志高速缓存状态的需要。

参照图1对计算系统的一些介绍性讨论进行描述。然后,关于图2至图7对记录和恢复操作进行描述。

计算系统现在越来越多地采用多种多样的形式。例如,计算系统可以是手持式设备、家用电器、膝上型计算机、台式计算机、大型机、分布式计算系统、数据中心、或甚至传统上未被认为是计算系统的设备,诸如可穿戴物(例如,眼镜)。在本说明书和权利要求书中,术语“计算系统”被广义地定义为包括任何设备或系统(或其组合),其包括至少一个物理和有形处理器以及能够在其上具有计算机可执行指令的物理和有形存储器,这些计算机可执行指令可以由处理器执行。存储器可以采用任何形式并且可以取决于计算系统的性质和形式。计算系统可以分布在网络环境上并且可以包括多个组成计算系统。

如图1所图示的,在其最基本的配置中,计算系统100通常包括至少一个硬件处理单元102和存储器104。存储器104可以是物理系统存储器,其可以是易失性的、非易失性的、或两者的某个组合。术语“存储器”在本文中也可以用于指代非易失性大容量存储装置,诸如物理存储介质。如果计算系统是分布式的,则处理、记忆和/或存储能力也可以是分布式的。

计算系统100上还具有通常被称为“可执行组件”的多个结构。比如,计算系统100的存储器104被图示为包括可执行组件106。术语“可执行组件”是结构的名称,对于在计算领域中的本领域技术人员而言很容易理解,该结构可以是软件、硬件或其组合。比如,当以软件实现时,本领域普通技术人员应当理解,可执行组件的结构可以包括可以在计算系统上执行的软件对象、例程、方法,无论这种可执行组件存在于计算系统的堆中,还是该可执行组件存在于计算机可读存储介质上。

在这样的情况下,本领域普通技术人员应当认识到,可执行组件的结构存在于计算机可读介质上,使得当由计算系统的一个或多个处理器解释时(例如,通过处理器线程),使得计算系统执行功能。这种结构可以直接由处理器计算机可读(当可执行组件是二进制的情况时)。可替代地,结构可以被构造为可解释的和/或编译的(无论是在单个阶段还是在多个阶段中),以便生成处理器直接可解释的这种二进制。当使用术语“可执行组件”时,对可执行组件的示例结构的这种理解完全在计算领域的普通技术人员的理解之内。

本领域普通技术人员还把术语“可执行组件”很好地理解为包括专门或近似专门在硬件中(诸如现场可编程门阵列(FPGA)、专用集成电路(ASIC)或任何其他专用电路内)实现的结构。因而,不管是在软件、硬件还是组合中实现,术语“可执行组件”都是计算领域的普通技术人员很好理解的、用于结构的术语。在该描述中,还可以使用术语“组件”、“服务”、“引擎”、“模块”、“虚拟机”等。如在本说明书中和在这种情况下所使用的,这些术语(无论是否使用修饰语句表达)也旨在与术语“可执行组件”同义,并且因此也具有由计算领域的普通技术人员很好理解的结构。

在下面的描述中,参考由一个或多个计算系统执行的动作对实施例进行描述。如果这些动作在软件中实现,则(执行动作的相关联的计算系统的)一个或多个处理器响应于已经执行了构成可执行组件的计算机可执行指令来指导计算系统的操作。例如,这样的计算机可执行指令可以在形成计算机程序产品的一个或多个计算机可读介质上体现。这种操作的示例涉及数据的操纵。

计算机可执行指令(和所操纵的数据)可以被存储在计算系统100的存储器104中。计算系统100还可以包含通信信道108,其允许计算系统100例如通过网络110与其他计算系统通信。

虽然不是所有计算系统都需要用户界面,但是在一些实施例中,计算系统100包括用于与用户交互的用户界面112。用户界面112可以包括输出机构112A以及输入机构112B。本文中所描述的原理不限于精确的输出机构112A或输入机构112B,因为这将取决于设备的性质。然而,输出机构112A可以包括比如扬声器、显示器、触觉输出、全息图等等。输入机构112B的示例可以包括比如麦克风、触摸屏、全息图、相机、键盘、其他指点输入的鼠标、任何类型的传感器等等。

如下文所更详细讨论的,本文中所描述的实施例可以包括或利用包括计算机硬件(诸如例如,一个或多个处理器和系统存储器)的专用或通用计算系统。本文中所描述的实施例还包括用于携带或存储计算机可执行指令和/或数据结构的物理和其他计算机可读介质。这样的计算机可读介质可以是可以被通用或专用计算系统访问的任何可用介质。存储计算机可执行指令的计算机可读介质是物理存储介质。携带计算机可执行指令的计算机可读介质是传输介质。因此,通过示例而非限制,本发明的实施例可以包括至少两种截然不同的计算机可读介质:存储介质和传输介质。

计算机可读存储介质包括RAM、ROM、EEPROM、CD-ROM或其他光盘存储装置、磁盘存储装置或其他磁存储设备、或可以用于存储具有计算机可执行指令或数据结构的形式的期望的程序代码手段并且可以被通用或专用计算系统访问的任何其他物理和有形存储介质。

“网络”被定义为使得在计算系统和/或模块和/或其他电子设备之间能够传送电子数据的一个或多个数据链路。当信息通过网络或另一通信连接(硬连线连接、无线连接或硬连线连接或无线连接的组合)被传送或提供给计算系统时,计算系统适当地将连接视为传输介质。传输介质可以包括网络和/或数据链路,其可以用于携带具有计算机可执行指令或数据结构的形式的期望的程序代码手段并且可以由通用或专用计算系统访问。上述的组合也应该包括在计算机可读介质的范围内。

进一步地,在到达各种计算系统组件时,具有计算机可执行指令或数据结构形式的程序代码手段可以从传输介质自动地传输到存储介质(反之亦然)。例如,通过网络或数据链路接收的计算机可执行指令或数据结构可以被缓存在网络接口模块(例如“NIC”)内的RAM中,然后最终传送到计算系统RAM和/或传送到计算系统的较不易失性的存储介质。因此,应当理解,存储介质可以被包括在同样(甚至主要)利用传输介质的计算系统组件中。

计算机可执行指令例如包括指令和数据,其当在处理器处被执行时使得通用计算系统、专用计算系统或专用处理设备执行特定功能或功能组。可替代地或另外,计算机可执行指令可以将计算系统配置为执行某个功能或功能组。计算机可执行指令可以是例如二进制文件乃至在由处理器直接执行之前经历一些翻译(诸如编译)的指令,诸如汇编语言之类的中间格式指令、乃至源代码。

尽管已经用特定于结构特征和/或方法动作的语言描述了主题,但是应当理解,在所附权利要求中限定的主题不一定限于上文所描述的特征或动作。相反,所描述的特征和动作被公开为实现权利要求的示例形式。

本领域技术人员应当领会,本发明可以在具有许多类型的计算系统配置的网络计算环境中实施,这些计算系统配置包括个人计算机、台式计算机、膝上型计算机、消息处理器、手持式设备、多处理器系统、基于微处理器或可编程的消费电子产品、网络PC、小型计算机、大型计算机、移动电话、PDA、寻呼机、路由器、交换机、数据中心、可穿戴物(诸如眼镜)等。本发明还可以在分布式系统环境中实施,其中通过网络链接(通过硬连线数据链路、无线数据链路或通过硬连线数据链路和无线数据链路的组合)的本地计算系统和远程计算系统均执行任务。在分布式系统环境中,程序模块可能位于本地存储器存储设备和远程存储器存储设备中。

本领域技术人员还应当领会,本发明可以在云计算环境中实施。云计算环境可能是分布式的,尽管这不是必需的。当是分布式的时,云计算环境可以在组织内国际地分布和/或具有跨多个组织处理的组件。在本说明书和以下权利要求中,“云计算”被定义为用于使得能够对可配置计算资源(例如,网络、服务器、存储装置、应用和服务)的共享池进行按需网络访问的模型。“云计算”的定义并不局限于当被适当部署时可以从这种模型中获得的任何其他优点。

图2图示了根据本文中所描述的原理的系统200。该系统包括日志管理组件201和日志恢复组件202,其可以如上面针对图1的可执行组件106所描述的那样被构造。更进一步地,系统200可以如上文针对图1的计算系统100所描述的那样被构造。日志管理组件201使得事件被写入持久性主存储器230,以使得它们将通过正常操作或恢复操作被写入日志241(换句话说,如果不是绝对确定,这种事件的记录也几乎是确定的)。

系统200包括事件提供者集合210,其向日志管理组件201提供事件以供记录。比如,在示例中,事件提供者210A首先提供如箭头211A所示的事件(以下被称为“事件A”);事件提供者210B然后提供如箭头211B所表示的事件(以下称为“事件B”);事件提供者210C然后提供如箭头211C所表示的事件(以下称为“事件C”);并且事件提供者210D然后提供如箭头211D所表示的事件(以下称为“事件D”)。因而,在该示例中,日志管理组件201接收以下事件以用于以如下次序进行记录:事件A、事件B、事件C和事件D。日志管理组件201接收事件以供记录的速率可以随时间的推移而变化。

事件提供者210被图示为包括四个事件提供者210A,210B,210C和210D。然而,本文中所描述的原则与有多少事件提供者正在将事件提供到日志中无关。因而,椭圆210E被提供以象征提供要被记录的事件的事件提供者的数目的灵活性。活动地提供事件以供记录的事件提供者的数目甚至可能会随时间的推移而显著波动。然而,四个事件提供者210A到210D仅出于示例和易于参考的目的而被图示。事件提供者可以是任何软件或硬件组件或系统,无论本地地驻留在系统200上还是位于远程。

在接收到每个事件时,日志管理组件201以以下方式将事件写入持久性主存储器230中:如果在事件被写入日志之前发生故障,则恢复组件202能够在恢复期间将事件提供给被存储在持久性存储装置240中的日志241。然而,如果不需要恢复,则在正常的操作过程中,事件最终将在存储在持久性存储装置240中的日志241内结束标识。如果发生故障,则在随后的恢复期间,恢复组件202被触发使用持久性存储器240中的日志241以及写入持久性主存储器230的事件,以便执行恢复。

成功写入持久性主存储器230的事件以恢复组件202将最终操作以使得事件被包括在持久性存储装置240的日志241内的方式写入。因而,成功写入持久性主存储器230确保即使在成功写入之后发生故障,事件也将被记录。因而,在事件成功写入持久性主存储器230之后,可以立即确定事件写入的成功,而不是等到确认事件实际上已经写入持久性存储装置240的日志241中为止。因而,可以几乎立即返回发起写入的线程,并且写入持久性主存储器230一次已经成功完成。

这导致在线程发起写入事件的时间到线程被释放的时间之间的时延减少了多个数量级。通常,发起将事件写入日志高速缓存的任何线程都必须共同等待确认日志高速缓存的内容已经写入持久性存储装置。这不仅导致从I/O操作到持久性存储装置本身的时延,还导致从等待日志高速缓存被充分填充到首先发起该I/O操作的时延。

更具体地,持久性主存储器230包括事件被写入其中的多个日志高速缓存结构231,即,每次一个日志高速缓存结构准备好接收事件。比如,图2中图示了四个日志高速缓存结构231A,231B,231C和231D。然而,椭圆231E和231F表示也可能有其他数字。在一个示例中,可能有超过一百个这样的日志高速缓存结构。日志高速缓存结构被事件填充,直到日志高速缓存结构已满或直到某一时间已过,此时,与日志高速缓存结构相对应的事件被串行化并且经由I/O操作被放入日志241中。在其中要记录事件A到D的示例中,假设事件A和B被写入一个日志高速缓存结构231A中(如相应箭头213A和213B所表示的),于是日志高速缓存结构231A被确定为被填满(不再接受其他事件)。此时,日志高速缓存结构231B可以变为活动的,并且如相应箭头213C和213D所表示的,下一事件C和D被提供到日志高速缓存结构231B中。每个日志高速缓存结构都可能以循环方式进行轮换。

在一个实施例中,还存在其中写入相同事件的易失性存储器220,其中易失性存储器还包括日志高速缓存221,该日志高速缓存221镜像持久性主存储器230的日志高速缓存结构。比如,易失性日志高速缓存221A可以与持久性日志高速缓存结构231A相对应,它们均包含相同的内容,并且甚至两者在被占据日志高速缓存内的相同的相对空间的事件填充时可能均被镜像。类似地,易失性日志高速缓存221B至221D分别与持久性日志高速缓存结构231B至231D相对应。因为可能存在如椭圆231E和231F所表示的其他持久性日志高速缓存结构,所以可能存在如椭圆221E和221F所表示的其他易失性日志高速缓存。

在其中镜像易失性日志高速缓存和持久性日志高速缓存两者的实施例中,事件被写入易失性日志高速缓存和对应的持久性日志高速缓存结构中。比如,事件A可以在事件A被写入持久性日志高速缓存结构231A(如箭头213A所表示的)中的大约同时被写入易失性日志高速缓存221A(如虚线箭头212A所表示的)中。类似地,事件B可以在事件B被写入持久性日志高速缓存结构231A(如由箭头213B所表示的)中的大约同时被写入易失性日志高速缓存221A(如由虚线箭头212B所表示的)中。

更进一步地,此时,假设两个对应的日志高速缓存221A和231A被认为已满(凭借实际上已满或者凭借时间的流逝)。此时,活动的镜像的日志高速缓存成为镜像的日志高速缓存221B和231B。在那之后,在事件A到D的示例中,事件C可以在事件C被写入持久性日志高速缓存结构231B(如箭头213C所标识的)的大约同时被写入易失性日志高速缓存221B(如由虚线箭头212C表示的)中。随后,事件D可以在事件D被写入持久性日志高速缓存结构231B(如箭头213D所表示的)中的大约同时被写入易失性日志高速缓存221B(如由虚线箭头212D所表示的)中。

虽然这种双重书写可能看起来很浪费,但是它实际上具有若干个优点。比如,一旦日志高速缓存被填充得与它将要被填满一样多,通常会有复杂的预先串行化过程,其中日志高速缓存的数据会被四处移动以在日志中进行高效的串行化和紧凑表示。当设计预先串行化时,存在若干判断调用,其在日志高速缓存中产生不同的日志高速缓存状态序列。因而,预先串行化随着不同的产品在不同的环境中以不同的方式发生,甚至可能在相同的环境或版本或相同的产品中随时间的推移而改变。

如果在持久性主存储器中仅存在单个日志高速缓存,则在该日志高速缓存结构内可以跟踪这些众多的预先串行化改变。否则,如果在预先串行化的中间出现故障,则恢复将不可能确定地进行。这种跟踪会使预先串行化过程显著复杂化。恢复过程也会很复杂,因为如果在预先串行化过程期间发生故障,恢复过程可能不得不具有附加逻辑来算出日志缓存结构在预先串行化过程中的位置,以便可以从那里继续恢复。

相反,在预先串行化中牵涉的所有操纵可以被局限在易失性日志高速缓存中。现有产品已经与易失性日志高速缓存进行了交互,以便对高速缓存内容执行预先串行化操纵,因此这可能允许预先串行化和串行化正常进行,而无需对执行预先串行化的现有产品做出改变。更进一步地,如果在预先串行化期间要发生故障,导致易失性日志高速缓存的内容丢失,则可以简单地使用持久性日志高速缓存结构来重新填充易失性日志高速缓存以向易失性日志高速缓存提供其在先前尝试过的预先串行化开始的时候所处于的原始状态。然后,预先串行化可能再次开始,导致易失性日志高速缓存中的事件被串行化到日志中。再者,不需要对现有的预先串行化过程做出改变以允许发生这种恢复;并且避免了在预先串行化期间追踪状态改变的复杂性。

图3图示了用于记录计算系统的事件以便使得计算系统能够从可能的故障中恢复的方法300的流程图。方法300可以由比如图2的日志管理组件201执行。因而,现在频繁参考图2的系统200对图3的方法300进行描述。

每当日志管理组件检测到线程正在向日志写入事件时(动作301),执行方法300。作为响应,该事件被写入持久性主存储器(动作302)。如果发生故障,该写入以以下方式发生:事件将被写入日志,无论是在正常操作期间相对立即地,还是在恢复期间更为靠后地(如下文所进一步描述的)。这在下文中将被称为对持久性主存储器的“成功写入”。更进一步地,如果易失性存储器也用于日志高速缓存,则该事件被写入易失性存储器(动作303)。在也使用易失性存储器的情况下,当事件已成功写入持久性主存储器并且事件已被写入易失性存储器时,事件的“成功”写入发生。如上文所提及的,在成功写入之后,线程可以以非常低的时延返回到事件提供者(动作304)。

尽管动作302和303被图示为并行发生,但是在一个实施例中,在易失性存储器中写入易失性日志高速缓存(动作303)实际发生在写入持久性主存储器中的持久性日志高速缓存结构之前(动作302)。这在易失性高速缓存的写入首先确定位置的实施例中是有用的。比如,日志序列号(或LSN)表示在易失性日志高速缓存中写入的位置。在这种情况下,日志管理组件201生成LSN以表示事件的位置,以便可以发生适当的镜像。在该实施例中,日志管理组件201将按顺序执行以下操作:1)基于当前易失性日志高速缓存来查找LSN,2)将事件内容复制到当前易失性日志高速缓存中,3)基于LSN来查找持久性主存储器位置,以及4)将事件内容也复制到持久性主存储器的那个位置。

比如,图2实质上示出了图3的方法的四次发生。首先,日志管理组件201检测到事件A要被写入(动作301)。如箭头213A所表示的,日志管理组件201然后成功地将事件A写入当前处于活动的持久性日志高速缓存结构中的任一个持久性日志高速缓存结构中(在示例中为日志高速缓存结构231A)(动作302)。更进一步地,如箭头212A所表示的,日志管理组件201还将事件A写入当前处于活动的易失性日志高速缓存中的任一个易失性日志高速缓存中(在示例中为日志高速缓存221A)(动作303)。此时,线程返回(如箭头214A所表示的)到事件提供者210A(动作304)。

接下来,日志管理组件201检测到事件B要被写入(动作301)。然后,如箭头213B所表示的,日志管理组件201将事件B成功写入活动日志高速缓存结构231A(动作302)。更进一步地,如箭头212B所表示的,日志管理组件201还将事件B写入到活动易失性日志高速缓存221A(动作303)。此时,线程返回(如箭头214B所表示的)到事件提供者210B(动作304)。接下来,日志管理组件201检测到从日志高速缓存221A和231A到日志高速缓存221B和231B的活动日志高速缓存的改变。如将参照图4所描述的,作为响应,日志管理组件201将活动日志高速缓存221A和221B的事件预先串行化到存储器,并且将该事件串行化到持久性存储装置240上的日志241中。

第三,日志管理组件201检测到事件C要被写入(动作301)。然后,如箭头213C所表示的,日志管理组件201成功地将事件C写入当前处于活动的持久性日志高速缓存结构中的任一个持久性日志高速缓存结构(在该示例中,为日志高速缓存结构231B,由于检测到活动日志高速缓存中的改变)中(动作302)。更进一步地,如箭头212C所表示的,日志管理组件201还将事件C写入当前处于活动的易失性日志高速缓存中的任一个易失性日志高速缓存(在该示例中,为日志高速缓存221B,由于检测到活动日志高速缓存中的改变)中(动作303)。此时,线程返回(如箭头214C所表示的)到事件提供者210C(动作304)。

最后,日志管理组件201检测到事件D要被写入(动作301)。然后,如箭头213D所表示的,日志管理组件201将事件D成功写入活动日志高速缓存结构231B(动作302)。更进一步地,如箭头212D所表示的,日志管理组件201还将事件D写入活动易失性日志高速缓存221B(动作303)。此时,线程返回(如箭头214D所表示)到事件提供者210D(动作304)。此时,事件A到D的示例结束。然而,这个过程可能会无限期地继续,一个线程和事件之后接着另一个线程和事件,并且立即发生线程的返回。

图4图示了用于将日志高速缓存串行化到日志中的方法400的流程图。方法400可以在图2的系统200的上下文中执行。因而,现在频繁参考图2的系统200对图4的方法400进行描述。方法400可以通过比如图2的日志管理组件201执行。

在检测到活动日志高速缓存要要改变时(动作401),发起方法400。比如,如果日志高速缓存已经完全填满,则可能会发生这种情况。可替代地,在日志高速缓存的较早版本已经完全填满或者经过特定时间量之后,这可能会发生。比如,在图2的事件A至D的示例中,日志管理组件201检测到事件B被写入日志高速缓存的时间与事件C被写入日志高速缓存的时间之间活动日志高速缓存要发生改变。

在检测到活动日志高速缓存要改变之后,先前活动的日志高速缓存将其状态改变为填满(动作402),并且先前不活动的日志高速缓存将其状态改变为活动(动作403)。状态意指日志高速缓存不能再接收事件并且将要被写入日志中。活动状态意指日志高速缓存可以接收事件。比如,在图2的事件A至D的示例中,在事件B被写入日志高速缓存之后但在事件C被写入日志高速缓存之前,持久性日志高速缓存结构231A已经填满(动作402)并且持久性日志高速缓存结构231B变为活动(动作403)。在还使用易失性存储器220的实施例中,在事件B被写入日志高速缓存但事件C被写入日志高速缓存之前,易失性日志高速缓存221A已经填满(动作402)并且易失性日志高速缓存221B变为活动(动作403)。

然后,日志高速缓存的内容被预先串行化(动作404),串行化(动作405),然后写入日志241中(动作406)。预先串行化(动作404)是可选的,但有助于有效地串行化事件以用于存储和/或有效地将事件存储在日志中。预先串行化的示例包括移动以更有效地移除空白空间(诸如槽(slot)阵列移动)、校验和(checksum)生成和插入、加密、字节填充、压缩等。

然后,所得预先串行化的内容被串行化(动作405)以通过I/O信道传输到持久性存储装置。比如,在图2中,持久性日志高速缓存结构231A的内容的可选预先串行化和串行化由箭头215A表示。然而,如果采用易失性日志高速缓存,则易失性日志高速缓存221A的内容将进行如箭头215B所表示的预先串行化和串行化。

一旦内容被安全地存储在日志中(动作406),日志管理组件就确认存储(动作407),然后将日志高速缓存释放到可用状态(动作408)。可用状态意指日志高速缓存当前未被写入,但当日志管理组件如此指令时,可供日志管理组件以改变为活动状态。比如,在图2中,一旦写入215A或(在采用易失性日志高速缓存的情况下)写入215B被确认为已经完成到日志中(动作407),一旦日志管理组件201决定再次使用它们,日志高速缓存221A和231A每个都变为可用的以变为活动的。在这种情况下,因为不再需要先前填满的日志高速缓存的内容,所以它们将失效,并且在未来可能被安全地覆盖写入。可替代地,日志高速缓存可以用默认值和/或模式重新初始化以备未来使用。

通常此时,已经将事件写入该日志高速缓存的所有线程最终被释放。然而,不是批量释放所有陷入的线程之前,等待直到日志高速缓存被冲刷为止,而是在每次完成方法300时,一个接一个地释放线程。在目前的技术中,这会将时延从毫秒减少到可能的几微秒。

图5图示了用于将事件成功写入持久性存储装置的方法500的流程图。方法500是图3的动作302的示例,并且用于解释图2中所图示的持久性主存储器230内的一些剩余结构。方法500包括:将事件写入持久性主存储器的日志高速缓存结构中(动作501),并且还将槽结构分配给事件(动作502)。因而,图2的持久性主存储器230被图示为包括多个槽结构232。因为槽结构不复杂,所以它们可以相对较小。然后,修改槽结构(动作503)以表示在日志高速缓存结构中写入日志的位置,并且保留次序信息,该次序信息表示在其他事件也被写入日志高速缓存结构的上下文中写入该事件的次序。

在一个实施例中,槽的次序和位置的这种保留使用其根处具有日志高速缓存描述符的槽结构的链接列表来保留。比如,持久性主存储器中的一个日志高速缓存描述符可能与持久性主存储器中的每个持久性日志高速缓冲存结构相关联。比如,图2示出了持久性主存储器230还包括日志高速缓存描述符233。一个日志高速缓存描述符与每个持久性日志高速缓存结构相对应。比如,日志高速缓存描述符233A与持久性日志高速缓存231A相对应。类似地,日志高速缓存描述符233B至233D与相应的持久性日志高速缓存结构231B至231D相对应。

现在参照图6A至图6C对使用这种链接列表来跟踪持久性日志高速缓存结构内的事件的位置和次序的示例进行描述,该图6A至图6C示出了在执行到日志高速缓存的两个事件写入时链接列表的示例后续状态。

图6A图示了初始状态600A,其中日志高速缓存结构610是空的,但对应的日志高速缓存描述符620指示活动状态。作为示例,日志高速缓存结构610可以就在持久性日志高速缓存结构变得活动之后(在向其写入事件C之前)表示图2的持久性日志高速缓存结构231B,并且因此仍然是空的。日志高速缓存描述符620包括日志高速缓存描述符标识符字段621,其表示与日志高速缓存结构的逻辑关联(如通过线615用符号表示的)。日志高速缓存描述符620还包括具有“活动”值的状态字段622。

现在假设事件要被写入日志高速缓存结构610。比如,事件C在图2的示例中首先被写入日志高速缓存结构231B。事件被写入日志高速缓存结构(动作501)并且槽结构被分配。比如,在图6B中,状态600B示出了事件C已被写入位置611处。更进一步地,槽结构631已被分配。例如,槽结构631可以比如是图2的槽结构232中的一个槽结构。

槽结构被修改(动作503)以标识事件被写入日志高速缓存结构的位置,并且保留事件的次序。参考图6B,通过让日志高速缓存结构610的日志高速缓存描述符620内的指针623指向槽结构631,该槽结构631与日志高速缓存结构610相关联。槽结构631还包括位置描述632,其指向(如箭头651所表示的)事件C在日志高速缓存结构610内的位置611。该描述可以包括比如指向位置611的开始地址的指针以及位置611的大小。此时,恢复组件(诸如恢复组件202)可以使用状态600B来将易失性日志高速缓存221B恢复到事件C被写入之后但在事件D被写入之前其所处的状态。

现在假设另一事件将要被写入日志高速缓存结构610。比如,在图2的示例中,事件D接下来被写入日志高速缓存结构231B。事件被写入日志高速缓存结构(动作501)并且槽结构被分配。比如,在图6C中,状态600C示出了事件D已经写入位置612处。更进一步地,槽结构641已被分配。例如,槽结构641可以是图2的槽结构232中的一个槽结构。

槽结构被修改(动作503)以标识事件被写入日志高速缓存结构的位置,并且保留事件的次序。参照图6C,槽结构641包括位置描述642,其指向日志高速缓存结构610内的事件D的位置612(如箭头652所表示的)。该描述可以包括比如指向位置612的开始地址的指针以及位置612的大小。槽结构641首先被修改为具有指向链接列表中先前的第一槽结构631的指针643。然后,日志高速缓存描述符620内的指针623被修改为指向新槽结构641。因而,此时,恢复组件(诸如恢复组件202)可以使用状态600C来将易失性日志高速缓存221B恢复为它在事件C和D被写入之后所处的状态,并且还可以知道(基于链接列表中的次序)事件C发生在事件D之前。

图7图示了用于使用持久性存储装置中以及持久性主存储器中所保存的日志来恢复计算系统的方法700的流程图。比如,方法700可以由图2的恢复组件202执行。因而,现在将频繁参考图2的系统200对图7的恢复方法700进行描述。在该示例中,在持久性日志高速缓存231A的内容被写入持久性存储装置的日志241之前、但在事件C和D已被写入持久性日志高速缓存231B之后,发生故障。

恢复组件评估持久性存储装置中的日志以标识所存储的日志的结尾(动作701)。然后,恢复组件通过标识在所存储的日志的结尾之后具有事件的任何日志高速缓存结构来标识持久性主存储器中的日志的尾部(动作702)。在图2的示例中,假设持久性日志高速缓存结构231A和231B两者中的任一个的内容都未被写入持久性存储装置240的日志241。在这种情况下,持久性日志高速缓存结构231A和231B两者都是在日志241的结尾之后,并且因此包括日志的尾部。

还确认日志高速缓存结构的内容是有效的(动作703)。如果确认内容所处的状态与在事件写入之间一致,则日志高速缓存结构的内容有效。在这种情况下,假设持久性日志缓存结构都是有效的。

对于未在日志中进行串行化的所标识的有效日志高速缓存结构中的每个所标识的有效日志高速缓存结构,恢复组件随后将日志高速缓存结构的串行化的内容捕获到持久性存储装置中的日志中(动作704)。该操作被一次一个日志高速缓存结构地执行,并且以适当的时间次序发生,使得较早的日志高速缓存结构将比稍后的日志高速缓存结构更早地串行化到日志中。在使用易失性日志高速缓存的情况下,该捕获可以使用对于易失性日志高速缓存已经可用的现有的预先串行化和串行化过程。比如,可以首先将日志高速缓存结构的内容复制到易失性存储器中的对应日志高速缓存中,然后该内容(使用可选的预先串行化和串行化)从易失性日志高速缓存写入到持久性存储装置的日志中,其与先前所描述的动作404至406一致。

因而,已经描述了一种有效的用于记录的机制,其中线程发起向日志写入事件的时间和线程被返回的时间之间的时延被显著减少。在执行其他工作之前,线程不再需要等待直到整个日志高速缓存被串行化到日志中为止。更进一步地,在易失性存储器被使用以具有镜像持久性主存储器中的日志高速缓存的日志高速缓存的一些实施例中,预先串行化过程不需要被改变,并且因此即使在预先串行化期间发生故障,恢复也是可能的。

在不背离其精神或基本特征的情况下,可以以其他具体形式来体现本发明。所描述的实施例在所有方面仅被认为是说明性的而非限制性的。因此,本发明的范围由所附权利要求而非由前面的说明书来指示。落在权利要求的等同物的含义和范围内的所有变化都将被囊括在其范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1