连续数据存储中面向raid5的写操作优化设计方法

文档序号:6341563阅读:370来源:国知局
专利名称:连续数据存储中面向raid5的写操作优化设计方法
技术领域
本发明属于计算机数据存储技术领域,涉及一种在连续数据存储中面向RAID 5的写操作优化设计方法。
背景技术
RAID (Redundant Array of Ind印endent Disk,独立冗余磁盘阵列)技术,是将N台硬盘通过RAID Controller(分Hardware, Software)结合成虚拟单台大容量的硬盘使用。RAID的采用为存储系统(或者服务器的内置存储)带来巨大利益,其中提高传输速率和提供容错功能是最大的优点。 RAID 5是一种存储性能、数据安全和存储成本兼顾的存储解决方案。RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上,冗余校验数据均衡分布于所有磁盘中。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。 当构造冗余校验数据时,如果写入的数据正好是RAID 5的一个条带,则直接从这些数据计算出一个校验块,否则就要使用重构写或读改写。其中,重构写是读取未修改磁盘的数据块,与要写入的数据块一起计算得到校验块;读改写是读取需要修改磁盘的旧数据块和旧的校验块计算得到校验块。为计算校验块,重构写或读改写需要额外的1/0开销和延时,这就降低了RAID 5的吞吐能力。 另一方面,当向RAID 5写入的数据块不连续(随机写)时,磁盘就需要寻道到新
的数据块位置,此时,随机1/0传输性能是连续1/0传输性能的35%甚至更低。 因此,如何避免重构写或读改写的开销,并保持数据块的连续性,避免磁盘寻道开
销,成为亟待解决的问题。

