一种数据存储方法及数据中心与流程

文档序号:12176263阅读:342来源:国知局
一种数据存储方法及数据中心与流程

本发明涉及通信技术领域,具体涉及一种数据存储方法及数据中心。



背景技术:

目前,云存储是一个以数据存储和管理为核心的云计算系统,使用者可以在任何时候、任何地点,通过可连网的终端连接到云中存取数据。其中,对象存储是云存储的核心,也称为基于对象的存储,对象存储系统最大的特点是对象名称是一个域名地址,一旦该域名被设置为公开,所有人都可以访问该对象。为了解决对象存储系统的容灾及可用性等问题,可以采用多数据中心的方案。

多数据中心的对象存储系统中,每个数据中心都可以处理客户端的业务请求,即可以将对象上传到任一个数据中心,也可以从任一个数据中心下载到同一个对象。其中,对象上传到任一个数据中心后,要保证每个数据中心最终存储的该对象的数据为同样的数据,才能使得从任一个数据中心下载该对象时,都能下载到相同的数据。因此,当对象存储系统中有上传对象的数据时,会启动一轮决议过程,若被大多数数据中心接受,则各数据中心会保存本次上传的该对象的数据,从而,使得从任一个数据中心下载该对象时,都能下载到相同的数据。然而,达成一轮决议需要各个数据中心进行多次网络交互,导致网络开销大。



技术实现要素:

本发明实施例提供了一种数据存储方法及数据中心,可以降低网络开销。

本发明实施例第一方面提供一种数据存储方法,应用于包括多个数据中心的对象存储系统,包括:数据中心存储对象的数据时,读取本端中对象已存在的版本号构成的第二版本历史队列;数据中心判断第一版本历史队列中本次存储的对象的数据的版本号是否大于第二版本历史队列中的版本号;若大于第二版本历史队列中的版本号,则数据中心确定未产生乐观锁冲突,本次存储的对象的数据存储成功。

其中,版本号包括接收到客户端发送的用于存储对象的数据的存储请求的接收时间和通用唯一识别码UUID;接收时间在后的版本号大于接收时间在先的版本号,针对接收时间相同的版本号,UUID大的版本号大于UUID小的版本号。对象的不同存储请求对应对象的不同数据,不同的对象的数据对应不同的版本号,因此,可以通过版本号区别每一个存储请求对应的对象的数据,并且,可以根据该版本号确定不同存储请求对应的对象的不同数据的新旧关系。其中,UUID为通用唯一识别码(Universally Unique Identifier,UUID),该UUID在分布式系统中,即各个数据中心中都是唯一的,由当前的日期、时间、时钟序列以及全局唯一的IEEE机器识别号构成。其中,UUID的第一个部分与时间有关,例如,同一个数据中心生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。即使不同的数据中心接收到该对象的数据的两个存储请求的时间相同,但通用唯一识别码不同,因此,版本号中的接收时间可以为接收到存储请求的数据中心的本地时间,不必是全球时间精准同步的原子钟确定的精准授时。该实施方式由于不严格要求各数据中心采用全球时间精准同步的原子钟保证时间一致,从而降低了数据存储方法的实现难度,节约数据存储的成本。

可见,该发明实施例可以在本次存储的该对象的数据的版本号大于该对象已存在的版本号时,将本次存储的该对象的数据存储成功,与需要达成一轮决议进行存储的方法相比,大大降低了网络开销。另外,每个存储请求对应一个版本号,该版本号可用于区别不同存储请求对应的对象的数据的新旧关系,对象存储系统中每个数据中心在本次存储的该对象的数据的版本号大于该对象已存在的版本号时才能存储成功,使得每个数据中心每次存储的该对象的数据为对象存储系统接收的该对象的最新数据,保证了各数据中心中该对象的数据的一致。

在第一方面的第一种可能的实现方式中,数据中心读取本端中对象已存在的版本号构成的第二版本历史队列之前,数据中心可以接收其他数据中心发送的复制请求;从复制请求中提取对象的数据以及对象的第一版本历史队列;响应复制请求,存储对象的数据。该实施方式可以将其他数据中心接收到的对象的数据也同步到本数据中心中。

结合第一方面的实现方式,在第一方面的第二种可能的实现方式中,数据中心读取本端中对象已存在的版本号构成的第二版本历史队列之前,接收对象的存储请求;数据中心针对存储请求生成本次待存储的对象的数据的版本号;数据中心将版本号添加到对象的版本历史队列的队尾,构成对象的第一版本历史队列;数据中心响应存储请求,存储对象的数据,并向其他数据中心发送复制请求,复制请求携带对象的第一版本历史队列。该实施方式不仅可以将本数据中心接收到的存储请求中的对象的数据存储起来,还可以给其他数据中心发送复制请求,使得其他数据也可以根据复制请求同步存储该对象的数据。

