一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种实现分布式块存储系统读写的方法及装置与流程

2021-11-05 21:41:00 来源:中国专利 TAG:


1.本技术涉及分布式存储技术领域,特别是涉及一种实现分布式块存储系统读写的方法及装置。


背景技术:

2.随着信息化技术的发展,用户的存储需要越来越高,相比于传统的存储系统,云存储以其扩展性强、性价比高、容错性好等优势,得到了业界的广泛认同。而云存储中的重要技术之一就是分布式块存储技术,在信息化的海量存储需求中,如何对分布式块存储系统进行读写,从而提升分布式块存储系统的读写效率,是个重要的技术问题。
3.目前分布式块存储系统的读写方法,通常是:当一个虚拟磁盘有多个缓冲区获取到分布式块存储的读命令或者写命令时,按照读操作和写操作对不同命令进行分类,然后逐一执行读操作和写操作,直到完成当前命令的所有读写操作。
4.然而,目前分布式块存储系统的读写方法中,由于分布式存储所对接的场景不断丰富,虚拟化场景也越来越多,面对一个磁盘存在多个缓冲区同时进行读写的操作时,由于单个虚拟磁盘的iops(input/output operations per second,每秒进行读写(i/o)操作的次数)存在着上线,这种逐一执行读操作和写操作,会占用大量的读写时间,从而降低存储系统的存储效率,进而无法满足用户越来越高的存储需求。


技术实现要素:

5.本技术提供了一种实现分布式块存储系统读写的方法及装置,以解决现有技术中分布式块存储读写方法导致存储效率较低的问题。
6.为了解决上述技术问题,本技术实施例公开了如下技术方案:
7.一种实现分布式块存储系统读写的方法,所述方法包括:
8.获取io向量队列参数,所述io向量队列参数为:聚集写参数writev、散布读参数readv以及分散读写参数write/read中的一种;
9.当io向量队列参数为writev时,采用缓存暂存的方法,对分布式块存储系统进行聚集写操作;
10.当io向量队列参数为readv时,采用内存转换的方法,对分布式块存储系统进行散布读操作;
11.当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统。
12.可选地,所述当io向量队列参数为writev时,采用缓存暂存的方法,对分布式块存储系统进行聚集写操作,包括:
13.获取writev io向量的偏移量和长度;
14.根据所述writev io向量的偏移量和长度,分配新的向量和第一内存缓存区,所述新的向量用于接收转移后的writev io向量的偏移量和长度,所述第一内存缓存区用于接
收writev io向量中的buf;
15.根据所述writev io向量的偏移量和长度,将缓存数据转移至所述第一内存缓存区;
16.将第一内存缓存区的内存缓存区指针传入回调函数中,所述回调函数用于请求异步回调空间;
17.根据转移后的writev io向量的偏移量和长度,以及所述第一内存缓存区,计算请求writev操作的数据对应的数据块和物理磁盘地址;
18.根据所述数据块和物理磁盘地址,对请求writev操作的数据执行异步写请求;
19.写入完成后,根据所述内存缓存区指针释放所述内存缓存区。
20.可选地,所述当io向量队列参数为readv时,采用内存转换的方法,对分布式块存储系统进行散布读操作,包括:
21.获取所有readv io向量的偏移量和长度;
22.根据任一所述readv io向量的偏移量和长度,分配一个向量指针和一个第二内存缓存区,所述第二内存缓存区用于接收io向量中的缓存数据;
23.将每个readv io向量的地址传递至所述向量指针,并将所述向量指针传入回调函数中,所述回调函数用于请求异步回调空间;
24.根据任一所述readv io向量的偏移量和长度,以及对应的第二内存缓存区,计算请求readv操作的数据所对应的数据块和物理磁盘地址;
25.根据请求readv操作的数据所对应的数据块和物理磁盘地址,对请求readv操作的数据执行异步读请求;
26.读取完成后,根据所述向量指针遍历所有readv io向量,获取每个readv请求的偏移量、长度和第二内存缓存区;
27.单步读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区。
28.可选地,所述单步读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区,具体为:
29.根据每个readv请求的偏移量和长度,依次读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区。
30.可选地,所述当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统,包括:
31.申请两个队列,分别用于暂存所获取的读请求和写请求;
32.针对任一读请求和写请求,分配一个设置有请求超时阈值的时钟;
33.采用一线程对每个队列中的读请求和写请求,进行遍历与合并;
34.针对任一读请求或写请求,根据所述时钟判断所述读请求或写请求是否为超时请求;
35.如果是,判断前后两个请求是否为相邻请求;
36.如果是相邻请求,则合并相邻的读请求或写请求;
37.对合并后的读请求或写请求进行相应的读操作或写操作。
38.可选地,所述合并相邻的读请求或写请求,包括:
39.将相邻的所述读请求或写请求合并为一个较大的合并请求;
40.将每个所述合并请求的回调暂存至回调池;
41.将所述合并请求的时钟更新为合并前两个相邻读请求或写请求中时间较大的值。
42.可选地,所述请求超时阈值为100毫秒。
43.可选地,当所述读请求或写请求判定为超时请求时,所述采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统的方法,还包括:
44.针对任一读请求或写请求,判断所述读请求或写请求的请求长度是否超出合并长度阈值;
45.如果是,从所述队列中出队,并直接执行读操作或写操作。
46.可选地,对合并后的读请求或写请求进行相应的读操作或写操作之后,所述方法还包括:
47.编辑回调池中不同请求的回调;
48.根据不同请求的回调,分发转移相应数据,并通过逐个调用不同请求的回调完成请求读写。
49.一种实现分布式块存储系统读写的装置,所述装置包括:
50.io向量参数获取模块,用于获取io向量队列参数,所述io向量队列参数为:聚集写参数writev、散布读参数readv以及分散读写参数write/read中的一种;
51.聚集写模块,用于当io向量队列参数为writev时,采用缓存暂存的方法,对分布式块存储系统进行聚集写操作;
52.散布读模块,用于当io向量队列参数为readv时,采用内存转换的方法,对分布式块存储系统进行散布读操作;
53.连续读写模块,用于当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统。
54.本技术的实施例提供的技术方案可以包括以下有益效果:
55.本技术提供一种实现分布式块存储系统读写的方法,该方法首先获取io向量队列参数,当io向量队列参数为writev时,采用缓存暂存的方法,对分布式块存储系统进行聚集写操作,当io向量队列参数为readv时,采用内存转换的方法,对分布式块存储系统进行散布读操作;当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统。本实施例根据所获取的不同io向量队列参数,采用不同的方法执行相应的读请求、写请求或多个缓存区的连续读写请求,这种方法使得本实施例既能够支持业务层传入的已有的readv读向量参数、writev写向量参数,又能够实现分散write/read请求的统一处理,从而大大提高分布式块存储系统的存储业务上限和存储效率,提高用户体验,有利于提高分布式块存储系统的市场竞争力。尤其是当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求进行合并,能够有效提高存储业务上限,从而提高存储效率。
56.本技术还提供一种实现分布式块存储系统读写的装置,该装置主要包括:io向量参数获取模块、聚集写模块、散布读模块和连续读写模块。通过io向量参数获取模块获取到不同的参数后,根据不同的参数启动聚集写模块、散布读模块或连续读写模块,从而采用不同的方法执行不同的读写操作,这种结构设计,根据不同的io向量参数而定,有针对性,既
支持已经存在的内核readv、writev参数,又能够实现分散write/read请求的统一处理,有利于提高存储的灵活性,以及存储业务的上限,从而大大提高分布式块存储系统的存储效率。
57.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。
附图说明
58.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。
59.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
60.图1为本技术实施例所提供的一种实现分布式块存储系统读写的方法的流程示意图;
61.图2为本技术实施例所提供的一种实现分布式块存储系统读写的装置的结构示意图。
具体实施方式
62.为了使本技术领域的人员更好地理解本技术中的技术方案,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本技术保护的范围。
63.为了更好地理解本技术,下面结合附图来详细解释本技术的实施方式。
64.实施例一
65.参见图1,图1为本技术实施例所提供的一种实现分布式块存储系统读写的方法的流程示意图。由图1可知,本实施例中实现分布式块存储系统读写的方法,包括如下过程:
66.s1:获取io向量队列参数。
67.本实施例的方法运行于l inux平台,io向量队列参数为:聚集写参数writev、散布读参数readv以及分散读写参数write/read中的一种。
68.根据不同的io向量队列参数,采用不同的方法执行不同的读操作或写操作。
69.当io向量队列参数为writev时,执行步骤s2:采用缓存暂存的方法,对分布式块存储系统进行聚集写操作。
70.具体地,步骤s2包括如下过程:
71.s21:获取writev io向量的偏移量和长度。
72.也就是获取writev请求下iovec的偏移和长度。
73.s22:根据writev io向量的偏移量和长度,分配新的向量和第一内存缓存区,新的向量用于接收转移后的writev io向量的偏移量和长度,第一内存缓存区用于接收writev io向量中的buf。
74.s22:根据writev io向量的偏移量和长度,将缓存数据转移至第一内存缓存区。
75.s24:将第一内存缓存区的内存缓存区指针传入回调函数中,回调函数用于请求异步回调空间。
76.也就是,将第一内存缓存区的内存缓存区指针传入回调函数,请求异步回调空间,以便于writev请求完成时释放缓存区空间。
77.s25:根据转移后的writev io向量的偏移量和长度,以及第一内存缓存区,计算请求writev操作的数据对应的数据块和物理磁盘地址。
78.也就是根据转移后的writev io向量的偏移量和长度,以及第一内存缓存区,确定请求writev操作的数据属于哪部分数据块,以及该数据的物理磁盘所在地址。
79.s26:根据数据块和物理磁盘地址,对请求writev操作的数据执行异步写请求。
80.s27:写入完成后,根据内存缓存区指针释放内存缓存区。
81.写入完成后,根据回调空间中的buf指针,释放缓存空间,完成writev请求,至此,聚集写请求中的分散的请求全部写入分布式块存储系统的持久化区域。释放缓存空间时,可以采用系统释放内存函数,释放buf指针所指向的缓存空间。
82.继续参见图1可知,当io向量队列参数为readv时,执行步骤s3:采用内存转换的方法,对分布式块存储系统进行散布读操作。
83.具体地,步骤s3包括如下过程:
84.s31:获取所有readv io向量的偏移量和长度。
85.也就是获取readv请求下iovec的偏移和长度。
86.s32:根据任一readv io向量的偏移量和长度,分配一个向量指针和一个第二内存缓存区,第二内存缓存区用于接收io向量中的缓存数据。
87.s33:将每个readv io向量的地址传递至向量指针,并将向量指针传入回调函数中,回调函数用于请求异步回调空间。
88.也就是建立向量指针与用户向量地址之间的映射关系,并传入请求异步回调空间,以便于readv请求完成时进行缓存分配。
89.由步骤s32和s33可知,本实施例中,readv需要记录每个向量的偏移、长度、buf指针,readv请求完成后将读取的数据依次放入buf中。
90.s34:根据任一readv io向量的偏移量和长度,以及对应的第二内存缓存区,计算请求readv操作的数据所对应的数据块和物理磁盘地址。
91.s35:根据请求readv操作的数据所对应的数据块和物理磁盘地址,对请求readv操作的数据执行异步读请求。
92.也就是根据readv请求的偏移量、长度、申请的缓存区,计算readv操作的数据属于哪部分数据,以及readv操作的数据的物理磁盘所在地址,执行异步读请求。
93.s36:读取完成后,根据向量指针遍历所有readv io向量,获取每个readv请求的偏移量、长度和第二内存缓存区。
94.s37:单步读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区。
95.由步骤s36和s37可知,从磁盘读取完成后,根据回调空间中的向量指针,遍历该向量结构,获取到各个请求的偏移量、长度以及二内存缓存区,单步读取磁盘的缓存buf中分
段读取数据,然后写入各个向量地址空间对应的第二内存缓存区,完成缓存至第二内存缓存区的内存转移。
96.进一步地,本实施例中步骤s37的实现方法,具体为:
97.根据每个readv请求的偏移量和长度,依次读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区。
98.继续参见图1可知,当io向量队列参数为write/read时,执行步骤s4:采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统。
99.具体地,步骤s4包括如下过程:
100.s40:申请两个队列,分别用于暂存所获取的读请求和写请求。
101.s41:针对任一读请求和写请求,分配一个设置有请求超时阈值的时钟。
102.本实施例中请求超时阈值为100毫秒,也就是当请求时间大于等于100毫秒时,判定为请求超时,执行请求超时的后续步骤,当请求时间小于100毫秒时,判定为请求没有超时,继续维持请求状态。
103.s42:采用一线程对每个队列中的读请求和写请求,进行遍历与合并。
104.s43:针对任一读请求或写请求,根据时钟判断读请求或写请求是否为超时请求。
105.如果读请求或写请求为超时请求,执行步骤s44:判断前后两个请求是否为相邻请求。
106.本实施例中的相邻请求指的是相邻偏移量请求。
107.判定为请求超时的时候,出队,并继续判断前后两个请求是否为相邻请求,当判定为请求没有超时的时候,继续在队列中等待即可。
108.如果是相邻请求,执行步骤s45:则合并相邻的读请求或写请求。
109.具体地,步骤s45又包括如下过程:
110.s451:将相邻的读请求或写请求合并为一个较大的合并请求。
111.可以采用向前合并的方式,也可以采用向后合并的方式,将当前的两个相邻的请求合并为一个合并请求。
112.s452:将每个合并请求的回调暂存至回调池。
113.s453:将合并请求的时钟更新为合并前两个相邻读请求或写请求中时间较大的值。
114.也就是,比对合并前两个相邻请求的时间,选定时间较大的值,采用这个时间较大的值作为合并请求的时钟。
115.s46:对合并后的读请求或写请求进行相应的读操作或写操作。
116.进一步地,本实施例对合并后的读请求或写请求进行相应的读操作或写操作之后,还包括步骤s47:编辑回调池中不同请求的回调。
117.s48:根据不同请求的回调,分发转移相应数据,并通过逐个调用不同请求的回调完成请求读写。
118.进一步地,当读请求或写请求判定为超时请求时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统的方法,还包括对请求长度的判断。具体地,包括步骤s49:针对任一读请求或写请求,判断读请求或写请求的请求长度是否超出合并长度阈值。本实施例中合并长度阈值取值为1mb。
119.如果读请求或写请求的请求长度超出合并长度阈值,队列中出队,并直接执行读操作或写操作,否则继续在队列中等待。
120.通过步骤s48,在线程遍历队列时,同时判断时钟是否超时和请求长度是否超长,能够提高判断的准确性,有利于进一步提高分布式块存储系统的读写效率。
121.实施例二
122.在图1所示实施例的基础上参见图2,图2为本技术实施例所提供的一种实现分布式块存储系统读写的装置的结构示意图。由图2可知,本实施例中实现分布式块存储系统读写的装置主要包括:io向量参数获取模块、聚集写模块、散布读模块和连续读写模块。
123.其中,io向量参数获取模块,用于获取io向量队列参数,io向量队列参数为:聚集写参数writev、散布读参数readv以及分散读写参数write/read中的一种;聚集写模块,用于当io向量队列参数为writev时,采用缓存暂存的方法,对分布式块存储系统进行聚集写操作;散布读模块,用于当io向量队列参数为readv时,采用内存转换的方法,对分布式块存储系统进行散布读操作;连续读写模块,用于当io向量队列参数为write/read时,采用缓存暂存与合并下发的方法,将多个缓存区的连续读写请求,统一下发至分布式块存储系统。
124.进一步地,聚集写模块包括:第一偏移量和长度获取单元、向量和内存缓存区分配单元、数据转移单元、第一指针传入单元、第一计算单元、异步写请求单元和释放单元。
125.其中,第一偏移量和长度获取单元,用于获取writev io向量的偏移量和长度;向量和内存缓存区分配单元,用于根据writev io向量的偏移量和长度,分配新的向量和第一内存缓存区,新的向量用于接收转移后的writev io向量的偏移量和长度,第一内存缓存区用于接收writev io向量中的buf;数据转移单元,用于根据writev io向量的偏移量和长度,将缓存数据转移至第一内存缓存区;第一指针传入单元,用于将第一内存缓存区的内存缓存区指针传入回调函数中,回调函数用于请求异步回调空间;第一计算单元,用于根据转移后的writev io向量的偏移量和长度,以及第一内存缓存区,计算请求writev操作的数据对应的数据块和物理磁盘地址;异步写请求单元,用于根据数据块和物理磁盘地址,对请求writev操作的数据执行异步写请求;释放单元,用于写入完成后,根据内存缓存区指针释放内存缓存区。
126.散布读模块包括:第二偏移量和长度获取单元、向量指针和内存缓存区分配单元、第二指针传入单元、第二计算单元、异步读请求单元、第一遍历单元和单步读取单元。其中,第二偏移量和长度获取单元,用于获取所有readv io向量的偏移量和长度;向量指针和内存缓存区分配单元,用于根据任一readv io向量的偏移量和长度,分配一个向量指针和一个第二内存缓存区,第二内存缓存区用于接收io向量中的缓存数据;第二指针传入单元,用于将每个readv io向量的地址传递至向量指针,并将向量指针传入回调函数中,回调函数用于请求异步回调空间;第二计算单元,用于根据任一readv io向量的偏移量和长度,以及对应的第二内存缓存区,计算请求readv操作的数据所对应的数据块和物理磁盘地址;异步读请求单元,用于根据请求readv操作的数据所对应的数据块和物理磁盘地址,对请求readv操作的数据执行异步读请求;第一遍历单元,用于读取完成后,根据向量指针遍历所有readv io向量,获取每个readv请求的偏移量、长度和第二内存缓存区;单步读取单元,用于单步读取磁盘缓存buf中的数据,将磁盘缓存buf中的数据写入每个readv io向量地址所对应的第二内存缓存区。
127.连续读写模块包括:队列申请单元、时钟分配单元、第二遍历单元、第一判断单元、第二判断单元、合并单元和读写操作单元。其中,队列申请单元,用于申请两个队列,分别用于暂存所获取的读请求和写请求;时钟分配单元,用于针对任一读请求和写请求,分配一个设置有请求超时阈值的时钟;第二遍历单元,用于采用一线程对每个队列中的读请求和写请求,进行遍历与合并;第一判断单元,用于针对任一读请求或写请求,根据时钟判断读请求或写请求是否为超时请求;第二判断单元,用于当读请求或写请求为超时请求时,判断前后两个请求是否为相邻请求;合并单元,用于当前后两个请求为相邻请求时,合并相邻的读请求或写请求;读写操作单元,用于对合并后的读请求或写请求进行相应的读操作或写操作。
128.该实施例中实现分布式块存储系统读写的装置的工作原理和工作方法,在图1所示的实施例中已经详细阐述,在此不再赘述,
129.以上所述仅是本技术的具体实施方式,使本领域技术人员能够理解或实现本技术。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本技术的精神或范围的情况下,在其它实施例中实现。因此,本技术将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献