发明内容
本发明的目的是为解决上述技术问题,提出一种连续数据存储中面向RAID5的写操作优化设计方法。 本发明方法所采用的技术方案如下 在连续数据存储应用中,通过在计算机上运行一个聚合驱动程序,对应用程序的写数据块进行聚合重组,即,在连续数据存储时,在内存缓冲区内保存应用程序发出的写数据块,并构造一个与RAID 5的完整条带长度相等的对齐数据块,之后,使对齐数据块在RAID 5上恰好占满整个条带,再发送给RAID 5,以实现对RAID 5的整条写;同时,对向RAID 5写入的数据块进行排序,使它们连续地写入相邻的条带,由此实现RAID 5的连续1/0传输; 其中,所述聚合驱动程序位于应用程序和RAID 5之间,包括两个线程和一个队列Q ;两个线程中,一个是接收线程,其完成如下工作监控和接收应用程序发送给RAID 5的写请求,并把接收到的写请求加入到队列Q ;另一个是发送线程,其完成如下工作当队列Q不为空时,从队列Q中取出并处理写请求。
该方法同样适用于RAID 6。
下面对其进行具体说明 首先,获取RAID 5磁盘阵列的参数,包括条带长度(Stripe Length,—个条带在单块磁盘上的占用区域的大小,以字节为单位),条带深度(Stripe D印th,组成RAID 5的
磁盘数目)。 其中,一个完整的条带长度(Full Stripe Length)等于条带长度乘以条带深度。
上述两个参数可通过人工指定,或者调用API接口函数,或者运行测试程序等方式获得。 其次,在计算机上运行一个聚合驱动程序,该程序位于应用程序和RAID 5之间。
所述聚合驱动程序包括两个线程和一个队列Q。两个线程中,一个是接收线程,其完成如下工作监控和接收应用程序发送给RAID 5的写请求,并把接收到的写请求加入到队列Q。另一个是发送线程,其完成如下工作当队列Q不为空时,从队列Q中取出并处理写请求。 设写请求具有如下格式 ssize—t write(struct file氺filp, const char氺buf, size—t cnt, 1off—t氺off)其中,filp为设备文件指针,指一个打开的设备,例如RAID 5磁盘阵列;buf为用户空间缓冲区指针,指向待写数据的起始地址;cnt为写数据块的大小;off是偏移量,也就是用户数据写入设备文件的起始位置,RAID 5会将其转换为对应的LBA。为方便说明,将写请求记作(buf, cnt, off)。 在上述基础上,进行以下操作 对于每一路数据,当应用程序提交写请求时,每次写入数据块的起始逻辑块地址LBA与前一次写操作的末尾LBA是相邻的,即数据被存储到连续的逻辑块中。如果为每一路数据分别建立一个RAID 5,可以简化聚合驱动程序的设计,但这样需要更多的磁盘个数,校验数据需占据更多的存储空间。因此,将多路数据存储在一个RAID 5中。
应用程序把N路数据块依次发送给RAID 5,由接收线程接收后将其加入到队列Q。设定每次采集并写入的数据块大小相等,D(i, j)表示第i路采集到的第j项数据,0《i《N-l,O《j。 对于每一路数据,发送线程为它创建一个发送缓冲区,记作bufsend[i](0《i《N-l),其中,缓冲区大小为RAID 5的完整条带长度Fu11 Stripe Length,简记为fullstripelen。缓冲区缓存的字节数记为filled[i],缓冲区空闲的字节数记为residiml[i]。 filled[i]+residiml [i] = fullstripelen。 发送线程从队列Q中取出写请求,设该请求对应于第i路数据,将其发送到对应的发送缓冲区bufsend[i]。对于bufsend[i],初始其residual [i]为fullstripelen,offsend[i] = i*fullstripelen。设bufsend[i]接收到的写请求表示为(buf , cnt, off)。buf send [i]处理写请求的流程如下
1)接收第i路数据的写请求(buf, cnt, off); 2)判断buf send [i]是否可容纳该写请求的数据块,即,比较cnt和residual [i]。如果cnt小于residual [i],转到3);否则转到6); 3)从该写请求的数据缓冲区复制cnt个字节到bufsend[i]; 4)修改residual [i]为residual [i] _cnt ; 5)在队列Q中删除该写请求,然后转到1)执行; 6)把该写请求的前residual [i]个字节复制到bufsend[i]; 7)将该写请求修改为(buf+residiml[i], cnt-residiml[i], off+residiml[i])。
艮卩,修改buf为buf+residiml[i], 修改cnt为cnt_residiml [i], 修改off为
off+residiml [i]; 8)由于经步骤6)已将bufsend[i]填满,此时,发送线程将bufsend[i]中的数据写入RAID 5,其偏移量为offsend[i],长度为fullstripelen。 9)偏移量指针offsend[i]增加N*fullstripelen,并设置residual [i]为fullstripelen。 10)判断cnt是否为零,若cnt = 0,表明该写请求的数据已经发送完毕,转到5)执行,否则,转到2)执行。 由于应用程序设定每路数据块的大小相等,所以N个发送缓冲区是依次顺序填满的。当缓冲区bufsend[O]至bufsend[N-l]依次填满后,发送线程就会把这N个缓冲区中的数据逐个发送给RAID 5,并被顺序写入到RAID 5的第kN到第(kN)+N_1条带中,这里k=0,1,2,...。由此实现了对RAID 5条带的整条写,避免了重构写或读改写。由于对条带的写入同时也是连续的,对RAID 5表现为顺序写,避免了随机写操作所需的磁头寻道。
按照如上方法存储的数据,第i路数据存储在第i、N+i、2N+i,. . . , kN+l,...个条带中。读取每一路数据时,LBA线性增加,磁头顺序移动,磁头寻道开销将比随机读要低。
为了保证应用程序重启后,bufsend[i]写入的整条数据仍然与RAID 5的条带边
界对齐,聚合驱动程序需要监控应用程序对设备文件的打开与关闭操作。当应用程序关闭设备文件,发送线程最后一次向RAID 5写数据时,缓冲区bufsend[i]可能没有填满,因此需要记录当前offsend[i]及缓存字节数filled[i] (fullstripelen-residual [i])的值后,再把bufsend[i]中的数据写入RAID 5 ;当设备文件再次打开时,首先根据记录的offsend[i]及filled[i],在RAID 5中从offsend[i]位置开始,读出filled[i]个字节到buf send [i]后,再进入正常工作状态。 对于连续数据保护系统(CDP),本发明同样适用。块级CDP系统需要将捕获的磁盘
数据块写操作保存在CDP日志中,由于日志区中的数据是连续写入的,并且每一个日志数
据项(磁盘块数据)都具有相同的大小,因此同样适合使用本方法进行优化,每一个要保护
的磁盘相当于一路数据。 有益效果 本发明方法具有以下优点 1)实现了 RAID 5条带的整条写。本发明通过缓冲组合应用程序发出的写数据块,每次向RAID 5写入一个完整的条带,避免了构造RAID 5校验数据所需的重构写或读改写的开销。 2)实现了多个条带的连续写。本发明通过设置多个缓冲区,使多路数据组合后的完整的条带连续地写入到RAID 5中,实现了RAID 5的连续写,避免了磁盘寻道开销。
3)通过RAID 5条带的整条写和多个条带的连续写,降低了 RAID 5系统的I/O开
销,提高了它的吞吐能力。 该发明同样适用于RAID 6。