结合第一方面的实现方式,或者第一方面的第一种或第二种可能的实现方式,在第一方面的第三种可能的实现方式中,数据中心在判断出第一版本历史队列中本次存储的对象的数据的版本号不大于第二版本历史队列中的版本号,可以确定产生乐观锁冲突,本次存储的对象的数据存储失败;然后,数据中心可以比较第一版本历史队列与第二版本历史队列中的版本号,合并排列出第三版本历史队列;存储第三版本历史队列以更新本端对象的版本历史队列。其中,数据中心可以在出现乐观锁冲突,确定本次存储的对象的数据为过期数据,但为了保证本数据中心及时更新该对象的版本历史队列,依旧可以将第一版本历史队列与本端该对象已存在的版本号构成的第二版本历史队列合并,得到第三版本历史队列,来更新本端中该对象的版本历史队列。

相应地,无论是存储请求触发数据中心存储数据还是复制请求触发数据中心存储数据,若数据中心确定未产生乐观锁冲突,则表示第一版本历史队列为当前的最新的版本历史队列,数据中心可以存储该第一版本历史队列作为该对象的版本历史队列,以便于下次更新该对象的数据时使用。

结合第一方面的第三种可能的实现方式中,在第一方面的第四种可能的实现方式中,数据中心比较第一版本历史队列与第二版本历史队列中的版本号,合并排列出第三版本历史队列,可以具体为:数据中心从队尾向对头的顺序,确定第一版本历史队列与第二版本历史队列中是否存在第一个相同的版本号;若存在第一个相同的版本号,则数据中心将第一版本历史队列与第二版本历史队列中第一个相同的版本号到队尾的所有版本号进行排序,合并出第三版本历史队列;若不存在第一个相同的版本号,则数据中心将第一版本历史队列与第二版本历史队列中的所有版本号进行排序,合并出第三版本历史队列。

本发明实施例第二方面提供了一种数据中心,该数据中心具有实现上述第一方面提供的方法的行为功能,所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例公开的一种对象存储系统的示意图;

图2是本发明实施例公开的一种数据存储方法的流程示意图;

图3是本发明实施例公开的数据中心的一种结构示意图;

图4是本发明实施例公开的数据中心的另一结构示意图。

具体实施方式

为了便于理解本发明实施例,下面先对本发明实施例的应用场景进行描述。请参阅图1,图1是本发明实施例公开的一种对象存储系统的示意图。如图1所示,本发明实施例中,对象存储系统可以包括多个数据中心,本发明实施例以两个数据中心DC1、DC2为例,每个数据中心可以包括负载均衡模块(Load Balancing,LB)、对象存储子系统以及KV(Key-Value)子系统,其中,负载均衡子系统用于将客户端Client A、Client B的存储请求分别分配对各个对象存储子系统,避免某个对象存储子系统的负载过大;对象存储子系统负责为对象的数据分配版本号并将对象的多个版本号进行排序;KV子系统负责将对象的数据存储或写入到磁盘中。如图1所示,每个数据中心都可以接收客户端上传的存储请求,无论存储请求从哪个数据中心上传,对象存储系统中各数据中心都可以采用本发明实施例提供的数据存储方法,存储该对象的数据并降低网络开销。以下分别进行详细说明。

请参阅图2,图2是本发明实施例公开的一种数据存储方法,如图2所示,该数据存储方法包括以下步骤:

S101、数据中心存储对象的数据时,读取本端中该对象已存在的版本号构成的第二版本历史队列;

S102、数据中心判断第一版本历史队列中本次存储的该对象的数据的版本号是否大于第二版本历史队列中的版本号;若大于第二版本历史队列中的版本号,则执行步骤S103;若不大于第二版本历史队列中的版本号,则结束本流程。

S103、数据中心确定未产生乐观锁冲突,本次存储的该对象的数据存储成功。

本发明实施例中,步骤S101至S103的执行主体也可以为数据中心的对象存储子系统或者数据中心的服务器等,本发明实施例不做限定。

