技术领域
[0001] 本
发明涉及计算机存储领域,尤其涉及该领域内的独立冗余磁盘阵列的数据读写方法。
背景技术
[0002] 随着信息技术的飞速发展,各种行业应用都对信息的存储提出了更高的要求,这些要求主要包括存储系统的速度、容量、可靠性、可用性和安全性等方面,传统的存储系统已经无法满足。
[0003] RAID(Redundant Array of Independent Disk,独立冗余磁盘阵列)是一种由多
块独立磁盘构成的,能提高读写性能并具备容错能
力的存储系统。RAID实现了多个磁盘并行读写的功能,将用户的数据拆分成多个数据块并行写入多个磁盘。读取数据时先从多个磁盘并行读出数据块再组合成用户需要的数据,使得存储系统的带宽由多个磁盘的带宽
叠加而成,大大提高了存储系统的
访问速度。RAID的容错能力是通过冗余方式实现的,所述冗余的方式有磁盘镜像和设置校验等。除了用户需要的数据以外,RAID中还存储了大量的冗余数据,通过所述容错方法保证磁盘在出现错误的情况下可以恢复数据。
[0004] RAID按照实现存储的原理不同分为不同的级别,常见的具备容错能力的RAID级别有RAID1,RAID5,RAID10等。请参阅图1,为
现有技术中的由四块磁盘构成的一个RAID5级磁盘阵列的数据分布示意图,将所述四块磁盘命名为磁盘1、磁盘2、磁盘3和磁盘4,每个磁盘分成N个数据块,所述四个磁盘分别贡献出一个数据块构成一个磁盘条带(StripeD)为该磁盘阵列的一行,可以理解,该RAID5具有N个磁盘条带,每个磁盘条带具有一个校验块,其用于存放一个校验值,所述校验值由该磁盘条带的另外三个数据块进行异或计算而得。
[0005] 具体地说,来自磁盘1的数据块0、来自磁盘2的数据块1、来自磁盘3的数据块2以及来自磁盘4的校验块P1构成一个磁盘条带1(StripeD1),依次类推,构成StripeD2、StripeD3.........StripeDN。
[0006] 对所述磁盘阵列执行写操作时,用户数据被拆分成若干个数据块,对应写入所述N个磁盘条带中的数据块内,其校验块P1的数据由数据块0异或数据块1,接着异或数据块2计算得到并写入校验块P1内。
[0007] 因此,可以理解的是,当其中一个磁盘出错,都可以由其他磁盘通过异或计算从而恢复其上的数据,例如,如果磁盘2出错,那么磁盘2上的数据块1的数据可以由数据块0、数据块2和校验块P1异或计算得到,数据块4的数据可以由数据块3、校验块P2和数据块5异或计算得到,以此类推,磁盘2的数据都可以恢复。
[0008] 很明显,每一次对磁盘阵列上的一个数据块进行写操作,都要进行一个对其他相关数据块的读操作和一次异或计算以更新校验块的值,例如,在完成对数据块0的写操作时,除了写数据块0以外,还需要另外完成数据块1的读操作,数据块2的读操作,以及校验块P1的重新计算和写操作。此时,如果用户再
请求写数据块1和数据块2,那么还需要完成数据块0的读操作,校验块P1的重新计算和写操作。具体请参阅图2,为图1的磁盘阵列处理用户读写请求的时序图,可见,每一次对其中一个数据块的写操作(写0、写01、写012或者写2操作)都必须完成一个写时间和一个校验块的计算写入时间。因此,为了保证磁盘阵列的容错能力,需要花费大量的时间读取同一磁盘条带中的其他数据块到内存中分配的条带结构,并重新计算和写入校验块。这些读操作和异或计算大大增加了磁盘阵列的负担,尤其在用户写请求频繁的情况下,校验块内数据的反复更新会大大增加磁盘阵列的开销,降低系统的读写性能,严重影响磁盘阵列对用户的响应。
[0009] 中国
专利CN101055512A提出一种磁盘阵列的数据存取方法,具体为:建立一个写记录表,该写记录表中的每一项对应所述磁盘阵列的一个磁盘条带;触发一个对该写记录表的定时和扫描任务。系统每次进行数据的写操作时都要更新该写记录表中写操作所对应的磁盘条带的记录位。所述定时的动作结束时,所述扫描任务启动,如果发现所述记录位为更新标识,表示对应磁盘条带的数据已经更新,校验值则已经失效。读取所述有更新标识的记录位所对应的磁盘条带的全部数据块,并根据这些数据块来计算校验值,最后将校验值写入磁盘的校验块并更新记录位。重复上述步骤至所有的记录位处理完毕,再重新启动定时。由于该方法将对目标数据块的写操作和对校验块的更新操作采用一个定时和扫描任务分开来,每次执行写操作都仅仅更新目标数据块,并不更新对应的校验块,而是在所述定时的时间之后再进行校验块的更新动作。
[0010] 该中国专利的技术存在以下不足:首先,系统每次执行写操作时应该进行的校验数据更新都被延后在所述定时时间之后,即分布在磁盘各个
位置的磁盘条带都有可能未更新校验块,整个条带的数据处于不一致状态。如果在条带的校验块更新之前磁盘出现错误,也即是在该定时时间内磁盘出现错误,则磁盘条带的数据将无法恢复,因此,系统的容错能力得不到充分保证,数据丢失的
风险较大。其次,写记录表的项数取决于磁盘容量,在磁盘容量较大的情况下,每次对写记录表的扫描均会消耗大量处理器时间,因此,所述写记录表的扫描开销较大,加重系统负担。该专利提出的方法,一个记录位对应多个条带,却会造成不必要的校验块更新,无法降低开销。
[0011] 又有美国专利6,282,671“Method and system for improved efficiency of parity calculation in RAID system”提出根据写操作对磁盘条带的
覆盖情况来选择计算校验块的方法。校验块可以通过目标数据块的新数据(new data value)和条带中其他数据块的旧数据(all other old data within the associated data stripe)的异或计算得到,或者通过目标数据块的新数据(new data value)、目标数据块的旧数据(old data value)和旧校验块(old parity value)的异或计算得到,校验块的计算选择上述两种计算方法中进行读写次数最少(the least number of input/output operations)的一种。该美国专利提供的方法通过减少在计算校验块时系统进行读操作的次数,因此在一定程度上减少了计算校验块数据的时间,但是其写校验块的时间仍然较长,尤其在写操作频繁的情况下,校验块反复更新的开销仍然很高。
[0012] 可见,现有技术还存在
缺陷,有待于改进和发展。
发明内容
[0013] 本发明的目的在于,提供一种磁盘阵列的自适应延迟校验方法,在充分保证磁盘阵列的容错能力的同时,加快写操作的处理速度,有效降低更新校验块的开销,提高磁盘阵列系统的读写性能。
[0014] 为解决上述技术问题,本发明的技术方案如下:
[0015] 一种磁盘阵列的数据读写方法,所述磁盘阵列的每个磁盘条带具有一个状态属性,所述状态属性为写操作频繁状态、写操作不频繁状态或者延迟更新校验块状态,所述磁盘阵列的数据读写方法包括以下步骤:
[0016] A、内存分配多个条带结构,所述条带结构具有一个写计数属性,其由一个写计数属性维护线程维护,设定所述计数属性维护线程一个计数周期,并设定一个
阈值,初始化所述磁盘条带状态位图的同时对每个条带结构的写计数属性清0,并开始一个计数周期;创建一个磁盘条带状态位图,以记录全部磁盘条带的状态属性;初始化所述磁盘条带状态位图;
[0017] B、接收用户读写请求,每接收一个写请求则所述写计数属性维护线程对所述目标磁盘条带所对应条带结构的写计数属性加1,在所述计数周期结束时,所述条带结构的写计数属性大于所述阈值,则更新其对应的目标磁盘条带的状态属性为所述写操作频繁状态,所述写计数属性小于或者等于所述阈值,则更新所述磁盘条带状态位图上对应的目标磁盘条带的状态属性为写操作不频繁状态;
[0018] C、执行用户的读写请求,如果是写请求,则执行写目标磁盘条带并根据目标磁盘条带的状态属性执行更新校验块或者延迟更新校验块,如果是读请求,则执行一读请求处理流程;具体的,执行延迟更新校验块包括步骤:判断所述目标磁盘条带的状态属性为写操作频繁状态还是延迟更新校验块状态,如果是写操作频繁状态,则执行步骤A3,如果是延迟更新校验块状态,则执行步骤B3;
[0019] 所述步骤A3为更新所述目标磁盘条带的状态属性为延迟更新校验块状态,并开始计时一个延迟时间,在所述延迟时间内,延迟更新校验块;
[0020] 所述步骤B3为:判断所述延迟时间是否结束,如果是,则执行更新校验块并将目标磁盘条带的状态属性更新为写操作不频繁状态。
[0021] 所述的磁盘阵列的数据读写方法,其中,所述步骤C中,如果是写请求,则在执行所述写目标磁盘条带的同时检查其状态属性是否为写操作不频繁状态,如果是则选择执行所述更新校验块,如果不是则选择执行所述延迟更新校验块。
[0022] 所述的磁盘阵列的数据读写方法,其中,所述步骤A中,所述初始化磁盘条带状态位图为将其上记录的每个磁盘条带的状态属性初始化为写操作不频繁状态。
[0023] 所述的磁盘阵列的数据读写方法,其中,所述磁盘条带的状态属性以一个标记值记录在所述磁盘条带状态位图上,所述标记值为2位二进制值,所述写操作频繁状态、写操作不频繁状态或者延迟更新校验块状态的标记值不同。
[0024] 所述的磁盘阵列的数据读写方法,其中,所述步骤C中,所述读请求处理流程包括以下步骤:
[0025] 将目标数据块读入对应条带结构的数据缓冲区;
[0026] 判断所述对应的条带结构的所有数据缓冲区是否完全更新,如果是,则执行步骤A5;
[0027] 所述步骤A5为:检查目标磁盘条带的状态属性是否为延迟更新校验块状态,如果是,则更新目标磁盘条带的校验块并更新所述目标磁盘条带的状态属性为写操作不频繁状态。
[0028] 所述的磁盘阵列的数据读写方法,其中,在执行步骤A中,初始化所述磁盘条带状态位图之前执行一个步骤D,所述步骤D为:检查所述磁盘条带状态位图是否记录有延迟状态,如果有则更新其相应磁盘条带的校验块。
[0029] 所述的磁盘阵列的数据读写方法,其中,所述更新校验块的步骤为读取目标磁盘条带的数据块并依次进行异或计算,将所述异或计算的结果写入校验块。
[0030] 所述的磁盘阵列的数据读写方法,其中,所述目标磁盘条带的状态属性由一个状态访问线程访问所述磁盘条带位图获得,所述写计数属性维护线程与状态访问线程互斥。
[0031] 本发明提供了一种磁盘阵列的自适应延迟校验方法,动态地检测并记录磁盘阵列中的写操作
频率高的磁盘条带,并延迟处理处于所述写操作频率高的磁盘条带的校验块更新。在保证系统容错功能的前提下,本发明有效减少了写操作频繁的情况下校验块的更新次数即校验数据的计算和写入的次数,大大提高系统的读写处理速度,加快对用户读写请求的响应,显著改善磁盘阵列的读写性能。
附图说明
[0032] 图1是现有技术中的一种RAID系统的磁盘结构示意图;
[0033] 图2是现有技术中的RAID系统处理用户的读写请求的时序图;
[0034] 图3是本发明第一
实施例提供的一种磁盘阵列数据分布及其磁盘条带状态位图的示意图;
[0035] 图4是本发明第一实施例提供的磁盘阵列的数据读写方法的
流程图;
[0036] 图5是本发明第一实施例提供的磁盘阵列的数据读写方法中的延迟校验处理的流程图;
[0037] 图6是本发明第一实施例提供的磁盘阵列的数据读写方法中的读请求处理的流程图;
[0038] 图7是采用本发明第一实施例提供的磁盘阵列的数据读写方法处理读写请求的时序图;
具体实施方式
[0039] 下面结合附图和具体实施方式对本发明进行详细说明。
[0040] 请参阅图3,为本发明第一实施例提供的一种由四块磁盘组成的一种RAID5级磁盘阵列以及为所述磁盘阵列创建的一个磁盘条带状态为图,所述四块磁盘分别为磁盘1、磁盘2、磁盘3以及磁盘4。所述磁盘阵列的数据块按照左旋不对称方式分布。
[0041] 每个磁盘被划分为N个数据块,所述四个磁盘分别贡献出一个数据块构成该磁盘阵列中的一个磁盘条带(StripeD),每个磁盘条带为所述磁盘阵列的一个行,可以理解所述磁盘阵列有N个磁盘条带,来自磁盘1的一个数据块0、来自磁盘2的数据块1、来自磁盘3的数据块2以及来自磁盘4的校验块P1构成一个磁盘条带1(StripeD1),依次类推,构成StripeD2、StripeD3.........StripeDN。
[0042] 所述磁盘阵列的每个磁盘条带具有一个状态属性,所述状态属性为写操作频繁状态、写操作不频繁状态或者延迟更新校验块状态。所述延迟更新校验块状态即是目标数据块处于被写中,而校验块未更新,校验块更新操作被延迟至一延迟时间之后进行。
[0043] 定义所述磁盘条带处于写操作频繁状态为热点状态;定义所述磁盘条带处于写操作不频繁状态为
冰点状态;定义所述磁盘条带处于延迟更新检验块的状态为延迟状态。
[0044] 优选地,在本实施例中,预先设定一个阈值,在一个计数周期内,目标磁盘条带被执行写操作次数大于所述阈值时,标记该目标磁盘条带处于热点状态;目标磁盘条带写操作次数小于或者等于该阈值时,标记该目标磁盘条带处于冰点状态。
[0045] 请参阅表1,优选地,本实施例提供的所述热点状态、冰点状态以及延迟状态分别对应的标记值按照表1的对应关系。优选地,本实施例的所述磁盘条带状态标记值采用2bit(位)。
[0046] 表1
[0047]磁盘条带状态标记值 磁盘条带状态
00 冰点状态
01 热点状态
11 延迟状态
[0048] 因此,可以理解的是,对于本实施例的磁盘阵列,StripeD1、StripeD3和StripeD5对应的状态位图标记为00,表示在目前的一个计数周期内,StripeD1、StripeD3和StripeD5这些磁盘条带作为目标的写请求较少,即其处于冰点状态;
[0049] StripeD2的状态位图为01,表示在该计数周期内,已接收到较多针对StripeD2的写请求,此时StripeD2校验块的内容需要频繁更新,但是这些更新目前并未延迟处理,磁盘条带处于热点状态;StripeD4的状态位图为11,表示系统判定针对StripeD4的写请求十分密集,处理写请求时对StripeD4的校验块更新做出延迟处理来提升性能,磁盘条带处于延迟状态。
[0050] 当然,所述磁盘条带状态标记值不限于所述2bit格式,其只要能够区分所述三种磁盘条带状态且可以适合计算机存储及辨识的值的形式都可以。
[0051] 当然,所述三种磁盘条带状态与标记值“00、01、11”的对应关系不限于表1给出的对应关系,还可以为冰点状态对应“01”、热点状态对应“00”以及延迟状态对应“11”的对应关系等。
[0052] 在实际情况中,由于写请求通常具备连续性,则磁盘阵列中的多个相邻磁盘条带的状态位图标记相同。
[0053] 在本实施例中,预先创建所述磁盘条带状态位图,所述磁盘条带状态位图具有N个状态块,分别对应所述N个磁盘条带,记录所述N个磁盘条带的状态值,以标记其处于写操作频繁状态、写操作不频繁状态或者是延迟更新校验块状态。
[0054] 优选地,在本实施例中,内存中每个条带结构具有一个写计数属性,系统分配一个写计数属性维护线程以维护所述写计数属性。具体地,系统每接收一个写请求,所述写计数维护线程对所述写计数属性加1,所述写计数维护线程采用定时机制,即设定一个计数周期,在所述一个计数周期内,所述写技术维护线程扫描该内存中正在使用(或者称为被激活)的条带结构的写计数属性,判断其是否超过一个阈值,如果超过所述阈值,则将其对应的磁盘条带对应的状态块更新为热点状态值;否则将其更新为冰点状态值,如果所述状态块的位图标记为延迟状态,则不进行更新。
[0055] 上述判断完毕,将所述写计数属性清0,所有被激活的条带结构扫描完成之后进入下一个周期。
[0056] 下面结合图4详细说明本发明第一实施例提供的磁盘阵列的数据读写方法。
[0057] 图4为本发明第一实施例的磁盘阵列的数据读写方法流程图,包括步骤一、步骤二和步骤三:
[0058] 步骤一内存分配多个条带结构,创建所述磁盘条带状态位图,以记录所述磁盘条带的状态属性;初始化所述磁盘条带状态位图;
[0059] 本领域的技术人员可以理解,内存分配出多个条带结构(Stripe)。激活其中一个条带结构用于对应所述磁盘阵列的一个目标磁盘条带StripeD,所述目标磁盘条带即为被请求读操作或者写操作的目标磁磁盘条带。所述StripeD和Stripe中的数据块大小是相同的。所述内存的条带结构的数目远远低于所述磁盘阵列中的磁盘条带的数目,内存的条带结构只分配给被用户请求到的StripeD即目标磁盘阵列,所述分配出的对应目标磁盘条带的条带结构称为被激活的条带结构。
[0060] 所述初始化所述磁盘条带状态位图,具体为,将其上记录的每个磁盘条带的状态值初始化为所述冰点状态。
[0061] 设定所述计数属性维护线程的计数周期,并设定所述阈值,初始化所述磁盘条带状态位图的同时对每个条带结构的写计数属性清0,并开始所述计数周期;
[0062] 步骤二接收读写请求,并更新所述磁盘条带状态位图。
[0063] 本实施例中,在接收读写请求时执行一个写计数以更新所述磁盘条带状态位图,所述执行写计数为:每接收一个写请求,所述写计数属性维护线程对目标磁盘条带对应的条带结构的写计数属性加1,并根据所述执行写计数的结果更新所述磁盘条带状态位图。
[0064] 具体地,在所述计数周期内,所述写计数属性大于所述阈值,更新所述磁盘条带的状态属性为所述热点状态,所述写计数属性小于或者等于所述阈值,所述磁盘条带的状态属性保持为冰点状态。
[0065] 步骤三执行用户的读写请求,如果是写请求,则进入一个写请求处理流程,如果是读请求,则进入一读请求处理流程。
[0066] 所述写请求处理流程包括以下步骤:判断目标磁盘条带的状态属性是否为冰点状态,如果是,则写入目标数据块并更新校验块,然后将目标磁盘条带的状态位图更新为冰点状态“00”,如果否,则写入目标数据块,然后进入一个校验延迟处理流程。
[0067] 所述写请求处理流程中的更新校验块的步骤为:读取目标数据块所在磁盘条带的其他数据块并与目标数据块进行依次异或计算,将所述异或计算的结果写入所述校验块;
[0068] 下面结合图5详细说明所述写请求处理流程中的校验延迟处理流程,所述校验延迟处理流程的步骤为:
[0069] 判断所述目标磁盘条带的状态为热点状态还是延迟状态;
[0070] 如果所述目标磁盘条带的状态是热点状态“01”,则执行步骤A3,如果所述目标磁盘条带的状态是延迟状态“11”,则执行步骤B3;
[0071] 所述步骤A3为:更新所述目标磁盘条带的状态为延迟状态,并开始计时一个延迟时间。
[0072] 所述步骤B3为:首先判断所述延迟状态的延迟时间是否结束,如果所述延迟时间结束,则执行更新校验块,并将目标磁盘条带的状态位图更新为冰点状态“00”。
[0073] 可以理解的是,所述延迟时间的时间长度根据实际需要在系统初始化时进行设定,不限于一个固定的值。当然,所述延迟时间越长,校验更新的次数会越少,磁盘阵列的读写效率会越高,而数据丢失的风险相对于延迟时间较短的磁盘阵列而言则越大。
[0074] 下面结合图6详细说明所述步骤三中的读请求处理流程。
[0075] 首先,读取目标数据块并写入数据缓冲区;
[0076] 具体地,将目标数据块的数据读入其所在磁盘条带所对应的内存的条带结构的数据缓冲区中。
[0077] 然后,判断目标数据块所在磁盘条带对应的条带结构是否更新,是则执行步骤A5,否则结束所述读请求处理并返回;
[0078] 所述步骤A5为:查看所述磁盘条带的状态是否为延迟状态,是则更新校验块并结束所述校验延迟时间,否则结束所述读请求处理并返回。
[0079] 在本实施例中,所述磁盘条带的状态属性由一个状态访问线程访问所述磁盘条带位图获得,所述写计数属性维护线程与状态访问线程互斥。优选地,设定所述写计数属性维护线程的优先级高于所述磁盘条带状态位图访问的优先级。
[0080] 请参阅图7,为图3的磁盘阵列采用本发明第一实施例提供的磁盘阵列数据读写方法的读写请求处理时序图。
[0081] 所述磁盘阵列执行对磁盘条带StripeD1中数据块的读写操作,包括写数据块0,写数据块0和数据块1,读数据块1,写数据块0、数据块1和数据块2,以及写数据块2共计六次读写操作。
[0082] 采用本发明第一实施例给出的磁盘阵列的数据读写方法后,如图7所示,计算和写入校验块P1的操作被延迟,在此之前针对StripeD1中数据块的写操作处理都没有更新P1,节省了写请求的处理时间,加快了磁盘阵列处理读写的速度。
[0083] 可见,采用本发明第一实施例提供的磁盘阵列的数据读写方法,在一个计数周期内,读写处理时序明显比现有技术的读写处理时序减少了多个更新校验的时间,提高了数据读写效率。在保证磁盘阵列容错能力的前提下,有效减少了写操作频繁的情况下校验数据的更新次数,大大提高系统的读写处理速度,加快磁盘阵列对用户的响应,有效改善磁盘阵列的读写性能。
[0084] 下面详细说明本发明第二实施例的磁盘阵列的数据读取方法,其与本发明第一实施例的不同点在于,在步骤一中,在所述初始化每个磁盘条带的状态属性之前执行一个步骤D,所述步骤D为:检查所述磁盘条带状态位图是否记录有延迟状态,如果有则更新其相应磁盘条带的校验块。
[0085] 可以理解的是,本发明第二实施例的磁盘阵列,在当磁盘阵列意外被停止运行,系统在下一次启动时,在所述初始化每个磁盘条带的状态属性之前,执行步骤D,可以恢复磁盘阵列被停止运行时的数据,在具备本发明第一实施例的有益效果
基础上,数据安全性更高。
[0086] 以上
说明书中的具体实施部分,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的方法及技术内容做出些许的更动或修饰为等同变化的等效实施例,但是凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单
修改、等同变化与修饰,均仍属于本发明技术方案的范围内。