具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种日志存储方法,主要是通过键-数值(Key-Value)存储系统来储存日志文件,本实施例的方法是Key-Value存储系统(即日志存储系统)所执行的方法,流程图如图1所示,包括:
步骤101,获取日志文件的写请求,生成写请求对应的日志序号。
可以理解,Key-Value存储系统是用来储存数据即Value的系统,每个Value(本实施例中为一个写请求对应的日志文件)的存储地址是通过Key和一定的策略计算得到,可以同时对多个Value进行操作而互不影响,具有高并发高性能优势。
本实施例中采用Key-Value存储系统来对日志文件进行储存,且本实施例的方法流程可以是用户通过包括Key-Value存储系统的设备提供的界面来触发,也可以在对包括Key-Value存储系统的设备进行操作时,触发对操作过程中生成的日志文件进行的储存。
当Key-Value存储系统获取了日志文件的写请求后,可以按照递增(或递减)的方式生成日志序号,如果以递增(或递减)的方式来生成日志序号,则为当前写请求分配的日志序号即为:在为上次获取的写请求生成的日志序号的基础上加(或减)m,这里m为正数。Key-Value存储系统也可以根据写请求所请求写入的日志文件所属日志对象来生成日志序号,比如写请求是请求写入用户a对应的日志文件,则当前生成的日志序号即为:在为上次获取的关于用户a的写请求(日志文件的写请求)生成的日志序号基础上加(或减)m。
步骤102,将写请求所请求写入的日志文件所属日志对象的标识信息与日志序号作为键,并通过键计算得到写请求所请求写入的日志文件的存储地址。
在Key-Value存储系统中用日志对象来区分不同用户(或不同类型,或不同应用等)的日志文件,且可以储存至少一个日志对象的日志文件,这里日志文件所属日志对象的标识信息是能唯一标识一个日志对象的信息,比如通过用户名和应用名来标识一个日志对象,则数据库(Data Base,DB)中某一用户USER的一类比如域名(DOMAIN)类型对应的所有日志文件都可以用“DB_USER_DOMAIN”来标识,而DB_USER_DOMAIN即为一个日志对象的标识信息。
本发明实施例中以日志对象和步骤101中生成的日志序号结合起来作为键,其中该日志序号可以认为是键值,在通过键计算存储地址时,Key-Value存储系统可以将键通过哈希散列方法进行计算,还可以通过其它计算进行计算。
步骤103,根据日志文件的存储地址将写请求所请求写入的日志文件储存到Key-Value存储系统的磁盘系统中。
可见,本实施例的日志存储方法中,通过Key-Value存储系统来储存日志文件,具体地,当Key-Value存储系统接收到获取日志文件的写请求,生成写请求对应的日志序号,并将写请求所请求写入的日志文件所属日志对象的标识信息与日志序号作为键,通过键计算得到写请求所请求写入的日志文件的存储地址,最后根据日志文件的存储地址将写请求所请求写入的日志文件储存到磁盘系统中。和现有技术中通过传统的存储系统来储存日志文件,即一个日志对象只对应一个日志文件相比,本发明实施例中通过Key-Value存储系统来储存日志文件,即将日志对象标识与动态生成的日志序号作为键,使得一个日志对象对应的多个日志文件可以储存到不同的存储地址,这样可以通过多个处理进程来处理一个日志对象对应的日志文件,提高对日志文件的处理速度,从而提升日志存储系统的性能。
在一个具体的实施例中,为了对磁盘系统中的日志文件的方便管理,Key-Value存储系统除了执行上述步骤101到103外,还可以先在内存中缓存磁盘系统中储存的日志对象对应的日志文件信息,该日志文件信息可以包括日志对象的标识信息、日志对象对应的日志文件的最大键值和最小键值(即上述生成的日志序号),并将缓存的日志对象对应的日志文件信息周期性地储存到Key-Value存储系统的磁盘系统中,即日志文件信息的持久化过程。
由于本发明实施例中是将日志对象的标识信息与分配的日志序号结合起来作为键,则该日志序号则可以认为是对应的键值,如果在上述步骤101中为写请求生成日志序号时以递增方式进行生成,随着Key-Value存储系统不断地获取日志文件的写请求,一个日志对象对应的日志文件的最大键值是不断变化的,且该最大键值可以指示Key-Value存储系统的磁盘系统中下一次待插入日志文件的位置。为了使得Key-Value存储系统有足够的空间来储存新的日志文件,当系统中储存日志文件对应的日志文件的储存时间超过一定阈值,或该日志文件对应保护的业务逻辑或事务已经执行完成,就会删除该日志文件,就会使得一个日志对象对应的日志文件的最小键值随着储存时间的变化而变化,则该最小键值可以指示Key-Value存储系统的磁盘系统中下一次待删除日志文件的位置。其中,如果将某一个日志对象对应的日志文件储存到磁盘系统后,可以根据增加的日志文件对应的存储地址更新该日志对象对应的最大键值,即更新为该增加的日志文件的存储地址对应的键值;如果删除磁盘系统中某一个日志对象对应的日志文件时,可以根据删除的日志文件对应的存储地址更新该日志对象对应的最小键值,即更新为大于该删除的日志文件的存储地址对应键值的最小键值。
而如果为写请求生成日志序号时以递减方式生成,随着Key-Value存储系统不断地获取日志文件的写请求,一个日志对象对应的日志文件的最小键值是不断变化的,且该最小键值可以指示Key-Value存储系统的磁盘系统中下一次待插入日志文件的位置。且一个日志对象对应的日志文件的最大键值随着储存时间的变化而变化,则该最大键值可以指示Key-Value存储系统的磁盘系统中下一次待删除日志文件的位置。其中,如果将某一个日志对象对应的日志文件储存到磁盘系统后,可以根据增加的日志文件对应的存储地址更新该日志对象对应的最小键值,即更新为该增加的日志文件的存储地址对应的键值;如果删除磁盘系统中某一个日志对象对应的日志文件时,可以根据删除的日志文件对应的存储地址更新该日志对象对应的最大键值,即更新为小于该删除的日志文件的存储地址对应键值的最大键值。
且本实施例中,为了管理磁盘系统储存的日志文件,还需要在磁盘系统中储存每个日志对象对应的日志文件信息,由于其中包括的最大键值和最小键值是随着Key-Value存储系统不断接收写请求而不断变化,这就需要Key-Value存储系统在接收到每个写请求时,更新相应日志对象对应的日志文件信息。本实施例中将日志文件信息先进行缓存,这样在每次更新日志文件信息时,可以不用去访问磁盘系统,为直接在缓存中进行更新,提高了更新速度;而为了增强日志文件信息的可靠性,减少故障恢复时的工作量,需要将缓存的日志文件信息周期性(比如以一定的时间间隔或以一定的频率间隔)地储存到磁盘系统中;且可以将日志文件信息在磁盘系统中储存成日志元数据(Log Meta Data)。
例如图2所示,在内存中缓存着日志对象的标识、最大键值n和最小键值1等日志文件信息,则在磁盘系统中n个键对应的存储地址内分别储存着该日志对象的日志文件1到n,其中日志文件1到n对应的键为该日志对象的标识与日志序号的结合,而日志序号即为从最小键值1到最大键值n。
参考图3所示,在另一具体的实施例中,Key-Value存储系统将每个日志对象对应的日志文件信息储存到磁盘系统后,可以按照如下步骤来实现故障恢复:
步骤104,从磁盘系统中读取第一日志对象对应的用于指示磁盘系统中待插入日志的位置的第一键值。
如果包括本实施例中Key-Value存储系统的设备中应用程序等发生故障时,比如因断电或者其它系统底层的原因导致故障或设备停机,则在该故障的应用程序在下次重启或其业务被其他节点接管时,可以从该Key-Value存储系统储存的日志对象对应的日志文件信息中读取第一键值。
步骤105,在磁盘系统中顺序读取大于或小于第一键值的一轮N个键值所对应的存储地址内储存的数据,其中,N为正整数。
可以理解,如果在步骤101生成日志序号时是按照递增的方式生成的,则这里需要根据键值的顺序,依次读取大于第一键值的N个键值对应存储地址内储存的数据,比如第一键值为0,则读取键值1到N所对应的数据;如果生成日志序号时是按照递减的方式生成的,则依次读取小于第一键值的N个键值对应存储地址内储存的数据,其中N可以根据实际情况预置在磁盘系统中,一般为10或100等。且若读取的一轮N个键值对应存储地址内储存的数据都为空,则认为在故障发生时没有日志文件储存到存储系统中,可以不用更新系统中储存的该第一键值,结束流程;若读取的一轮N个键值对应的存储地址中,至少有一个存储地址内储存的数据非空,则认为在故障发生时,系统中正并发地写入日志文件,但是并不是先开始写的日志文件最先写入磁盘系统中,而有些后开始写的日志文件最先写入磁盘系统中,则需要更新系统中储存的第一键值,并执行步骤106。
步骤106,顺序读取大于或小于N个键值的另外至少一轮的N个键值所对应的存储地址内储存的数据,直到当前一轮的N个键值对应存储地址内储存的数据都为空。
如果在步骤101生成日志序号时是按照递增的方式生成的,则这里需要根据键值的顺序,依次读取大于上述N个键值对应存储地址内储存的数据,比如第一键值为0,在步骤105中读取了一轮键值1到N所对应的数据,则在该步骤中读取至少另一轮键值N+1到2N所对应的数据,如果另一轮的N个键值对应的数据都为空,则执行步骤107,如果至少有一个存储地址内储存的数据非空,则继续执行步骤106。如果在步骤101生成日志序号时是按照递减的方式生成的,则本步骤中依次读取小于上述N个键值对应存储地址内储存的数据。
步骤107,用当前一轮的前一轮中读取的N个键值对应的存储地址中,最近读取的一个非空数据的存储地址对应的键值更新第一日志对象对应的第一键值。
比如当前一轮键值2N+1到3N对应的存储地址内储存的数据都为空,而前一轮键值N+1到2N对应的存储地址中,键值N+7对应的存储地址内储存的数据非空,且从该存储地址起,之后的存储地址内储存的数据都为空,则在更新第一键值时更新为N+7。
可见,如果包括本实施例中Key-Value存储系统的设备中应用程序等发生故障,导致缓存中的日志文件信息没有及时储存到磁盘系统中,可以通过磁盘系统中当前储存的日志文件及日志文件的存储地址对应的键值来更新日志文件信息。
在其它的具体实施例中,Key-Value存储系统当在执行上述步骤103失败时,可以将步骤102中计算的存储地址对应键的信息(比如键值,和键中包含的日志对象的标识等信息)储存到磁盘系统内操作失败的键列表中。
需要说明的是,在存储日志文件的过程中,不一定是由于系统底层导致缓存中的日志文件信息没有储存到磁盘系统中,也可能由于需要储存的日志文件太大超时等原因导致日志文件没有储存到磁盘系统中,而没有更新日志文件信息,则在故障恢复的过程中:
当在上述步骤104中读取了第一键值后,可以先不执行步骤105到107而是先查找磁盘系统中操作失败的键列表中是否储存有与第一日志对象对应的,且大于或小于该第一键值的键值,如果不是,说明并不是在日志文件的储存时发生的故障,继续执行上述步骤105到107;如果是,说明在日志文件的储存时发生故障,可以更新该第一键值为该查找的键值,且在更新完键值后,可以以更新后的第一键值来执行步骤105到107。且Key-Value存储系统除了可以更新能指示磁盘系统中待插入日志文件的位置的第一键值,还可以读取指示磁盘系统中待删除日志文件的位置的第三键值,并查找磁盘系统中操作失败的键列表中是否储存与第一日志对象对应的,且小于或大于该第三键值的键值,如果是,更新该第三键值为查找的键值,如果不是,则不会更新第三键值。
其中如果在步骤101生成日志序号时是以递增方式生成,则这里需要查找操作失败的键列表中是否储存大于该第一键值的键值;而需要查找操作失败的键列表中是否储存小于该第三键值的键值。如果在步骤101生成日志序号时是以递减方式生成,则这里需要查找操作失败的键列表中是否储存小于该第一键值的键值;而需要查找操作失败的键列表中是否储存大于该第三键值的键值。
可见,本实施例中可以通过储存在磁盘系统中的日志文件、日志文件的存储地址对应的键值及操作失败的键列表来更新日志文件信息。
参考图4所示,Key-Value存储系统在执行完上述步骤102到103中储存日志文件后,可以按照如下的步骤来对Key-Value存储系统的磁盘系统中的日志文件进行操作,比如读取或删除等操作:
步骤201,获取日志文件的操作请求,在操作请求中包括第二日志对象的标识信息和第二键值。
本实施例中对日志文件的操作流程可以是通过包括Key-Value存储系统的设备提供的界面来触发,其中日志文件的操作请求可以是日志文件的读取或删除请求,而操作请求中包括的第二键值可以是在该第二日志对象对应的日志文件进行储存时系统为之生成的日志序号。
步骤202,将第二日志对应的标识信息和第二键值作为键,计算得到操作请求所请求操作的日志文件的存储地址。
在进行计算存储地址时,可以按照储存该日志文件过程中进行计算存储地址时所使用的方法一致,这样才能查找到相应的日志文件。
步骤203,根据操作请求对请求操作的存储地址内储存的日志文件进行相应操作。
其中,如果操作请求是删除请求,则可以将该存储地址内储存的日志文件删除,且可以更新系统中储存的日志文件信息。
可见,本实施例中如果需要对日志文件进行操作时,需要在操作请求中携带所要操作的日志对象的标识和储存日志文件的存储地址对应键的键值,这样才能找到相应的日志文件并进行相应的操作。
需要说明的是,上述提到的第一键值、第二键值和第三键值并不指示顺序关系,而是为了说明不同的键值。且第一日志对象和第二日志对象也不指示顺序关系,而是为了说明不同的日志对象。
本发明实施例还提供一种日志存储系统,即为Key-Value存储系统,结构示意图如图5所示,包括:
序号生成单元10,用于获取日志文件的写请求,生成所述写请求对应的日志序号,可以以递增(或递减)的方式来生成日志序号;
地址获取单元11,用于将所述写请求所请求写入的日志文件所属日志对象的标识信息与所述序号生成单元10生成的日志序号作为键,并通过所述键计算得到所述写请求所请求写入的日志文件的存储地址,具体地,可以将键通过哈希散列方法进行计算,还可以通过其它计算进行计算;
写入单元12,用于根据所述日志获取单元获取的日志文件的存储地址将所述写请求所请求写入的日志文件储存到磁盘系统13中;
磁盘系统13,用于在键对应的存储地址内储存日志文件。
本实施例的日志存储系统(即Key-Value存储系统)中,当序号生成单元10接收到获取日志文件的写请求,生成写请求对应的日志序号,地址获取单元11将写请求所请求写入的日志文件所属日志对象的标识信息与日志序号作为键,通过键计算得到写请求所请求写入的日志文件的存储地址,最后写入单元12根据日志文件的存储地址将写请求所请求写入的日志文件储存到磁盘系统13中。和现有技术中通过传统的存储系统来储存日志文件,即一个日志对象只对应一个日志文件相比,本发明实施例中通过Key-Value存储系统来储存日志文件,即将日志对象与动态生成的日志序号作为键,使得一个日志对象对应的多个日志文件可以储存到不同的存储地址,这样可以通过多个处理进程来处理一个日志对象对应的日志文件,提高对日志文件的处理速度,从而提升日志存储系统的性能。
参考图6所示,在一个具体的实施例中,日志存储系统除了可以包括如图5所示的结构外,还可以包括:缓存单元14、储存单元15、键值读取单元16、数据读取单元17、循环读取单元18、更新单元19、列表储存单元20和查找单元21,其中:
缓存单元14,用于缓存所述磁盘系统13中日志对象对应的日志文件信息,所述日志文件信息包括日志对象的标识信息、所述日志对象对应的日志文件的最大键值和最小键值(即序号生成单元10生成的日志序号),所述最大键值或最小键值用于指示所述磁盘系统13中待插入日志文件的位置。
可以理解,如果序号生成单元10为写请求生成日志序号时以递增方式进行生成,则缓存单元14缓存的最大键值可以指示日志存储系统的磁盘系统13中下一次待插入日志文件的位置,而最小键值可以指示日志存储系统的磁盘系统13中下一次待删除日志文件的位置。如果序号生成单元10为写请求生成日志序号时以递减方式进行生成,则缓存单元14缓存的最小键值可以指示日志存储系统的磁盘系统13中下一次待插入日志文件的位置,而最大键值可以指示日志存储系统的磁盘系统13中下一次待删除日志文件的位置。
储存单元15,用于将缓存单元14缓存的所述日志对象对应的日志文件信息周期性地(比如以一定的时间间隔或以一定的频率间隔)储存到所述磁盘系统中,可以将日志文件信息储存成日志元数据。
键值读取单元16,用于从所述磁盘系统13中读取第一日志对象对应的用于指示磁盘系统中待插入日志的位置的第一键值。
数据读取单元17,用于在所述磁盘系统13中顺序读取大于或小于所述键值读取单元16读取的第一键值的一轮N个键值所对应的存储地址内储存的数据,所述N为正整数。如果序号生成单元10是以递增的方式生成日志序号的,则数据读取单元17读取大于第一键值的N个键值对应的数据,如果序号生成单元10是以递减发的方式生成的,则数据读取单元17读取小于第一键值的N各键值对应的数据。
其中如果序号生成单元10为写请求生成日志序号时以递增方式进行生成,则数据读取单元17在磁盘系统13中顺序读取大于键值读取单元16读取的第一键值的一轮N个键值所对应的存储地址内储存的数据;如果序号生成单元10为写请求生成日志序号时以递减方式进行生成,则数据读取单元17在磁盘系统13中顺序读取小于键值读取单元16读取的第一键值的一轮N个键值所对应的存储地址内储存的数据。
循环读取单元18,用于若所述数据读取单元17读取的所述一轮的N个键值对应存储地址中,至少有一个存储地址内储存的数据非空,顺序读取大于或小于所述N个键值的另外至少一轮的N个键值所对应的存储地址内储存的数据。
其中如果序号生成单元10为写请求生成日志序号时以递增方式进行生成,则循环读取单元18顺序读取大于N个键值的另外至少一轮的N个键值所对应的存储地址内储存的数据;如果序号生成单元10为写请求生成日志序号时以递减方式进行生成,则循环读取单元18顺序读取小于N个键值的另外至少一轮的N个键值所对应的存储地址内储存的数据。
更新单元19,用于所述循环读取单元18读取的当前一轮的N个键值对应存储地址内储存的数据都为空,用所述当前一轮的前一轮中读取的N个键值对应的存储地址中,最近读取的一个非空数据的存储地址对应的键值更新所述第一日志对象对应的第一键值。
列表储存单元20,用于若所述写入单元12根据所述日志文件的存储地址将所述写请求所请求写入的日志文件储存到磁盘系统13失败,将所述计算的存储地址对应键的信息储存到磁盘系统13中操作失败的键列表中。
查找单元21,用于查找所述磁盘系统13中操作失败的键列表中是否储存与所述第一日志对象对应的,且大于或小于所述键值读取单元16读取的第一键值的键值,如果不是,通知所述数据读取单元17读取一轮N个键值所对应的存储地址内储存的数据。
其中如果序号生成单元10为写请求生成日志序号时以递增方式进行生成,则查找单元21查找操作失败的键列表中大于所述键值读取单元16读取的第一键值的键值;如果序号生成单元10为写请求生成日志序号时以递减方式进行生成,则查找单元21查找操作失败的键列表中小于所述键值读取单元16读取的第一键值的键值。
本实施例中,通过序号生成单元10、地址获取单元11和写入单元12可以将日志文件写入到磁盘系统13中,如果写入单元12的写入操作失败时,可以通过列表储存单元21将失败的日志文件对应键的信息储存到操作失败的键列表中。
且本实施例中还可以通过缓存单元14将日志文件信息先进行缓存,这样在每次更新日志文件信息时,可以不用去访问磁盘系统13,为直接在缓存中进行更新,提高了更新速度;而为了进行故障恢复,需要储存单元15将缓存的日志文件信息周期性地储存到磁盘系统13中。
如果该日志存储系统中的应用程序发生故障导致缓存单元14缓存的日志文件信息没有及时储存到磁盘系统13中,则可以通过键值读取单元16、数据读取单元17、循环读取单元18和更新单元19来更新磁盘系统中储存的日志文件信息。其中如果数据读取单元17读取的一轮N个键值对应存储地址内储存的数据都为空,在可以不用更新第一键值。且在键值读取单元16读取第一键值后,查找单元20可以查找操作失败的键列表中是否储存有大于或小于第一键值的键值,如果有,则可以通知更新单元19将第一键值更新为该查找的键值,如果没有,则继续通过数据读取单元17、循环读取单元18和更新单元19来更新第一键值。且查找单元20还可以查找磁盘系统13中操作失败的键列表中是否储存与第一日志对象对应的,且小于或大于该第三键值的键值,如果是,更新该第三键值为查找的键值,如果不是,则不会更新第三键值,该第三键值能指示磁盘系统13中待删除日志文件的位置。
需要说明的是,上述实施例中的系统中,如果序号生成单元10为写请求生成日志序号时以递增方式进行生成,更新单元19还可以用于当将某一个日志对象对应的日志文件储存到磁盘系统后,根据增加的日志文件对应的存储地址更新该日志对象对应的最大键值,即更新为该增加的日志文件的存储地址对应的键值;该更新单元19还用于当删除磁盘系统中某一个日志对象对应的日志文件时,可以根据删除的日志文件对应的存储地址更新该日志对象对应的最小键值,即更新为大于该删除的日志文件的存储地址对应键值的最小键值。
如果序号生成单元10为写请求生成日志序号时以递减方式进行生成,更新单元19还可以用于当将某一个日志对象对应的日志文件储存到磁盘系统后,根据增加的日志文件对应的存储地址更新该日志对象对应的最小键值,即更新为该增加的日志文件的存储地址对应的键值;该更新单元19还用于当删除磁盘系统中某一个日志对象对应的日志文件时,根据删除的日志文件对应的存储地址更新该日志对象对应的最大键值,即更新为小于该删除的日志文件的存储地址对应键值的最大键值。
参考图7所示,在其它的具体实施例中,日志存储系统除了可以包括如图5所示的结构外,还可以包括:操作请求获取单元30、操作地址获取单元31和操作单元32,其中:
操作请求获取单元30,用于获取日志文件的操作请求(比如读取或删除请求),所述操作请求中包括第二日志对象的标识信息和第二键值,其中第二键值可以是在该第二日志对象对应的日志文件进行储存时序号生成单元10为之生成的日志序号。
操作地址获取单元31,用于将所述操作请求获取单元30获取的操作请求中,第二日志对应的标识信息和第二键值作为键,计算得到所述操作请求所请求操作的日志文件的存储地址;操作地址获取单元31在进行计算存储地址时,可以按照储存该日志文件过程中地址获取单元11进行计算存储地址时所使用的方法一致,这样才能查找到相应的日志文件。
操作单元32,用于根据所述操作请求获取单元31获取的操作请求对所述请求操作的存储地址内储存的日志文件进行相应操作。
如果操作请求是删除请求,则操作单元32可以将该存储地址内储存的日志文件删除,且可以更新系统中储存的日志文件信息。
本实施例中如果需要对日志文件进行操作时,需要在操作请求中携带所要操作的日志对象的标识和储存日志文件的存储地址对应键的键值,这样才能找到相应的日志文件并进行相应的操作。
可以理解,上述图5到图7所示的日志存储系统中的各个单元之间进行的日志文件的存储方法可以如图1和图3所示,且日志文件的操作方法可以如图4所示,在此不进行赘述。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:ROM、RAM、磁盘或光盘等。
以上对本发明实施例所提供的日志存储方法及系统,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。