分布式系统的数据处理方法和装置与流程

文档序号:21362721发布日期:2020-07-04 04:36阅读:198来源:国知局
分布式系统的数据处理方法和装置与流程

本发明涉及数据存储领域,具体而言,涉及一种分布式系统的数据处理方法和装置。



背景技术:

在分布式存储系统中,数据的一致性非常重要,磁盘本身的静默错误,硬件异常或软件漏洞都会导致用户数据丢失或不一致,给用户带来了巨大的损失。因此分布式存储系统中,会通过md5或crc进行数据校验,将每一个数据块的大小记录到存储系统中,读数据的时候通过计算数据的校验和与存储的校验和来判断副本数据的一致性

现有技术的校验数据装置在从分布式存储系统中读取数据时候需要进行数据校验,这一过程对系统性能影响较大,这是目前分布式存储系统存在的缺陷。

针对现有技术中分布式存储系统对数据进行校验时占用系统性能过多的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种分布式系统的数据处理方法和装置,以至少解决现有技术中分布式存储系统对数据进行校验时占用系统性能过多的技术问题。

根据本发明实施例的一个方面,提供了一种分布式系统的数据处理方法,包括:接收数据存储指令;获取待存储数据,并将所述待存储数据按照指定大小进行分段;分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。

进一步地,上述方法还包括:接收数据读取指令;根据所述数据读取指令读取数据,并计算读取的数据的当前校验数据;将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对;在比对成功的情况下确定读取的数据为所述数据读取指令所指示的待读取数据。

进一步地,上述方法还包括:接收数据写零指令或数据清除指令;清除待写零数据或待清除数据对应的校验数据,并更新所述待写零数据或所述待清除数据所在分段的校验数据。

进一步地,预设的校验数据缓存空间存储有校验数据,在将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对之前,所述方法还包括:从所述校验数据缓存空间提取所述原校验数据。

进一步地,从所述校验数据缓存空间提取所述原校验数据,包括:如果所述校验数据缓存空间存在所述原校验数据,则从所述校验数据缓存空间提取所述原校验数据;如果所述校验数据缓存空间不存所述原校验数据,则从磁盘中提取所述原校验数据,并将从磁盘提取的所述原校验数据写入所述校验数据缓存空间。

进一步地,将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对,包括:调用异步读回模块,其中,所述异步读回模块提交读请求后完成当前线程,以支持异步读取;通过所述异步读回模块将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对。

根据本发明实施例的一个方面,提供了一种分布式系统的数据处理装置,包括:接收模块,用于接收数据存储指令;获取模块,用于获取待存储数据,并将所述待存储数据按照指定大小进行分段;第一计算模块,用于分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。

进一步地,上述装置还包括:接收模块,用于接收数据读取指令;第二计算模块,用于根据所述数据读取指令读取数据,并计算读取的数据的当前校验数据;比对模块,用于将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对;确定模块,用于在比对成功的情况下确定读取的数据为所述数据读取指令所指示的待读取数据。

根据本发明实施例的一个方面,提供了一种存储介质,存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述的分布式系统的数据处理方法。

根据本发明实施例的一个方面,提供了一种处理器,处理器用于运行程序,其中,所述程序运行时执行上述的分布式系统的数据处理方法。

在本发明实施例中,接收数据存储指令,获取待存储数据,并将所述待存储数据按照指定大小进行分段;分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。基于ceph的分布式存储系统,每次操作的最小io大小是4kib,每4kib的data通过crc32算法编码得到4字节的数据校验值,如果一个对象的数据校验值作为一条校验数据记录,则每4kio的更新,都需要操作整个对象的,但采用上述分段的方式,每次只加载、更新或清除操作对象数据所在分段的校验数据记录,进而持久化或删除对应的rocksdb记录,从而降低开启数据校验对性能的影响,解决了现有技术中分布式存储系统对数据进行校验时占用系统性能过多的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的一种分布式系统的数据处理方法的流程图;

图2是根据本发明实施例的一种对校验数据进行分段存储的示意图;

图3是根据本发明实施例的一种基于crccache存储校验数据的示意图;

图4是根据本发明实施例的一种读取数据的流程图;以及

图5是根据本发明实施例的一种分布式系统的数据处理装置的示意图。

下面,为了便于对本实施例的理解,对本实施例出现的专业名词进行解释:

