分布式集群环境中的数据更新方法及装置与流程

文档序号:12123950阅读:1428来源:国知局
分布式集群环境中的数据更新方法及装置与流程

本申请涉及数据处理技术领域,尤其涉及一种分布式集群环境中的数据更新方法及装置。



背景技术:

对于处理海量数据的分布式集群环境,包括若干分布式的数据库(DB)服务器集群和数量更多的分布式的应用服务器集群。当有对DB服务器集群的某个DB中的业务对象的数据(以下简称数据)的更新请求时,更新请求被随机或者按照一定策略被分配到应用服务器集群中的任意一台应用服务器,由这台应用服务器从DB中读取数据,对该数据进行修改后再更新到DB中。

在分布式高并发集群环境中,对DB中的一条数据的高并发更新是很常见的事情。由于对一条数据的更新是高度并发的,意味着同一时刻,会有很多个针对同一条数据的更新请求。那必须要保证响应于一个更新请求而进行的读取数据、修改数据并更新到DB的期间,其他对该数据的访问必须阻塞,以保证数据更新的准确性。

现有的一种方案,通过DB的行级锁和事务结合来保证数据更新的准确性。其中,读取数据、修改数据并更新到DB在一个事务中。以DB服务器集群使用的数据库为mysql为例,在数据更新的事务开始时,对DB中的这条数据加行级锁,以阻塞其他事务对这条数据的访问。这种方案虽然保证了数据更新的准确性,但将并发的访问请求变成了串行,极大降低了DB服务器的吞吐量(tps),造成DB服务器的性能及可靠性下降,甚至影响整个系统的性能。

现有的另一种方案,通过乐观锁来保证数据更新的准确性。通常是在DB表中加版本(version)的字段,每次数据更新时,将version 字段的取值加1,如果更新到DB的数据的version字段的取值比读取该数据时的version字段的取值大1才允许更新。这种方案虽然保证了数据更新的准确性,但如果对一条数据的并发更新量非常大时,更新失败率会非常高,需要不断重试,这必然导致DB服务器的负荷(load)较高,造成DB服务器的性能及可靠性下降,甚至影响整个系统的性能。



技术实现要素:

本申请的目的是提供一种分布式集群环境中的数据更新方法及装置,能够在保证数据更新准确的前提下,保证DB服务器的性能和可靠性。

根据本申请的一个方面,提供一种分布式集群环境中的数据更新方法,该方法包括以下步骤:尝试排它锁定与所述分布式集群环境中的其他应用服务器共享的存储空间中记录的、更新请求针对的业务对象;如果锁定成功,对所述业务对象在所述分布式集群环境的数据库中对应的数据进行更新;更新完成后,释放对所述存储空间中记录的所述业务对象的锁定。

根据本申请的另一方面,还提供了一种分布式集群环境中的数据更新装置,该装置包括以下模块:记录锁定模块,用于尝试排它锁定与所述分布式集群环境中的其他应用服务器共享的存储空间中记录的、更新请求针对的业务对象;数据更新模块,用于如果锁定成功,对所述业务对象在所述分布式集群环境的数据库中对应的数据进行更新;锁定释放模块,用于更新完成后,释放对所述存储空间中记录的所述业务对象的锁定。

与现有技术相比,本申请具有以下优点:现有技术中无论采用行级锁还是乐观锁的方式对DB中的数据进行更新,均是通过直接在DB中加排它锁来保证数据更新的准确性,这势必会增加DB服务器的压力,使DB的性能和可靠性下降。而本申请实施例提供的技术方案,在应用层通过锁定业务对象的方式,提前将并发的更新请求串行 化,以避免大量的更新请求同时涌入DB,从而减少了DB服务器的压力,提升了DB的性能和可靠性。具体地说,尝试排它锁定与分布式集群环境中的其他应用服务器共享的存储空间中记录的更新请求针对的业务对象,并且只有锁定成功,才能执行在DB服务器中对该业务对象对应的数据进行更新的步骤。这样,就在从DB中读取数据并进行更新的操作之前,将更新请求串行化。通过这种方法,使得同时访问DB中的同一条数据的应用服务器数量大大减少,这样就能够提高DB服务器的吞吐量,降低DB服务器的负荷,从而提升DB的性能和可靠性,进而提升整个分布式系统的性能。另外,由于本申请实施例使得更新请求提前在应用层串行化,同一时刻,处理同一业务对象的更新请求的各个应用服务器中,只有一个应用服务器可以执行在DB服务器中对该业务对象对应的数据进行更新的步骤,因此,对DB中同一条数据的更新并不会发生冲突;并且,在更新完毕后会释放对上述存储空间中记录的业务对象的锁定,以便使得其他应用服务器可以执行在DB服务器中对该业务对象对应的数据进行更新的步骤。可见,本申请实施例提供的技术方案,在提高了DB服务器的性能和可靠性的同时,保证了更新的准确性。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:

