1.本技术涉及分布式存储技术领域,具体涉及一种纠删码数据存储方法、装置、设备及介质。
背景技术:2.纠删码(erasure coding,ec)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验让各分段之间相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。
3.在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。现有技术中,新写入一个非满条带的数据时,对该数据进行满条带对齐,并将该数据的首尾空洞部分填充为0,然后将填充后的数据写入磁盘。这样带来了一定的写放大,导致存储空间的利用率较低。
技术实现要素:4.本技术实施例提供一种基于纠删码的数据存储方法、装置、设备及介质,用于提高存储空间的利用率。
5.第一方面,本技术提供一种基于纠删码的数据存储方法,包括:
6.若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据所述第一数据的首地址偏移、数据长度和所述条带长度,确定所述第一数据对应的第一条带;
7.根据所述第一条带的长度,采用填充数据对所述第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对所述填充后的第一数据进行编码,获得第一校验块;其中,所述填充后的第一数据的长度等于所述第一条带的长度;
8.将所述第一数据写入所述第一条带对应的存储空间,并在所述第一条带对应的存储空间中创建空洞,将所述第一校验块写入其他存储空间;其中,所述第一数据和所述空洞占满所述第一条带对应的存储空间;
9.当读取所述第一数据时,若所述第一数据中部分数据存在损坏,则根据其他数据和所述第一校验块恢复所述第一数据;其中,所述其他数据是根据所述空洞的位置,用所述填充数据对所述第一数据中未损坏的数据进行填充得到的。
10.在本技术实施例中,若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,即针对非满条带的写入第一数据时,根据填充后的第一数据获得第一校验块之后,仅将第一数据写入存储空间,并创建空洞。相较于现有技术中直接将填充后的第一数据写入存储空间,相对减少写入操作,可以减少写放大,并且也减少了存储空间的浪费,提高存储空间的利用率。
11.在一种可能的实施例中,在将所述第一校验块写入其他存储空间之后,所述方法还包括:
12.接收到待存储的第二数据覆盖写入所述第一条带的请求;
13.若所述第二数据的首地址偏移或数据长度不是所述条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块;其中,所述目标条带单元为所述第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;所述第二条带单元为第一条带中除第一条带单元之外剩余的条带单元;
14.将所述第二数据写入所述第一条带单元对应的存储空间,覆盖所述第一条带单元对应的存储空间中的原有数据,以及将所述第二校验块写入所述第一校验块对应的存储空间,覆盖所述第一校验块。
15.在本技术实施例中,比较第一条带单元和第二条带单元的数量,相当于比较第二数据写入所需占用的条带单元和不会占用的条带单元的数量,读取数量更少的条带单元对应的存储空间中的目标数据,用于计算新的校验块,可以尽量减少读请求操作。
16.在一种可能的实施例中,从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块,包括:
17.若所述第二条带单元为所述目标条带单元,从所述第二条带单元对应的存储空间中读取所述目标数据;
18.使用所述纠错码算法对所述目标数据和所述第二数据进行编码,获得所述第二校验块。
19.在本技术实施例中,从第二数据写入所需不会占用的第二条带单元对应的存储空间中读取目标数据,相当于只读取一个条带内没有被覆盖的条带单元,不用读取整个条带,减少了读的范围。
20.在一种可能的实施例中,从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块,包括:
21.若所述第一条带单元为所述目标条带单元,从所述第一条带单元对应的存储空间中读取所述目标数据;
22.对所述目标数据和所述第二数据进行异或运算,并使用所述纠错码算法进行编码,获得增量校验块;
23.对所述增量校验块和所述第一校验块进行异或运算,获得所述第二校验块。
24.在本技术实施例中,从第二数据写入所需占用的第一条带单元对应的存储空间中读取目标数据,利用目标数据与第二数据的差异、通过异或运算在本地计算出新的校验块,省去了校验块的远程传输。
25.在一种可能的实施例中,在将所述第一校验块写入其他存储空间之后,所述方法还包括:
26.接收到读取所述第一数据包括的第三数据的请求;
27.若所述第三数据的首地址偏移或数据长度不是所述条带长度的整数倍,则根据所述第三数据的首地址偏移、数据长度、所述条带长度、以及条带单元长度,确定所述第三数据对应的第三条带单元;
28.从所述第三条带单元对应的存储空间中读取所述第三数据。
29.在本技术实施例中,将读取粒度减小为条带单元级别,按条带单元读取第三数据,
可以减少读请求的不必要扩散,相较于满条带的读取方式,可以减少读请求操作。
30.第二方面,本技术提供一种纠删码数据存储装置,包括:
31.确定模块,用于若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据所述第一数据的首地址偏移、数据长度和所述条带长度,确定所述第一数据对应的第一条带;
32.获得模块,用于根据所述第一条带的长度,采用填充数据对所述第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对所述填充后的第一数据进行编码,获得第一校验块;其中,所述填充后的第一数据的长度等于所述第一条带的长度;
33.写入模块,用于将所述第一数据写入所述第一条带对应的存储空间,并在所述第一条带对应的存储空间中创建空洞,将所述第一校验块写入其他存储空间;其中,所述第一数据和所述空洞占满所述第一条带对应的存储空间;
34.读取模块,用于当读取所述第一数据时,若所述第一数据中部分数据存在损坏,则根据其他数据和所述第一校验块恢复所述第一数据;其中,所述其他数据是根据所述空洞的位置,用所述填充数据对所述第一数据中未损坏的数据进行填充得到的。
35.在一种可能的实施例中,所述装置还包括接收模块,所述接收模块用于:在将所述第一校验块写入其他存储空间之后,接收到待存储的第二数据覆盖写入所述第一条带的请求;
36.所述获得模块还用于:若所述第二数据的首地址偏移或数据长度不是所述条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块;其中,所述目标条带单元为所述第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;所述第二条带单元为第一条带中除第一条带单元之外剩余的条带单元;
37.所述写入模块还用于:将所述第二数据写入所述第一条带单元对应的存储空间,覆盖所述第一条带单元对应的存储空间中的原有数据,以及将所述第二校验块写入所述第一校验块对应的存储空间,覆盖所述第一校验块。
38.在一种可能的实施例中,所述获得模块具体用于:
39.若所述第二条带单元为所述目标条带单元,从所述第二条带单元对应的存储空间中读取所述目标数据;
40.使用所述纠错码算法对所述目标数据和所述第二数据进行编码,获得所述第二校验块。
41.在一种可能的实施例中,所述获得模块具体用于:
42.若所述第一条带单元为所述目标条带单元,从所述第一条带单元对应的存储空间中读取所述目标数据;
43.对所述目标数据和所述第二数据进行异或运算,并使用所述纠错码算法进行编码,获得增量校验块;
44.对所述增量校验块和所述第一校验块进行异或运算,获得所述第二校验块。
45.在一种可能的实施例中,所述接收模块还用于:在将所述第一校验块写入其他存储空间之后,接收到读取所述第一数据包括的第三数据的请求;
46.所述确定模块还用于:若所述第三数据的首地址偏移或数据长度不是所述条带长
度的整数倍,则根据所述第三数据的首地址偏移、数据长度、所述条带长度、以及条带单元长度,确定所述第三数据对应的第三条带单元;
47.所述读取模块还用于:从所述第三条带单元对应的存储空间中读取所述第三数据。
48.第三方面,本技术提供一种电子设备,包括:
49.存储器,用于存储程序指令;
50.处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行第一方面中任一项所述的方法。
51.第四方面,本技术提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被计算机执行时,使所述计算机执行第一方面中任一项所述的方法。
附图说明
52.图1为现有技术中纠删码数据写入示意图;
53.图2为现有技术中纠删码数据读取示意图;
54.图3为本技术实施例提供的条带、块、分片之间的关系示意图;
55.图4为现有技术中纠删码创建对象示意图;
56.图5为本技术实施例提供的一种纠删码数据存储方法的流程示意图;
57.图6为本技术实施例提供的纠删码创建对象示意图;
58.图7为现有技术中纠删码读取数据示意图;
59.图8为本技术实施例提供的纠删码读取数据示意图;
60.图9为现有技术中纠删码覆盖写示意图;
61.图10为本技术实施例提供的纠删码部分写示意图;
62.图11为本技术实施例提供的纠删码部分更新的示意图;
63.图12为本技术实施例提供的纠删码列存对象创建示意图;
64.图13为本技术实施例提供的纠删码列存对象覆盖写示意图;
65.图14为本技术实施例的纠删码数据处理方法的基本流程示意图;
66.图15为本技术实施例的新写入数据的处理流程示意图;
67.图16为本技术实施例的读取数据的处理流程示意图;
68.图17为本技术实施例的覆盖写数据的处理流程示意图;
69.图18为本技术实施例提供的8k随机写长稳测试优化前后的稳态性能对比示意图;
70.图19为本技术实施例提供的一种纠删码数据存储装置的结构图;
71.图20为本技术实施例提供的一种电子设备的结构图。
具体实施方式
72.为了更好的理解本技术实施例提供的技术方案,下面将结合说明书附图以及具体的实施方式进行详细的说明。
73.在数据存储领域,按照误码控制的不同功能,可分为检错码、纠错码和纠删码3种类型。检错码仅具备识别错码功能而无纠正错码功能。纠错码不仅具备识别错码功能,同时
具备纠正错码功能。纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可以将无法纠错的信息删除。
74.纠删码是k个数据块+m个校验块的结构,可以用公式:n=k+m来表示。其中,变量k表示原始数据或符号的值,变量m表示故障后添加的提供保护的额外或冗余符号的值。变量n表示纠删码过程后创建的符号的总值。数据块和校验块都可以称为存储块,当部分存储块损坏的情况下,可以根据剩余存储块的数据,计算得到损坏的部分存储块的数据,从而保证整体数据不会丢失。
75.其中涉及到m和k的取值,m值控制在丢失数据之前可以容忍多少次失败。k值决定每个对象的数据将被条带化多少块。k的取值较大意味着较低的存储开销,但也意味着任何写入操作或读取操作都需要与更多的设备通信,从而增加了数据读取和写入延迟。m值影响可靠性与存储成本,m取值大,故障容忍度高,m取值小,数据冗余低。
76.以分布式存储系统ceph为例,下面介绍纠删码是如何应用到分布式存储系统中的。
77.请参照图1,为现有技术中纠删码数据写入示意图。以k=2,m=1为例,客户端在将名称为photo.jpg的对象上传到分布式存储系统ceph之后,会在主对象存储设备(object storage device,osd)中调用相应的纠删码算法对该对象的数据进行编码计算,由于k=2,将该对象原来的内容abcdefgh拆分成两个分片,条带分片1的内容为abcd,条带分片2的内容为efgh,再计算出校验条带分片3的内容为wxyz。按照ceph集群的数据分布地图(crushmap)所指定的规则,将这3个条带分片随机分布在3个不同的对象存储设备(object storage device,osd)中,完成对photo.jpg对象的存储操作。
78.请参照图2,为现有技术中纠删码数据读取示意图。客户端在发起读取photo.jpg请求以后,这个对象的主osd(例如osd1)会向其他关联的osd(例如osd2和osd3)发起读取请求。当请求发送到了osd2和osd3,此时osd2出现故障无法回应请求,最终只能获取到osd1的条带分片(内容为abcd)和osd3的条带分片(内容为wxyz),此时osd1作为主osd,会对osd1和osd3的条带分片做纠删码解码操作,计算出osd2的条带分片的内容(即efgh),重新组合出新的photo.jpg的内容(即abcdefgh),将该结果返回给客户端。
79.如上介绍了现有技术中纠删码数据的写入和读取过程,其中涉及到条带、分片等基本概念,下面对这些基本概念进行介绍。
80.1、条带(stripe):如果待编码对象过大,无法一次编码完成,那么可以分为多次进行,每次完成的编码部分称为一个条带,同一个对象内的条带中的数据是连续。
81.2、块(chunk),又称stripe_unit(条带单元):对象基于纠删码进行编码时,每次编码通过若干个数据块可以计算出多个校验块,每个块的大小是相同的,多个数据块组成一个条带。
82.3、分片(shard):同一个对象中序号相同的块位于同一块磁盘(disk),它们组成了一个对象的分片。分片内部的块之间数据是不连续的。
83.请参照图3,为本技术实施例提供的条带、块、分片之间的关系示意图。可见,该纠删码数据采用4+2的结构,即k=4,m=2,每个条带包括4个数据块,这4个数据块编码得到2个校验块。即第一行的chunk1、chunk2、chunk3和chunk4组成stripe1,stripe1的chunk1、chunk2、chunk3和chunk4经过编码得到第一行的chunk5和chunk6。第二行的chunk1、
chunk2、chunk3和chunk4组成stripe2,stripe2的chunk1、chunk2、chunk3和chunk4经过编码得到第二行的chunk5和chunk6。每个圆柱体表示一个disk,虚线框表示一个shard,包括多个序号相同的块,一个shard对应一个disk。
84.纠删码存储池对象的所有写入都必须更新完整条带(所有k+m个数据服务),它通常比副本需要与更多的数据服务通信,会增加等待时间。如果一个写只更新一部分的条带,需要读取完整的条带进行更新,重新编码,然后再次写入更新的磁盘,导致纠删码存储池的小数据的io操作比多副本池性能低。
85.请参照图4,为现有技术中纠删码创建对象示意图。在k=4、m=2的场景下,每个条带单元的长度为stripe_unit=4k,每个条带的长度为16k,每个条带包括4个条带单元(块)。当新写入数据长度为17k的数据时,需要先创建一个数据长度为17k的数据对象(object),其中,stripe1的chunk1与stripe2的chunk1会拼接成shard1,一起写入第一个disk中,stripe2中后面的15kb空间用0填充。其实际写入的数据包括8个条带单元和4个检验块的数据,即实际写入的数据长度为48k,实际空间利用率17/48=35.4%远小于理论值4/6=66.7%。当新写入数据的数据长度远小于stripe_unit=4k时,空间利用率会趋近于0%。而且,为了将17k的数据写入6个disk中,需要下发6个数据读写(io)请求,远大于3副本的3个io。
86.为了提高存储空间的利用率,本技术实施例提供一种纠删码数据存储方法,该方法可以由电子设备执行。电子设备可以通过终端或服务器实现,终端例如移动终端、固定终端或便携式终端,例如移动手机、多媒体计算机、多媒体平板、台式计算机、笔记本计算机、平板计算机等。服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器,但并不局限于此。
87.下面以电子设备执行纠删码数据存储方法为例,介绍本技术实施例提供的纠删码数据存储方法,请参照图5,为本技术实施例提供的一种纠删码数据存储方法的流程示意图。
88.s501、若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据第一数据的首地址偏移、数据长度和条带长度,确定第一数据对应的第一条带。
89.具体的,电子设备接收到写入待存储的第一数据的请求,则根据第一数据的首地址偏移和数据长度是否为条带长度的整数倍,判断第一数据是否为满条带的数据。若第一数据的首地址偏移或数据长度不是条带长度的整数倍,说明第一数据为非满条带的数据,则根据第一数据的首地址偏移、数据长度和条带长度,确定第一数据对应的第一条带。
90.s502、根据第一条带的长度,采用填充数据对第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对填充后的第一数据进行编码,获得第一校验块。
91.具体的,电子设备确定第一数据为非满条带的数据,则根据第一条带的长度,采用0、1等填充数据对第一数据的首尾空洞部分进行填充,获得填充后的第一数据。再使用预设的纠错码算法对填充后的第一数据进行编码,获得第一校验块。其中,填充后的第一数据的长度等于第一条带的长度。在第一数据之前所填充的填充数据的数量等于第一数据的首地址偏移。
92.例如,第一数据的首地址偏移offset=1k、数据长度为length=7k,每个条带的长度为16k,则在第一数据之前填充1个0,在第一数据之后填充8个0,进而填充后的第一数据的数据长度为16k,与条带长度相同。
93.s503、将第一数据写入第一条带对应的存储空间,并在第一条带对应的存储空间中创建空洞,将第一校验块写入其他存储空间。
94.其中,空洞相当于空文件夹,未存放任何数据。电子设备利用底层存储的op_zero机制创建空洞,使第一数据和空洞占满第一条带对应的存储空间,减少磁盘的io压力,并减少空间浪费。
95.s504、当读取第一数据时,若第一数据中部分数据存在损坏,则根据其他数据和第一校验块恢复第一数据。
96.具体的,其他数据是根据空洞的位置,用填充数据对第一数据中未损坏的数据进行填充得到的。当电子设备读取第一数据时,若第一数据中部分数据存在损坏,可以从第一条带对应的存储空间中读取第一数据中未损坏的数据,并根据空洞的位置,用填充数据对第一数据中未损坏的数据进行填充,得到其他数据。然后从其他存储空间中读取第一校验块,对其他数据和第一校验块使用预设的纠错码进行解码,从而恢复第一数据。
97.应当说明的是,s503和s504是可选的。在一种可能的实施例中,若第一数据的首地址偏移和数据长度均是条带长度的整数倍,说明第一数据为满条带的数据,则直接使用纠错码算法对第一数据进行编码,获得第三校验块,将第一数据写入第一条带对应的存储空间,将第三校验块写入其他存储空间。该过程可以参考图1和图2论述的内容,此处不再赘述。
98.请参照图6,为本技术实施例提供的纠删码创建对象示意图。在k=4、m=2的场景下,每个条带单元长度为stripe_unit=4k,每个条带的长度为16k,每个条带包括4个条带单元(块)。当新写入数据长度为7k的第一数据时,需要先创建一个数据长度为7k的数据对象(object),由于7k的第一数据无法占满16k的条带,利用底层存储的op_zero机制创建空洞。计算校验块code1和code2时还是用0填充第一数据,但是向数据面服务下发事务时,将填充0的部分变成op_zero操作。针对图6中的第二个条带单元,事务会携带两个操作(op):一个写数据操作(write data),一个创建空洞操作(do zero)。
99.如上介绍了如何新写入第一数据的过程,下面介绍如何读取第一数据包括的第三数据。
100.纠删码的读算法一般是满条带的读,即使只读一个对象中很小的范围也会读取整个条带的数据。这样带来两个问题:增加了数据服务上磁盘的io浪费。读请求的扩散导致网络带宽的浪费,读请求的整个时延增加。
101.请参照图7,为现有技术中纠删码读取数据示意图。在k=4、m=2的场景下,每个条带单元长度为stripe_unit=4k,每个条带长度为16k,每个条带包括4个条带单元。针对34k的第一数据,需要从中读取的第三数据为offset=17k、length=18k。根据条带对齐规则得到实际要读的条带数据为new_offset=16k、new_length=32k,即读取stripe2与stripe3两个条带。可以看出:new_offset《offset且new_length》length,实际读取的数据比需要读取的数据更多。
102.针对非满条带的读放大问题,本技术实施例提供一种纠删码数据读取方法,电子
设备接收到读取第一数据包括的第三数据的请求之后,根据第三数据是否为满条带的数据,确定采用不同的方式来读取第三数据。下面分情况进行介绍。
103.第一种情况,采用条带对齐规则来读取第三数据。
104.若第三数据的首地址偏移和数据长度均不是条带长度的整数倍,则根据第三数据的首地址偏移、数据长度、以及条带长度,确定第三数据对应的目标条带,从目标条带对应的存储空间中读取第三数据。
105.第二种情况,采用条带单元对齐规则来读取第三数据。
106.若第三数据的首地址偏移或数据长度不是条带长度的整数倍,则根据第三数据的首地址偏移、数据长度、条带长度、以及条带单元长度,确定第三数据对应的第三条带单元,从第三条带单元对应的存储空间中读取第三数据。
107.请参照图8,为本技术实施例提供的纠删码读取数据示意图。在k=4、m=2的场景下,每个条带单元长度为stripe_unit=4k,每个条带长度为16k,每个条带包括4个条带单元。针对7k的第一数据,待读取的第三数据为offset=1k、length=3k,根据块对齐即条带单元对齐规则,得到实际要读的条带单元数据为offset=0、length=4k,即黑色矩形框对应的第一个条带单元中的数据,第一个条带单元对应一个磁盘上,因此只需读取这一个磁盘即可获得第三数据。
108.如上介绍了如何读取第一数据包括的第三数据的过程,下面介绍在已写入第一数据的基础上,如何覆盖写入第二数据。
109.覆盖写是纠删码中最消耗性能的操作,但是由于纠删码存储数据是满条带的存储方式,现有技术在覆盖写入新数据时,对该新数据进行条带对齐,并将该新数据需要占用条带的块全部读出来。实际上因为写入区域的数据将要被覆盖,也不需要参与校验块的计算,所以这部分数据无需读出,因此存在一定的读放大。此外,在写入小于1个数据块的数据时,也需按条带对齐再写入磁盘,导致写放大,最终导致性能降低。
110.请参照图9,为现有技术中纠删码覆盖写示意图。针对数据长度为34k的第一数据,即将覆盖写入的第二数据为offset=30k、length=20k,按照条带对齐规则得到需要读取的条带数据为offset=16k、length=32k,也就是strip2和stripe3两个条带的数据,然后将strip2和stripe3的数据与第二数据合并,重新计算校验块。实际就是:需要读取2个条带的数据,并写入3个条带的数据。
111.针对覆盖写的惩罚读写问题,本技术实施例提供一种纠删码数据覆盖写入的方法,具体步骤如下:
112.s1.1、接收到待存储的第二数据覆盖写入第一条带的请求。
113.电子设备接收到待存储的第二数据覆盖写入第一条带的请求之后,可以判断第二数据是否为满条带的数据。
114.s1.2、若第二数据的首地址偏移或数据长度不是条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据目标数据和第二数据,获得第二校验块。
115.其中,目标条带单元为第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;第二条带单元为第一条带中除第一条带单元之外剩余的条带单元。
116.具体的,若第二数据的首地址偏移或数据长度不是条带长度的整数倍,说明第二数据不是满条带的数据,电子设备可以根据第二数据的首地址偏移、数据长度、条带长度、
条带单元长度,确定第二数据写入所需占用的第一条带单元,进一步确定第一条带中除第一条带单元之外剩余的第二条带单元。然后根据第一条带单元和第二条带单元的数量大小,确定目标条带单元。
117.电子设备根据目标条带单元的不同,获得第二校验块的方式不同,下面分情况进行介绍。
118.情况一、若第二条带单元的数量小于第一条带单元的数量,则将第二条带单元确定为目标条带单元,采用部分写的方式来获得第二校验块。
119.若第二条带单元为目标条带单元,从第二条带单元对应的存储空间中读取目标数据,使用纠错码算法对目标数据和第二数据进行编码,获得第二校验块。
120.请参照图10,为本技术实施例提供的纠删码部分写示意图。即将覆盖写入的第二数据为offset=21k、length=20k(即灰色矩形框对应的条带单元数据)。首先读取未被覆盖的条带单元数据(即黑色矩形框对应的条带单元数据),然后将读取的条带单元数据与即将覆盖写入的第二数据进行合并,并通过纠删码算法编码(ec encode),计算出新校验块。
121.情况二、若第一条带单元的数量小于第二条带单元的数量,则将第二条带单元确定为目标条带单元,则采用部分更新的方式来获得第二校验块。
122.若第一条带单元为目标条带单元,从第一条带单元对应的存储空间中读取目标数据,对目标数据和第二数据进行异或运算,并使用纠错码算法进行编码,获得增量校验块,对增量校验块和第一校验块进行异或运算,获得第二校验块。
123.请参照图11,为本技术实施例提供的纠删码部分更新的示意图。即将覆盖写入的第二数据为offset=30k、length=4k,第二数据写入所需占用的第一条带单元为黑色矩形框对应的条带单元。首先读取将要被覆盖的条带单元数据(即灰色矩形框对应的条带单元数据),然后将读取的条带单元数据(即灰色矩形框对应的条带单元数据)与即将覆盖写入的第二数据(即黑色矩形框对应的条带单元数据)进行异或计算修改前后的变化量,接着通过修改前后的变化量计算校验块的变化量(即增量校验块)。最后对校验块的变化量(即增量校验块)与原有的第一校验块进行异或计算得出新校验块(即第二校验块)。
124.情况三、若第二条带单元的数量等于第一条带单元的数量,可以将第二条带单元或第一条带单元确定为目标条带单元,采用部分写或部分更新的方式来获得第二校验块。部分写或部分更新请参照前文论述的内容,此处不再赘述。
125.s1.3、将第二数据写入第一条带单元对应的存储空间,覆盖第一条带单元对应的存储空间中的原有数据,以及将第二校验块写入第一校验块对应的存储空间,覆盖第一校验块。
126.具体的,电子设备获得第二校验块之后,用第二数据覆盖第一条带单元对应的存储空间中的原有数据,以及用第二校验块覆盖第一校验块,进而成功将第二数据写入第一条带。
127.如上所述的内容针对非满条带读写的场景,在满条带的读写情况下,读写的范围超过一个条带时必然带来读写的扩散,也就是需要读写k个数据服务才能完成读写,其根本原因是一个数据服务上的数据是不连续的。例如一个条带包括4个条带单元,被分配到了4个不同的磁盘,读取该条带的数据就需要向4个磁盘下发读请求。
128.针对块存储场景,块设备都是一段连续的空间,块设备都对应着统一存储层中的
多个对象,每个对象的大小都是确定的。因此在一种可能的实施例中,一个条带对应一个存储空间,当第一条带包括多个条带时,将每个第一条带对应的数据写入不同的存储空间中。
129.在本技术实施例中,将数据行存转化列存,使得一个数据服务上的数据是连续的,在读写过程中,减少了读写放大,减少了与数据服务通信负载,特别在覆盖写场景下,减少了校验块的远程传输,校验块的计算都是在本地进行的。
130.请参照图12,为本技术实施例提供的纠删码列存对象创建示意图。在k=4、m=2的场景下,每个条带单元长度为stripe_unit=256k,每个条带包括4个条带单元,则每个条带长度为4*256=1m。待写入的数据为offset=512k、length=768k,在创建对象的过程中,通过offset和length计算出待写入的数据在整个object中的范围,待写入的数据占用了shard1(即stripe1)和shard2(即stripe2),其它空间用0填充。将shard1(即stripe1)的数据写入一个磁盘,将shard2(即stripe2)的数据写入另一个磁盘。
131.请参照图13,为本技术实施例提供的纠删码列存对象覆盖写示意图。在k=4、m=2的场景下,每个条带单元长度为stripe_unit=256k,每个条带包括4个条带单元,每个条带长度为4*256=1m。新写入的数据为offset=3328k、length=5128k,先读取即将被覆盖的数据(即黑色矩形框对应的条带单元数据),再将读取的数据与新写入的数据(即灰色矩形框对应的条带单元数据)进行异或操作计算增量校验块。增量校验块与原有校验块进行异或计算得出新的校验块。这种数据排列方式在小范围的读写操作基本可以做到与三副本相差不多的性能表现。
132.为了更清楚地说明本技术实施例的纠删码数据存储方法,请参照图14,为本技术实施例的一种纠删码数据处理方法的基本流程示意图。
133.s1401、创建数据对象。
134.在分布式存储系统中创建数据对象。
135.s1402、新写入数据。
136.接收到新写入数据的请求,向数据对象中新写入数据。
137.s1403、读取数据。
138.接收到读取数据的请求,从数据对象中读取数据。
139.s1404、覆盖写入数据。
140.接收到覆盖写入数据的请求,向数据对象中覆盖写入数据。
141.请参照图15,为本技术实施例提供的新写入数据的处理流程示意图,具体步骤如下所述。
142.s1501、对待写入的第一数据进行计算。
143.计算第一数据针对条带对齐后的offset、length以及对应的条带。
144.s1502、判断第一数据是否为满条带的数据。
145.若第一数据为满条带的数据,则执行s1503。若第一数据为非满条带的数据,则执行s1506。其中,如何判断第一数据是否为满条带的数据,请参照前文论述的内容,此处不再赘述。
146.s1503、计算第三校验块。
147.使用纠错码算法对第一数据进行编码,获得第三校验块。
148.s1504、生成第一事务,包含写入数据操作与创建空洞操作。
149.s1505、将第一事务提交给管理磁盘的数据服务。
150.s1506、计算第一校验块。
151.根据第一条带的长度,采用填充数据对第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对填充后的第一数据进行编码,获得第一校验块。
152.s1507、生成第二事务,仅包含写入数据操作。
153.s1508、将第二事务提交给管理磁盘的数据服务。
154.请参照图16,为本技术实施例提供的读取数据的处理流程示意图,具体步骤如下所述。
155.s1601、对待读取的第三数据进行计算。
156.计算第三数据针对条带对齐后的offset、length以及对应的条带。
157.s1602、判断第三数据是否为满条带的数据。
158.若第三数据为满条带的数据,则执行s1603。若第三数据为非满条带的数据,则执行s1605。其中,如何判断第三数据是否为满条带的数据,请参照前文论述的内容,此处不再赘述。
159.s1603、按照条带对齐生成第三事务,包括读取数据操作。
160.s1604、将第三事务提交给管理磁盘的数据服务。
161.s1605、按照条带单元对齐生成第四事务,包括读取数据操作。
162.s1606、将第四事务提交给管理磁盘的数据服务。
163.请参照图17,为本技术实施例提供的覆盖写数据的处理流程示意图,具体步骤如下所述。
164.s1701、对待覆盖写入的第二数据进行计算。
165.计算第二数据针对条带对齐后的offset、length以及对应的条带。
166.s1702、判断第二数据是否为满条带的数据。
167.若第二数据为满条带的数据,则执行s1703。若第二数据为非满条带的数据,则执行s1706。其中,如何判断第二数据是否为满条带的数据,请参照前文论述的内容,此处不再赘述。
168.s1703、计算第四校验块。
169.使用纠错码算法对第二数据进行编码,获得第四校验块。
170.s1704、生成第五事务,包括写入数据操作与创建空洞操作。
171.s1705、将第五事务提交给管理磁盘的数据服务。
172.s1706、计算采取部分写和部分更新分别需要读取的条带单元数。
173.部分写需要读取的条带单元就是前文论述的第二条带单元,部分更新分别需要读取的条带单元就是前文论述的第一条带单元。如何计算第一条带单元和第二条带单元的数量请参照前文论述的内容,此处不再赘述。
174.s1707、判断部分写读取的条带单元数是否小于部分更新读取的条带单元数。
175.判断第二条带单元是否小于第一条带单元,若是,则执行s1708,若否,则执行s1712。
176.s1708、读取未被覆盖的条带单元的数据。
177.未被覆盖的条带单元就是前文论述的第二条带单元,从第二条带单元对应的存储
空间中读取目标数据。
178.s1709、读取部分与新写部分计算校验块。
179.使用纠错码算法对目标数据和第二数据进行编码,获得第二校验块。
180.s1710、生成第六事务,仅包括写入数据操作。
181.s1711、将第六事务提交给管理磁盘的数据服务。
182.s1712、读取将要被覆盖的条带单元的数据。
183.将要被覆盖的条带单元就是前文论述的第一条带单元,从第一条带单元对应的存储空间中读取目标数据。
184.s1713、计算将要被覆盖数据修改前后的变化量。
185.对目标数据和第二数据进行异或运算,得到变化量。
186.s1714、计算校验块的变化量。
187.使用纠错码算法对变化量进行编码,获得增量校验块。
188.s1715、计算校验块。
189.对增量校验块和第一校验块进行异或运算,获得第二校验块。
190.s1716、生成第七事务,仅包含写入数据操作。
191.s1717、将第七事务提交给管理磁盘的数据服务。
192.为了模拟现网业务场景,考虑mysql数据库密集小i/o写入场景,进行了8k随机写的长时间写入测试(ec4+2模型),验证优化前后的稳态性能。请参照图18,为本技术实施例提供的8k随机写长稳测试优化前后的稳态性能对比示意图。本技术实施例提供的纠错码数据存储方法得到的曲线为优化后的性能曲线,现有技术得到的曲线为优化前的性能曲线,优化后的性能曲线的趋势平稳且远高于优化前的性能曲线。该优化主要是针对非满条带读写的场景,减少读写放大而带来了性能损失,因此优化后的性能得到大幅提高,且性能稳定。
193.基于同一发明构思,本技术还提供一种纠删码数据存储装置,可以具体设置于前文论述的电子设备中,请参照图19,该装置包括:
194.确定模块1901,用于若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据第一数据的首地址偏移、数据长度和条带长度,确定第一数据对应的第一条带;
195.获得模块1902,用于根据第一条带的长度,采用填充数据对第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对填充后的第一数据进行编码,获得第一校验块;其中,填充后的第一数据的长度等于第一条带的长度;
196.写入模块1903,用于将第一数据写入第一条带对应的存储空间,并在第一条带对应的存储空间中创建空洞,将第一校验块写入其他存储空间;其中,第一数据和空洞占满第一条带对应的存储空间;
197.读取模块1904,用于当读取第一数据时,若第一数据中部分数据存在损坏,则根据其他数据和第一校验块恢复第一数据;其中,其他数据是根据空洞的位置,用填充数据对第一数据中未损坏的数据进行填充得到的。
198.在一种可能的实施例中,该装置还包括接收模块1905,接收模块1905用于:在将第一校验块写入其他存储空间之后,接收到待存储的第二数据覆盖写入第一条带的请求;
199.获得模块1902还用于:若第二数据的首地址偏移或数据长度不是条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据目标数据和第二数据,获得第二校验块;其中,目标条带单元为第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;第二条带单元为第一条带中除第一条带单元之外剩余的条带单元;
200.写入模块1903还用于:将第二数据写入第一条带单元对应的存储空间,覆盖第一条带单元对应的存储空间中的原有数据,以及将第二校验块写入第一校验块对应的存储空间,覆盖第一校验块。
201.在一种可能的实施例中,获得模块1902具体用于:
202.若第二条带单元为目标条带单元,从第二条带单元对应的存储空间中读取目标数据;
203.使用纠错码算法对目标数据和第二数据进行编码,获得第二校验块。
204.在一种可能的实施例中,获得模块1902具体用于:
205.若第一条带单元为目标条带单元,从第一条带单元对应的存储空间中读取目标数据;
206.对目标数据和第二数据进行异或运算,并使用纠错码算法进行编码,获得增量校验块;
207.对增量校验块和第一校验块进行异或运算,获得第二校验块。
208.在一种可能的实施例中,接收模块1905还用于:在将第一校验块写入其他存储空间之后,接收到读取第一数据包括的第三数据的请求;
209.确定模块1901还用于:若第三数据的首地址偏移或数据长度不是条带长度的整数倍,则根据第三数据的首地址偏移、数据长度、条带长度、以及条带单元长度,确定第三数据对应的第三条带单元;
210.读取模块1904还用于:从第三条带单元对应的存储空间中读取第三数据。
211.应当说明的是,图19中装置还可以用于实现前文论述的任一的纠删码数据存储方法,此处不再赘述。
212.基于同一发明构思,本技术实施例中还提供了一种电子设备,该设备相当于前文论述的电子设备,请参照图20,该设备包括:
213.存储器2002,用于存储程序指令;
214.处理器2001,用于调用所述存储器2002中存储的程序指令,按照获得的程序指令执行前文论述的纠删码数据存储方法。
215.处理器2001可以是一个中央处理单元(central processing unit,cpu),或者为数字处理单元、或为图像处理器等中的一种或多种组合。存储器2002可以是易失性存储器(volatile memory),例如随机存取存储器(random-access memory,ram);存储器2002也可以是非易失性存储器(non-volatile memory),例如只读存储器,快闪存储器(flash memory),硬盘(hard disk drive,hdd)或固态硬盘(solid-state drive,ssd)、或者存储器2002是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储器2002可以是上述存储器的组合。
216.最为一种实施例,处理器2001可以实现前文论述的纠删码数据存储方法,处理器
2001还可以实现前文图19论述的装置的功能,此处不再赘述。
217.基于同一发明构思,本技术实施例提供一种计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序包括程序指令,程序指令当被计算机执行时,使计算机执行如前文论述任一的纠删码数据存储方法。由于上述计算机可读存储介质解决问题的原理与纠删码数据存储方法相似,因此上述计算机可读存储介质的实施可以参见方法的实施,重复之处不再赘述。
218.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
219.本技术是参照根据本技术的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
220.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
221.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
222.显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的精神和范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。
技术特征:1.一种纠删码数据存储方法,其特征在于,包括:若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据所述第一数据的首地址偏移、数据长度和所述条带长度,确定所述第一数据对应的第一条带;根据所述第一条带的长度,采用填充数据对所述第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对所述填充后的第一数据进行编码,获得第一校验块;其中,所述填充后的第一数据的长度等于所述第一条带的长度;将所述第一数据写入所述第一条带对应的存储空间,并在所述第一条带对应的存储空间中创建空洞,将所述第一校验块写入其他存储空间;其中,所述第一数据和所述空洞占满所述第一条带对应的存储空间;当读取所述第一数据时,若所述第一数据中部分数据存在损坏,则根据其他数据和所述第一校验块恢复所述第一数据;其中,所述其他数据是根据所述空洞的位置,用所述填充数据对所述第一数据中未损坏的数据进行填充得到的。2.如权利要求1所述的方法,其特征在于,在将所述第一校验块写入其他存储空间之后,所述方法还包括:接收到待存储的第二数据覆盖写入所述第一条带的请求;若所述第二数据的首地址偏移或数据长度不是所述条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块;其中,所述目标条带单元为所述第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;所述第二条带单元为第一条带中除第一条带单元之外剩余的条带单元;将所述第二数据写入所述第一条带单元对应的存储空间,覆盖所述第一条带单元对应的存储空间中的原有数据,以及将所述第二校验块写入所述第一校验块对应的存储空间,覆盖所述第一校验块。3.如权利要求2所述的方法,其特征在于,从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块,包括:若所述第二条带单元为所述目标条带单元,从所述第二条带单元对应的存储空间中读取所述目标数据;使用所述纠错码算法对所述目标数据和所述第二数据进行编码,获得所述第二校验块。4.如权利要求2所述的方法,其特征在于,从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块,包括:若所述第一条带单元为所述目标条带单元,从所述第一条带单元对应的存储空间中读取所述目标数据;对所述目标数据和所述第二数据进行异或运算,并使用所述纠错码算法进行编码,获得增量校验块;对所述增量校验块和所述第一校验块进行异或运算,获得所述第二校验块。5.如权利要求1所述的方法,其特征在于,在将所述第一校验块写入其他存储空间之后,所述方法还包括:接收到读取所述第一数据包括的第三数据的请求;
若所述第三数据的首地址偏移或数据长度不是所述条带长度的整数倍,则根据所述第三数据的首地址偏移、数据长度、所述条带长度、以及条带单元长度,确定所述第三数据对应的第三条带单元;从所述第三条带单元对应的存储空间中读取所述第三数据。6.一种纠删码数据存储装置,其特征在于,包括:确定模块,用于若待存储的第一数据的首地址偏移或数据长度不是条带长度的整数倍,则根据所述第一数据的首地址偏移、数据长度和所述条带长度,确定所述第一数据对应的第一条带;获得模块,用于根据所述第一条带的长度,采用填充数据对所述第一数据进行填充,获得填充后的第一数据,以及使用预设的纠错码算法对所述填充后的第一数据进行编码,获得第一校验块;其中,所述填充后的第一数据的长度等于所述第一条带的长度;写入模块,用于将所述第一数据写入所述第一条带对应的存储空间,并在所述第一条带对应的存储空间中创建空洞,将所述第一校验块写入其他存储空间;其中,所述第一数据和所述空洞占满所述第一条带对应的存储空间;读取模块,用于当读取所述第一数据时,若所述第一数据中部分数据存在损坏,则根据其他数据和所述第一校验块恢复所述第一数据;其中,所述其他数据是根据所述空洞的位置,用所述填充数据对所述第一数据中未损坏的数据进行填充得到的。7.如权利要求6所述的装置,其特征在于,所述装置还包括接收模块,所述接收模块用于:在将所述第一校验块写入其他存储空间之后,接收到待存储的第二数据覆盖写入所述第一条带的请求;所述获得模块还用于:若所述第二数据的首地址偏移或数据长度不是所述条带长度的整数倍,则从目标条带单元对应的存储空间中读取目标数据,根据所述目标数据和所述第二数据,获得第二校验块;其中,所述目标条带单元为所述第二数据写入所需占用的第一条带单元和第二条带单元中数量较小的条带单元;所述第二条带单元为第一条带中除第一条带单元之外剩余的条带单元;所述写入模块还用于:将所述第二数据写入所述第一条带单元对应的存储空间,覆盖所述第一条带单元对应的存储空间中的原有数据,以及将所述第二校验块写入所述第一校验块对应的存储空间,覆盖所述第一校验块。8.如权利要求7所述的装置,其特征在于,所述获得模块具体用于:若所述第二条带单元为所述目标条带单元,从所述第二条带单元对应的存储空间中读取所述目标数据;使用所述纠错码算法对所述目标数据和所述第二数据进行编码,获得所述第二校验块。9.一种电子设备,其特征在于,包括:存储器,用于存储程序指令;处理器,用于调用所述存储器中存储的程序指令,按照获得的程序指令执行权利要求
1-5中任一项所述的方法。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被计算机执行时,使所述计算机执行如权利要求1-5中任一项所述的方法。
技术总结本申请涉及数据存储技术领域,具体涉及一种纠删码数据存储方法、装置、设备及介质,用于提高存储空间的利用率。该方法包括:若第一数据不是满条带的数据,根据第一数据对应的第一条带的长度,采用填充数据对第一数据进行填充,获得与第一条带相同长度的填充后的第一数据,对填充后的第一数据进行编码,获得第一校验块;将第一数据写入第一条带对应的存储空间,并在第一条带对应的存储空间中创建空洞,将第一校验块写入其他存储空间;第一数据和空洞占满第一条带对应的存储空间;当读取第一数据时,若第一数据存在损坏,根据其他数据和第一校验块恢复第一数据;其他数据是根据空洞的位置,用填充数据对第一数据中未损坏的数据进行填充得到的。行填充得到的。行填充得到的。
技术研发人员:杨朝辉 张翼 刘啸滨 白杨 马建庭 王珺 廖力
受保护的技术使用者:天翼云科技有限公司
技术研发日:2022.07.18
技术公布日:2022/11/1