本发明实施例中,版本号包括接收到客户端发送的用于存储对象的数据的存储请求的接收时间和通用唯一识别码UUID;接收时间在后的版本号大于接收时间在先的版本号,针对接收时间相同的版本号,UUID大的版本号大于UUID小的版本号。其中,对象的不同存储请求对应对象的不同数据,对象的不同数据对应不同的版本号,因此,可以通过版本号区别每一个存储请求对应的对象的数据,并且,可以根据该版本号确定不同存储请求对应的对象的不同数据的新旧关系。其中,UUID为通用唯一识别码(Universally Unique Identifier,UUID),该UUID在分布式系统中,即各个数据中心中都是唯一的,由当前的日期、时间、时钟序列以及全局唯一的IEEE机器识别号构成。其中,UUID的第一个部分与时间有关,例如,同一个数据中心生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。即使不同的数据中心接收到该对象的数据的两个存储请求的时间相同,但通用唯一识别码不同,因此,版本号中的接收时间可以为接收到存储请求的数据中心的本地时间,不必是全球时间精准同步的原子钟确定的精准授时。该实施方式由于不严格要求各数据中心采用全球时间精准同步的原子钟保证时间一致,从而降低了数据存储方法的实现难度,节约数据存储的成本。

可选地,数据中心读取本端中对象已存在的版本号构成的第二版本历史队列之前,还可以包括以下步骤:

11)数据中心接收其他数据中心发送的复制请求;

12)数据中心从该复制请求中提取对象的数据以及该对象的第一版本历史队列;

13)数据中心响应该复制请求,存储该对象的数据。

该实施方式中,存储的数据来自其他数据中心同步的数据,从而保证各数据中心的数据一致。

可选地,数据中心存储对象的数据也可以为客户端向本数据中心发送的存储请求所对应的对象的数据,可以包括以下步骤:

21)数据中心接收对象的存储请求;

22)数据中心针对该存储请求生成该对象的版本号;

23)数据中心将该版本号添加到该对象的版本历史队列的队尾,构成该对象的第一版本历史队列;

24)数据中心响应该存储请求,存储该对象的数据,并向其他数据中心发送复制请求。

其中,该复制请求用于将存储请求对应的对象的数据同步写入到其他数据中心,该复制请求携带对象的第一版本历史队列。其中,版本号包括该版本号对应的存储请求的接收时间和UUID;该接收时间是本数据中心待存储的对象的数据所对应的存储请求的接收时间。

本发明实施例中,数据中心在存储对象的数据时,若没有该对象,则该对象的版本历史队列为空,NULL;若已经存在该对象,则该对象的版本历史队列不为空。举例来说,数据中心针对该存储请求生成的版本号为V2,若数据中心在该存储请求之前的版本历史队列为NULL,那么第一版本历史队列为NULL->V2;若数据中心在该存储请求之前的版本历史队列为NULL->V1,那么第一版本历史队列为NULL->V1->V2。另外,版本历史队列中位于靠近对头的版本号小于位于靠近队尾的版本号,新生成的版本号可以直接添加到版本历史对列的队尾,构成第一版本历史队列。

本发明实施例中,第一版本历史队列为数据中心在接收到存储请求时,生成针对待存储的对象的数据的版本号后,将该版本号添加到该数据中心已存储的或者已存在的该对象的版本历史队列的队尾而构成的;第二版本历史队列是数据中心各自存储的或已存在的该对象的版本历史队列。例如,数据中心DC1接收到存储请求时,可以生成针对该存储请求待存储的对象的数据的版本号,并将该版本号添加到DC1中该对象的版本历史队列的队尾,构成第一版本历史队列;数据中心DC2接收到DC1发送的复制请求时,可以提取出第一版本历史队列,并读取DC2中已存在的该对象的版本号构成的第二版本历史队列,DC2根据该第一版本历史队列和第二版本历史队列存储该存储请求对应的该对象的数据。

本发明实施例中,若数据中心判断出第一版本历史队列中本次存储的对象的数据的版本号不大于第二版本历史队列中的版本号,该数据存储方法还可以包括以下步骤:

31)数据中心确定产生乐观锁冲突,所述本次存储的所述对象的数据存储失败;

32)数据中心比较第一版本历史队列与第二版本历史队列中的版本号,合并排列出第三版本历史队列;

33)数据中心存储第三版本历史队列以更新本端中该对象的版本历史队列。

该实施方式中,数据中心存储该第三版本历史队列,以便于下次更新该对象的数据时,将该第三版本历史队列作为该对象在该数据中心中已存在的版本历史队列。

举例来说,场景1为:数据中心DC1接收到对象的存储请求,生成的版本号为V1;DC1已经存在的该对象的版本历史队列为NULL,则第一版本历史队列为NULL->V1。

针对场景1,DC1读取的第二版本历史队列为NULL,DC1判断出第一版本历史对列中版本号V1大于第二版本历史队列中的NULL,因此,DC1确定未产生乐观锁冲突,故DC1可以将版本号V1对应的该对象的数据存储成功。

