一种跨集群对象存储异步备份方法、装置和系统
技术领域
本发明涉及存储技术领域,特别涉及一种跨集群对象存储异步备份方法、装置和系统。
背景技术
对象存储是一种海量小文件的分布式存储系统,它将对象(Object)以扁平化的结构存储在以桶(Bucket)为命名空间的两级结构中,通过在Bucket中新增Object,克服目录树管理的不足,从而实现海量小文件的存储。对象存储部署在一个独立的集群上,为了避免单个集群发生故障时数据丢失,需要将数据备份到其它集群,其中,用户写入的集群称为主集群,备份主集群的数据的集群称为从集群。
当前的对象存储集群同步方法有两种:
第一种、写入时实时备份:
当对象写入到对象存储集群时,由写入对象的主集群将请求同时发送到另外一个集群,两个集群同时写入对象,并且在主集群或者从集群收集两个集群的写入结果,根据不同的策略来决定返回给用户的结果。例如:策略一:当两个集群都返回成功时才返回用户成功,任意一个集群失败或超时则返回用户失败;策略二:当两个集群任何一个返回成功时就返回用户成功,若某个集群失败,则辅助以后端同步服务,将成功端的对象复制到失败端;策略三:按照用户写入的主集群的执行结果,来返回给用户相应的结果,辅助以后端同步服务,将主集群的对象状态复制到从集群;以及除此之外等等一系列策略。
该种备份方式,由于两边集群执行结果不可控,容易产生一致性问题,若需要保证最终一致,往往需要辅助以后端异步复制方案,复杂度较之后端异步同步方案更高。由于要等待两边集群执行结果,主集群更新逻辑复杂,且会增加客户端请求执行时长。
第二种、后端异步备份:
该方案采用异步备份的方式,使用后端服务进行对象的跨集群复制,保证两个集群数据的最终一致性,是市面上比较常采用的方案,其详细步骤如下:
1、用户写入数据到主集群,数据落入集群之前,对象存储将数据的操作信息先记录到消息队列。
2、如果写消息队列的动作失败,则返回给用户失败。
3、如果写消息队列的动作成功,则继续写主集群,并且根据操作结果返回给用户操作结果。
4、后端同步服务,不断从消息队列取出数据的操作记录,根据操作记录将主集群的数据异步复制到从集群。
该方案可以保证数据的最终一致性,但大部分方案实现需要改动对象存储服务的代码,其需要对每个改写数据的API做改造,实现复杂度很高,容易出错。由于数据在真正落入主集群之前写操作队列,所以消息队列中可能会有许多无效操作信息。
相同对象的多次操作记录多条消息,进行多次同步操作,冗余性比较高,浪费同步资源。后端同步服务拿到操作记录后,需要判断操作是否真实有效,再进行同步,当同步时,同步服务查看主集群数据状态,将难以区分数据操作失败与数据操作进行中,从而无法判断同步时的数据状态是否是最终状态。
上述两种实现方案都需要改动原有对象存储代码,实现难度系数比较大。
发明内容
有鉴于此,本申请提供一种跨集群对象存储异步备份方法、装置和系统,能够在不改变原有对象存储代码的基础上,简单、高效地实现对象存储后端异步同步。
为解决上述技术问题,本申请的技术方案是这样实现的:
一种跨集群对象存储异步备份方法,应用于跨集群对象存储异步备份系统中的同步服务器上,该方法包括:
从数据库服务器上获取同步的数据列表;
将数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中;
针对缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态;
根据获取的状态,将获取的数据备份到从集群服务器。
一种跨集群对象存储异步备份装置,应用于跨集群对象存储异步备份系统中的同步服务器上,该装置包括:第一获取单元、处理单元、第二获取单元和备份单元;
所述第一获取单元,用于从数据库服务器上获取同步的数据列表;
所述处理单元,用于将所述第一获取单元获取的数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中;
所述第二获取单元,用于针对所述处理单元下发任务的缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态;
所述备份单元,用于根据获取的状态,将获取的数据备份到从集群服务器。
一种跨集群对象存储异步备份系统,该系统包括:主集群服务器、数据库服务器、同步服务器和从集群服务器;
所述主集群服务器,用于在成功执行写入数据请求时,将对应的用户操作对象的名称发送给数据库服务器;
所述数据库服务器,用于接收到所述主集群服务器发送的用户操作对象时,存储到同步的数据列表中;
所述同步服务器,用于从数据库服务器上获取同步的数据列表;将数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中;针对缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态;根据获取的状态,将获取的数据备份到从集群服务器。
一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述的跨集群对象存储异步备份方法的步骤。
一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现权利要求所述的跨集群对象存储异步备份方法的步骤。
由上面的技术方案可知,本申请中通过在主集群在存储数据时,将用户操作对象名称存储到数据库服务器中,通过将用户操作对象名称划分为多个任务,针对每个任务中的用户操作对象名称到主集群服务器中获取对应的状态和数据,根据获取的状态,将获取的数据备份到从集群服务器。该方案能够在不改变原有对象存储代码的基础上,简单、高效地实现对象存储后端异步同步。
附图说明
图1为本申请实施例中跨集群对象存储异步备份系统示意图;
图2为本申请实施例中跨集群对象存储异步备份的流程示意图;
图3为本申请实施例中应用于上述技术的装置结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面结合附图并举实施例,对本发明的技术方案进行详细说明。
本申请实施例中提供一种跨集群对象存储异步备份系统,该备份系统包括:同步服务器、主集群服务器、从集群服务器和数据库服务器;其中,同步服务器为备份集群部署的服务器,从集群服务器为从集群部署的服务器,主集群服务器为主集群部署的服务器。
数据库服务器与同步服务器、主集群服务器,或从集群服务器可以为同一服务器,或不同服务器;
所述同步服务器与主集群服务器,或从集群服务器为同一服务器,或不同服务器;
也就是说备份集群、主集群、从集群和数据库可以部署在相同的服务器上,也可以部署在不同的服务器上。
参见图1,图1为本申请实施例中跨集群对象存储异步备份系统示意图。图1中每个集群可以使用多个服务器部署,且不限服务器的个数,图1中所示出的每个集群中的服务器的个数仅仅是一种示例。
主集群中用于进行数据存储的主集群服务器部署通过Lua扩展nginx实现的可伸缩的Web平台(Openresty)服务,以及对象存储服务,将Openresty服务作为对象存储服务的前端,替代传统使用的nginx或apache等服务作为对象存储前端,将对象存储服务作为后端。
OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。
下面给出跨集群对象存储异步备份过程:
主集群进行对象存储的过程:
主集群服务,用于通过部署的Openresty服务接收客户端发送的写入数据请求;通过部署的对象存储服务处理用户请求;并将操作结果为成功的写入请求对应的用户操作对象名称通过Openresty服务向所述数据库服务器发送。
所述用户操作对象名称为:类型为增、删、改的写入请求对应的用户操作对象的名称。
具体实现时,部署的Openresty服务称为Openresty服务模块,部署的对象存储服务称为对象存储服务模块,两个模块的具体交互过程,具体如下:
主集群服务器的Openresty服务模块接收客户端发送的写入数据请求;并转发给对象存储服务模块。
对象存储模块接收到写入数据请求时,根据写入数据请求的内容进行处理,并向Openresty服务模块反馈该次用户操作结果。
Openresty服务模块接收到对象存储模块反馈的操作结果时,若确定该次写入数据成功,且该次请求的类型为增、删、改时,将对应的用户操作对象名称,也就是针对该次操作对象的描述信息发送给数据库服务器进行存储;并将操作结果反馈给客户端。
具体实现上述过程时,可以通过如下具体实现方法:配合lua脚本,在log_by_lua_file阶段,获取用户的请求,判断请求类型,对于增删改数据的请求,如果请求成功,将操作的数据的名称,即用户操作对象的名称记录到数据库中。
数据库服务器存储主集群服务器发送的用户操作对象名称,存储在同步的数据列表中。
具体实现时,可以使用Mysql数据库实现同步的数据列表中。
数据库服务器中针对每个用户操作对象存储一条记录,当任一用户操作对象对应的记录需要修改时,以replace模式更新每个用户操作对象的记录。
通过只记录成功的操作对象信息,以及replace更新模式,解决用户进行无效操作的问题、多次操作冗余浪费同步资源的问题。
进行数据备份的过程:
同步服务器从数据库服务器上获取同步的数据列表,将数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中;这里的缓存队列可以通过Redis实现。Redis:一种可基于内存或可持久化的日志型、Key-Value数据库。
在将数据列表中的用户操作对象名称划分为多个任务时,可以将一个用户操作对象名称划分为一个任务,也可以将多个用户操作对象名称划分为一个任务。
在同步服务器中作为主同步服务器的同步服务器来执行数据列表的获取,以及任务的划分,作为从同步服务器的同步服务器执行数据列表中的任务的同步。
针对缓存队列中的任务采用分布式方式处理,也就是通过多个服务器来处理所述缓存队列中的任务,或者通过多个进程处理缓存队列中的任务,亦或两者结合,本申请实施例中对此并不进行限制。
针对缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态;即拉取需要备份的数据。
同步服务器根据获取的状态,将获取的数据备份到从集群服务器。
这里的状态为存在,或不存在,如果存在,则将对应的数据备份到从集群服务器,不存在,则删除从集群服务器上相应数据。
根据主集群服务器上存储数据的状态复制数据,不会出现难以区分数据操作失败与数据操作进行的情况,大大简化设计逻辑。
至此,完成跨集群对象存储异步备份的过程。
下面结合附图详细说明跨集群对象存储异步备份的过程。
参见图2,图2为本申请实施例中跨集群对象存储异步备份的流程示意图。具体步骤为:
步骤201,从数据库服务器上获取同步的数据列表。
本步骤的执行主体为同步服务器,具体实现时,可以将同步服务器分为一个主同步服务器和多个从同步服务器,一个同步服务器可以作为主同步服务器,也可以作为一个从同步服务器,还可以同时作为主同步服务器和从同步服务器。
在整个系统中存在一个主同步服务器,该主同步服务器可以同时作为备同步服务器。
数据列表中存储多个用户操作对象的名称;
用户操作对象名称为主集群服务器通过部署的Openresty服务在主集群服务器成功写入数据时发送的针对该次操作对象的描述信息,其中,所述主集群服务器通过Openresty服务接收客户端发送的写入数据请求,通过部署的对象存储服务处理写入数据请求。
所述用户操作对象名称为:类型为增、删、改的写入请求对应的用户操作对象的名称。
即针对类型为增、删、减的写入数据请求,且执行所述写入数据请求写入成功时,对应的用户操作对象名称存储数据库服务器的数据列表中,其它情况的用户操作对象名称不写入数据列表中。
数据库服务器在数据列表中针对每个用户操作对象存储一条记录,以replace模式更新每个用户操作对象的记录。
步骤202,将数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中。
步骤201-202的执行主体可以为作为主同步服务器的服务器。
步骤203,针对缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态。
针对缓存队列中的任务采用分布式方式处理,即在一台服务器或多台服务器上启动多个同步服务工作模块,从主集群服务器上拉取用户操作对象的数据和状态。
步骤204,根据获取的状态,将获取的数据备份到从集群服务器。
步骤203-204的执行主体可以为作为从同步服务器的服务器。
基于同样的发明构思,本申请实施例中还提供一种跨集群对象存储异步备份装置,应用于跨集群对象存储异步备份系统中的同步服务器上。参见图3,图3为本申请实施例中应用于上述技术的装置结构示意图。该装置包括:第一获取单元301、处理单元302、第二获取单元303和备份单元304;
第一获取单元301,用于从数据库服务器上获取同步的数据列表;
处理单元302,用于将第一获取单元301获取的数据列表中的用户操作对象名称划分为多个任务,并下发到缓存队列中;
第二获取单元303,用于针对处理单元302下发任务的缓存队列中本同步服务器处理的任务从主集群服务器获取对应的用户操作对象的数据和状态;
备份单元304,用于根据获取的状态,将获取的数据备份到从集群服务器。
较佳地,
所述用户操作对象名称为主集群服务器通过部署的Openresty服务在主集群服务器成功写入数据时发送的针对该次操作对象的描述信息,其中,所述主集群服务器通过Openresty服务接收客户端发送的写入数据请求,通过部署的对象存储服务处理写入数据请求。
较佳地,
所述数据库服务器中针对每个用户操作对象存储一条记录,以replace模式更新每个用户操作对象的记录。
较佳地,
所述用户操作对象名称为:类型为增、删、改的写入请求对应的用户操作对象的名称。
较佳地,
针对缓存队列中的任务采用分布式方式处理。
上述实施例的单元可以集成于一体,也可以分离部署;可以合并为一个单元,也可以进一步拆分成多个子单元。
此外,本申请实施例中还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现所述的跨集群对象存储异步备份方法的步骤。
另外,本申请实施例中还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现权利要求所述的跨集群对象存储异步备份方法的步骤。
综上所述,本申请通过在对象存储服务之前部署openresty,使用openresty作为对象存储服务的前端。Openresty转发请求给对象存储服务,当收到请求回复时,将成功的操作记录到Mysql。后端的分布式同步服务SyncServer,由master从Mysql获取同步列表,下发同步任务给Redis,Work从redis获取同步列表,然后从对象存储服务拉取需要同步的数据,并且同步到从集群的对象存储服务。
该方案无需改动对象存储本身的代码;并且采用Mysql作为消息队列,从设计上根本避免了失败请求、多次请求冗余的问题,后端同步服务实现逻辑也大幅度简化。该方案逻辑明晰,实现简单方便,大幅度简化了对象存储异步同步的实现。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。