共享数据同步方法及装置
技术领域
本申请涉及计算机技术领域,尤其涉及共享数据同步方法及装置。
背景技术
目前,部分开源数据库采用本地存储的方式,数据库的主节点和备节点各自维护一份数据,这种方式被称为“Shared-nothing”。采用这种“Shared-nothing”方式搭建的数据库,扩展难度较大。这是因为,新建一个只读实例时需要重新拷贝读写实例上的全量数据。当数据量较大时,整个过程将非常慢,而且增加一个只读实例就需要增加一份额外的存储开销。
为了解决上述问题,可以采用共享存储的架构(Shared-storage),数据库的主节点和备节点共享一份数据,从而能够更方便的增加只读实例(备节点)。
因此,如何在共享存储上实现主节点与备节点间的数据同步,成为了一个亟待解决的问题。
发明内容
本申请实施例提供了共享数据同步方法,分别应用于主节点和备节点,从而对于采用LSM树这种数据存储结构实现的数据库中,在共享存储上实现了主节点与备节点间共享数据的数据同步。
本申请实施例采用下述技术方案:
第一方面,本申请实施例提供一种共享数据同步方法,应用于备节点,其中,所述共享数据存储在共享存储空间中,所述共享存储空间采用日志结构合并LSM树的方式进行数据的存储,所述方法包括:
获取数据操作日志及其执行序号,获取元数据操作日志及其执行序号;
按照所述数据操作日志和所述元数据操作日志的执行序号,在本地重放所述数据操作日志和所述元数据操作日志。
优选的,本申请实施例第一方面提供的方法中,所述数据操作日志中包括:主节点将第一目标数据写入主节点内存表MemTable的操作日志;
则在本地重放所述数据操作日志,包括:
备节点将所述第一目标数据写入备节点内存表MemTable中,以得到与所述主节点相同的内存视图。
优选的,本申请实施例第一方面提供的方法中,所述数据操作日志中还包括:所述主节点在所述主节点MemTable的大小达到预设阈值时,将所述主节点MemTable置为只读状态、并创建新的主节点MemTable用于继续写入所述第一目标数据的操作日志;
则在本地重放所述数据操作日志,还包括:
所述备节点在所述备节点MemTable的大小达到预设阈值时,将所述备节点MemTable置为只读状态,并创建新的备节点MemTable用于继续写入所述第一目标数据,以得到与所述主节点相同的内存视图。
优选的,本申请实施例第一方面提供的方法中,所述元数据操作日志中包括:主节点执行磁盘写入操作和合并操作的操作日志;
在本地重放所述元数据操作日志,包括:
根据所述磁盘写入操作和合并操作的结果,在本地更改存储在所述备节点中的本地元数据以及本地元数据版本信息。
优选的,本申请实施例第一方面提供的方法中,所述方法还包括:
向主节点发送所述备节点的本地元数据版本信息,供所述主节点判断是否删除待删除队列中的无效数据。
优选的,本申请实施例第一方面提供的方法中,向主节点发送所述备节点的本地元数据版本信息,具体包括以下至少一项:
周期性的向所述主节点发送所述备节点的本地元数据版本信息;
在所述备节点的本地元数据版本信息被更改时,向所述主节点发送所述备节点的本地元数据版本信息。
优选的,本申请实施例第一方面提供的方法中,获取数据操作日志及其执行序号,包括以下至少一项:
周期性的获取存储在所述共享存储空间和/或主节点上的数据操作日志及其执行序号;
在接收到来自主节点的数据操作日志变化通知时,获取存储在所述共享存储空间和/或主节点上的数据操作日志及其执行序号。
优选的,本申请实施例第一方面提供的方法中,获取元数据操作日志及其执行序号,包括以下至少一项:
周期性的获取存储在所述共享存储空间和/或主节点上的元数据操作日志及其执行序号;
在接收到来自主节点的元数据操作日志变化通知时,获取存储在共享存储空间和/或主节点上的元数据操作日志及其执行序号。
优选的,本申请实施例第一方面提供的方法中,获取数据操作日志及其执行序号,包括:
拉取存储在所述共享存储空间和/或主节点上的数据操作日志及其执行序号。
优选的,本申请实施例第一方面提供的方法中,获取元数据操作日志及其执行序号,包括:
拉取存储在所述共享存储空间和/或主节点上的元数据操作日志及其执行序号。
第二方面,本申请实施例提供一种共享数据同步方法,应用于主节点,其中,所述共享数据存储在共享存储空间中,所述共享存储空间采用日志结构合并LSM树的方式进行数据的存储,所述方法包括:
基于第一类操作步骤,生成数据操作日志;
基于第二类操作步骤,生成元数据操作日志;
基于所述第一类操作步骤和所述第二类操作步骤的执行时间,确定所述数据操作日志和所述元数据操作日志的执行序号;
将所述数据操作日志、所述元数据操作日志、以及所述执行序号写入共享存储空间。
优选的,本申请实施例第二方面提供的方法中,在基于第一类操作步骤,生成数据操作日志之后,所述方法还包括:
向备节点发送数据操作日志变化通知,所述数据操作日志变化通知用于通知所述备节点获取所述数据操作日志。
优选的,本申请实施例第二方面提供的方法中,在基于第二类操作步骤,生成元数据操作日志之后,所述方法还包括:
向备节点发送元数据操作日志变化通知,所述元数据操作日志变化通知用于通知所述备节点获取所述元数据操作日志。
优选的,本申请实施例第二方面提供的方法中,所述第一类操作步骤包括:
将第一目标数据写入主节点内存表MemTable。
优选的,本申请实施例第二方面提供的方法中,所述第一类操作步骤还包括:
当所述主节点MemTable的大小达到预设阈值时,将所述主节点MemTable置为只读状态,并创建新的主节点MemTable用于继续写入所述第一目标数据。
优选的,本申请实施例第二方面提供的方法中,所述第二类操作步骤包括:
当内存中只读内存表MemTable的数量达到预设阈值时,执行磁盘写入操作,将所述只读MemTable以有序字符串表SSTable的形式顺序写入所述共享存储空间的磁盘;其中,所述只读MemTable为处于只读状态的主节点MemTable;
当所述SSTable的数量达到预设阈值时,执行合并操作,将多个SSTable重合的部分进行合并,生成新的SSTable。
优选的,本申请实施例第二方面提供的方法中,在执行合并操作,将多个SSTable重合的部分进行合并,生成新的SSTable之后,所述方法还包括:
将所述多个SSTable重合的部分确定为待删除的无效数据,并确定所述无效数据所对应的目标元数据版本信息;
将所述无效数据的标识信息、以及所述目标元数据版本信息添加入待删除队列中;
根据所述备节点的本地元数据版本信息,确定是否删除所述待删除队列中的所述无效数据。
优选的,本申请实施例第二方面提供的方法中,根据所述备节点的本地元数据版本信息,确定是否删除所述待删除队列中的所述无效数据,包括:
在所述本地元数据版本信息高于或者等于所述目标元数据版本信息的情况下,确定删除所述待删除队列中的所述无效数据。
优选的,本申请实施例第二方面提供的方法中,在根据所述备节点的本地元数据版本信息,确定是否删除所述待删除队列中的所述无效数据之前,所述方法还包括:
接收所述备节点的本地元数据版本信息。
优选的,本申请实施例第二方面提供的方法中,接收所述备节点的本地元数据版本信息,具体为:
周期性的接收所述备节点的本地元数据版本信息。
第三方面,本申请实施例提供一种共享数据同步装置,应用于备节点,其中,所述共享数据存储在共享存储空间中,所述共享存储空间采用日志结构合并LSM树的方式进行数据的存储,所述装置包括:
第一获取模块,用于获取数据操作日志及其执行序号;
第二获取模块,用于获取元数据操作日志及其执行序号;
本地重放模块,用于按照所述数据操作日志和所述元数据操作日志的执行序号,在本地重放所述数据操作日志和所述元数据操作日志。
第四方面,本申请实施例提供一种共享数据同步装置,应用于主节点,其中,所述共享数据存储在共享存储空间中,所述共享存储空间采用日志结构合并LSM树的方式进行数据的存储,所述装置包括:
数据操作日志生成模块,用于基于第一类操作步骤,生成数据操作日志;
元数据操作日志生成模块,用于基于第二类操作步骤,生成元数据操作日志;
执行序号确定模块,用于基于所述第一类操作步骤和所述第二类操作步骤的执行时间,确定所述数据操作日志和所述元数据操作日志的执行序号;
写入模块,用于将所述数据操作日志、所述元数据操作日志、以及所述执行序号写入共享存储空间。
第五方面,本申请实施例提供一种电子设备,其中,所述电子设备包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器执行以下操作:
获取数据操作日志及其执行序号,获取元数据操作日志及其执行序号;
按照所述数据操作日志和所述元数据操作日志的执行序号,在本地重放所述数据操作日志和所述元数据操作日志。
第六方面,本申请实施例提供一种计算机可读存储介质,其中,所述计算机可读存储介质存储一个或多个程序,所述一个或多个程序当被包括多个应用程序的电子设备执行时,使得所述电子设备执行以下操作:
获取数据操作日志及其执行序号,获取元数据操作日志及其执行序号;
按照所述数据操作日志和所述元数据操作日志的执行序号,在本地重放所述数据操作日志和所述元数据操作日志。
第七方面,本申请实施例提供一种电子设备,其中,所述电子设备包括:
处理器;以及
被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器执行以下操作:
基于第一类操作步骤,生成数据操作日志;
基于第二类操作步骤,生成元数据操作日志;
基于所述第一类操作步骤和所述第二类操作步骤的执行时间,确定所述数据操作日志和所述元数据操作日志的执行序号;
将所述数据操作日志、所述元数据操作日志、以及所述执行序号写入共享存储空间。
第八方面,本申请实施例提供一种计算机可读存储介质,其中,所述计算机可读存储介质存储一个或多个程序,所述一个或多个程序当被包括多个应用程序的电子设备执行时,使得所述电子设备执行以下操作:
基于第一类操作步骤,生成数据操作日志;
基于第二类操作步骤,生成元数据操作日志;
基于所述第一类操作步骤和所述第二类操作步骤的执行时间,确定所述数据操作日志和所述元数据操作日志的执行序号;
将所述数据操作日志、所述元数据操作日志、以及所述执行序号写入共享存储空间。
本申请实施例采用的上述至少一个技术方案能够达到以下有益效果:
在主节点和备节点之间共享一份存储在共享存储空间中的数据,并且,共享存储空间采用日志结构合并LSM树这种数据存储结构进行数据存储的情况下,备节点为实现与主节点之间的数据同步,将获取数据操作日志及其执行序号,还将获取元数据操作日志及其执行序号,并在此基础上按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。采用这种方式,备节点通过对日志的本地重放,能得到和主节点一致的内存视图和磁盘视图,从而能够实现主备节点之间的数据同步。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例所适用的数据库系统的架构示意图;
图2为本申请实施例中由备节点执行的共享数据同步方法的流程示意图;
图3为本申请实施例中由主节点执行的共享数据同步方法的流程示意图;
图4为本申请实施例中主节点生成数据操作日志的流程示意图;
图5为本申请实施例中主节点生成元数据操作日志的流程示意图;
图6为本申请实施例中无效数据删除过程的流程示意图;
图7为本申请实施例中应用于备节点的共享数据同步装置的结构示意图;
图8为本申请实施例中应用于主节点的共享数据同步装置的结构示意图;
图9为本申请实施例中一种电子设备的结构示意图;
图10为本申请实施例中又一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请实施例提供的数据同步方法,适用于如图1所示例的采用共享存储架构(Shared storage)搭建的数据库系统。该数据库系统中,包含一个主节点、多个备节点、以及由主节点和备节点共享的共享存储空间。可以理解到,主节点作为读写实例,可以向用户提供读数据服务和写数据服务;备节点又可称为备用节点,作为只读实例,仅向用户提供读数据服务。由于在该数据库系统中,主节点和备节点共享一份存储在共享存储空间中的数据,因此,相比于传统的主备节点各自维护一份全量数据的“Shared-nothing”数据库系统而言,图1所示的数据库系统能够更加方便的增加备节点。
在采用共享存储架构搭建的数据库系统中,可以采用多种数据存储组织结构搭建共享存储空间,管理共享存储空间中存储的数据。例如,多路搜索树Btree结构,日志结构合并LSM树,等等。需要说明的是,若采用Btree结构管理共享存储空间中的数据,主节点和备节点之间的数据同步将比较复杂,并且效率较低。
因此,本申请实施例提出了共享数据同步方法,以期在采用日志结构合并LSM树这种数据存储结构进行共享数据管理的数据库系统中,实现主节点与备节点间共享数据的数据同步,提高数据同步的效率。
需要说明的是,本申请实施例中所说的数据库系统,可以向用户(可具体化为数据库系统的客户端)提供数据的写入、读取、删除、修改等多种数据服务。其中,对数据的修改操作,可以拆分为读取-写入操作,或者可以拆分为读取-删除-写入操作。由于主节点或者备节点从共享存储空间中读取数据,并不会改变共享存储空间中的数据,因此,读取操作不会导致主备节点之间的数据不同步,在本申请实施例所提供的数据同步方法中无需重点说明。本申请实施例将着重介绍数据库系统中进行数据的写入操作和删除操作(可统称为数据的编辑操作)时,主备节点之间的数据同步问题。
以下结合附图,详细说明本申请各实施例提供的技术方案。
参见图2所示,本申请实施例提供了一种共享数据同步方法,应用于备节点。可以理解到,该方法所适用的数据库系统中,共享存储空间是采用日志结构合并LSM树的方式进行数据存储和管理的。备节点所执行的共享数据同步方法,可具体包括:
步骤S101:获取数据操作日志及其执行序号。
本申请实施例中,备节点执行步骤S101,获取数据操作日志及其执行序号时,可以是按照预设的时间间隔周期性的执行,也可以在接收到主节点或者共享存储空间发送的通知消息(例如,数据操作日志变化通知)时执行。相对应的,主节点或者共享存储空间可以在生成了新的数据操作日志时向备节点发送通知消息(例如,数据操作日志变化通知),以便触发备节点获取数据操作日志及其执行序号。
需要说明的是,数据操作日志是由主节点在其本地内存上进行数据相关操作时生成的。具体的,数据操作日志,是主节点在编辑数据的过程中执行对本地内存的数据操作(可记为第一类操作步骤)时生成的,主节点还会将数据操作日志及其执行序号写入共享存储空间。因此,备节点既可以从共享存储空间中获取数据操作日志及其执行序号,也可以从主节点中获取。
优选的,为便于数据库系统的扩展,以备节点从共享存储空间中获取数据操作日志及其执行序号的方式为更优。
进一步的,每条数据操作日志中可以包含操作的动作类型以及所操作的数据内容。数据操作日志中所记录的操作,均是主节点对其本地内存(即主节点的内存)的操作。例如,若数据操作日志所对应的动作类型为新增一条数据,则操作的数据内容可以是新增数据的内容,等等。
还需要说明的是,备节点执行步骤S101,获取数据操作日志及其执行序号时,可以有多种具体的获取方式:可以由共享存储空间和/或主节点基于数据操作日志的变化,或者基于备节点发送的数据操作日志获取请求,或者基于预设的推送周期,主动将数据操作日志及其执行序号推送到备节点;也可以由备节点基于主节点发送的数据操作日志变化通知,或者基于预设的获取周期,主动从共享存储空间和/或主节点拉取数据操作日志及其执行序号。
优选的,由于共享存储空间通常会以分布式系统的方式构建,将有多个节点并行提供服务,因此,备节点执行步骤S101时,优选采用从共享存储空间上拉取数据操作日志及其执行序号的方式进行。
步骤S103:获取元数据操作日志及其执行序号。
本申请实施例中,备节点执行步骤S103获取元数据操作日志及其执行序号的时机和方式,与获取数据操作日志及其执行序号的时机和方式类似,可以是按照预设的时间间隔周期性的执行,也可以在接收到主节点或者共享存储空间发送的通知消息(例如,元数据操作日志变化通知)时执行。相对应的,主节点或者共享存储空间可以在生成了新的元数据操作日志时向备节点发送通知消息(例如,元数据操作日志变化通知),以便触发备节点获取元数据操作日志及其执行序号。
需要说明的是,元数据操作日志是由主节点在共享存储空间的磁盘上进行数据相关操作时生成的。具体的,元数据操作日志,是主节点在编辑数据的过程中执行对共享存储空间的磁盘的数据操作(可记为第二类操作步骤)时生成的,主节点还会将元数据操作日志及其执行序号写入共享存储空间。因此,备节点既可以从共享存储空间中获取元数据操作日志及其执行序号,也可以从主节点中获取。
优选的,为便于数据库系统的扩展,以备节点从共享存储空间中获取元数据操作日志及其执行序号的方式为更优。
进一步的,每条元数据操作日志中可以包含操作的动作类型以及所操作的数据内容。元数据操作日志中所记录的操作,均是主节点对共享存储空间的磁盘的操作。例如,若元数据操作日志所对应的动作类型为新增一条数据,则操作的数据内容可以是新增数据的内容,等等。
还需要说明的是,备节点执行步骤S103,获取元数据操作日志及其执行序号时,可以有多种具体的获取方式:可以由共享存储空间和/或主节点基于元数据操作日志的变化,或者基于备节点发送的元数据操作日志获取请求,或者基于预设的推送周期,主动将元数据操作日志及其执行序号推送到备节点;也可以由备节点基于主节点发送的元数据操作日志变化通知,或者基于预设的获取周期,主动从共享存储空间和/或主节点拉取元数据操作日志及其执行序号。
优选的,由于共享存储空间通常会以分布式系统的方式构建,将有多个节点并行提供服务,因此,备节点执行步骤S103时,优选采用从共享存储空间上拉取元数据操作日志及其执行序号的方式进行。
本申请实施例中,备节点获取数据操作日志和元数据操作日志的时机和方式,可以相同,也可以不同,本申请实施例对此不做限定。
步骤S105:按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。
在本申请实施例中,备节点执行步骤S101和步骤S103获取到的数据操作日志和元数据操作日志的执行序号,均由主节点在生成数据操作日志和元数据操作日志之后,基于第一类操作步骤和第二类操作步骤的执行时间确定。能够理解,执行序号反映的是主节点执行第一类操作步骤和第二类操作步骤的相对顺序,体现为逻辑递增序号即可,而并不直接反映主节点执行第一类操作步骤和第二类操作步骤的具体执行时间(可以理解为主节点执行具体操作步骤时的物理时间)。
例如,备节点执行步骤S101获取到三条数据操作日志,执行序号分别为1、2、4,还执行步骤S103获取到两条元数据操作日志,执行序号分别为3、5,则备节点在执行步骤S105进行本地重放时,将按照执行序号依次递增的方式,重放数据操作日志和元数据操作日志。
本申请实施例中,主节点在其本地内存所执行的不同的第一类操作步骤,将对应生成不同内容的数据操作日志。因此,相对应的,备节点根据数据操作日志在其本地内存(可以理解为备节点的内存)中进行重放时的具体步骤也将不同。
可选的,若数据操作日志中包括:主节点将第一目标数据写入主节点内存表MemTable的操作日志,则备节点执行步骤S105在本地重放数据操作日志时,可包括:将第一目标数据写入备节点内存表MemTable中,以得到与主节点相同的内存视图。
可选的,若数据操作日志中还包括:主节点在主节点MemTable的大小达到预设阈值时,将主节点MemTable置为只读状态、并创建新的主节点MemTable用于继续写入第一目标数据的操作日志;则备节点执行步骤S105在本地重放数据操作日志时,还可包括:在备节点MemTable的大小达到预设阈值时,将备节点MemTable置为只读状态,并创建新的备节点MemTable用于继续写入第一目标数据,以期得到与主节点相同的内存视图。
需要说明的是,本申请实施例中所说的在本地重放数据操作日志,可以理解为备节点在其本地内存(即备节点的内存)上重复进行主节点在其本地内存(即主节点的内存)上所执行的操作。可以理解到,备节点在按照主节点的第一类操作步骤(该操作步骤为生成数据操作日志的操作步骤)进行了本地重放后,备节点上将能够得到与主节点相同的内存视图。可以理解为,备节点的内存中将呈现出与主节点的内存相同的数据内容和数据结构。因此,通过这一过程实现了主节点与备节点在内存层面的数据同步。
本申请实施例中,主节点在对共享存储空间上的磁盘所执行的不同的第二类操作步骤不同,将对应生成不同内容的元数据操作日志。因此,相对应的,备节点根据元数据操作日志进行本地重放时的具体步骤也将不同。
可选的,若元数据操作日志中包括:主节点执行磁盘写入操作和合并操作的操作日志,则在本地重放元数据操作日志时,可以根据磁盘写入操作和合并操作的结果,在本地更改存储在备节点中的本地元数据以及本地元数据版本信息。
需要说明的是,存储在共享存储空间中的元数据操作日志将会随着主节点所执行的第二类操作步骤而更新。每生成一条新的元数据操作日志,就会对应产生一个元数据的新版本。因此,各个版本的元数据,可以理解为主节点执行第二类操作步骤的执行结果。
能够理解,备节点在其本地内存中也维护着如上所述的元数据的版本,相当于一个文件集合列表,以便为用户提供读数据服务时,可以根据该列表进行文件的查找。因此,备节点获取到元数据操作日志及其执行序号后进行本地重放,可以理解为,备节点在其本地内存(即备节点的内存)中更新本地元数据版本信息为元数据操作日志所对应的元数据版本信息,从而获取到共享存储空间中更新的文件集合列表,完成与主节点在磁盘层面的数据同步。
还需要说明的是,由于元数据操作日志是基于主节点对共享存储空间上的磁盘进行的数据操作生成的,因此,备节点在本地重放元数据操作日志时,并不需要、也不能对共享存储空间上的磁盘再次进行同样的操作,因此,本申请实施例中所说的在本地重放元数据操作日志,可以理解为备节点将主节点对共享存储空间上的磁盘的数据操作的结果在本地(即在备节点上)记录下来,以便更新备节点中的本地元数据以及本地元数据版本信息。每个版本的元数据都对应一个文件集合列表,该文件集合列表中能够反映共享存储空间中所存储的文件的位置、大小、标识等元数据信息。
可以理解到,在本地重放元数据操作日志,将使得备节点的本地元数据与主节点所得到的元数据一致,备节点的本地元数据版本信息与主节点所得到的元数据版本信息一致,从而备节点可以获得与主节点一致的磁盘视图。因此,通过这一本地重放过程能够实现主节点与备节点在磁盘层面的数据同步。
需要特别说明的是,相比于主节点生成数据操作日志和元数据操作日志的时间而言,备节点获取到的数据操作日志和元数据操作日志存在一定的滞后性,因此,备节点基于数据操作日志和元数据操作日志进行本地重放所得到的内存视图和磁盘视图(可以统称为数据视图),相比于主节点的内存视图和磁盘视图也可能存在一定的滞后性。尤其是,如果主节点持续不断地执行第一类操作步骤和/或第二类操作步骤进行数据的写入,则也将持续不断的生成新的数据操作日志和/或元数据操作日志,这种情况下,备节点所得到的内存视图和磁盘视图,将始终滞后于主节点。因此,确切的说,备节点所得到的内存视图和磁盘视图,将与主节点的当前时刻或者历史上某个时间点的数据视图相同。
在主节点和备节点之间共享一份存储在共享存储空间中的数据,并且,共享存储空间采用日志结构合并LSM树这种数据存储结构进行数据存储的情况下,备节点为实现与主节点之间的数据同步,将获取数据操作日志及其执行序号,还将获取元数据操作日志及其执行序号,并在此基础上按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。采用这种方式,备节点通过对日志的本地重放,能得到和主节点一致的内存视图和磁盘视图,从而能够实现主备节点之间的数据同步。
与备节点执行的共享数据同步方法相对应的,本申请实施例还提供了一种由主节点执行的共享数据同步方法,参见图3所示。该方法包括:
S201:基于第一类操作步骤,生成数据操作日志。
可选的,第一类操作步骤可以包括:将第一目标数据写入主节点内存表MemTable。相对应的,主节点基于这一操作步骤生成的数据操作日志中,将会记录操作的类型,以及被写入的第一目标数据的内容。备节点基于该数据操作日志进行本地重放时,也会相对应的将第一目标数据写入备节点内存表MemTable中,以期得到与主节点相同的内存视图。
可选的,第一类操作步骤还可以包括:当主节点MemTable的大小达到预设阈值时,将主节点MemTable置为只读状态,并创建新的主节点MemTable用于继续写入第一目标数据。相对应的,主节点基于这一操作步骤生成的数据操作日志中,将会记录操作的类型——内存表切换操作(可称为Switch Memtable的操作)。备节点基于该数据操作日志进行本地重放时,也会相对应的在备节点MemTable的大小达到预设阈值时,将备节点MemTable置为只读状态,并创建新的备节点MemTable用于继续写入第一目标数据,以期得到与主节点相同的内存视图。
可选的,在执行步骤S201基于第一类操作步骤,生成数据操作日志之后,主节点还可以进一步向备节点发送数据操作日志变化通知,以便通知备节点获取数据操作日志。相对应的,备节点可以在接收到来自主节点的数据操作日志变化通知时,向共享存储空间和/或主节点发起数据操作日志获取请求,或者直接拉取存储在共享存储空间和/或主节点上的数据操作日志。可以理解到,主节点也可以在执行了步骤S205确定了数据操作日志的执行序号之后,再向备节点发送数据操作日志变化通知,以触发备节点获取数据操作日志及其执行序号。
S203:基于第二类操作步骤,生成元数据操作日志。
可选的,第二类操作步骤可具体包括:当内存中只读内存表MemTable的数量达到预设阈值时,执行磁盘写入操作,将只读MemTable以有序字符串表SSTable的形式顺序写入共享存储空间的磁盘,其中,只读MemTable为处于只读状态的主节点MemTable。
可选的,第二类操作步骤还可包括:当SSTable的数量达到预设阈值时,执行合并操作,将多个SSTable重合的部分进行合并,生成新的SSTable。主节点可以根据磁盘写入操作和合并操作,生成元数据操作日志。相对应的,备节点获取到元数据操作日志后,会在备节点本地记录磁盘写入操作和合并操作的结果,形成更新后的元数据信息,以期得到与主节点相同的数据视图。
可选的,在执行步骤S203基于第二类操作步骤,生成元数据操作日志之后,主节点还可以进一步向备节点发送元数据操作日志变化通知,以便通知备节点获取元数据操作日志。相对应的,备节点可以在接收到来自主节点的元数据操作日志变化通知时,向共享存储空间和/或主节点发起元数据操作日志获取请求,或者直接拉取存储在共享存储空间和/或主节点上的元数据操作日志。可以理解到,主节点也可以在执行了步骤S205确定了元数据操作日志的执行序号之后,再向备节点发送元数据操作日志变化通知,以触发备节点获取元数据操作日志及其执行序号。
S205:基于第一类操作步骤和第二类操作步骤的执行时间,确定数据操作日志和元数据操作日志的执行序号。
可以理解到,第一类操作步骤和第二类操作步骤的执行时间,可以理解为基于主节点本地的时间系统所记录的、第一类操作步骤和第二类操作步骤执行时的物理时间。可以理解到,对于备节点而言,需要按照操作步骤之间的执行顺序进行本地重放,才可能得到与主节点相同的数据视图,包括基于数据操作日志得到的内存视图和基于元数据操作日志得到的磁盘视图。因此,主节点在生成日志后,基于操作步骤的执行时间,根据执行时间的先后顺序,确定数据操作日志和元数据操作日志的执行序号,以便备节点在本地重放时,可以按照执行序号进行日志的重放。
例如,主节点执行步骤S201生成三条数据操作日志(分别为日志A1、日志A2、日志A3),还执行步骤S203生成两条元数据操作日志(分别为日志B1、日志B2)。对这三条数据操作日志和两条元数据操作日志,按照执行时间的先后排序为:日志A1、日志A2、日志B1、日志A3、日志B2,则主节点在基于执行时间确定执行序号时,将确定日志A1的执行序号为1,日志A2的执行序号为2,日志B1的执行序号为3,日志A3的执行序号为4,日志B2的执行序号为5。
相对应的,备节点获取到上述三条数据操作日志和两条元数据操作日志及其执行序号后,也将按照日志A1、日志A2、日志B1、日志A3、日志B2的顺序进行本地重放,以期得到与主节点相同的内存视图和磁盘视图。
需要特别说明的是,在具体实施时,主节点既可以每生成一条数据操作日志或者元数据操作日志,就确定日志(包括数据操作日志和/或元数据操作日志)对应的执行序号,也可以在生成多条日志后,再根据这多条日志的执行时间,确定每条日志对应的执行序号。
S207:将数据操作日志、元数据操作日志、以及执行序号写入共享存储空间。
主节点将数据操作日志、元数据操作日志、以及执行序号写入共享存储空间,从而使得备节点既可以从主节点获取日志,也可以从共享存储空间获取日志,有利于数据库系统的扩展性。
以上介绍了主节点生成数据操作日志和元数据操作日志,以及备节点基于数据操作日志、元数据操作日志及执行序号进行本地重放的过程。以下结合LSM树的数据组织方式,进一步阐释这一过程。
LSM树的基本思想,是将新写入的数据保存在主节点的本地内存中,达到一定数量后再将新写入的数据批量写入磁盘(此处具体为共享存储空间中的磁盘),在写入的过程中可以与之前已经存在的数据(即已经存储在共享存储空间的数据)进行合并。
在本申请实施例中,日志结构合并LSM树的数据存储结构包含内存存储和磁盘存储两部分。以下结合图4、图5和图6中给出的交互流程示意图,简要介绍向以LSM树方式构建的共享存储空间中写入数据的主要过程。
首先,参见图4所示,主节点接收到来自用户(可以是数据库系统的客户端)的写数据请求后,可以先将写入数据的操作追加到数据操作日志中,即,在Data Oplog(全称DataOperation-log)里持久化。可以理解到,可以将数据操作日志存储在共享存储空间上,此时,共享存储空间上将新增一条数据操作日志。
需要说明的是,数据操作日志中包含操作的类型,例如,新增一条数据的操作,删除一条数据的数据,修改某条数据的操作,还是切换内存表(Switch Memtable)的操作,等等。除此之外,数据操作日志中还包含被操作的数据的内容。例如,新增一条数据的操作,其日志中包含新增的数据的内容。又例如,删除一条数据的操作,其日志中包含被删除的数据的内容。再例如,修改某条数据的操作,其日志中包含修改前的数据的内容和修改后数据的内容。
其次,参见图4所示,在追加数据操作日志成功后,主节点会将写数据请求所请求写入的数据(可记为第一目标数据)写入主节点的本地内存中,具体为写入主节点本地的内存表MemTable中。这一过程将记录在数据操作日志中。需要说明的是,MemTable在节点的内存中,用于记录最近修改的数据,可以用跳跃表来组织。
再次,参见图4所示,主节点监控内存表MemTable的大小。当内存表MemTable写满时,即内存表MemTable的大小达到一预设阈值时,将写满的内存表MemTable置为只读状态,形成只读内存表MemTable(可表述为Immutable MemTable);并且,创建一个新的内存表MemTable用于继续写入新的数据(具体为第一目标数据)。
可以理解到,此时存在切换内存表MemTable的操作,即,由向原内存表MemTable中写入数据,切换为向新创建的内存表MemTable中写入数据,因此,会产生一条新的数据操作日志。同样的,主节点会将这一操作追加写入共享存储空间上的数据操作日志中,相对应的,共享存储空间上也将新增一条数据操作日志。
然后,参见图5所示,主节点监控本地内存中只读内存表MemTable的数量。当只读内存表MemTable的数量达到一预设阈值时,主节点将执行磁盘写入操作,将只读MemTable以有序字符串表SSTable(全称Sorted String Table)的形式顺序写入(Flush)共享存储空间的磁盘中。可以理解到,此时,主节点向共享存储空间的磁盘中写入数据,将生成元数据操作日志;相对应的,共享存储空间会将SSTable写入磁盘中,并且新增对应的元数据操作日志。
最后,参见图5所示,主节点还监控共享存储空间中有序字符串表SSTable的数量。当SSTable的数量达到一预设阈值时,主节点执行合并操作,将多个SSTable重合的部分进行合并,生成新的SSTable,并进而将新的SSTable写入共享存储空间的磁盘中。可以理解到,此时,主节点又将向共享存储空间的磁盘中写入数据(具体为新的SSTable),因而将生成元数据操作日志;相对应的,共享存储空间会将新的SSTable写入磁盘中,并且新增对应的元数据操作日志。
可以理解到,若主节点接收到来自用户的数据删除请求,则可以响应数据删除请求进行数据的删除,并对应的生成一条数据操作日志。备节点获取到该条数据操作日志后,在本地进行重放,即可得到该数据被删除的状态。
以上主要介绍了在写入数据的过程中数据操作日志和元数据操作日志的生成过程,以及共享存储空间中数据的变化。可以理解到,备节点执行本申请实施例所提供的数据同步方法,可以基于数据操作日志、元数据操作日志及其执行序号进行本地重放,以期得到与主节点一致的内存视图和磁盘视图,高效的实现了主备节点之间的数据同步。
在部分情况下,存储在共享存储空间中磁盘上的数据可能会成为无效数据。例如,主节点在进行合并操作时,会将多个SSTable重合的部分进行合并,生成新的SSTable,则用来合并生成新的SSTable的多个原SSTable将成为冗余数据,共享存储空间中将不再需要继续保留这部分无效数据。这些无效数据,可以理解为合并前的数据,用于进行合并的数据,或者多个SSTable重合的部分。因此,主节点在执行合并操作之后将需要删除这部分合并前的SSTable文件,以便释放这些无效数据所占用的存储空间。
能够理解,如果主节点不执行合并(Compaction)操作,则主节点上的数据就会一直膨胀,读取速度将变慢,所占用的存储空间也会增加,导致主节点可能无法持续提供正常服务。因此,采用日志结构合并LSM树的方式进行数据的存储时,主节点通常都会不断的进行数据的合并操作。
在非共享存储的数据库架构下,主节点完成对数据的整理合并后即可直接清理无效数据。而在共享存储的数据库架构下,备节点对共享存储空间上存储的数据是有依赖的,因此,主节点必须确保备节点无需使用这些无效数据了,才能够安全的删除这些无效数据。
具体的,由于备节点获取到的内存视图和磁盘视图将滞后于主节点,因此,若主节点直接将这部分无效数据删除,则在备节点仍然需要访问这部分数据时,例如,备节点基于尚未更新的元数据信息,响应用户读取这部分数据的请求时,可能会出现访问失败等异常状况。因此,本申请实施例还进一步给出了安全删除无效数据的方法。
参见图6所示,主节点执行合并操作,将多个SSTable重合的部分进行合并,生成新的SSTable后,可以进一步将多个SSTable重合的部分确定为待删除的无效数据,并确定无效数据所对应的目标元数据版本信息;然后,将无效数据的标识信息、以及目标元数据版本信息添加入待删除队列中;进而可以根据备节点的本地元数据版本信息,确定是否删除待删除队列中的无效数据。
为实现数据的安全删除,备节点可以向主节点发送备节点的本地元数据版本信息,供主节点判断是否删除待删除队列中的无效数据。
可选的,备节点可以周期性的向主节点发送备节点的本地元数据版本信息,以便主节点能够及时的获知备节点的本地元数据版本信息。能够理解,备节点发送本地元数据版本的周期,与备节点获取数据操作日志或元数据操作日志的周期(如果有)可以相同,也可以不同。
可选的,备节点也可以在备节点的本地元数据版本信息被更改时,将更新后的本地元数据版本信息即时发送给主节点。
可选的,备节点向主节点发送本地元数据版本信息时,可以通过网络发送,也可以通过共享存储空间的文件读写来实现,本申请实施例对此不做限定。
相对应的,主节点在接收到备节点的本地元数据版本信息的基础上,根据备节点的本地元数据版本信息,确定是否删除待删除队列中的无效数据时,就可以在本地元数据版本信息高于或者等于目标元数据版本信息的情况下,确定删除待删除队列中的无效数据。
可以理解到,备节点的本地元数据版本信息高于或者等于目标元数据版本信息,表示备节点已经获取了新的元数据操作日志(也就是与形成目标元数据版本信息的合并操作相对应的元数据操作日志),已经得到了多个SSTable重合的部分(相当于待删除的无效数据)被合并后的磁盘视图,因此,可以确定删除待删除队列中的无效数据,进而可以从共享存储空间中删除无效数据。
以下将举例说明主节点因执行合并操作而对无效数据进行删除的过程。
假设主节点执行磁盘写入操作,将文件3写入共享存储空间中。这一操作将对应产生一条新的元数据操作日志,在共享存储空间形成元数据版本信息为V5的元数据。此时,元数据版本信息为V5的元数据所对应的文件集合列表为<文件1,文件2,文件3>。
进一步的,主节点在满足条件时执行合并操作,将文件2和文件3合并为文件4。这一操作同样会对应产生一条新的元数据操作日志,在共享存储空间形成元数据版本信息为V6的元数据。此时,元数据版本信息为V6的元数据所对应的文件集合列表为<文件1,文件4>。
由此可见,文件2和文件3对于主节点而言已经失效,主节点将不再需要使用文件2和文件3,因此,可以将文件2和文件3确定为待删除的无效数据。进而可以将无效数据的标识信息、以及目标元数据版本信息(此处,目标元数据版本信息为V6)添加入待删除队列中,具体的,此处可以将<V6,文件2>和<V6,文件3>两条记录添加入待删除队列中。<V6,文件2>所表达的含义是,当所有的备节点的本地元数据版本信息都同步到高于或等于V6版本时,就可以从共享存储空间中安全的删除文件2了。
与此同时,备节点不断的从共享存储空间和/或主节点中获取(例如,采用拉取的方式)元数据操作日志,当获取到用于形成元数据版本信息V6的元数据操作日志后,备节点将在本地重放,更改存储在备节点中的本地元数据为<文件1,文件4>,并更新备节点的本地元数据版本信息为V6版。当备节点将更新为V6版本的本地元数据版本信息发送到主节点时,主节点就能够确定备节点的本地元数据版本信息(此时为V6)已经高于或者等于待删除队列中文件2和文件3所对应的目标元数据版本信息(此时为V6)。在这种情况下,主节点就可以安全的将文件2和文件3从共享存储空间中删除了,这是因为,备节点的本地元数据版本信息已经更新到使得文件2和文件3失效的目标元数据版本信息,表示备节点将不再请求访问文件2和文件3,因此,将文件2和文件3从共享存储空间中删除,并不会造成读取失败等异常响应。
可以理解到,如果数据库系统中包含多个备节点,则主节点需要确保每一个备节点的本地元数据版本信息都高于或者等于目标元数据版本信息,才能删除对应的无效数据。
在本申请实施例中,采用上述方法,能够根据备节点的数据同步进度(尤其是磁盘数据的同步进度)进行无效数据的回收,既能够及时释放共享存储空间的存储资源,又能够保证备节点的正常读取服务,满足数据库系统的运维需求。
参见图7所示,本申请实施例还提供一种共享数据同步装置,应用于备节点,其中,共享数据存储在共享存储空间中,共享存储空间采用日志结构合并LSM树的方式进行数据的存储。该装置可具体包括:
第一获取模块101,用于获取数据操作日志及其执行序号;
第二获取模块103,用于获取元数据操作日志及其执行序号;
本地重放模块105,用于按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。
能够理解,上述共享数据同步装置,能够实现前述实施例中提供的由备节点执行的共享数据同步方法的各个步骤,关于共享数据同步方法的相关阐释均适用于共享数据同步装置,此处不再赘述。
参见图8所示,本申请实施例还提供一种共享数据同步装置,应用于主节点,其中,共享数据存储在共享存储空间中,共享存储空间采用日志结构合并LSM树的方式进行数据的存储。该装置可具体包括:
数据操作日志生成模块201,用于基于第一类操作步骤,生成数据操作日志;
元数据操作日志生成模块203,用于基于第二类操作步骤,生成元数据操作日志;
执行序号确定模块205,用于基于第一类操作步骤和第二类操作步骤的执行时间,确定数据操作日志和元数据操作日志的执行序号;
写入模块207,用于将数据操作日志、元数据操作日志、以及执行序号写入共享存储空间。
能够理解,上述共享数据同步装置,能够实现前述实施例中提供的由主节点执行的共享数据同步方法的各个步骤,关于共享数据同步方法的相关阐释均适用于共享数据同步装置,此处不再赘述。
图9是本申请的一个实施例电子设备的结构示意图。请参考图9,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图9中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成共享数据同步装置,应用于备节点。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
获取数据操作日志及其执行序号,获取元数据操作日志及其执行序号;
按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。
上述如本申请图2所示实施例揭示的共享数据同步装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
该电子设备还可执行图2中共享数据同步装置执行的方法,并实现共享数据同步装置在图2所示实施例的功能,本申请实施例在此不再赘述。
本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图2所示实施例中共享数据同步装置执行的方法,并具体用于执行:
获取数据操作日志及其执行序号,获取元数据操作日志及其执行序号;
按照数据操作日志和元数据操作日志的执行序号,在本地重放数据操作日志和元数据操作日志。
图10是本申请的一个实施例电子设备的结构示意图。请参考图10,在硬件层面,该电子设备包括处理器,可选地还包括内部总线、网络接口、存储器。其中,存储器可能包含内存,例如高速随机存取存储器(Random-Access Memory,RAM),也可能还包括非易失性存储器(non-volatile memory),例如至少1个磁盘存储器等。当然,该电子设备还可能包括其他业务所需要的硬件。
处理器、网络接口和存储器可以通过内部总线相互连接,该内部总线可以是ISA(Industry Standard Architecture,工业标准体系结构)总线、PCI(PeripheralComponent Interconnect,外设部件互连标准)总线或EISA(Extended Industry StandardArchitecture,扩展工业标准结构)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
存储器,用于存放程序。具体地,程序可以包括程序代码,所述程序代码包括计算机操作指令。存储器可以包括内存和非易失性存储器,并向处理器提供指令和数据。
处理器从非易失性存储器中读取对应的计算机程序到内存中然后运行,在逻辑层面上形成共享数据同步装置,应用于主节点。处理器,执行存储器所存放的程序,并具体用于执行以下操作:
基于第一类操作步骤,生成数据操作日志;
基于第二类操作步骤,生成元数据操作日志;
基于第一类操作步骤和第二类操作步骤的执行时间,确定数据操作日志和元数据操作日志的执行序号;
将数据操作日志、元数据操作日志、以及执行序号写入共享存储空间。
上述如本申请图3所示实施例揭示的共享数据同步装置执行的方法可以应用于处理器中,或者由处理器实现。处理器可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(Digital SignalProcessor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件完成上述方法的步骤。
该电子设备还可执行图3中共享数据同步装置执行的方法,并实现共享数据同步装置在图3所示实施例的功能,本申请实施例在此不再赘述。
本申请实施例还提出了一种计算机可读存储介质,该计算机可读存储介质存储一个或多个程序,该一个或多个程序包括指令,该指令当被包括多个应用程序的电子设备执行时,能够使该电子设备执行图3所示实施例中共享数据同步装置执行的方法,并具体用于执行:
基于第一类操作步骤,生成数据操作日志;
基于第二类操作步骤,生成元数据操作日志;
基于第一类操作步骤和第二类操作步骤的执行时间,确定数据操作日志和元数据操作日志的执行序号;
将数据操作日志、元数据操作日志、以及执行序号写入共享存储空间。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。