举例来说,场景2为:数据中心DC1接收到数据中心DC2发送的复制请求,该复制请求用于将DC2接收的存储请求对应的对象的数据同步写入到DC1,该复制请求携带该对象的第一版本历史队列为NULL->V1,DC1已经存在的该对象的版本历史队列为NULL,其中,版本号V1为DC2针对其接收的存储请求对应的对象的数据生成的。

针对场景2,DC1读取的第二版本历史队列为NULL,DC1判断出第一版本历史对列中版本号V1大于第二版本历史队列中的NULL,因此,DC1确定未产生乐观锁冲突,可以将版本号V1对应的该对象的数据存储成功。

举例来说,场景3为:数据中心DC1接收到同一个对象的两个存储请求,针对这两个存储请求生成的版本号分别为V1、V2,其中,版本号V1对应的存储请求的接收时间先于版本号V2对应的存储请求的接收时间,因此版本号V1小于版本号V2,DC1已经存在的该对象的版本历史队列为NULL。

针对该场景3,DC1先存储版本号V1对应的该对象的数据,确定第一版本历史队列为NULL->V1,读取的第二版本历史队列为NULL,DC1判断出第一版本历史对列中版本号V1大于第二版本历史队列中的NULL,因此,DC1确定未产生乐观锁冲突,DC1可以将版本号V1对应的该对象的数据存储成功;其次,DC1存储版本号V2对应的该对象的数据,确定第一版本历史队列为NULL->V1->V2,读取的第二版本历史队列为NULL->V1,DC1判断出第一版本历史对列中版本号V2大于第二版本历史队列中的版本号V1,因此,DC1确定未产生乐观锁冲突,DC1可以将版本号V2对应的该对象的数据存储成功。

举例来说,场景4为:数据中心DC1接收到对象的存储请求,生成的版本号为V3,DC1已经存在的该对象的版本历史队列为NULL->V1->V2,则第一版本历史队列为NULL->V1->V2->V3。

针对场景4,DC1读取的第二版本历史队列为NULL->V1->V2,DC1判断出第一版本历史对列中的版本号V3大于第二版本历史队列中的各版本号,因此,DC1确定未产生乐观锁冲突,DC1可以将版本号V3对应的该对象的数据存储成功。

举例来说,场景5为:数据中心DC1接收到数据中心DC2发送的复制请求,该复制请求用于将DC2接收的存储请求对应的对象的数据同步写入到DC1,该复制请求携带该对象的第一版本历史队列为NULL->V1->V2,DC1已经存在的该对象的版本历史队列为NULL->V1,其中,版本号V2为DC2针对其接收的存储请求对应的对象的数据生成的。

针对场景5,DC1读取的第二版本历史队列为NULL->V1,DC1判断出第一版本历史对列的队尾的版本号V2大于第二版本历史队列中队尾的V1,因此,DC1确定未产生乐观锁冲突,DC1可以将版本号V2对应的该对象的数据存储成功。

举例来说,场景6为:数据中心DC1接收到对象的存储请求,生成的版本号为V1;同时,数据中心DC2接收到同一对象的存储请求,生成的版本号为V2,DC1和DC2中已经存在的该对象的版本历史队列均为NULL,并且版本号V1大于版本号V2(即,数据中心DC1和数据中心DC2虽然同时接收到存储请求,但两者生成的版本号中UUID不同,V1的UUID大于V2的UUID)。

针对上述场景6,首先,DC1在存储版本号V1对应的对象的数据时,第一版本历史队列为NULL->V1,第二版本历史队列为NULL,根据版本号比较规则,判断出第一版本历史队列中V1大于第二版本历史队列中的NULL,确定未产生乐观锁冲突,DC1将版本号V1对应的对象的数据存储成功;其次,DC1接收到DC2发送的复制请求,在存储版本号V2对应的对象的数据时,第一版本历史队列为NULL->V2,此时第二版本历史队列为NULL->V1(即DC1存储成功版本号V1对应的对象的数据时,该对象的版本历史队列就为存储版本号V1对应的对象的数据时的第一版本历史队列NULL->V1),由于第一版本历史队列中V2小于第二版本历史队列中的V1,确定产生乐观锁冲突,DC1将版本号V2对应的对象的数据存储失败,版本号V2对应的数据为过期数据,因此,DC1从队尾向对头的顺序,确定第一版本历史队列与第二版本历史队列中不存在相同的版本号;将第一版本历史队列与第二版本历史队列中的所有版本号进行排序,即对版本号V2和版本号V1排序;版本号V1大于版本号V2,故第三版本历史队列为NULL->V2->V1,DC1存储该第三版本历史队列将本端该对象的版本历史队列更新为NULL->V2->V1。