图1为本申请一个实施例的方法流程图;

图2为本申请一个详细实施例的方法流程图;

图3为本申请又一个实施例的装置示意图。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

在更加详细地讨论示例性实施例之前应当提到的是,一些示例性实施例被描述成作为流程图描绘的处理或方法。虽然流程图将各项操 作描述成顺序的处理,但是其中的许多操作可以被并行地、并发地或者同时实施。此外,各项操作的顺序可以被重新安排。当其操作完成时所述处理可以被终止,但是还可以具有未包括在附图中的附加步骤。所述处理可以对应于方法、函数、规程、子例程、子程序等等。

在上下文中所称“应用服务器”和“DB服务器”是一种计算机设备,指可以通过运行预定程序或指令来执行数值计算和/或逻辑计算等预定处理过程的智能电子设备,其可以包括处理器与存储器,由处理器执行在存储器中预存的存续指令来执行预定处理过程,或是由ASIC、FPGA、DSP等硬件执行预定处理过程,或是由上述二者组合来实现。

需要说明的是,所述计算机设备仅为举例,其他现有的或今后可能出现的计算机设备如可适用于本申请,也应包含在本申请保护范围以内,并以引用方式包含于此。

后面所讨论的方法(其中一些通过流程图示出)可以通过硬件、软件、固件、中间件、微代码、硬件描述语言或者其任意组合来实施。当用软件、固件、中间件或微代码来实施时,用以实施必要任务的程序代码或代码段可以被存储在机器或计算机可读介质(比如存储介质)中。(一个或多个)处理器可以实施必要的任务。

这里所公开的具体结构和功能细节仅仅是代表性的,并且是用于描述本申请的示例性实施例的目的。但是本申请可以通过许多替换形式来具体实现,并且不应当被解释成仅仅受限于这里所阐述的实施例。

应当理解的是,当一个模块被称为“连接”或“耦合”到另一模块时,其可以直接连接或耦合到所述另一模块,或者可以存在中间模块。与此相对,当一个模块被称为“直接连接”或“直接耦合”到另一模块时,则不存在中间单元。应当按照类似的方式来解释被用于描述模块之间的关系的其他词语(例如“处于...之间”相比于“直接处于...之间”,“与...邻近”相比于“与...直接邻近”等等)。

这里所使用的术语仅仅是为了描述具体实施例而不意图限制示 例性实施例。除非上下文明确地另有所指,否则这里所使用的单数形式“一个”、“一项”还意图包括复数。还应当理解的是,这里所使用的术语“包括”和/或“包含”规定所陈述的特征、整数、步骤、操作、单元和/或组件的存在,而不排除存在或添加一个或更多其他特征、整数、步骤、操作、单元、组件和/或其组合。

还应当提到的是,在一些替换实现方式中,所提到的功能/动作可以按照不同于附图中标示的顺序发生。举例来说,取决于所涉及的功能/动作,相继示出的两幅图实际上可以基本上同时执行或者有时可以按照相反的顺序来执行。

下面结合附图对本申请作进一步详细描述。

图1为本申请一个实施例的分布式集群环境中的数据更新方法的流程示意图。