分布式存储系统:简单来说,就是将数据分散存储到多个存储服务器上,并将这些分散的存储资源构成一个虚拟的存储设备,来提供数据存储服务。

pg:放置组(placementgroup),一个放置组(pg)把一系列对象汇聚到一组,并且把这个组映射到一系列osd。

osd:osd(objectstoragedevice)是指负责数据落盘的一个进程。

静默错误:silentdatacorruption,硬盘最核心的使命是正确的存入数据、正确的读出数据,在出错时及时抛出异常告警。磁盘出现异常的情形可能包括硬件错误、固件bug或者软件bug、供电问题、介质损坏等,常规的这些问题都能够正常被捕获抛出异常,而最可怕的事情是,数据处理都是正常的,直直至使用的时候才发现数据是错误的、损坏的。这就是静默错误。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

实施例1

根据本发明实施例,提供了一种分布式系统的数据处理方法的实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图1是根据本发明实施例的一种分布式系统的数据处理方法的流程图,如图1所示,该方法包括如下步骤:

步骤s102,接收数据存储指令。

具体的,上述数据存储指令用于向分布式存储系统中存储数据。

步骤s104,获取待存储数据,并将所述待存储数据按照指定大小进行分段。

在ceph的分布式存储系统,每个对象的大小是4mib。上述方案中,将每个对象进行分段,从而得到一个对象对应的多个分段。在一种可选的实施例中,对于一个4g的对象,可以将其分为多段,例如,如果根据256kib进行分段,则一个对象具有16个分段。

步骤s106,分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。

具体的,上述校验数据即为数据的校验值,可以通过md5(报文摘要算法5)或crc(cyclicredundancycheck,循环冗余校验)的方式确定每个分段的待存储数据的校验数据。在上述实施例中,如果根据256kib进行分段,则一个对象具有16条检验数据记录。

图2是根据本发明实施例的一种对校验数据进行分段存储的示意图,结合图2所示,对于一个4mib的对象,将其分为16个分段,每个分段data_chunk_size=256kib。每4kibddata通过crc32算法编码得到4byte数据校验值,其中,每256kib的数据校验值作为一条<key,value>cre_chunk记录(4kib的io具有4字节的校验值,256kib数据的校验值为64个4字节,即256字节,该256个字节的校验值作为数据库中的一条存储),其中,key用于表示分段的标识,velue用于表示数据校验值。将记录存储在后端rocksdb中,从而得到16条校验数据记录,每条校验数据记录crc_chunk_size=256b,数据校验记录的总和为4kibcrcvalue。

由上可知,本申请上述实施例接收数据存储指令,获取待存储数据,并将所述待存储数据按照指定大小进行分段;分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。基于ceph的分布式存储系统,每次操作的最小io大小是4kib,每4kib的data通过crc32算法编码得到4字节的数据校验值,如果一个对象的数据校验值作为一条校验数据记录,则每4kio的更新,都需要操作整个对象的,但采用上述分段的方式,每次只加载、更新或清除操作对象数据所在分段的校验数据记录,进而持久化或删除对应的rocksdb记录,从而降低开启数据校验对性能的影响,解决了现有技术中分布式存储系统对数据进行校验时占用系统性能过多的技术问题。

开启数据校验后,需要在write,read,zero,truncate这四种操作执行后,保证数据与存在的数据校验值保持一致。写入数据的操作(write),写入的数据必须计算其校验数据、并对数据所属分段的校验数据记录进行更新、以及持久化(存储至rocksdb中)校验数据,从而保持数据与校验值的一致性。其他三种操作分别进行说明。

作为一种可选的实施例,上述方法还包括:接收数据读取指令;根据所述数据读取指令读取数据,并计算读取的数据的当前校验数据;将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对;

在比对成功的情况下确定读取的数据为所述数据读取指令所指示的待读取数据。

上述方案中,对于读操作(read)需要进行数据校验。进行数据校验的方法是,计算根据数据读取指令读取的数据的当前校验数据,并提取存储该数据时的原校验数据,将当前校验数据与原校验数据进行比对,如果相同,则说明读取的数据未被篡改,如果不同,则说明读取的数据可能被篡改,从而保证了数据写入和读取的一致性。

作为一种可选的实施例,上述方法还包括:接收数据写零指令或数据清除指令;清除待写零数据或待清除数据对应的校验数据,并更新所述待写零数据或所述待清除数据所在分段的校验数据。