举例来说,场景7为:数据中心DC1接收到对象的存储请求,生成的版本号为V1;同时,数据中心DC2接收到同一对象的存储请求,生成的版本号为V2,DC1和DC2中已经存在的该对象的版本历史队列均为NULL,并且版本号V1小于版本号V2(即,虽然数据中心DC1和数据中心DC2同时接收到存储请求,但两者生成的版本号中UUID不同,V1的UUID小于V2的UUID)。

针对上述场景7,首先,DC1在存储版本号V1对应的对象的数据时,第一版本历史队列为NULL->V1,第二版本历史队列为NULL,第一版本历史队列中V1大于第二版本历史队列中的NULL,确定未产生乐观锁冲突,DC1将版本号V1对应的对象的数据存储成功;其次,DC1接收到DC2发送的复制请求,在存储版本号V2对应的对象的数据时,第一版本历史队列为NULL->V2,此时第二版本历史队列为NULL->V1(即DC1在存储成功版本号V1对应的对象的数据时,该对象的版本历史队列就为存储版本号V1对应的对象的数据时的第一版本历史队列NULL->V1);第一版本历史队列中V2大于第二版本历史队列中的V1,确定未产生乐观锁冲突,DC1将版本号V2对应的对象的数据存储成功。

需要注意的是,无论是存储请求触发的DC1存储数据还是复制请求触发的DC1存储数据,若DC1确定未产生乐观锁冲突,则表示第一版本历史队列为当前的最新的版本历史队列,DC1可以存储该第一版本历史队列作为该对象的版本历史队列,以便于下次更新该对象的数据时使用。

图2所示的数据存储方法在存储对象的数据时,可以读取本端中该对象已存在的版本号构成的第二版本历史队列;数据中心判断第一版本历史队列中本次存储的该对象的数据的版本号是否大于第二版本历史队列中的版本号;若大于第二版本历史队列中的版本号,则数据中心确定未产生乐观锁冲突,本次存储的该对象的数据存储成功;可见,该发明实施例可以在本次存储的该对象的数据的版本号大于该对象已存在的版本号时,将本次存储的该对象的数据存储成功,与需要达成一轮决议进行存储的方法相比,大大降低了网络开销。另外,每个存储请求对应一个版本号,该版本号可用于区别不同存储请求对应的对象的数据的新旧关系,对象存储系统中每个数据中心在本次存储的该对象的数据的版本号大于该对象已存在的版本号时才能存储成功,使得每个数据中心每次存储的该对象的数据为对象存储系统接收的该对象的最新数据,保证了各数据中心中该对象的数据的一致。

本发明实施例以图1中的对象存储系统为例,对数据存储方法进行详细阐述,可以包括以下步骤:

客户端Client A向数据中心DC1发送存储请求,该存储请求用于存储对象Obj的数据1;

DC1接收到存储请求,DC1中负载均衡模块1将该存储请求分配给DC1中对象存储子系统11处理;

对象存储子系统11针对该存储请求生成对象Obj的数据1的版本号V1;

对象存储子系统11读取DC1中对象Obj的版本历史队列为NULL;

对象存储子系统11将版本号V1添加到对象Obj的版本历史队列的队尾,构成对象Obj的第一版本历史队列为NULL->V1;

对象存储子系统11调用DC1中KV子系统1存储对象Obj的数据1,并向数据中心DC2发送复制请求,该复制请求中携带第一版本历史队列NULL->V1以及对象Obj的数据1;

对象存储子系统11调用DC1中KV子系统1存储对象Obj的数据1时,未收到KV子系统1返回的乐观锁冲突,确定对象Obj的数据1存储成功,并且此时DC1中对象Obj的版本历史队列为NULL->V1;

数据中心DC2接收到对象存储子系统11发送的复制请求,DC2中负载均衡模块1将该复制请求分配给DC2中对象存储子系统21处理;

对象存储子系统21从复制请求中提取出对象Obj的数据1以及对象Obj的第一版本历史队列为NULL->V1;

对象存储子系统21调用DC2中KV子系统2响应复制请求,存储对象Obj的数据1;

KV子系统2存储对象Obj的数据1时,读取DC2中对象Obj已存在的版本号构成的第二版本历史队列为NULL;

KV子系统2判断出第一版本历史队列中对象Obj的数据1的版本号V1大于空的第二版本历史队列,确定未产生乐观锁冲突;

对象存储子系统21未收到KV子系统2返回的乐观锁冲突,确定对象Obj的数据1存储成功,并且此时DC2中对象Obj的版本历史队列为NULL->V1;