图1为向N个发送缓冲区分发队列Q中写请求的示意 图2为写请求的处理流程图; 图3为视频监控数据在RAID 5条带中的存储情况;
图4为本发明实施例的写操作示意图。
具体实施例方式
下面结合附图及实施例,对本发明方法做进一步详细说明。
结合基于块级的多路视频监控,详细阐述本方法的工作流程。 对于每一路监控数据,当视频监控程序提交写请求时,每次写入数据块的起始逻辑块地址LBA与前一次写操作的末尾LBA是相邻的,即数据被存储到连续的逻辑块中。如果为每一路监控数据分别建立一个RAID 5,可以简化聚合驱动程序的设计,但这样需要更多的磁盘个数,校验数据需占据更多的存储空间。因此,可将多路视频监控数据存储在一个RAID 5中。 视频监控程序把N路采集数据依次发送给RAID 5,由接收线程接收后将其加入到队列Q。设定每次采集并写入的数据块大小相等,D(i, j)表示第i路视频采集到的第j项数据,O《i《N-l,O《j。 对于每一路数据,发送线程为它创建一个发送缓冲区,记作bufsend[i](0《i《N-l),其中,缓冲区大小为RAID 5的完整条带长度Fu11 Stripe Length,简记为fullstripelen,缓冲区缓存的字节数记为f illed[i],缓冲区空闲的字节数记为residiml[i]。 filled[i]+residiml [i] = fullstripelen。 发送线程从队列Q中取出写请求,设该请求对应于第i路视频数据,将其发送到对应的发送缓冲区bufsend[i],如图1所示。对于缓冲区bufsend[i],初始其residual [i]为fullstripelen, offsend[i] = i*fullstripelen,设bufsend[i]接收到的写请求表示为(buf, cnt, off) 。 bufsend[i]处理写请求的工作流程如图2所示,过程如下
1)接收第i路数据写请求(buf, cnt, off); 2)判断bufsend[i]缓冲区是否可容纳该写请求的数据块,即,比较cnt和
residual [i]。如果cnt小于residual [i],转到3);否则转到6); 3)从该写请求的数据缓冲区复制cnt个字节到buf send [i]; 4)修改residual [i]为residual [i] _cnt ; 5)在队列Q中删除该写请求,转到1)执行; 6)把该写请求的前residual [i]个字节复制到buf send [i]; 7)将该写请求修改为(buf+residiml[i], cnt-residiml[i], off+residiml[i])。
艮卩修改buf为buf+residiml[i], 修改cnt为cnt_residiml [i], 修改off为
off+residiml [i];由于经步骤6)已将bufsend[i]填满,此时,发送线程将bufsend[i]中的数据写入RAID 5(偏移量为offsend[i],长度为fullstripelen)。 9)偏移量指针offsend[i]增加N*fullstripelen,设置residual [i]为fullstripelen。 10)判断cnt是否为零,若cnt = 0,表明该写请求的数据已经发送完毕,转到5)执行,否则,转到2)执行。 由于应用程序设定每路数据块的大小相等,所以N个发送缓冲区是依次顺序填满的。当缓冲区bufsend[O]至bufsend[N-l]依次填满后,发送线程就会把这N个缓冲区中的数据逐个发送给RAID 5,并被顺序写入到RAID 5的第kN到第(kN)+N-1条带中,这里k=0,1,2,…,见图3。由此实现了对RAID 5条带的整条写,避免了重构写或读改写;由于对条带的写入同时也是连续的,对RAID 5表现为顺序写,避免了随机写操作所需的磁头寻道。 按照如上方法存储的视频数据,第i路视频数据存储在第i、 N+i、2N+i,…,kN+l,…个条带中,读取每一路视频数据时,LBA线性增加,磁头顺序移动,磁头寻道开销将比随机读要低。 为了保证应用程序重启后,bufsend[i]写入的整条数据仍然与RAID 5的条带边
界对齐,聚合驱动程序需要监控应用程序对设备文件的打开与关闭操作。当应用程序关闭设备文件,发送线程最后一次向RAID 5写数据时,缓冲区bufsend[i]可能没有填满,因此需要记录当前offsend[i]及缓存字节数filled[i] (fullstripelen-residual [i])的值后,再把bufsend[i]中的数据写入RAID 5 ;当设备文件再次打开时,首先根据记录的offsend[i]及filled[i],在RAID 5中从offsend[i]位置开始,读出filled[i]个字节到bufsend[i]后,再进入正常工作状态。
实施例 如图4所示,设2路视频监控应用程序,每次发送的写数据块大小为4KB, RAID 5条带长度fullstripelen = 10KB(5个数据磁盘,1个校验磁盘,每个数据块大小为2KB),第0路、第l路数据的发送缓冲区分别为bufsend
和bufsend[l],初始变量residual
=residual[1] = fullstripelen = IOKB, offsend[O] = 0, offsend[l] = fullstripelen。
接收线程接收到应用程序发出的6个写请求,分别来自于第0路、第1路视频监控,见图4(a),放入队列Q中。发送线程向bufsend[O]和bufsend[l]分发写请求,见图4(b)。 发送线程进行如下操作,见图4 (c)。对于每一路数据,前2个写请求的数据块被复制到缓冲区中,第3个写请求数据块的前面2KB将缓冲区填满,该写请求被修改为2KB。
大小为10KB的缓冲区填满后,被写入RAID 5,正好是RAID 5的一个条带,RAID 5可以直接计算校验数据,而不需要从磁盘上读取旧的数据块或校验块;而图中的2个条带在RAID 5中的地址又是连续的,见图4(d),由RAID 5作为顺序的写操作来处理,不需要磁盘寻道。 本发明利用缓冲区对多路数据进行重组聚合,在视频监控、连续数据保护等连续
数据存储应用中,构造出连续的、完整的条带写操作,提高RAID 5的吞吐能力。 对于RAID 6系统,本发明同样适用。完整的条带写操作可以使RAID 6不需读取
8磁盘数据块或校验块就可以计算出校验数据,而连续的条带写操作可以节省磁盘的寻道开 销。
权利要求
一种连续数据存储中面向RAID 5的写操作优化设计方法,其特征在于,在连续数据存储应用中,通过在计算机上运行一个聚合驱动程序,对应用程序的写数据块进行聚合重组,即,在连续数据存储时,在内存缓冲区内保存应用程序发出的写数据块,并构造一个与RAID 5的完整条带长度相等的对齐数据块,之后,使对齐数据块在RAID 5上恰好占满整个条带,再发送给RAID 5,以实现对RAID 5的整条写;同时,对向RAID 5写入的数据块进行排序,使它们连续地写入相邻的条带,由此实现RAID 5的连续I/O传输;其中,所述聚合驱动程序位于应用程序和RAID 5之间,包括两个线程和一个队列Q;两个线程中,一个是接收线程,其完成如下工作监控和接收应用程序发送给RAID 5的写请求,并把接收到的写请求加入到队列Q;另一个是发送线程,其完成如下工作当队列Q不为空时,从队列Q中取出并处理写请求;同时,聚合驱动程序要监控应用程序对设备文件的打开与关闭操作。
2. 如权利要求1所述的一种连续数据存储中面向RAID 5的写操作优化设计方法,其特 征在于,所述对RAID 5的整条写的实现过程如下应用程序把N路数据块依次发送给RAID 5,由接收线程接收后将其加入到队列Q ;设定 每次采集并写入的数据块大小相等,D(i, j)表示第i路采集到的第j项数据,O《i《N-l, 0《j ;对于每一路数据,发送线程为它创建一个发送缓冲区,记作bufsend[i] (0《i《N-l), 其中,缓冲区大小为RAID 5的完整条带长度Fu11 Stripe Length,简记为fullstripelen ; 缓冲区缓存的字节数记为filled[i],缓冲区空闲的字节数记为residual [i]; filled[i]+residiml[i] = fullstripelen ;发送线程从队列Q中取出写请求,设该请求对应于第i路数据,将其发送到对应的发送 缓冲区bufsend[i];对于bufsend[i],初始其residual [i]为fullstripelen, offsend[i] =i*fullstripelen ;设bufsend[i]接收到的写请求表示为(buf, cnt, off) ;bufsend[i] 处理写请求的流程如下1) 接收第i路数据的写请求(buf, cnt, off);2) 判断bufsend[i]是否可容纳该写请求的数据块,即,比较cnt和residual [i];如果 cnt小于residual [i],转到3);否则转到6);3) 从该写请求的数据缓冲区复制cnt个字节到bufsend[i];4) 修改residual [i]为residual [i] _cnt ;5) 在队列Q中删除该写请求,然后转到1)执行;6) 把该写请求的前residual [i]个字节复制到bufsend[i];7) 将该写请求修改为(buf+residiml [i] , cnt_residiml [i] , off+residiml [i]), 艮卩,修改buf为buf+residiml[i], 修改cnt为cnt_residiml [i], 修改off为 off+residiml [i];8) 由于经步骤6)已将bufsend[i]填满,此时,发送线程将bufsend[i]中的数据写入 RAID 5,其偏移量为offsend[i],长度为fullstripelen ;9) 偏移量指针offsend[i]增加N*fullstripelen,并设置residual [i]为 fullstripelen ;10) 判断cnt是否为零,若cnt = 0,表明该写请求的数据已经发送完毕,转到5)执行,否则,转到2)执行;由于应用程序设定每路数据块的大小相等,所以N个发送缓冲区是依次顺序填满的;当缓冲区bufsend[O]至bufsend[N-l]依次填满后,发送线程就会把这N个缓冲区中的数 据逐个发送给RAID 5,并被顺序写入到RAID 5的第kN到第(kN)+N-1条带中,这里k = 0, 1,2,…;为保证应用程序重启后,bufsend[i]写入的整条数据仍然与RAID 5的条带边界对齐, 聚合驱动程序需要监控应用程序对设备文件的打开与关闭操作当应用程序关闭设备文件,发送线程最后一次向RAID 5写数据时,需要记录当 前offsend[i]及缓存字节数filled[i] (fullstripelen-residual [i])的值后,再把 bufsend[i]中的数据写入RAID 5 ;当设备文件再次打开时,首先根据记录的off send [i]及 filled[i],在RAID 5中从offsend[i]位置开始,读出filled[i]个字节到bufsend[i]后, 再进入正常工作状态。
全文摘要
本发明提出了一种连续数据存储中面向RAID5的写操作优化设计方法。在连续数据存储应用中,在内存缓冲区内保存应用程序发出的写数据块,并构造一个与RAID 5的完整条带长度相等的对齐数据块,之后,使对齐数据块在RAID5上恰好占满整个条带,再发送给RAID5,以实现对RAID5的整条写。这样写入的数据块恰好占满RAID5的整个条带,从而避免了重构写、读改写等生成校验的开销,数据块的连续性避免了磁头的寻道开销,提高了存储系统的吞吐能力。同时,对向RAID5写入的数据块进行排序,使它们连续地写入相邻的条带,由此实现RAID 5的连续I/O传输。本发明同样适用于RAID6。
文档编号G06F3/06GK101727299SQ20101918501
公开日2010年6月9日 申请日期2010年2月8日 优先权日2010年2月8日
发明者刘靖宇, 周泽湘, 孙志卓, 谢红军, 谭毓安 申请人:北京同有飞骥科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1