在上述方案中,在进行数据写零操作(zero)或数据清除操作(truncate)时,需要清除相应的数据校验值。对写零操作或清除操作的数据的数据校验值进行清除,其所在分段的校验记录也需要进行更新。

作为一种可选的实施例,预设的校验数据缓存空间存储有校验数据,在将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对之前,上述方法还包括:从所述校验数据缓存空间提取所述原校验数据。

上述校验数据缓存空间(crccache)采用缓存机制,将rocksdb中的校验数据存储在该校验数据缓存空间中,从而能够从校验数据缓存空间直接读取原校验数据,而无需从后端rocksdb提取。

在一种可选的实施例中,上述校验数据缓存空间包括多层(level),查找方式为首先在最高层查找,如果不存在,则在下一层进行查找,直至查找到校验数据缓存空间的最后一层。图3是根据本发明实施例的一种基于crccache存储校验数据的示意图,结合图3所示,指定存储空间xstore中包括多个缓存片段cacheshard,每个cacheshard都具有8层crccache(level#1ofcrccache、level#1ofcrccache……level#8ofcrccache),其覆盖了pg.a至pg.z中的所有数据。在进行查找时,首先从level#1ofcrccache进行查找,如果level#1ofcrccache中不存在所查找的校验数据,则从level#2ofcrccache中查找,直至找到所查找的校验数据,或找到level#8ofcrccache,其中,该示例中,一个level是128m内存,128m内存可以缓存128g数据的数据校验值。

作为一种可选的实施例,从所述校验数据缓存空间提取所述原校验数据,包括:如果所述校验数据缓存空间存在所述原校验数据,则从所述校验数据缓存空间提取所述原校验数据;如果所述校验数据缓存空间不存所述原校验数据,则从磁盘中提取所述原校验数据,并将从磁盘提取的所述原校验数据写入所述校验数据缓存空间。

在上述方案中,在启用了crccache后,由crccache用来缓存校验值,读数据的时候,计算数据的校验和,然后跟cache中的数据的校验值对比,数据校验值在cache中比对,相比从rocksdb读取,响应速度更快。如果crccache中没有命中,则从rocksdb中读取,然后缓存到crccache中。

图4是根据本发明实施例的一种读取数据的流程图,首先进行条件检查:判断是否开启了l2_cache,其中,l2_cache是指xstore(ceph的本地存储引擎,类似文件系统,是直接同块设备交互的组件)中的第二层缓存,这层缓存包括两类重要数据结构的缓存,分别是onode和crc。onode缓存记录了哪些对象拥有onode缓存,onode包含该对象的所有元数据信息,如对象使用的数据块物理偏移、扩展属性、对象大小等信息,类似文件系统的inode;crc缓存记录了哪些对象拥有crc缓存,以及该对象的哪些分段数据包含数据校验值和数据校验值本身。开启l2_cache的意思是启用onode和crc缓存,启用后,涉及到对象读写操作时,需要更新onode和crc缓存。在判断结果为开启的情况下进入下个步骤,在判断结果为未开启的情况下,则直接退出。

在判断结果为开启l2_cache的情况下,进行合法性检查,如果是meta_pg、临时对象、非块对象等情况则不需要被缓存,退出即可,否则进入下一个步骤。

判断是否满足only_cache_crc=true(only_cache_crc=true表示只更新crc缓存),如果满足,则不缓存onode(onode缓存更新在流程的其他部分会被执行,这里只更新crc缓存是为了避免重复更新,提升操作效率),否则缓存onode,并进入下一个步骤。

再次进行条件检查。如果onode中没有记录开启数据校验,则退出,如果crccache的开关没有开启,则退出,否则其他情况下进入下一个步骤。具体的,l2_cache包含crc缓存,但l2_cache开启并不意味着crc缓存开启,但crc缓存开启则意味着l2_cache一定开启了。因此这里需要判断crc缓存是否开启,同时如果对象本身没有开启数据校验功能(onode中记录该属性),则也没有必要更新crc缓存。

查找crccache中是否缓存了该对象,如果没有缓存则将crc_chunk_map(用于记录对象当前运行时保存的所有数据校验值)中所有记录对象都写入crccache,否则只将其内部记录被更新、被标记为删除或新从rocksdb中读取的分段数据校验值写入ceccache。具体的,对象是ceph的一个基本操作单位,类似于文件系统中的一个文件,对象有元数据信息(onode)和数据信息(实际记录用户写入的内容)。crc缓存容量有上限,不可能包含ceph集群中所有对象的crc缓存,因此在更新crc缓存前,需要首先判断该对象是否在crc缓存中,如果在则将本次操作中变化的部分写入缓存;如果不在,则将对象当前运行时保存的所有数据校验值(crc_chunk_map中记录)写入crc缓存。被更新、被标记为删除或从rocksdb中读取的分段数据就是上述变化的部分。被更新意味着crc缓存中存的是旧值,需要用本次操作的新值覆盖旧值,如覆盖写对象的某个部分,crc值发生了变化;被标记为删除意味着,这个数据分段被删除了,因此需要清空crc缓存中数据校验值;从rocksdb中读取的分段数据意味着crc缓存没有这段数据校验值,需要在crc缓存新增这部分数据校验值。

作为一种可选的实施例,将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对,包括:调用异步读回模块,其中,所述异步读回模块提交读请求后完成当前线程,以支持异步读取;通过所述异步读回模块将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对。

基于ceph的分布式存储系统读分为同步读和异步读,是pg下发读请求的语义,如果是同步读,则osd的worker线程一直阻塞,直到数据从此盘或cache返回。这样相当于磁盘做io时,线程不能调度其他io,性能较差,因此使用异步读较多,而只有少量业务是同步读,如scrub的读数据请求。

但如果启用了数据校验,在读的时候需要校验数据crc,由于内部强制等读返回,此时这个线程一直握着pg锁,导致pg内部的其他io没法被处理,异步读在内部就退化为同步读了。

为了解决上述问题,在异步读回调模块中增加数据校验,该模块用于在异步读操作从底层返回后进行数据校验,如果存在数据不一致时,记录该对象。将数据校验放到异步读回调模块中由异步读回调模块执行,异步读的语义是提交到cache后,这个线程就执行完成,同时释放pg锁,支持异步读,从而极大降低了对性能的影响。

实施例2

根据本发明实施例,提供了一种分布式系统的数据处理装置的实施例,图5是根据本发明实施例的一种分布式系统的数据处理装置的示意图,如图5所示,该装置包括如下步骤:

接收模块50,用于接收数据存储指令。

获取模块52,用于获取待存储数据,并将所述待存储数据按照指定大小进行分段。

第一计算模块54,用于分别计算每个分段内的待存储数据的校验数据,并将所述每个分段内的待存储数据的校验数据作为一条校验记录进行存储。

作为一种可选的实施例,上述装置还包括:接收模块,用于接收数据读取指令;第二计算模块,用于根据所述数据读取指令读取数据,并计算读取的数据的当前校验数据;比对模块,用于将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对;确定模块,用于在比对成功的情况下确定读取的数据为所述数据读取指令所指示的待读取数据。

作为一种可选的实施例,上述装置还包括:第二接收模块,用于接收数据写零指令或数据清除指令;清除模块,用于清除待写零数据或待清除数据对应的校验数据,并更新所述待写零数据或所述待清除数据所在分段的校验数据。

作为一种可选的实施例,上述装置为还包括:提取模块,用于预设的校验数据缓存空间存储有校验数据,在将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对之前,从所述校验数据缓存空间提取所述原校验数据。

作为一种可选的实施例,提取模块包括:第一提取子模块,用于如果所述校验数据缓存空间存在所述原校验数据,则从所述校验数据缓存空间提取所述原校验数据;第二提取子模块,用于如果所述校验数据缓存空间不存所述原校验数据,则从磁盘中提取所述原校验数据,并将从磁盘提取的所述原校验数据写入所述校验数据缓存空间。

作为一种可选的实施例,比对模块包括:调用子模块,用于调用异步读回模块,其中,所述异步读回模块提交读请求后完成当前线程,以支持异步读取;比对子模块,用于通过所述异步读回模块将所述当前校验数据与写入所述读取的数据时所述读取的数据的原校验数据进行比对。

实施例3

根据本发明实施例,提供了一种存储介质,存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行实施例1所述的分布式系统的数据处理方法。

实施例4

根据本发明实施例,提供了一种处理器,处理器用于运行程序,其中,所述程序运行时执行实施例1所述的分布式系统的数据处理方法。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1