此时,客户端Client B向数据中心DC2发送存储请求,该存储请求用于存储对象Obj的数据2;同时,客户端Client A向数据中心DC1发送存储请求,该存储请求用于存储对象Obj的数据3;

DC2接收到存储请求,DC2中负载均衡模块2将该存储请求分配给DC2中对象存储子系统21处理;DC1接收到存储请求,DC1中负载均衡模块1将该存储请求分配给DC1中对象存储子系统11处理;

对象存储子系统21针对该存储请求生成对象Obj的数据2的版本号V2;对象存储子系统11针对该存储请求生成对象Obj的数据3的版本号V3;其中,版本号V2中的接收时间与版本号V3中的接收时间相同,但版本号V2中的UUID小于版本号V3中的UUID;

对象存储子系统21读取DC2中对象Obj的版本历史队列为NULL->V1;对象存储子系统21将版本号V2添加到对象Obj的版本历史队列的队尾,构成对象Obj的第一版本历史队列为NULL->V1->V2;对象存储子系统11读取DC1中对象Obj的版本历史队列为NULL->V1;对象存储子系统11将版本号V3添加到对象Obj的版本历史队列的队尾,构成对象Obj的第一版本历史队列为NULL->V1->V3;

对象存储子系统21调用DC2中KV子系统2存储对象Obj的数据2,并向数据中心DC1发送复制请求,该复制请求中携带第一版本历史队列NULL->V1->V2以及对象Obj的数据2;对象存储子系统11调用DC1中KV子系统1存储对象Obj的数据3,并向数据中心DC2发送复制请求,该复制请求中携带第一版本历史队列NULL->V1->V3以及对象Obj的数据3;

对象存储子系统21调用DC2中KV子系统2存储对象Obj的数据2时,未收到KV子系统2返回的乐观锁冲突,确定对象Obj的数据2存储成功,并且此时DC2中对象Obj的版本历史队列为NULL->V1->V2;对象存储子系统11调用DC1中KV子系统1存储对象Obj的数据3时,未收到KV子系统1返回的乐观锁冲突,确定对象Obj的数据3存储成功,并且此时DC1中对象Obj的版本历史队列为NULL->V1->V3;

数据中心DC2接收到对象存储子系统11发送的复制请求,DC2中负载均衡模块1将该复制请求分配给DC2中对象存储子系统21处理;数据中心DC1接收到对象存储子系统21发送的复制请求,DC1中负载均衡模块1将该复制请求分配给DC1中对象存储子系统11处理;

对象存储子系统21从复制请求中提取出对象Obj的数据3以及对象Obj的第一版本历史队列为NULL->V1->V3;对象存储子系统11从复制请求中提取出对象Obj的数据2以及对象Obj的第一版本历史队列为NULL->V1->V2;

对象存储子系统21调用DC2中KV子系统2响应复制请求,存储对象Obj的数据3;对象存储子系统11调用DC2中KV子系统1响应复制请求,存储对象Obj的数据2;

KV子系统2存储对象Obj的数据3时,读取DC2中对象Obj已存在的版本号构成的第二版本历史队列为NULL->V1->V2;KV子系统1存储对象Obj的数据2时,读取DC1中对象Obj已存在的版本号构成的第二版本历史队列为NULL->V1->V3;

KV子系统2判断出第一版本历史队列中对象Obj的数据3的版本号V3大于其第二版本历史队列NULL->V1->V2中的版本号,确定未产生乐观锁冲突;KV子系统1判断出第一版本历史队列中对象Obj的数据2的版本号V2不大于其第二版本历史队列ULL->V1->V3中的V3,确定产生乐观锁冲突;

对象存储子系统21未收到KV子系统2返回的乐观锁冲突,确定对象Obj的数据3存储成功,并且此时DC2中对象Obj的版本历史队列为NULL->V1->V2->V3;对象存储子系统11收到KV子系统1返回的乐观锁冲突,确定对象Obj的数据2存储失败,此时,对象存储子系统11比较第一版本历史队列NULL->V1->V2与第二版本历史队列NULL->V1->V3中的版本号,合并排列出第三版本历史队列NULL->V1->V2->V3;对象存储子系统11存储该第三版本历史队列作为对象Obj在DC1中的版本历史队列。

可见,DC1和DC2中最终存储的对象Obj的数据均为数据3;最终存储的该对象Obj的版本历史队列均为NULL->V1->V2->V3。该数据存储方法不必在数据中心DC1和DC2之间进行网络决议,各数据中心就可以实现所存储的对象的数据一致,降低了网络开销。另外,该实施方式中版本号中存储请求的接收时间为接收到存储请求的数据中心的本地时间,而不必是通过GPS实现全球时间精准同步的原子钟的精准授时,从而,降低了方案的实施难度及成本。