其中,本实施例的方法主要通过计算机设备来实现,且特别适用于分布式高并发集群环境中的应用服务器。分布式高并发集群环境中,经常会出现对DB中的一条数据高并发更新。针对一条数据的各个更新请求被随机或按照一定策略分配到应用服务器集群的任意一台应用服务器,由这台应用服务器响应相应的更新请求,从DB中读取数据,对该数据进行修改后再更新到DB中。为了保证更新准确,对于同一条数据,每次只能允许一台应用服务器从DB中读取数据,对该数据进行修改后再更新到DB中。现有技术中无论采用行级锁还是乐观锁的方式对DB中的数据进行更新,均是通过直接在DB中加排它锁来保证数据更新的准确性,这势必会增加DB服务器的压力,使DB的性能和可靠性下降。而本申请实施例提供的技术方案,在应用层通过锁定业务对象的方式,提前将并发的更新请求串行化,以避免大量的更新请求同时涌入DB,从而减少了DB服务器的压力,提升了DB的性能和可靠性。

本申请实施例中,分布式集群环境中的各应用服务器集群中的各台应用服务器共享存储空间,该存储空间可以由一个存储设备提供,也可以由若干个存储设备组成的分布式存储设备集群提供。该存储空 间记录有更新请求针对的业务对象,并且,对于一个业务对象,在该存储空间中仅会有一条记录。接收到更新请求而试图更新DB服务器中的同一条数据的各个应用服务器均会先在该存储空间中尝试对相应的业务对象进行锁定,而其中只有一个应用服务器会成功锁定该业务对象。从而实现在应用层将并发的更新请求串行化。

为了区分不同的业务对象,优选的,存储空间中记录的业务对象至少包括业务对象的标识字段(KEY),通过标识字段来区分不同的业务对象。例如,将业务对象的业务主键作为其标识字段。

根据本实施例的方法包括步骤S110-S130。

在步骤S110中,尝试排它锁定与分布式集群环境中的其他应用服务器共享的存储空间中记录的更新请求针对的业务对象。

排它锁定,是指当本应用服务器成功锁定该业务对象后,除非释放锁定,否则其他应用服务器无法成功锁定该业务对象。

例如,在要更新例程A中的某些参数的时候,可以把例程A看成是一个业务对象。整个例程A的数据(包括程序和参数)放在数据库中。而步骤S110中的存储空间不同于数据库,它可以只存储业务对象的标识字段。例如存储空间中维护一个列表,列出各业务对象的标识字段,可选的,还列出业务对象名、以及与数据库中的数据的对应关系(即,到数据库的什么位置能找到该业务对象的真实数据)。与现有技术对数据库本身进行锁定不同,本申请实施例针对存储空间中的业务对象进行锁定,即在应用层通过锁定业务对象的方式,提前将并发的更新请求串行化,以避免大量的更新请求同时涌入DB,从而减少了DB服务器的压力,提升了DB的性能和可靠性。

在步骤S120中,如果锁定成功,对该业务对象在分布式集群环境的数据库中对应的数据进行更新。

如果锁定不成功,优选的,可以重新尝试锁定。当然,也可以不再尝试,而是拒绝相应的更新请求。本申请不对锁定不成功后执行的操作进行限定。

如果尝试重新锁定,则可以预先设置最大尝试次数,并设置尝试 等待时间。每次锁定失败后,在设置的尝试等待时间后再次尝试锁定。如果尝试次数达到最大尝试次数,但仍未能成功锁定,则不再继续尝试。

在步骤S130中,更新完成后,释放对上述存储空间中记录的上述业务对象的锁定。

由于预先对更新请求进行了串行化处理,因此在步骤S130中,通常能够成功完成更新。考虑到可能由于发生意外导致更新不成功,为了使得其他应用服务器能够继续对相应的数据进行更新,需要在确认更新失败后,同样释放对上述存储空间中记录的上述业务对象的锁定。

本申请实施例中,步骤S110中尝试排它锁定与分布式集群环境中的其他应用服务器共享的存储空间中记录的更新请求针对的业务对象,并且只有锁定成功,才能执行步骤S120。其目的是,在从DB中读取数据并进行更新的操作之前,将更新请求串行化。使得同时访问DB中的同一条数据的应用服务器数量大大减少,这样就能够提高DB服务器的吞吐量,降低DB服务器的负荷,从而提升DB的性能和可靠性,进而提升整个分布式系统的性能。另外,由于本申请实施例使得更新请求提前在应用层串行化,同一时刻,处理同一业务对象的更新请求的各个应用服务器中,只有一个应用服务器可以执行在DB服务器中对该业务对象对应的数据进行更新的步骤,因此,对DB中同一条数据的更新并不会发生冲突;并且,在更新完毕后会释放对上述存储空间中记录的业务对象的锁定,以便使得其他应用服务器可以执行在DB服务器中对该业务对象对应的数据进行更新的步骤。可见,本申请实施例提供的技术方案,在提高了DB服务器的性能和可靠性的同时,保证了更新的准确性。

