CN102902561B - 数据存储方法及数据存储系统 - Google Patents
数据存储方法及数据存储系统 Download PDFInfo
- Publication number
- CN102902561B CN102902561B CN201210339989.XA CN201210339989A CN102902561B CN 102902561 B CN102902561 B CN 102902561B CN 201210339989 A CN201210339989 A CN 201210339989A CN 102902561 B CN102902561 B CN 102902561B
- Authority
- CN
- China
- Prior art keywords
- vernier
- data
- file
- data update
- sequence number
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种数据存储方法及数据存储系统。该方法包括:接收数据更新命令,为数据更新命令分配游标;将接收的数据更新命令以及分配的游标写入不断添加模式AOF文件,并将AOF文件写入磁盘;根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,将数据写入磁盘中的数据文件,将为数据更新命令分配的游标写入磁盘中的游标文件;重启服务,加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。应用本发明,可以降低数据恢复所需的时间、避免数据丢失。
Description
技术领域
本发明涉及数据存储技术,尤其涉及一种数据存储方法及数据存储系统。
背景技术
目前,内存数据持久化存储主要采用纯内存存储引擎,主要包括持久化消息队列(mcq,MemcacheQ)、远程字典服务器(Redis,RemoteDictionaryServer)以及关系型数据库管理系统(Mysql)等,Memcached暂时没有自带的数据落地方法,Redis则自带有不断添加模式(AOF,AppendOnlyMode)文件和快照(snapshot)两种方式,Mysql的内存表则通过主动调用转储(dump)命令来将数据全部导出,然后写入磁盘。
现有支持数据落地的内存存储引擎,Redis的AOF文件实现了增量备份(binlog),即对新增加的数据更新命令进行备份,通过将数据更新命令追加写入到磁盘,这样,可保证用户的数据更新命令能够被及时写入到磁盘,服务异常退出后,可以根据AOF文件中存储的数据更新命令来恢复数据,但该方法随着数据更新命令的不断增多,使得AOF文件的数据量越来越大,数据恢复所需的时间会越来越长。
为了降低数据恢复所需的时间,Redis引入了AOF文件重写机制,其功能就是重新生成一份AOF文件,新的AOF文件中一条记录的数据更新命令只会有一次,而现有常规的AOF文件,记录了对同一数据的多次更新命令,这样,可以减小AOF文件的大小,但该方法在重写AOF文件时,由于Redis在重写AOF文件时会占用大量的CPU和内存资源,导致负载过高,出现短暂的服务暂停现象,因而,在重写时,导致数据丢失问题,不能保障数据的安全性;而且,AOF文件的重写,也将影响Redis的数据处理性能,降低了数据更新命令的写入速度。
对于Redis的snapshot模式,是定期dump模式,即定期将内存数据批量写入磁盘,与Mysql的内存表的dump命令性质相同,如果发生服务重启或中断等异常,在两次snapshot期间发生的数据更新,由于未能及时写入磁盘,将会全部丢失;而且,随着更新的数据不断增多,从磁盘恢复数据所需的时间会越来越长。
由上述可见,现有的数据存储方法,无论是采用AOF文件存储方式还是snapshot存储方式,或是Mysql的dump存储方式,在恢复数据时,都存在数据恢复所需的时间较长、数据丢失的技术问题。
发明内容
本发明的实施例提供一种数据存储方法,降低数据恢复所需的时间、避免数据丢失。
本发明的实施例还提供一种数据存储系统,降低数据恢复所需的时间、避免数据丢失。
为达到上述目的,本发明实施例提供的一种数据存储方法,包括:
接收数据更新命令,为数据更新命令分配游标;
将接收的数据更新命令以及分配的游标写入不断添加模式AOF文件,并将AOF文件写入磁盘;
根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,将数据写入磁盘中的数据文件,将为数据更新命令分配的游标写入磁盘中的游标文件;
重启服务,加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。
其中,所述为数据更新命令分配游标包括:
判断当前接收的数据更新命令是否为接收的第一条数据更新命令,如果是,为接收的数据更新命令分配游标序列号,并记录分配的游标序列号信息;如果不是,将记录的游标序列号进行累加,为接收数据更新命令设置累加的游标序列号,记录累加的游标序列号信息。
其中,所述为数据更新命令分配游标包括:
判断AOF文件中是否存在写入的数据更新命令,如果不存在,为接收的数据更新命令分配游标序列号;如果存在,获取AOF文件中当前已写入的数据更新命令的游标序列号信息,对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号。
其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件包括:
获取预先设置的时间周期内,更新数据成功对应的数据更新命令,将为所述更新数据成功对应的数据更新命令分配的游标写入磁盘中的游标文件。
其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件进一步包括:
读取游标文件中最新存储的游标序列号;
判断为数据更新命令分配的游标序列号是否大于游标文件中最新存储的游标序列号,如果是,将为数据更新命令分配的游标写入磁盘中的游标文件;否则,不作处理。
其中,所述将数据写入磁盘中的数据文件之后,进一步包括:
删除数据文件中除最近更新数据外的其他数据。
其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件之后,进一步包括:
存储游标文件中最大的游标序列号,删除游标文件中除最大游标序列号外的其他游标序列号。
其中,所述加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令包括:
读取数据文件,获取数据文件中最近更新的数据;
从游标文件中,获取游标文件中顺序位最大的游标序列号;
根据该最大的游标序列号,查询存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令;
对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令。
一种数据存储系统,该数据存储系统包括:游标分配器、不断添加模式AOF文件存储器、数据文件存储器、游标文件存储器以及数据恢复器,其中,
游标分配器,用于接收数据更新命令,为数据更新命令分配游标;
AOF文件存储器,用于将接收的数据更新命令以及分配的游标写入AOF文件,存储写入的AOF文件;
数据文件存储器,用于根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,存储写入的数据文件,向游标文件存储器输出触发信息;
游标文件存储器,用于接收触发信息,存储将为数据更新命令分配的游标信息;
数据恢复器,用于重启服务,加载磁盘中数据文件存储器中的数据,获取游标文件存储器中顺序位最高的游标,从AOF文件存储器存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。
所述AOF文件存储器、数据文件存储器以及游标文件存储器分别为一个或多个。
所述游标分配器包括:接收模块、判断模块、分配模块以及累加模块,其中,
接收模块,用于接收数据更新命令,输出至判断模块;
判断模块,用于判断当前接收的数据更新命令是否为接收的第一条数据更新命令,如果是,输出至分配模块,如果不是,输出至累加模块;
分配模块,用于为接收的数据更新命令分配游标序列号,并记录分配的游标序列号信息;
累加模块,用于将记录的游标序列号进行累加,为接收数据更新命令设置累加的游标序列号,记录累加的游标序列号信息。
所述游标分配器包括:接收模块、判断模块、分配模块、获取模块以及累加模块,其中,
接收模块,用于接收数据更新命令,输出至判断模块;
判断模块,用于判断AOF文件中是否存在写入的数据更新命令,如果不存在,通知分配模块,如果存在,通知获取模块;
分配模块,用于接收通知,为接收的数据更新命令分配游标序列号;
获取模块,用于接收通知,获取AOF文件中当前已写入的数据更新命令的游标序列号信息;
累加模块,用于对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号。
所述数据恢复器包括:重启模块、数据文件读取模块、游标文件读取模块、查询模块以及更新模块,其中,
重启模块,用于重启服务;
数据文件读取模块,用于读取数据文件存储器中存储的数据文件,获取数据文件中最近更新的数据;
游标文件读取模块,用于从游标文件存储器存储的游标文件中,获取游标文件中顺序位最大的游标序列号;
查询模块,用于根据该最大的游标序列号,查询AOF文件存储器中存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令;
更新模块,用于对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令。
由上述技术方案可见,本发明实施例提供的一种数据存储方法及数据存储系统,接收数据更新命令,为数据更新命令分配游标;将接收的数据更新命令以及分配的游标写入不断添加模式AOF文件,并将AOF文件写入磁盘;根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,将数据写入磁盘中的数据文件,将为数据更新命令分配的游标写入磁盘中的游标文件;重启服务,加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。这样,通过为顺序存储的数据更新命令分配游标,在内存数据库中数据成功更新后,存储该更新数据的更新命令对应的游标信息,在进行数据恢复时,获取最后更新成功的数据,并依据该数据对应的游标信息,读取AOF文件中该游标信息后顺序存储的对应的数据更新命令,进行数据恢复,可以避免两次时间周期之间,由于服务重启造成的数据更新丢失问题,以及,AOF文件过大引起的数据恢复时间过长问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,以下将对实施例或现有技术描述中所需要使用的附图作简单地介绍。显而易见地,以下描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员而言,还可以根据这些附图所示实施例得到其它的实施例及其附图。
图1为本发明实施例的数据存储方法流程示意图。
图2为本发明实施例内存数据库处理数据更新命令的流程示意图。
图3为本发明实施例内恢复数据的流程示意图。
图4为本发明实施例的数据存储系统结构示意图。
具体实施方式
以下将结合附图对本发明各实施例的技术方案进行清楚、完整的描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施例,都属于本发明所保护的范围。
现有的数据存储方法,根据AOF文件中存储的数据更新命令来恢复数据,当数据更新命令不断增多时,AOF文件的数据量越来越大,使得数据恢复所需的时间越来越长;而采用AOF文件重写机制,虽然可以一定程度上降低数据恢复所需的时间,但会导致数据丢失问题,数据的安全性不高;而对于Redis的snapshot模式,随着更新的数据不断增多,从磁盘恢复数据所需的时间也会变长,如果发生服务重启或中断等异常,在两次snapshot期间发生的数据更新,由于未能及时写入磁盘,将会全部丢失。这样,在对数据安全性要求较高的情况下,服务异常不仅会导致数据存储的效率降低,也降低了用户的业务体验。
本发明实施例提出的数据存储方法,考虑对数据更新命令进行顺序化存储,并为顺序存储的数据更新命令分配游标(ID),在内存数据库中数据成功更新后,存储该更新数据的更新命令对应的游标信息,在进行数据恢复时,获取最后更新成功的数据,并依据该数据对应的游标信息,读取AOF文件中该游标信息后顺序存储的对应的数据更新命令,进行数据恢复。从而着重解决在内存数据存储中,如何保证两次snapshot期间服务重启造成的数据更新丢失问题,以及,AOF文件过大引起的数据恢复时间过长问题。
图1为本发明实施例的数据存储方法流程示意图。参见图1,该流程包括:
步骤101,接收数据更新命令,为数据更新命令分配游标;
本步骤中,用户或应用业务逻辑在需要对内存数据库中的数据进行更新时,向内存数据库发送数据更新命令,基于用户或应用业务逻辑所提交的数据更新命令总会有先后的顺序,并依序执行接收的数据更新名命令,因而,本发明实施例中,可以按照数据更新命令提交或接收的先后顺序,为数据更新命令分配用于标识其执行顺序的游标。
本发明实施例中,可以预先为该数据更新命令分配一个自增id,例如,可以按照接收到的数据更新命令的顺序进行分配,id从1开始,最大为64位无符号长整型。
较佳地,本发明实施例应用于异步提交系统中。
本发明实施例中,游标信息为游标序列号。当然,实际应用中,游标信息也可以是其它的信息,只要保证为每个数据更新命令设置的游标信息互不相同即可,即只要能够唯一标识数据更新命令即可。
为数据更新命令分配游标包括:
判断当前接收的数据更新命令是否为接收的第一条数据更新命令,如果是,为接收的数据更新命令分配游标序列号,并记录分配的游标序列号信息;如果不是,将记录的游标序列号进行累加,为接收数据更新命令设置累加的游标序列号,记录累加的游标序列号信息。
本步骤中,内存数据库判断接收的数据更新命令是否为第一条数据更新命令,如果是,将初始游标序列号分配给该数据更新命令,并记录该分配的游标序列号信息,后续如果接收到新数据更新命令,则将接收的前一数据更新命令的游标序列号进行累加,作为当前新接收数据更新命令的游标序列号。例如,将游标序列号依序加1,如果设置的第一条数据更新命令对应的初始游标序列号为1,则后续接收的数据更新命令对应的游标序列号,依序为2、3、4、…。
当然,实际应用中,为数据更新命令分配游标也可以包括:
判断AOF文件中是否存在写入的数据更新命令,如果不存在,为接收的数据更新命令分配游标序列号;如果存在,获取AOF文件中当前已写入的数据更新命令的游标序列号信息,对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号。
本步骤中,内存数据库在接收到数据更新命令时,查询写入磁盘的AOF文件中是否有写入的数据更新命令,如果没有,表明当前接收到的数据更新命令为第一条数据更新命令;如果写入磁盘的AOF文件中有写入的数据更新命令,则可以根据最近一次写入的数据更新命令中携带的游标序列号信息,为当前接收到的数据更新命令设置相应的游标序列号。
步骤102,将接收的数据更新命令以及分配的游标写入AOF文件,并将AOF文件写入磁盘;
本步骤中,在AOF文件中,建立数据更新命令与游标的映射关系并存储。将接收的数据更新命令顺序写入磁盘,并将顺序值(游标序列号)从1开始,依序自增,并将依序自增的序号作为依序接收的数据更新命令的游标,从而形成一一映射关系。
本发明实施例中,将数据更新命令传递给内存数据库写入AOF文件的同时,将为该数据更新命令对应分配的游标信息传递给内存数据库。为了持久化存储AOF文件,将生成的AOF文件实时写入磁盘进行持久化存储,以备后续进行数据恢复之用。
步骤103,根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,将数据写入磁盘中的数据文件,将为数据更新命令分配的游标写入磁盘中的游标文件;
本步骤中,内存数据库根据依序接收的数据更新命令,对内存数据库中的数据进行相应更新。
内存数据库程序,例如,通过预先构造数据结构来将数据存储到内存数据库的程序,在接收到数据更新命令时,对数据进行更新。
本发明实施例中,在磁盘中预先设置有数据文件以及游标文件,内存数据库在更新数据成功后,按照预先设置的时间周期,将更新的内存数据dump写入磁盘中数据文件的同时,将当前该更新命令对应的游标值也同时dump写入磁盘中的游标文件进行保存。
其中,将为数据更新命令分配的游标写入磁盘中的游标文件包括:
获取预先设置的时间周期内,更新数据成功对应的数据更新命令,将为所述更新数据成功对应的数据更新命令分配的游标写入磁盘中的游标文件。
较佳地,为了保持游标文件中存储的游标信息的前后一致性,将为数据更新命令分配的游标写入磁盘中的游标文件还可以包括:
读取游标文件中最新存储的游标序列号;
判断为数据更新命令分配的游标序列号是否大于游标文件中最新存储的游标序列号,如果是,将为数据更新命令分配的游标写入磁盘中的游标文件;否则,不作处理。
本步骤中,写入游标序列号时,需要对游标文件存储的游标序列号进行一致性检查,以避免不必要的处理流程,由于为数据更新命令分配的游标序列号依序递增,因而,如果为数据更新命令分配的游标序列号大于游标文件中最新存储的游标序列号,表明当前执行的数据更新是在上一次的数据更新的基础上执行的,具有连续性;如果为数据更新命令分配的游标序列号小于或等于游标文件中最新存储的游标序列号,例如,如果数据更新命令分配的游标序列号与存储的游标序列号相同,或者,数据更新命令分配的游标序列号与存储的游标序列号相差两个以上累加单位,表明当前执行的数据更新出现了异常,需要终止。
举例来说,假设内存数据库中存储的数据为空,需要为内存数据库置入数据B,并执行将数据B转换为数据A的流程,则本发明实施例中,依序包含两条数据更新命令,分别为初始化内存数据库的数据更新命令1以及将数据B转换为数据A的数据更新命令2,在接收到数据更新命令1后,为数据更新命令1分配游标序列号1,接收到数据更新命令2,为数据更新命令2分配游标序列号2,并将接收的数据更新命令及其分配的游标序列号写入磁盘中的AOF文件;执行数据更新命令1,在内存数据库中写入数据B,然后,执行数据更新命令2,将内存数据库中写入的数据B转换为数据A。在预先设置的时间周期到时,将初始写入的数据B以及转换后生成的数据A写入磁盘中的数据文件,将为数据更新命令1分配的游标序列号1以及为数据更新命令2分配的游标序列号2写入磁盘中的游标文件。如果在预先设置的时间周期未到时,服务出现异常,例如,内存数据库断电,则在AOF文件中,存储有数据更新命令1以及数据更新命令2,并分别建立有数据更新命令1与游标序列号1、以及数据更新命令2与游标序列号2的映射关系,在数据文件中,未写入任何数据,在游标文件中,也未记录任何游标序列号。
较佳地,本发明实施例中,为了有效降低磁盘中持久化存储的数据量,将数据写入磁盘中的数据文件的步骤之后,可以进一步包括:
删除数据文件中除最近更新数据外的其他数据。
本步骤中,如前所述,对于数据文件中存储有初始写入的数据B以及转换后生成的数据A的情形,由于转换后生成的数据A为最近更新数据,则可以只保留转换后生成的数据A,而删除初始写入的数据B。这样,数据文件中只需存储最后一次成功更新的数据,从而有效降低了所需存储的数据量。
基于同样的考虑,将为数据更新命令分配的游标写入磁盘中的游标文件的步骤,也可以进一步包括:
存储游标文件中最大的游标序列号,删除游标文件中除最大游标序列号外的其他游标序列号。
本步骤中,如前所述,对于游标文件中存储有数据更新命令1以及数据更新命令2的情形,由于数据更新命令2为最近执行的数据更新命令,则可以只保留最近执行的数据更新命令2,而删除数据更新命令1。这样,游标文件中也只需存储最后一次执行成功的数据更新命令,也有效降低了所需存储的数据量。
步骤104,重启服务,加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。
本步骤中,在将内存数据更新命令dump写入磁盘的同时,将当前该更新命令对应的游标序列号也同时dump到磁盘进行保存。
当数据库程序发生异常,例如,崩溃时,根据磁盘上保存的数据文件、AOF文件以及游标文件,即可安全地进行内存数据库中数据的接续更新和恢复。具体来说,
读取数据文件,获取数据文件中最近更新的数据,接着,从游标文件中,获取游标文件中顺序位最高的游标,即最大的游标序列号,根据该最大的游标序列号,查询存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令,对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令,从而恢复出所需的数据。
如前所述,如果AOF文件中存储有数据更新命令1映射的游标序列号1、以及,数据更新命令2映射的游标序列号2;数据文件中存储有初始写入的数据B以及转换后生成的数据A,或者,存储有转换后生成的数据A;游标文件中存储有游标序列号1以及游标序列号2,或者,存储有游标序列号2,在服务异常的情况下,通过重启服务,需要恢复出服务异常前的数据,则首先获取数据文件中最近更新的数据,即转换后生成的数据A,接着,获取获取游标文件中顺序位最高的游标,即游标序列号2,根据游标序列号2,查询存储的AOF文件,根据AOF文件中的映射关系,获取游标序列号2对应的数据更新命令,即数据更新命令2,由于该数据更新命令2之后,没有存储其它顺序位更高的数据更新命令,因而,无需对转换后生成的数据A执行数据更新,即恢复出的数据为转换后生成的数据A。
而如果AOF文件中存储有数据更新命令1映射的游标序列号1、以及,数据更新命令2映射的游标序列号2;数据文件中存储的数据为空;游标文件中存储的游标序列号为空,表明在执行数据更新命令1以及对数据B执行数据更新命令2的过程中,服务发生异常,现有技术中,该服务发生异常时,数据B以及数据A将被丢弃,无法恢复,本发明实施例中,在服务异常的情况下,通过重启服务,可以恢复出服务异常前的数据,首先获取数据文件中最近更新的数据(无数据),接着,获取获取游标文件中顺序位最高的游标(无游标序列号,例如,可以默认为0),则查询存储的AOF文件,获取最低游标序列号对应的数据更新命令,即数据更新命令1,以及最高游标序列号对应的数据更新命令2,根据数据更新命令1,置入初始数据B,根据数据更新命令2,将置入的初始数据B经过转换处理,转换为数据A,即可恢复数据为转换后生成的数据A。
图2为本发明实施例内存数据库处理数据更新命令的流程示意图。参见图2,该流程包括:
步骤201,应用业务逻辑发送用于数据更新的数据更新命令;
本步骤中,当需要进行数据更新时,向内存数据库发送数据更新命令。
步骤202,接收数据更新命令,判断是否接收成功,如果是,执行步骤203,否则,等待接收下一数据更新命令;
本步骤中,如果数据更新命令接收不成功,则继续等待,以便接收下一数据更新命令。
步骤203,为接收的数据更新命令进行游标分配;
本步骤中,依据接收的数据更新命令,依序为接收的数据更新命令分配顺序位依次增大的游标序列号。
步骤204,将成功接收的数据更新命令写入磁盘中的AOF文件;
步骤205,进行数据更新命令处理,等待接收下一数据更新命令。
本步骤中,根据数据更新命令,对数据进行相应更新,在更新成功后,当达到预先设置的时间周期时,将更新成功的数据写入磁盘中的数据文件,并将该数据更新命令对应的游标序列号写入磁盘中的游标文件。当然,实际应用中,也可以以更新成功的数据替换磁盘数据文件中存储的数据,并以该数据更新命令对应的游标序列号替换磁盘游标文件中存储的游标序列号。
图3为本发明实施例内恢复数据的流程示意图。参见图3,该流程包括:
步骤301,加载磁盘中存储的数据文件中的数据;
本步骤中,加载数据文件中最近存储的数据。
步骤302,读取磁盘游标文件中存储的游标序列号;
本步骤中,获取游标文件中存储的最大游标序列号。
步骤303,按照读取的游标序列号读取AOF文件中未处理的数据更新命令,进行数据恢复;
本步骤中,根据游标文件中存储的最大游标序列号,获取AOF文件中该最大游标序列号之后的数据更新命令,对加载的数据进行数据更新处理,从而恢复出所需的数据。
步骤304,响应网络查询命令,输出查询命令对应的数据。
本步骤中,在内存数据库中恢复出数据后,可以接收外部用户的查询命令,将查询得到的数据向用户返回,从而提供业务服务。
实际应用中,为了实现内存数据库的多机冗余,还可以将数据更新命令接收、游标分配和数据持久化存储机制单独提取并存处在不同的物理设备中,从而基于冗余机制开发异步提交系统。
由上述技术方案可见,本发明实施例的数据存储方法,在接收到数据更新命令后,为数据更新命令分配游标,并在内存数据库中数据依据数据更新命令更新成功后,存储该数据更新命令对应的游标信息以及更新的数据,在进行数据恢复时,获取最后更新成功的数据,并依据该数据对应的游标信息,读取AOF文件中该游标信息之后顺序存储的数据更新命令,对获取的数据进行数据更新,从而恢复出数据。这样,通过为数据更新命令分配游标并严格按照顺序保存,在dump数据的同时,保存数据更新命令对应的游标值,实现数据增量更新,在数据恢复时,按照游标历史值回跳游标,并重放数据更新命令来恢复内存数据,可以避免两次时间周期之间,由于服务重启造成的数据更新丢失问题,以及,AOF文件过大引起的数据恢复时间过长问题。具体来说,本发明实施例的技术方案,与Redis的AOF文件机制相比,不需要定期重写AOF文件,对于游标序列号小于游标文件中所记录的游标值的数据更新命令,可以直接删除,例如,在系统实现时,可以将游标文件按照2G文件大小进行拆分,并删除更新时间较长的数据以及游标序列号较小的游标,这样,减少了增量备份对磁盘的占用量,而且数据恢复时间短、速度快;而相较于Redis的snapshot机制,本发明实施例,由于dump时通过游标文件记录了游标值,因而,在数据恢复时,只需要从游标值开始而无需从最初的游标值开始,重新进行数据更新命令的处理,即可恢复全部数据,从而降低了恢复数据所需的时间,解决了两次snapshot期间重启服务造成的数据丢失问题,使得本发明实施例提出的异步提交系统,在自媒体产品内获得相对广泛的应用。
图4为本发明实施例的数据存储系统结构示意图。参见图4,该系统包括:游标分配器、AOF文件存储器、数据文件存储器、游标文件存储器以及数据恢复器,其中,
游标分配器,用于接收数据更新命令,为数据更新命令分配游标;
本发明实施例中,游标以游标序列号进行标识,按照接收的数据更新命令,依序递增。
AOF文件存储器,用于将接收的数据更新命令以及分配的游标写入AOF文件,存储写入的AOF文件;
数据文件存储器,用于根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,存储写入的数据文件,向游标文件存储器输出触发信息;
游标文件存储器,用于接收触发信息,存储将为数据更新命令分配的游标信息;
数据恢复器,用于重启服务,加载磁盘中数据文件存储器中的数据,获取游标文件存储器中顺序位最高的游标,从AOF文件存储器存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。
本发明实施例中,较佳地,AOF文件存储器可以为一个或多个,如果为多个,则可以形成冗余配置,可以提高系统的可靠性。数据文件存储器以及游标文件存储器也可以分别为一个或多个。
其中,
游标分配器包括:接收模块、判断模块、分配模块以及累加模块(图中未示出),其中,
接收模块,用于接收数据更新命令,输出至判断模块;
判断模块,用于判断当前接收的数据更新命令是否为接收的第一条数据更新命令,如果是,输出至分配模块,如果不是,输出至累加模块;
分配模块,用于为接收的数据更新命令分配游标序列号,并记录分配的游标序列号信息;
累加模块,用于将记录的游标序列号进行累加,为接收数据更新命令设置累加的游标序列号,记录累加的游标序列号信息。
当然,实际应用中,游标分配器也可以包括:接收模块、判断模块、分配模块、获取模块以及累加模块(图中未示出),其中,
接收模块,用于接收数据更新命令,输出至判断模块;
判断模块,用于判断AOF文件中是否存在写入的数据更新命令,如果不存在,通知分配模块,如果存在,通知获取模块;
分配模块,用于接收通知,为接收的数据更新命令分配游标序列号;
获取模块,用于接收通知,获取AOF文件中当前已写入的数据更新命令的游标序列号信息;
累加模块,用于对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号。
数据恢复器包括:重启模块、数据文件读取模块、游标文件读取模块、查询模块以及更新模块(图中未示出),其中,
重启模块,用于重启服务;
数据文件读取模块,用于读取数据文件存储器中存储的数据文件,获取数据文件中最近更新的数据;
游标文件读取模块,用于从游标文件存储器存储的游标文件中,获取游标文件中顺序位最大的游标序列号;
查询模块,用于根据该最大的游标序列号,查询AOF文件存储器中存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令;
更新模块,用于对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令。
显然,本领域技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若对本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也包含这些改动和变型在内。
Claims (9)
1.一种数据存储方法,该方法包括:
接收数据更新命令,为数据更新命令分配游标;
将接收的数据更新命令以及分配的游标写入不断添加模式AOF文件,并将AOF文件写入磁盘;
根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,将数据写入磁盘中的数据文件,将为数据更新命令分配的游标写入磁盘中的游标文件;
重启服务,加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令;
其中,所述为数据更新命令分配游标包括:判断AOF文件中是否存在写入的数据更新命令,如果不存在,为接收的数据更新命令分配游标序列号;如果存在,获取AOF文件中当前已写入的数据更新命令的游标序列号信息,对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号。
2.根据权利要求1所述的方法,其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件包括:
获取预先设置的时间周期内,更新数据成功对应的数据更新命令,将为所述更新数据成功对应的数据更新命令分配的游标写入磁盘中的游标文件。
3.根据权利要求2所述的方法,其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件进一步包括:
读取游标文件中最新存储的游标序列号;
判断为数据更新命令分配的游标序列号是否大于游标文件中最新存储的游标序列号,如果是,将为数据更新命令分配的游标写入磁盘中的游标文件;否则,不作处理。
4.根据权利要求1所述的方法,其中,所述将数据写入磁盘中的数据文件之后,进一步包括:
删除数据文件中除最近更新数据外的其他数据。
5.根据权利要求1所述的方法,其中,所述将为数据更新命令分配的游标写入磁盘中的游标文件之后,进一步包括:
存储游标文件中最大的游标序列号,删除游标文件中除最大游标序列号外的其他游标序列号。
6.根据权利要求1所述的方法,其中,所述加载磁盘数据文件中的数据,获取游标文件中顺序位最高的游标,从存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令包括:
读取数据文件,获取数据文件中最近更新的数据;
从游标文件中,获取游标文件中顺序位最大的游标序列号;
根据该最大的游标序列号,查询存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令;
对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令。
7.一种数据存储系统,其特征在于,该数据存储系统包括:游标分配器、不断添加模式AOF文件存储器、数据文件存储器、游标文件存储器以及数据恢复器,其中,
游标分配器,包括接收模块、判断模块、分配模块、获取模块以及累加模块,其中,
所述接收模块用于接收数据更新命令,输出至判断模块;
所述判断模块用于判断AOF文件中是否存在写入的数据更新命令,如果不存在,通知分配模块,如果存在,通知获取模块;
所述分配模块用于接收通知,为接收的数据更新命令分配游标序列号;
所述获取模块用于接收通知,获取AOF文件中当前已写入的数据更新命令的游标序列号信息;
所述累加模块用于对获取的游标序列号进行累加,为接收的数据更新命令设置累加的游标序列号;
AOF文件存储器,用于将接收的数据更新命令以及分配的游标写入AOF文件,存储写入的AOF文件;
数据文件存储器,用于根据数据更新命令更新数据,在更新数据成功后,按照预先设置的时间周期,存储写入的数据文件,向游标文件存储器输出触发信息;
游标文件存储器,用于接收触发信息,存储将为数据更新命令分配的游标信息;
数据恢复器,用于重启服务,加载磁盘中数据文件存储器中的数据,获取游标文件存储器中顺序位最高的游标,从AOF文件存储器存储的AOF文件中,加载该游标对应的数据更新命令之后的数据更新命令。
8.根据权利要求7所述的数据存储系统,其特征在于,所述AOF文件存储器、数据文件存储器以及游标文件存储器分别为一个或多个。
9.根据权利要求7或8所述的数据存储系统,其特征在于,所述数据恢复器包括:重启模块、数据文件读取模块、游标文件读取模块、查询模块以及更新模块,其中,
重启模块,用于重启服务;
数据文件读取模块,用于读取数据文件存储器中存储的数据文件,获取数据文件中最近更新的数据;
游标文件读取模块,用于从游标文件存储器存储的游标文件中,获取游标文件中顺序位最大的游标序列号;
查询模块,用于根据该最大的游标序列号,查询AOF文件存储器中存储的AOF文件,根据AOF文件中的映射关系,获取最大的游标序列号对应的数据更新命令;
更新模块,用于对获取的数据文件中最近更新的数据,依序执行最大的游标序列号对应的数据更新命令之后的数据更新命令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210339989.XA CN102902561B (zh) | 2012-09-13 | 2012-09-13 | 数据存储方法及数据存储系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210339989.XA CN102902561B (zh) | 2012-09-13 | 2012-09-13 | 数据存储方法及数据存储系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102902561A CN102902561A (zh) | 2013-01-30 |
CN102902561B true CN102902561B (zh) | 2016-01-20 |
Family
ID=47574807
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210339989.XA Active CN102902561B (zh) | 2012-09-13 | 2012-09-13 | 数据存储方法及数据存储系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102902561B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105468641B (zh) * | 2014-09-09 | 2020-08-18 | 上海盛大网络发展有限公司 | 一种搜索云消息实时分发系统及方法 |
CN105989160A (zh) * | 2015-03-03 | 2016-10-05 | 大唐软件技术股份有限公司 | 一种针对Redis数据库的内存数据持久化方法和装置 |
CN106055606A (zh) * | 2016-05-25 | 2016-10-26 | 合网络技术(北京)有限公司 | 流数据处理方法和装置 |
CN106790571A (zh) * | 2016-12-27 | 2017-05-31 | 歌尔科技有限公司 | 个人运动数据检测传输、接收处理方法和检测系统 |
CN106844102B (zh) * | 2017-01-16 | 2022-11-04 | 腾讯科技(深圳)有限公司 | 数据恢复方法和装置 |
US11138076B2 (en) | 2017-06-30 | 2021-10-05 | Redis Ltd. | Methods, systems, and media for controlling append-only file rewrites |
CN108614876B (zh) * | 2018-04-26 | 2021-02-02 | 武汉斗鱼网络科技有限公司 | 一种基于Redis数据库的系统和数据处理方法 |
CN108874416B (zh) * | 2018-05-04 | 2022-10-28 | 天津猎鹰网络技术有限公司 | 策略处理方法、装置、存储介质、处理器 |
CN113590379A (zh) * | 2021-06-25 | 2021-11-02 | 国电南瑞科技股份有限公司 | Redis数据持久化方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1838055A (zh) * | 2005-01-28 | 2006-09-27 | 惠普开发有限公司 | 具有数据跟踪的存储复制系统 |
CN102073560A (zh) * | 2011-01-17 | 2011-05-25 | 北京深思洛克软件技术股份有限公司 | 一种数据备份方法和装置 |
CN102170466A (zh) * | 2011-03-29 | 2011-08-31 | 中国人民解放军国防科学技术大学 | 一种数据处理方法及系统 |
CN102609364A (zh) * | 2012-02-14 | 2012-07-25 | 华中科技大学 | 缓存交换方法 |
-
2012
- 2012-09-13 CN CN201210339989.XA patent/CN102902561B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1838055A (zh) * | 2005-01-28 | 2006-09-27 | 惠普开发有限公司 | 具有数据跟踪的存储复制系统 |
CN102073560A (zh) * | 2011-01-17 | 2011-05-25 | 北京深思洛克软件技术股份有限公司 | 一种数据备份方法和装置 |
CN102170466A (zh) * | 2011-03-29 | 2011-08-31 | 中国人民解放军国防科学技术大学 | 一种数据处理方法及系统 |
CN102609364A (zh) * | 2012-02-14 | 2012-07-25 | 华中科技大学 | 缓存交换方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102902561A (zh) | 2013-01-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102902561B (zh) | 数据存储方法及数据存储系统 | |
US11327799B2 (en) | Dynamic allocation of worker nodes for distributed replication | |
CN103019888B (zh) | 备份方法与装置 | |
CN108804523B (zh) | 数据同步方法、系统及计算机可读存储介质 | |
CN102594849B (zh) | 数据备份、恢复方法、虚拟机快照删除、回滚方法及装置 | |
US8843716B2 (en) | Computer system, storage apparatus and data transfer method | |
US9501544B1 (en) | Federated backup of cluster shared volumes | |
KR20200113047A (ko) | 오픈 채널 스토리지 장치의 동작 방법 | |
CN101515276A (zh) | 一种文件数据写操作的方法、文件数据恢复方法及系统 | |
US10346066B2 (en) | Efficient erasure coding of large data objects | |
CN102750317A (zh) | 数据持久化处理方法、装置及数据库系统 | |
CN104866430A (zh) | 结合主从备份和纠删码的内存计算系统高可用优化方法 | |
CN103019626B (zh) | 存储系统、控制集群元数据的方法及装置 | |
US9507535B2 (en) | Offloading raid update operations to disk controllers | |
US9772910B1 (en) | Resource optimization for storage integrated data protection | |
CN113407380A (zh) | 跨集群灾备快速恢复的方法及装置、电子设备和存储介质 | |
CN102193780A (zh) | 事务实现方法以及事务实现设备 | |
US9690658B2 (en) | Distributed storage system and method | |
CN102833273A (zh) | 临时故障时的数据修复方法及分布式缓存系统 | |
CN103078805B (zh) | 使Zookeeper的读性能支持水平扩展的系统和方法 | |
US20140122433A1 (en) | Storage device and data backup method | |
CN112579550B (zh) | 一种分布式文件系统的元数据信息同步方法及系统 | |
US9594635B2 (en) | Systems and methods for sequential resilvering | |
CN110704091A (zh) | 一种固件升级方法及装置 | |
CN102523112A (zh) | 信息处理方法及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20230414 Address after: Room 501-502, 5/F, Sina Headquarters Scientific Research Building, Block N-1 and N-2, Zhongguancun Software Park, Dongbei Wangxi Road, Haidian District, Beijing, 100193 Patentee after: Sina Technology (China) Co.,Ltd. Address before: 100080, International Building, No. 58 West Fourth Ring Road, Haidian District, Beijing, 20 floor Patentee before: Sina.com Technology (China) Co.,Ltd. |
|
TR01 | Transfer of patent right |