请参阅图3,图3是本发明实施例公开的一种数据中心的结构示意图,该数据中心可以包括以下模块:

读取模块310,用于在存储对象的数据时,读取本端中该对象已存在的版本号构成的第二版本历史队列;

判断模块320,用于判断第一版本历史队列中本次存储的所述对象的数据的版本号是否大于第二版本历史队列中的版本号;

确定模块330,用于在判断模块320判断出第一版本历史队列中本次存储的该对象的数据的版本号大于第二版本历史队列中的版本号时,确定未产生乐观锁冲突,本次存储的所述对象的数据存储成功;

本发明实施例中,版本号包括接收到客户端发送的用于存储对象的数据的存储请求的接收时间和通用唯一识别码UUID;接收时间在后的版本号大于接收时间在先的版本号,针对接收时间相同的版本号,UUID大的版本号大于UUID小的版本号。其中,对象的不同存储请求对应对象的不同数据,不同存储请求还对应不同的版本号,因此,可以通过版本号区别每一个存储请求对应的对象的数据,并且,可以根据该版本号确定不同存储请求对应的对象的不同数据的新旧关系。其中,UUID为通用唯一识别码(Universally Unique Identifier,UUID),该UUID在分布式系统中,即各个数据中心中都是唯一的,由当前的日期、时间、时钟序列以及全局唯一的IEEE机器识别号构成。其中,UUID的第一个部分与时间有关,例如,同一个数据中心生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。即使不同的数据中心接收到该对象的数据的两个存储请求的时间相同,但通用唯一识别码不同,因此,版本号中的接收时间可以为接收到存储请求的数据中心的本地时间,不必是全球时间精准同步的原子钟确定的精准授时。该实施方式由于不严格要求各数据中心采用全球时间精准同步的原子钟保证时间一致,从而降低了数据存储方法的实现难度,节约数据存储的成本。

本发明实施例中,图3所示的数据中心还包括:

第一接收模块340,用于在读取模块310读取本端中对象已存在的版本号构成的第二版本历史队列之前,接收其他数据中心发送的复制请求;

提取模块350,用于从复制请求中提取对象的数据以及该对象的第一版本历史队列;

第一存储模块360,用于响应该复制请求,存储该对象的数据。

本发明实施例中,图3所示的数据中心还包括:

第二接收模块370,用于在读取模块310读取本端中对象已存在的版本号构成的第二版本历史队列之前,接收对象的存储请求;

生成模块380,用于针对存储请求生成本次待存储的所述对象的数据的版本号;

添加模块390,用于将版本号添加到对象的版本历史队列的队尾,构成该对象的第一版本历史队列;

第二存储模块390a,用于响应存储请求,存储对象的数据,并向其他数据中心发送复制请求,复制请求携带所述对象的第一版本历史队列。

本发明实施例中,第一接收模块340和第二接收模块370可以为同一个接收模块,执行不同的操作。

本发明实施例中,确定模块330,还用于在判断模块320判断出第一版本历史队列中本次存储的所述对象的数据的版本号不大于第二版本历史队列中的版本号时,确定产生乐观锁冲突,本次存储的所述对象的数据存储失败;

进而,图3所示的数据中心还包括:

比较模块390b,用于比较第一版本历史队列与第二版本历史队列中的版本号,合并排列出第三版本历史队列;

第三存储模块390c,还用于存储第三版本历史队列以更新本端中该对象的版本历史队列。

本发明实施例中,第一存储模块360、第二存储模块390a及第三存储模块390c可以为同一个存储模块,分别执行不同的操作。

本发明实施例中,比较模块390b可以包括以下单元:

确定单元,用于从队尾向对头的顺序,确定第一版本历史队列与第二版本历史队列中是否存在第一个相同的版本号;

合并单元,用于在确定单元确定第一版本历史队列与第二版本历史队列中存在第一个相同的版本号时,将第一版本历史队列与第二版本历史队列中第一个相同的版本号到队尾的所有版本号进行排序,合并出第三版本历史队列;合并单元,还用于在确定单元确定第一版本历史队列与第二版本历史队列中不存在第一个相同的版本号,将第一版本历史队列与第二版本历史队列中的所有版本号进行排序,合并出第三版本历史队列。

需要注意的是,无论是存储请求触发的数据中心存储数据还是复制请求触发的数据中心存储数据,若数据中心确定未产生乐观锁冲突,则表示第一版本历史队列为当前的最新的版本历史队列,数据中心可以存储该第一版本历史队列作为该对象的版本历史队列,以便于下次更新该对象的数据时使用。