优选地,步骤S110是将上述存储空间中记录的上述业务对象的标识字段的取值加n,n是不为0的固定值;完成对标识字段的取值的更新后,判断该标识字段的取值是否为初始值+n,如果是,表示对该存储空间中记录的该业务对象锁定成功,否则,表示对该存储空间中记录的该 业务对象锁定不成功。

相应的,步骤S130是更新完成后,将上述存储空间中记录的上述业务对象的标识字段的取值减n;或者,更新完成后,删除该存储空间中记录的该业务对象。

例如,业务对象的业务主键作为其标识字段,其初始值为0。先查找上述存储空间中是否记录有该业务对象,如果有记录,则将该业务对象的业务主键的取值加1(通过相应的计数器实现),如果没有记录,则在该存储空间中添加该业务对象,并将其业务主键的取值加1;然后,判断该业务对象的业务主键的取值(value)是否为1(即判断是否value==1),如果取值为1,表示还没有其他应用服务器对该业务对象进行锁定,即没有被其他应用服务器的线程处理,本应用服务器成功锁定,如果取值不为1(即value不为1),表示有其他应用服务器已经对该业务对象进行锁定,即有其他应用服务器的线程正在处理该业务对象。

可见,无论是否锁定成功,业务主键的取值均发生了改变。如果锁定失败,那么业务主键的取值肯定大于1。这种情况下,如果不对取值再次修改,则其他应用服务器在通过上述方法尝试锁定时,肯定会锁定失败。因此,在每次尝试锁定后,无论是否成功,均将业务主键的取值减1或删除该业务对象的记录。

在上述处理过程中,为保证对业务主键的取值的计数正确,同一时刻,只能有一个应用服务器对其进行计数。为实现这一点,优选的,可以采用具有原子自增功能的分布式缓存作为上述存储空间。

原子自增功能,即保证在有多方同时更新一个计数器的计数值时,仅允许其中一个更新成功。

本申请实施例中,如上所述,通过提前在应用层串行化更新请求,同一时刻,处理同一条数据的更新请求的各个应用服务器中,只有一个应用服务器可以执行在DB服务器中对该业务对象对应的数据进行更新的步骤,因此,对DB中同一条数据的更新并不会发生冲突。但考虑到可能存在的意外发生,例如上述存储空间发生故障,或者有应 用服务器发生故障,使得上述方法无法正常执行,则可能出现不止一个应用服务器从DB中读取同一条数据的情况。为了避免这种意外发生,优选的,步骤S120中,如果锁定成功,通过加排它锁的方式对上述业务对象在上述分布式集群环境的数据库中对应的数据进行更新。

本申请不对加排它锁的具体实现方式进行限定。可以采用现有的任意排它锁实现步骤S120。优选的,采用加乐观锁的方式对上述业务对象在上述分布式集群环境的数据库中对应的数据进行更新。

例如,在DB中查找是否存在上述业务对象;如果存在,从DB中读取该业务对象对应的数据,将该数据的版本号加1(即version=version+1),对读取的数据进行更新,或者说将更新后数据的版本号与DB中保存的版本号进行比较,如果比DB中保存的版本号大1,则将更新后的数据更新到DB中,并将DB中保存的版本号加1;如果不存在,将该业务对象的数据保存到DB中,并将其版本号加1。

由于提前在应用层对更新请求进行了串行化处理,因此,同时读取DB中的同一条数据造成的冲突可能性很小,不会增加DB的负荷。

基于上述任意方法实施例,在执行步骤S110之前,接收更新请求的相关参数;根据该更新请求的相关参数确定该更新请求针对的业务对象。

下面将结合具体应用场景,对本申请实施例提供的方法进行详细说明。

假设用于电子商务的分布式集群环境中,DB服务器集群用于维护电子商务的DB,业务对象为商品。可能存在多个用户同时下单购买同一商品的情况,则针对该商品的数据存在高并发更新,其中至少需要更新DB中该商品的库存数量。

