与Redis服务器进行数据同步的方法、装置和系统
技术领域
本发明涉及互联网技术领域,具体涉及一种与Redis服务器进行数据同步的方法、装置和系统。
背景技术
Redis存储方式能够灵活支持多种数据类型,因此,越来越多的在线业务开始采用Redis存储方式进行存储。但是,由于Redis存储方式需要占用大量的内存,导致可存储的空间非常有限,由此,迫切地需要将一些不常用的、重要性不高的业务迁移到其他的存储设备中,以便节省内存,提高机器利用效率。
由于Redis服务器中的数据量非常庞大,且Redis服务器上的业务数据经常更新,因此,在将Redis服务器中的业务数据迁移到其他存储设备的过程中,经常会出现Redis服务器上的原始数据还未复制完,就又接收到了新的更新数据,导致其他存储设备很难做到与Redis服务器之间的数据同步,由此无法实现业务的无缝迁移。
发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的与Redis服务器进行数据同步的方法、装置和系统。
根据本发明的一个方面,提供了一种与Redis服务器进行数据同步的方法,其包括:接收Redis服务器发送的全量数据;对全量数据进行解析及存储,并通过日志文件记录来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步;其中,当全量数据解析并存储完毕后,开始解析并存储日志文件中记录的增量数据。
根据本发明的另一方面,提供了一种与Redis服务器进行数据同步的装置,其包括:接收模块,适于接收Redis服务器发送的全量数据以及增量数据;第一存储模块,适于对接收模块接收到的全量数据进行解析及存储;日志模块,适于通过日志文件记录接收模块接收到的来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步;第二存储模块,适于在第一存储模块对全量数据解析并存储完毕后,开始解析并存储日志模块中记录的增量数据。
根据本发明的另一方面,提供了一种与Redis服务器进行数据同步的系统,其包括:Redis服务器以及上述的与Redis服务器进行数据同步的装置。
本发明提供的与Redis服务器进行数据同步的方法、装置和系统,能够在对Redis服务器发送的全量数据进行解析及存储的过程中,通过日志文件记录来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。其中,增量数据是指在生成上述全量数据之后进一步增加的数据,其包括在上述全量数据基础上的新增数据和/或修改数据。上述日志文件的主要作用在于:能够记录全量数据解析过程中收到的增量数据,使解析全量数据的过程与接收增量数据的过程能够同时进行。
由此可见,采用本发明中的方法、装置和系统,即使在全量数据非常庞大、解析耗时很长的情况下也不会耽误增量数据的接收,由此能够确保数据同步的效率。而且,由于Redis服务器中用于缓存最新数据的环形缓冲区被写满之后,会将原来的数据覆盖掉,因此,如果不能及时接收到来自Redis服务器的增量数据,则可能会发生数据丢失的情况,而本发明中的日志文件能够及时、全面地记录来自Redis服务器的全部增量数据,因此,确保了数据同步的可靠性。通过本发明中的方法、装置和系统能够实现业务的无缝迁移。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的与Redis服务器进行数据同步的方法流程图;
图2示出了本发明一个具体实施例提供的与Redis服务器进行数据同步的方法流程图;
图3按照时间节点方式描述了图2的步骤S210至步骤S240的实现过程;
图4示出了根据本发明一个实施例的与Redis服务器进行数据同步的装置的结构框图;
图5示出了根据本发明一个实施例的与Redis服务器进行数据同步的系统结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的与Redis服务器进行数据同步的方法流程图,如图1所示,该方法包括如下步骤:
步骤S110:接收Redis服务器发送的全量数据。
其中,上述全量数据为Redis服务器根据接收到的同步请求生成的数据快照文件,在解析并存储上述数据快照文件的过程中,通过多线程并行运行的方式进行解析,并对解析结果为指定类型的数据通过批量写入的方式进行存储,其中,指定类型的数据包括:hash,set,list,和/或zset类型的数据。
步骤S120:对上述全量数据进行解析及存储,并通过日志文件记录来自Redis服务器的增量数据,直至完成与该Redis服务器之间的数据同步。其中,当上述全量数据解析并存储完毕后,开始解析并存储上述日志文件中记录的增量数据。
上述日志文件为自定义格式的文件,其通过不同的日志项分别记录各条增量数据,每个日志项中包含该条增量数据及其对应的同步位移,以及用于对该日志项进行数据校验的校验码。其中,增量数据对应的同步位移用于指示本条增量数据与Redis服务器中用于缓存最新更新数据的环形缓冲区之间的同步关系,能够用来计算同步速度,并判断是否已完成同步;校验码用于确定日志项中存储的数据是否正确,以便提高数据存储的可靠性。
具体地,在步骤S120中,可通过以下方式确定是否完成与Redis服务器之间的数据同步:在解析并存储日志文件中记录的增量数据的过程中,如果进一步接收到来自Redis服务器的增量数据,则计算来自Redis服务器的增量数据中包含的同步位移与日志文件中已解析的增量数据中包含的同步位移之间的位移差,当该位移差小于预设阈值时,确定已完成与Redis服务器之间的数据同步。
可选地,为了实现实时同步,并提高存储效率,当确定已完成与Redis服务器之间的数据同步后,如果进一步接收到来自该Redis服务器的增量数据,则直接存储该增量数据。
本发明提供的与Redis服务器进行数据同步的方法,能够在对Redis服务器发送的全量数据进行解析及存储的过程中,通过日志文件记录来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。采用该方法,即使在全量数据非常庞大、解析耗时很长的情况下也不会耽误增量数据的接收,由此能够确保数据同步的效率。而且,由于Redis服务器中用于缓存最新数据的环形缓冲区被写满之后,会将原来的数据覆盖掉,因此,如果不能及时接收到来自Redis服务器的增量数据,则可能会发生数据丢失的情况,而本发明中的日志文件能够及时、全面地记录来自Redis服务器的全部增量数据,因此,确保了数据同步的可靠性。
下面以一个具体实施例详细描述本发明提供的与Redis服务器进行数据同步的方法。在该具体实施例中,以将Redis服务器中的业务数据无缝迁移至SSDB服务器为例进行说明,本领域技术人员还可以依照本实施例提供的方法实现Redis主服务器与Redis从服务器之间的业务数据的无缝迁移,以及Redis从服务器与Redis从服务器之间的业务数据的无缝迁移,本发明对其具体应用场景不做限定。
图2示出了该具体实施例提供的与Redis服务器进行数据同步的方法流程图,在图2中,各步骤的执行主体是与Redis服务器和SSDB服务器分别相连的同步装置,该同步装置也可以直接集成在SSDB服务器上。该同步装置可通过软件编程或硬件芯片等方式实现。如图2所示,该方法包括如下步骤:
步骤S210:向Redis服务器发送同步请求,接收Redis服务器根据该同步请求返回的全量数据。
其中的同步请求可通过sync命令或psync命令实现,根据该同步请求返回的全量数据为Redis服务器接收到同步请求后生成的数据快照文件,例如RDB文件。该数据快照文件为指定时刻(即接收到同步请求后)存储在Redis服务器上的全部数据的镜像文件。
可选地,为了便于在后续步骤中与Redis服务器进行通信,Redis服务器还可以返回包含用于识别该Redis服务器的主机ID号的同步响应消息。另外,为了便于在后续步骤中计算同步速度并在网络断开后实现断点续传等功能,该同步响应消息中还可以包含上述数据快照文件在环形缓冲区中对应的存储位置。例如,假设环形缓冲区的大小为1000,Redis服务器生成的数据快照文件中已包含了其中的前300个数据,则可以确定该数据快照文件在环形缓冲区中对应的存储位置为300。
步骤S220:对上述全量数据进行解析并存储。
由于全量数据的数据量通常较大,解析耗时较长,因此,为了提高解析效率,本发明通过多个线程并行运行的方式来解析上述数据快照文件。其中,多个线程的具体数量可根据CPU内核数、内存大小等多种指标确定。并且,在解析完成后,对解析结果为指定类型的数据通过批量写入的方式进行存储,以提高存储效率。其中,指定类型的数据包括:hash,set,list,和/或zset类型的数据。具体实现时,可通过python语言来实现本发明中的各个步骤,为了进一步提高解析效率,可以在python程序中引入C的动态链接库,从而利用C的解析工具来实现上述的多线程并行解析方式。
步骤S230:在接收到全量数据之后,通过日志文件记录来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。
其中,步骤S230与步骤S220同时开始执行,且步骤S230一直持续到步骤S220结束之后。也就是说,在解析并存储全量数据的过程中,只要Redis服务器中的数据发生了更新,就会进一步接收到来自Redis服务器的增量数据,通过日志文件来记录这些增量数据;并且,在全量数据解析并存储完毕后,如果Redis服务器中的数据又发生了更新,仍然会进一步接收到来自Redis服务器的增量数据,这时,只要还没有完成与Redis服务器之间的数据同步,就继续通过日志文件记录接收到的来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。其中,判断是否已完成与Redis服务器之间的数据同步时,可灵活通过多种方式实现,例如,可以根据发送增量数据时的时间戳与接收到增量数据时的时间戳的差值来判断,也可以根据增量数据中包含的同步位移等信息来判断,本发明对具体的判断方式不做限定。
上述的日志文件为自定义格式的文件,其通过不同的日志项分别记录各条增量数据,每个日志项中包含该条增量数据及其对应的同步位移,以及用于对该日志项进行数据校验的校验码。例如,该自定义的日志文件为如下格式的AOF文件:"len(cmd)+':'+cmd+':'+len(key)+':'key+':'+len(val)+':'+val+':'+len(offset)+':'+offset+':'+crc",其中cmd,key,val是请求的数据,offset是同步位移(同步offset),crc是校验码。上述日志文件的主要作用在于:第一,能够记录接收到全量数据之后,完成同步之前接收到的全部增量数据,即使在全量数据非常庞大、解析耗时很长的情况下也不会耽误增量数据的接收,由此能够确保数据同步的效率。第二,由于Redis服务器中用于缓存最新数据的环形缓冲区被写满之后,会将原来的数据覆盖掉,因此,如果不能及时接收到来自Redis服务器的增量数据,则可能会发生数据丢失的情况,而本发明中的日志文件能够及时、全面地记录来自Redis服务器的全部增量数据,因此,确保了数据同步的可靠性。
S240:在全量数据解析并存储完毕后,开始解析并存储上述日志文件中记录的增量数据。
上述步骤S240在步骤S220结束之后开始执行,并且,步骤S230与步骤S220和步骤S240并行进行。也就是说,只要全量数据解析并存储完毕,就开始通过步骤S240对步骤S230中的日志文件进行解析及存储,此时,步骤S230仍在继续。另外,在执行步骤S240的过程中,还可以进一步通过如下方式判断是否已完成与Redis服务器之间的数据同步,当判断结果为是时,则终止步骤S230:当通过步骤S230进一步接收到一条来自Redis服务器的增量数据时,计算这条增量数据中包含的同步位移与日志文件中已解析的增量数据中包含的同步位移之间的位移差,当该位移差小于预设阈值时,确定已完成与Redis服务器之间的数据同步。具体实现时,可以在步骤S240解析日志文件的过程中,判断当前已解析的各条增量数据中包含的同步位移的最大值,将其存储为解析位移(parse_offset),每当通过步骤S230进一步接收到一条来自Redis服务器的增量数据时,计算新接收到的这条增量数据中包含的同步位移与解析位移之间的位移差,进而判断是否已同步。
可选地,当确定已同步后,如果进一步接收到来自Redis服务器的增量数据,则可以对该增量数据直接进行存储,而不必再通过日志文件进行记录,从而省去记录及解析日志文件的时间,提高同步效率,做到实时同步。
通过上述的步骤S210至步骤S240就实现了与Redis服务器之间的数据同步。由于上述各个步骤的执行时间有所交叉,因此,为了使本发明中的方法更加清楚,在该方法中还可以根据同步进度来设定不同的状态。例如,将整个同步过程划分为准备(ready)状态、复制全量数据(copy)状态、全量数据复制完成(RDBEND)状态、同步增量数据(SYNC)状态。另外,在图3中按照时间节点的方式描述了步骤S210至步骤S240的实现过程。如图3所示,从t1时间点开始执行步骤S210,向Redis服务器发送同步请求,并接收Redis服务器根据该同步请求返回的全量数据。在t2时间点时,全量数据接收完毕,步骤S210结束。从t2时间点开始,执行步骤S220以及步骤S230,即:一边对全量数据进行解析并存储,一边通过日志文件记录来自Redis服务器的增量数据。在t3时间点时,全量数据解析并存储完毕,步骤S220结束,步骤S230仍在继续。从t3时间点开始执行步骤S240,解析并存储日志文件中记录的增量数据。另外,在执行步骤S240的过程中,进一步判断是否已完成与Redis服务器之间的数据同步,假设在t4时间点时完成了与Redis服务器之间的数据同步,则步骤S230结束,即:从t4时间点开始,接收到来自Redis服务器的增量数据后直接进行存储,而不再通过日志文件记录,因此,日志文件中的日志项不再增加,当解析完日志文件中的全部日志项后,步骤S240自动结束。
通过本发明中的方法能够使SSDB服务器与Redis服务器做到实时同步,从而将Redis服务器中的业务无缝迁移到SSDB服务器中,节省了Redis服务器中的内存,提高了其他业务的访问效率。在本发明中,能够在解析全量数据的同时,接收来自Redis服务器的增量数据,而不必像传统的Redis主从同步方式那样等到全量数据全部解析并存储完毕后才接收增量数据。该方法尤其适用于将Redis服务器中的数据同步到磁盘(而非内存)中,由于磁盘操作速度慢于内存操作速度,因此,在全量数据十分庞大的情况下,解析过程势必会耗费相当一部分时间,如果在这期间无法同时接收增量数据的话,容易导致最开始接收到的同步位移失效(因为redis的环形缓冲区被写满之后会被新数据覆盖掉),从而导致数据丢失,采用本发明提供的方法能够有效地解决上述问题。
图4示出了根据本发明一个实施例的与Redis服务器进行数据同步的装置400的结构框图,其包括:接收模块41、第一存储模块42、日志模块43、以及第二存储模块44。其中,接收模块41适于接收Redis服务器发送的全量数据以及增量数据。第一存储模块42适于对接收模块41接收到的全量数据进行解析及存储。日志模块43适于通过日志文件记录接收模块41接收到的来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。第二存储模块44适于在第一存储模块42对全量数据解析并存储完毕后,开始解析并存储日志模块43中记录的增量数据。
可选地,该装置进一步包括:用于确定是否完成与Redis服务器之间的数据同步的判断模块,在第二存储模块44解析并存储日志文件中记录的增量数据的过程中,如果接收模块进一步接收到来自Redis服务器的增量数据,则判断模块计算来自Redis服务器的增量数据中包含的同步位移与日志文件中已解析的增量数据中包含的同步位移之间的位移差,当位移差小于预设阈值时,确定已完成与Redis服务器之间的数据同步。
可选地,当确定已完成与Redis服务器之间的数据同步后,如果接收模块进一步接收到来自Redis服务器的增量数据,则直接将增量数据存储在第二存储模块中。
上述的全量数据为Redis服务器根据接收到的同步请求生成的数据快照文件,第一存储模块通过多线程并行运行的方式解析数据快照文件,并对解析结果为指定类型的数据通过批量写入的方式进行存储,其中,指定类型的数据包括:hash,set,list,和/或zset类型的数据。上述的日志文件为自定义格式的文件,其通过不同的日志项分别记录各条增量数据,每个日志项中包含该条增量数据及其对应的同步位移,以及用于对该条增量数据进行数据校验的校验码。
图5示出了根据本发明一个实施例的与Redis服务器进行数据同步的系统结构框图,其包括:Redis服务器500以及上述的与Redis服务器进行数据同步的同步装置400。图5以通过同步装置400实现Redis主服务器与SSDB服务器501之间的数据同步为例进行说明。本领域技术人员可以理解的是,同步装置400也能够用来实现Redis主服务器与Redis从服务器之间的数据同步。
本发明提供的与Redis服务器进行数据同步的方法、装置和系统,能够在对Redis服务器发送的全量数据进行解析及存储的过程中,通过日志文件记录来自Redis服务器的增量数据,直至完成与Redis服务器之间的数据同步。其中,增量数据是指在生成上述全量数据之后进一步增加的数据,其包括在上述全量数据基础上的新增数据和/或修改数据。上述日志文件的主要作用在于:能够记录全量数据解析过程中收到的增量数据,使解析全量数据的过程与接收增量数据的过程能够同时进行。
由此可见,采用本发明中的方法、装置和系统,即使在全量数据非常庞大、解析耗时很长的情况下也不会耽误增量数据的接收,由此能够确保数据同步的效率。而且,由于Redis服务器中用于缓存最新数据的环形缓冲区被写满之后,会将原来的数据覆盖掉,因此,如果不能及时接收到来自Redis服务器的增量数据,则可能会发生数据丢失的情况,而本发明中的日志文件能够及时、全面地记录来自Redis服务器的全部增量数据,因此,确保了数据同步的可靠性。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的网站系统信息的识别装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。