图3所示的数据中心中,读取模块可以在存储对象的数据时,读取本端中该对象已存在的版本号构成的第二版本历史队列;判断模块,可以判断第一版本历史队列中本次存储的该对象的数据的版本号是否大于第二版本历史队列中的版本号;确定模块,用于在判断模块判断出第一版本历史队列中本次存储的该对象的数据的版本号大于第二版本历史队列中的版本号时,确定未产生乐观锁冲突,本次存储的该对象的数据存储成功;可见,该发明实施例可以在本次存储的该对象的数据的版本号大于该对象已存在的版本号时,将本次存储的该对象的数据存储成功,与需要达成一轮决议进行存储的方法相比,大大降低了网络开销。另外,每个存储请求对应一个版本号,该版本号可用于区别不同存储请求对应的对象的数据的新旧关系,对象存储系统中每个数据中心在本次存储的该对象的数据的版本号大于该对象已存在的版本号时才能存储成功,使得每个数据中心每次存储的该对象的数据为对象存储系统接收的该对象的最新数据,从而保证了各数据中心中该对象的数据的一致。

本发明实施例和所述的方法实施例基于同一构思,其中的实施方式带来的技术效果也相同,具体过程可参照上述方法实施例的描述。

请参阅图5,图5是本发明实施例公开的数据中心的另一结构示意图,在本发明实施例中,数据中心包括处理器410、存储器420和收发器430。收发器430用于与外部设备之间收发数据。数据中心中的处理器410的数量可以是一个或多个。本发明的一些实施例中,处理器410、存储器420和收发器430可通过总线系统或其他方式连接。数据中心可以用于执行图2所示的方法。关于本实施例涉及的术语的含义以及举例,可以参考上述对应的方法实施例。此处不再赘述。

其中,存储器420中存储程序代码,处理器410用于调用存储器420中存储的程序代码,用于执行以下操作:

存储对象的数据时,读取本端中所述对象已存在的版本号构成的第二版本历史队列;

判断第一版本历史队列中本次存储的所述对象的数据的版本号是否大于所述第二版本历史队列中的版本号;

若大于所述第二版本历史队列中的版本号,则确定未产生乐观锁冲突,所述本次存储的所述对象的数据存储成功;

所述版本号包括接收到客户端发送的用于存储对象的数据的存储请求的接收时间和通用唯一识别码UUID;接收时间在后的版本号大于接收时间在先的版本号,针对接收时间相同的版本号,UUID大的版本号大于UUID小的版本号。

本发明实施例中,处理器410用于调用存储器420中存储的程序代码,数据中心读取本端中所述对象已存在的版本号构成的第二版本历史队列之前,还可以执行以下操作:

通过收发器430接收其他数据中心发送的复制请求;

从所述复制请求中提取对象的数据以及所述对象的第一版本历史队列;

响应所述复制请求,存储所述对象的数据。

本发明实施例中,处理器410用于调用存储器420中存储的程序代码,读取本端中所述对象已存在的版本号构成的第二版本历史队列之前,还可以执行以下操作:

接收对象的存储请求;

针对所述存储请求生成本次待存储的所述对象的数据的版本号;

将所述版本号添加到所述对象的版本历史队列的队尾,构成所述对象的第一版本历史队列;

响应所述存储请求,存储所述对象的数据,并通过收发器430向其他数据中心发送复制请求,所述复制请求携带所述对象的第一版本历史队列。

本发明实施例中,处理器410用于调用存储器420中存储的程序代码,在判断出第一版本历史队列中本次存储的所述对象的数据的版本号不大于所述第二版本历史队列中的版本号,还可以执行以下操作:

确定产生乐观锁冲突,所述本次存储的所述对象的数据存储失败;

比较所述第一版本历史队列与所述第二版本历史队列中的版本号,合并排列出第三版本历史队列;

存储所述第三版本历史队列以更新本端所述对象的版本历史队列。

本发明实施例中,处理器410用于调用存储器420中存储的程序代码,比较所述第一版本历史队列与所述第二版本历史队列中的版本号,合并排列出第三版本历史队列,可以具体为:

从队尾向对头的顺序,确定所述第一版本历史队列与所述第二版本历史队列中是否存在第一个相同的版本号;

若存在第一个相同的版本号,则将所述第一版本历史队列与所述第二版本历史队列中所述第一个相同的版本号到队尾的所有版本号进行排序,合并出第三版本历史队列;

若不存在第一个相同的版本号,则将所述第一版本历史队列与所述第二版本历史队列中的所有版本号进行排序,合并出第三版本历史队列。

以上对本发明实施例公开的一种数据存储方法及数据中心进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。

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