假设针对该商品的一个更新请求被分配至某台应用服务器,该应用服务器的处理器接收到该更新请求后,调用DB更新程序,并将更新请求中携带的更新请求相关参数发送给该DB更新程序。

应当指出的是,本实施例仅举例说明DB更新程序的一种调用情况,但并非限定。DB更新程序也可以通过其他方式被调用。

如图2所示,DB更新程序按照如下流程执行操作:

步骤S210、根据上述更新请求相关参数确定更新请求所针对的业务对象(DO)。

其中,业务对象与DB中记录的数据具有一一对应关系。

步骤S220、将分布式缓存中记录的该业务对象的KEY的取值加1。

其中,业务对象的业务主键作为KEY,其初始值为0。

本实施例中,可以为分布式缓存设置超时时间,达到超时时间后,需要清空分布式缓存中的数据,以便继续存入新的数据。其中,超时时间的计时器可以循环计时。

由于并发操作都集中在很短的时间内,因此,本实施例中,将超时时间设置为15秒。应当指出的是,在实际应用过程中,可以根据实际情况设置并调整超时时间的时长。

步骤S230、判断该业务对象的KEY的取值是否为1,如果为1,表示该业务对象没有被集群中的其他应用服务器的线程处理,执行步骤S240,否则,表示该业务对象正在被集群中其他应用服务器的线程处理,等待预定时间后返回步骤S220。

应当指出的是需要对设置最大尝试次数,以避免无休止地尝试造成对应用服务器处理资源的浪费。同时也为了避免在程序结束时,仍然没有结束尝试。因此,可以使得等待时间与最大尝试次数的乘积小于DB更新程序的执行超时时间。

步骤S240、根据业务主键,在DB中查找是否存在该业务对象,如果存在,执行步骤S250,否则执行步骤S260。

步骤S250、如果成功抢占乐观锁,将DB中的业务主键更新为更新请求中的业务主键,并将版本号加1,执行步骤S270。

步骤S260、在DB中添加该业务对象的数据,并将版本号加1,执行步骤S270。

步骤S270、将分布式缓存中的该业务对象的KEY的取值减1,以释放锁。

应当指出的是,也可以直接将该业务对象的记录删除,通过这种方式释放锁。

图3为本申请一个实施例的分布式集群环境中的数据更新装置3,该装置3包括以下模块:

记录锁定模块301,用于尝试排它锁定与所述分布式集群环境中的其他应用服务器共享的存储空间中记录的、更新请求针对的业务对象;

数据更新模块302,用于如果锁定成功,对所述业务对象在所述分布式集群环境的数据库中对应的数据进行更新;

锁定释放模块303,用于更新完成后,释放对所述存储空间中记录的所述业务对象的锁定。

可选地,所述记录锁定模块具体用于:将所述存储空间中记录的所述业务对象的标识字段的取值加n,n是不为0的固定值;完成对所述标识字段的取值的更新后,判断所述标识字段的取值是否为初始值+n,如果是,表示对所述存储空间中记录的所述业务对象锁定成功,否则,表示对所述存储空间中记录的所述业务对象锁定不成功;

所述锁定释放模块用于:更新完成后,将所述存储空间中记录的所述业务对象的标识字段的取值减n;或者,更新完成后,删除所述存储空间中记录的所述业务对象。

可选的,所述存储空间为具有原子自增功能的分布式缓存。

可选的,所述记录锁定模块还用于:

如果对所述存储空间中记录的所述业务对象锁定不成功,等待预定时间后再次尝试排它锁定所述存储空间中记录的所述业务对象。

所述数据更新模块具体用于:

如果锁定成功,通过加排它锁的方式对所述业务对象在所述分布式集群环境的数据库中对应的数据进行更新。

可选的,所述数据更新模块具体用于:

如果锁定成功,通过加乐观锁的方式对所述业务对象在所述分布式集群环境的数据库中对应的数据进行更新。

可选的,该装置还包括:

业务对象确认模块,用于接收更新请求的相关参数;根据所述更新请求的相关参数确定所述更新请求针对的业务对象。

需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,本申请的各个装置可采用专用集成电路(ASIC)或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。系统权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

虽然前面特别示出并且描述了示例性实施例,但是本领域技术人员将会理解的是,在不背离权利要求书的精神和范围的情况下,在其形式和细节方面可以有所变化。

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