本申请一般涉及大数据处理技术领域,具体涉及kafka技术领域,尤其涉及集群之间数据同步方法、装置、设备及其存储介质。
背景技术:
随着大数据的发展,例如大规模并行处理数据库、数据挖掘、分布式文件系统、分布式数据库、云计算平台等都在不断地更新。
kafka作为一种高吞吐量的分布式发布订阅消息系统,其支持通过kafka服务器和消费者集群来区分消息。在消费者集群之间使用现有的同步工具存在目标集群的主题分区消息和源集群的主题分区消息分布不均匀的情况,例如,mirrormaker工具。
技术实现要素:
鉴于现有技术中的上述缺陷或不足,期望提供一种集群之间数据同步的技术方案。
第一方面,本申请实施例提供了一种集群之间数据同步方法,该方法包括:
读取目标集群的第一主题的第一分区的目标消息偏移量;
比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号;
如果目标消息偏移量小于最早消息偏移量,则填充数据到第一分区;以及
同步第二分区的主副本到第一分区。
第二方面,本申请实施例提供了一种集群之间数据同步装置,该装置包括:
目标偏移量读取单元,用于读取目标集群的第一主题的第一分区的目标消息偏移量;
偏移量比较单元,用于比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号;
数据填充单元,用于如果当前消息偏移量小于最早消息偏移量,则填充数据到第一分区;
同步单元,用于同步第二分区的主副本到第一分区。
第三方面,本申请实施例提供了一种计算机设备,包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行该程序时实现如本申请实施例描述的方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序用于:
该计算机程序被处理器执行时实现如本申请实施例描述的方法。
本申请实施例提供的数据同步的技术方案,在解决kafka集群之间数据同步的问题时,通过数据填充处理,克服了现有技术中集群之间相同主题的相同分区的偏移量存在不能一一对应的问题。
进一步地,通过获取主副本被写入分区的状态来监控数据同步的进度,便于用户查看数据,提升了用户的体验度。还通过判断分区偏移量是否存储的情况,提升数据处理的效率。还通过主副本的数据保证数据的安全性和一致性。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1示出了本申请实施例提供的集群之间数据同步方法的流程示意图;
图2示出了本申请又一实施例提供的集群之间数据同步方法的流程示意图;
图3示出了本申请实施例提供的集群之间数据同步装置的示意性结构框图;
图4示出了本申请又一实施例提供的集群之间数据同步装置的示意性结构框图;
图5示出了适于用来实现本申请实施例的终端设备的计算机系统的结构示意图。
具体实施方式
下面结合附图和实施例对本申请作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
请参考图1,图1示出了本申请实施例提供的集群之间数据同步方法的流程示意图。
如图1所示,该方法包括:
步骤110,读取目标集群的第一主题的第一分区的目标消息偏移量。
将数据按照类型划分为不同的主题,主题又将相同类型的数据存储在不同的分区内。每个分区都由一系列有序,不可变的消息组成,这些消息被连续的追加到分区中,分区中的每个消息都包含一个连续的序列号,即:偏移量。偏移量用于确定消息在分区中的唯一位置。例如,kafka分区的消息是按照递增顺序存储在分区中,针对每条消息使用偏移量记录当前分区存储的消息量。除了记录分区存储消息的数量,kafka分区的消息还可以设置保存时间,当消息超过保存时间,则该消息被清除,但该消息对应的偏移量被保留。通过定期清除或删除已经消费的消息,减少磁盘占用。速删除无用文件,有效提高磁盘利用率。
本申请实施例,在执行数据同步的过程中,处理装置读取目标集群的第一主题的第一分区的目标消息偏移量。目标集群即待同步的目标对象。第一主题例如表示目标集群中任意一个主题。第一分区例如表示在第一主题下的任意一个分区。注意,本申请实施例中出现的第一,第二等词语,仅作为相同技术的区别解释,不可理解为顺序或操作时序的限定。
本申请实施例中,目标消息偏移量例如是目标集群的当前消息的偏移量。
步骤120,比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,其中,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号。
本申请实施例,在确定源集群的第二主题的第二分区的最早偏移量之后,比较目标偏移量和最早消息偏移量的大小。其中,源集群是同步处理的源对象。即将数据从源对象同步到目标对象。第二主题与目标集群的第一主题具有相同的主题名称,即表示第一主题和第二主题表示相同的主题。第二分区与第一分区具有相同的分区序号,集表示第二分区与第一分区具有相同的分区序号。例如,源kafka集群的主题a分区0对应的消息,同步到目标kafka集群的主题a分区0。
步骤130,如果目标消息偏移量小于最早消息偏移量,则填充数据到第一分区。
本申请实施例,当消费者从源集群依次消费主题a的分区0的消息后,再向目标集群逐渐生产从源集群获取的主题a的分区0的消息。但是,主题分区存储的消息通常有时间限制,从源集群消费消息时,导致源集群的某个主题的某个分区的偏移量不是从初始值开始,而是经过时间限制处理后的某个偏移量。例如,当源集群的主题a的分区2的消息偏移量是一个有序的序列值区间[2,8],其中,2为起始偏移量,也称为最早偏移量。当起始偏移量与目标集群的目标偏移量进行比较,目标偏移量表示目标集群的当前的偏移量。如果起始偏移量大于目标偏移量,则采用填充处理方式对目标集群中目标主题的目标分区进行填充处理。例如可以采用人工设置的方式填充数据,或者通过调用填充函数来实现数据的填充。从而使得源集群的偏移量与目标集群相同主题分区的偏移量一一对应。
本申请实施例中,数据填充的调用方式例如可以是:
目标消息偏移量小于最早消息偏移量时,程序同步调用填充消息模块,填充消息模块先读取配置文件中预定义的string类型消息,通过类型转换成byte类型的数据,消息数据会经过压缩,以提升填充速率,调用kafka的produce的api接口将数据写入到目标集群对应的主题的分区中,数据写入目标集群的目标主题的对应分区后,程序异步返回数据填充是否成功的结果。如果成功会继续写入数据,失败则会停止数据填充,程序退出。
步骤140,同步第二分区的主副本到第一分区。
本申请实施例中,在建立了一一对应的偏移量映射关系后,将相同主题的相同分区的消息从源集群的主副本存储的节点上同步到目标分区。
本申请实施例通过建立偏移量的一一对应关系,从而使得源集群的和目标集群的主题分区能够相互对应,提高数据同步的准确性。
进一步,本申请实施例在同步数据过程中还提出了能够查看数据同步进度的技术方案。请参考图2,图2示出了本申请实施例提供的集群之间数据同步方法的流程示意图。
如图2所示,该方法包括:
步骤210,读取目标集群的第一主题的第一分区的目标消息偏移量。
步骤220,比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号。
步骤230,如果目标消息偏移量小于最早消息偏移量,则填充数据到第一分区。
步骤240,确定第二分区的主副本被存储的节点。
步骤250,获取第二分区的主副本的分区偏移量,其中,分区偏移量的起始位置为最早消息偏移量。
步骤260,从节点获取与分区偏移量对应的主副本。
步骤270,将主副本写入第一分区。
步骤280,获取主副本被写入第一分区的状态。
其中步骤210-230与步骤110-130相同,参见步骤110-130的描述内容理解实施内容。
本申请实施例,处理装置在完成第一分区的数据填充之后,确定源集群的第二主题的第二分区的主副本被存储的节点。并确定该第二分区的分区偏移量,其中,分区偏移量理解为第二分区的消息总量,即从起始位置到截止位置。通常情况,起始位置为0,则截止位置对应的消息偏移量的具体序号值可以直接表示消息总量。但是,由于存储消息的时间限制导致其起始位置可能不为0。分区偏移量以最早消息偏移量为起始位置。截止位置可以是最后偏移量的位置。
在确定主副本被存储的所在节点和分区偏移量之后,按照消费者方式(consumer)从该节点获取与分区偏移量对应的主副本,然后按照生产者方式(producer)将主副本推送到目标分区,即完成同步数据的过程。
在kafka中,假如每个主题的分区有n个副本,kafka通过多副本机制实现故障自动转移,从而保证数据的安全性,副本存储在集群的不同节点上。对于主题的分区的数据操作,需要对主题的分区的所有节点都进行操作,从而保持数据的一致性。
消费者从kafka服务器读取分区的消息后,存储该分区中消息的偏移量,下一次再读取该分区的消息时,会根据是否对消息执行消费行为(commit)来决定从该分区的具体哪个偏移量开始读取。如果发生消费行为,则是从该偏移量的位置的下一序号开始。如果未发生消费行为,则从前一次消费行为之后的偏移量的位置开始。
在消费者读取消息后,将消息和偏移量进行相应的存储。生产者将消息发布到某个分区时,需要先找到分区的主副本所在的节点,然后生产者只将消息发布到主副本所在的节点,其他副本所在的节点则通过主副本的所在节点保持数据的一致性。
在确定主副本被存储的节点之后,根据主副本的分区偏移量获取主副本的内容,然后在将主副本的内容写入到目标分区(即待同步的目标集群的目标分区)。
在上述实施例基础上,还可以获取主副本被写入第一分区的状态。为了提高用户的体验度,通过调用数据推送回调函数,将主题的分区的数据写入到目标主题的目标分区的情况返回给生产者,以方便查看数据同步的进度。
本申请上述实施例基础上,为进一步提升数据的处理效率。在获取第二分区的主副本的分区偏移量之后,对分区偏移量是否存储进行判断。例如,该方法还可以包括:
步骤250a,判断分区偏移量是否保存在分区偏移量寄存单元;
步骤205b,如果存在,则读取分区偏移量寄存单元存储的分区偏移量;
步骤250c,如果不存在,则调用分区偏移量获取单元,以通过分区偏移量获取单元获取第二分区的主副本的分区偏移量,以及存储分区偏移量至分区偏移量寄存单元。
通过分区偏移量是否存储在相应的存储装置中,来进一步节省数据的处理时间,提升数据处理的效率。存储装置,例如,zookeeper,分区偏移量寄存单元等。
应当注意,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。相反,流程图中描绘的步骤可以改变执行顺序。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
进一步请参考图3,其示出了根据本申请一个实施例的集群之间数据同步装置300的示意性结构框图。
如图3所示,该装置300包括:
目标偏移量读取单元310,用于读取目标集群的第一主题的第一分区的目标消息偏移量。
将数据按照类型划分为不同的主题,主题又将相同类型的数据存储在不同的分区内。每个分区都由一系列有序,不可变的消息组成,这些消息被连续的追加到分区中,分区中的每个消息都包含一个连续的序列号,即:偏移量。偏移量用于确定消息在分区中的唯一位置。例如,kafka分区的消息是按照递增顺序存储在分区中,针对每条消息使用偏移量记录当前分区存储的消息量。除了记录分区存储消息的数量,kafka分区的消息还可以设置保存时间,当消息超过保存时间,则该消息被清除,但该消息对应的偏移量被保留。通过定期清除或删除已经消费的消息,减少磁盘占用。速删除无用文件,有效提高磁盘利用率。
本申请实施例,在执行数据同步的过程中,处理装置读取目标集群的第一主题的第一分区的目标消息偏移量。目标集群即待同步的目标对象。第一主题例如表示目标集群中任意一个主题。第一分区例如表示在第一主题下的任意一个分区。注意,本申请实施例中出现的第一,第二等词语,仅作为相同技术的区别解释,不可理解为顺序或操作时序的限定。
本申请实施例中,目标消息偏移量例如是目标集群的当前消息的偏移量。
偏移量比较单元320,用于比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,其中,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号。
本申请实施例,在确定源集群的第二主题的第二分区的最早偏移量之后,比较目标偏移量和最早消息偏移量的大小。其中,源集群是同步处理的源对象。即将数据从源对象同步到目标对象。第二主题与目标集群的第一主题具有相同的主题名称,即表示第一主题和第二主题表示相同的主题。第二分区与第一分区具有相同的分区序号,集表示第二分区与第一分区具有相同的分区序号。例如,源kafka集群的主题a分区0对应的消息,同步到目标kafka集群的主题a分区0。
数据填充单元330,用于如果目标消息偏移量小于最早消息偏移量,则填充数据到第一分区。
本申请实施例,当消费者从源集群依次消费主题a的分区0的消息后,再向目标集群逐渐生产从源集群获取的主题a的分区0的消息。但是,主题分区存储的消息通常有时间限制,从源集群消费消息时,导致源集群的某个主题的某个分区的偏移量不是从初始值开始,而是经过时间限制处理后的某个偏移量。例如,当源集群的主题a的分区2的消息偏移量是一个有序的序列值区间[2,8],其中,2为起始偏移量,也称为最早偏移量。当起始偏移量与目标集群的目标偏移量进行比较,目标偏移量表示目标集群的当前的偏移量。如果起始偏移量大于目标偏移量,则采用填充处理方式对目标集群中目标主题的目标分区进行填充处理。例如可以采用人工设置的方式填充数据,或者通过调用填充函数来实现数据的填充。从而使得源集群的偏移量与目标集群相同主题分区的偏移量一一对应。
本申请实施例中,数据填充的调用方式例如可以是:
目标消息偏移量小于最早消息偏移量时,程序同步调用填充消息模块,填充消息模块先读取配置文件中预定义的string类型消息,通过类型转换成byte类型的数据,消息数据会经过压缩,以提升填充速率,调用kafka的produce的api接口将数据写入到目标集群对应的主题的分区中,数据写入目标集群的目标主题的对应分区后,程序异步返回数据填充是否成功的结果。如果成功会继续写入数据,失败则会停止数据填充,程序退出。
同步单元340,用于同步第二分区的主副本到第一分区。
本申请实施例中,在建立了一一对应的偏移量映射关系后,将相同主题的相同分区的消息从源集群的主副本存储的节点上同步到目标分区。
本申请实施例通过建立偏移量的一一对应关系,从而使得源集群的和目标集群的主题分区能够相互对应,提高数据同步的准确性。
进一步,本申请实施例在同步数据过程中还提出了能够查看数据同步进度的技术方案。请参考图4,图4示出了本申请实施例提供的集群之间数据同步装置400的示意性结构框图。
如图4所示,该装置400包括:
目标偏移量读取单元410,用于读取目标集群的第一主题的第一分区的目标消息偏移量。
偏移量比较单元420,用于比较目标消息偏移量与源集群的第二主题的第二分区的最早消息偏移量,第二主题与第一主题具有相同的主题名称,第一分区与第二分区具有相同的分区序号。
数据填充单元430,用于如果目标消息偏移量小于最早消息偏移量,则填充数据到第一分区。
确定子单元440,确定第二分区的主副本被存储的节点。
分区偏移量获取子单元450,用于获取第二分区的主副本的分区偏移量,其中,分区偏移量的起始位置为最早消息偏移量;
主副本获取子单元460,用于从节点获取与分区偏移量对应的主副本;
写入子单元470,用于将主副本写入第一分区。
数据推送回调单元480,用于获取主副本被写入第一分区的状态。
其中目标偏移量读取单元410-数据填充单元430与目标偏移量读取单元310-数据填充单元330相同,参见目标偏移量读取单元310-数据填充单元330的描述内容理解实施内容。
本申请实施例,处理装置在完成第一分区的数据填充之后,确定源集群的第二主题的第二分区的主副本被存储的节点。并确定该第二分区的分区偏移量,其中,分区偏移量理解为第二分区的消息总量,即从起始位置到截止位置。通常情况,起始位置为0,则截止位置对应的消息偏移量的具体序号值可以直接表示消息总量。但是,由于存储消息的时间限制导致其起始位置可能不为0。分区偏移量以最早消息偏移量为起始位置。截止位置可以是最后偏移量的位置。
在确定主副本被存储的所在节点和分区偏移量之后,按照消费者方式(consumer)从该节点获取与分区偏移量对应的主副本,然后按照生产者方式(producer)将主副本推送到目标分区,即完成同步数据的过程。
在kafka中,假如每个主题的分区有n个副本,kafka通过多副本机制实现故障自动转移,从而保证数据的安全性,副本存储在集群的不同节点上。对于主题的分区的数据操作,需要对主题的分区的所有节点都进行操作,从而保持数据的一致性。
消费者从kafka服务器读取分区的消息后,存储该分区中消息的偏移量,下一次再读取该分区的消息时,会根据是否对消息执行消费行为(commit)来决定从该分区的具体哪个偏移量开始读取。如果发生消费行为,则是从该偏移量的位置的下一序号开始。如果未发生消费行为,则从前一次消费行为之后的偏移量的位置开始。
在消费者读取消息后,将消息和偏移量进行相应的存储。生产者将消息发布到某个分区时,需要先找到分区的主副本所在的节点,然后生产者只将消息发布到主副本所在的节点,其他副本所在的节点则通过主副本的所在节点保持数据的一致性。
在确定主副本被存储的节点之后,根据主副本的分区偏移量获取主副本的内容,然后在将主副本的内容写入到目标分区(即待同步的目标集群的目标分区)。
在上述实施例基础上,还可以获取主副本被写入第一分区的状态。为了提高用户的体验度,通过调用数据推送回调函数,将主题的分区的数据写入到目标主题的目标分区的情况返回给生产者,以方便查看数据同步的进度。
本申请上述实施例基础上,为进一步提升数据的处理效率。在获取第二分区的主副本的分区偏移量之后,对分区偏移量是否存储进行判断。例如,该装置还可以包括:
判断子单元450a,用于判断分区偏移量是否保存在分区偏移量寄存单元;
读取子单元450b,用于如果存在,则读取分区偏移量寄存单元存储的分区偏移量;
调用子单元450c,用于如果不存在,则调用分区偏移量获取单元,以通过分区偏移量获取单元获取第二分区的主副本的分区偏移量,以及存储分区偏移量至分区偏移量寄存单元。
通过分区偏移量是否存储在相应的存储装置中,来进一步节省数据的处理时间,提升数据处理的效率。存储装置,例如,zookeeper,分区偏移量寄存单元等。
本申请实施例中,确定子单元440,第一获取子单元450,第二获取子单元460,写入子单元470例如可以通过同步单元来实现。以及,判断子单元450a,读取子单元450b,调用子单元450c等子单元作为可选部件由同步单元来整体实现其功能。
应当理解,装置300-400中记载的诸单元或模块与参考图1-2描述的方法中的各个步骤相对应。由此,上文针对方法描述的操作和特征同样适用于装置300-400及其中包含的单元,在此不再赘述。装置300-400可以预先实现在电子设备的浏览器或其他安全应用中,也可以通过下载等方式而加载到电子设备的浏览器或其安全应用中。装置300-400中的相应单元可以与电子设备中的单元相互配合以实现本申请实施例的方案。
下面参考图5,其示出了适于用来实现本申请实施例的终端设备或服务器的计算机系统500的结构示意图。
如图5所示,计算机系统500包括中央处理单元(cpu)501,其可以根据存储在只读存储器(rom)502中的程序或者从存储部分508加载到随机访问存储器(ram)503中的程序而执行各种适当的动作和处理。在ram503中,还存储有系统500操作所需的各种程序和数据。cpu501、rom502以及ram503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。
以下部件连接至i/o接口505:包括键盘、鼠标等的输入部分506;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分507;包括硬盘等的存储部分508;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分509。通信部分509经由诸如因特网的网络执行通信处理。驱动器510也根据需要连接至i/o接口505。可拆卸介质511,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器510上,以便于从其上读出的计算机程序根据需要被安装入存储部分508。
特别地,根据本公开的实施例,上文参考图1/2描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括有形地包含在机器可读介质上的计算机程序,所述计算机程序包含用于执行图1-2的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分509从网络上被下载和安装,和/或从可拆卸介质511被安装。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,前述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本申请实施例中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,例如,可以描述为:一种处理器包括目标偏移量读取单元、偏移量比较单元、数据填充单元以及同步单元。其中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定,例如,同步单元还可以被描述为“用于同步第二分区的主副本到第一分区的单元”。
作为另一方面,本申请还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中前述装置中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,前述程序被一个或者一个以上的处理器用来执行描述于本申请的集群之间数据同步方法。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离前述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。