具体实施方式
参照附图,其中相同的部分用相同的附图标记表示,图1是图解示例性存储区域网络(SAN)10的各方面的方框图。SAN 10典型地设计成作为交换访问网络工作,其中使用交换机67创建交换网(fabric)66。在某些实施例中,使用运行在光纤信道(“FC”)物理层上的小型计算机系统接口(SCSI)协议来实现SAN 10。在其他实施例中,可以使用其他协议,例如Infiniband、FICON(光纤信道连接的一种特殊形式)、TCP/IP、以太网、千兆位以太网或iSCSI来实现SAN 10。交换机67具有主机61、62、63、64、65和控制器80的地址,因而主机61-65中的任一个可以互换地连接到任何控制器80。
主机61、62、63、64、65分别使用I/O接口71、72、73、74、75连接到网66。I/O接口71-75可以是任何类型的I/O接口;例如,FC环、直接附接到网66或者主机61-65使用的一条或多条信号线,用于分别向/从网66传输信息。网66包括例如用于连接两个或多个计算机网络的一个或多个FC交换机67。在某些实施例中,FC交换机67是常规的路由器交换机。
交换机67通过I/O接口79将主机61-65与控制器80互连。I/O接口79可以是任何类型的I/O接口,例如,光纤信道、Infiniband、千兆位以太网、以太网、TCP/IP、iSCSI、SCSI I/O接口或者由FC交换机67用来分别向/从控制器80并进而向多个存储装置91-93传输信息的一条或多条信号线。在图1所示的例子中,存储装置91-93和控制器80在RAID 90内操作。RAID 90还可以包括备用存储装置97,它在存储装置91-93中的任一个发生故障时可以与存储装置91-93交换。在RAID 90中可以包括除了存储装置91-93之外的额外存储装置。作为选择,存储装置91-93以及控制器80物理上可以彼此远离,从而一次灾难只能损害存储装置91-93中的一个。
RAID 90典型地包括用于指导RAID操作的一个或多个控制器80。控制器80可以采用很多不同的形式,并且可以包括嵌入式系统、分布式控制系统、个人计算机、工作站等。图1示出了典型的RAID控制器80,具有处理器82、元数据控制器98、随机存取存储器(RAM)84、非易失性存储器83、专用电路81、编码数据接口85和主机信息接口89。处理器82、RAM84、非易失性存储器83、专用电路81、元数据控制器98、编码数据接口85和主机信息接口89通过总线99相互通信。
作为选择,RAM 84和/或非易失性存储器83可以与专用电路81、编码数据接口85、元数据控制器98和主机信息接口89一起位于处理器82中。处理器82可以包括通用微处理器、定制处理器、FPGA、ASIC或其他形式的分立逻辑。RAM 84典型地用作主机61-65写或主机61-65读数据的高速缓存,用来保存计算出的数据、堆栈数据、可执行指令等。此外,RAM 84典型地用于在来自编码器86的编码数据87被存储在存储装置91-93上之前临时存储该数据。
非易失性存储器83可以包括任何类型的非易失性存储器,如电可擦可编程只读存储器(EEPROM)、闪速可编程只读存储器(PROM)、电池备用RAM、硬盘驱动器或其他类似装置。非易失性存储器83典型地用于保存可执行固件和任何非易失性数据,例如元数据88。元数据88的细节将在下面参照图3进一步讨论。
在某些实施例中,编码数据接口85包括允许处理器82与存储装置91-93通信的一个或多个通信接口。主机信息接口89允许处理器82与网66、交换机67和主机61-65通信。编码数据接口85和主机信息接口89的例子包括诸如RS-232、USB(通用串行总线)、SCSI(小型计算机系统接口)、光纤信道、千兆位以太网等串行接口。此外,编码数据接口85和/或主机信息接口89可以包括诸如射频(“RF”)(如蓝牙)之类的无线接口,或者诸如红外(IR)之类的光通信装置。
在某些实施例中,元数据控制器98在处理器82中由软件、固件、专用逻辑或者其组合来实现。此外,元数据控制器98的全部或部分可以位于控制器82外部,例如以主机61-65之一或其他处理装置中的软件实现。元数据控制器98管理与为作为编码数据在存储装置上存储而接收的信息相关联的元数据。在某些实施例中,元数据控制器98负责生成、改变、维护、存储、取出和处理与为作为为编码数据存储而接收的信息相关联的元数据。
在某些实施例中,分配器101在处理器82中由软件、固件、专用逻辑或者其组合来实现。此外,分配器101的全部或部分可以位于控制器80外部,例如以主机61-65之一中的软件实现。分配器101将编码数据(即,编码数据87)以如下格式分配给RAM和/或直接给存储装置:使得在一个或多个存储装置发生故障的情况下,可以从未发生故障的存储装置中解码和/或重建编码数据和/或源信息(将在下面描述)。当分配器101将数据分配给诸如装置91-93之类的存储装置时,根据元数据88进行分配,以便稍后可以从存储装置中读出分配的数据。
专用电路81提供额外的硬件来允许控制器80执行独有功能,例如用来对存储装置91-93、控制器80和编码器86环境降温的风扇控制。编码器86可以用卷积编码器(即,图4的卷积编码器220、图15的卷积编码器420)实现。专用电路81可以包括提供脉冲宽度调制(PWM)控制、模数转换(ADC)、数模转换(DAC)、异或(XOR)之类的电子电路。此外,专用电路81的全部或部分可以位于控制器80外部,例如以主机61-65之一中的软件实现。
在某些实施例中,编码器86可以用卷积编码器来实现。可以用状态图来理解卷积编码器的操作。图2示出(2,1,3)二进制卷积编码的状态图200。状态图200包括8个状态:S0 210、S1 211、S2 212、S3 213、S4 214、S5 215、S6 216和S7 217。状态图200中的状态之间的离散转移受数量和方向限制。例如,在状态S0 210处开始的编码处理只能转移回到S0 210或前进到S1 211。类似地,从S1 211的处理只能转移到S2 212或S3 213等。状态图200中的状态之间的每次转移导致将1位的信息编码成2位的纠错编码数据。将参照图3中的表290进一步说明该编码。
图3中的表290具有四列:初始状态191、目的状态292、信息293和纠错编码数据294。根据状态图200中总共8种状态和从一个特定状态到下一直接可能状态的两种可能的转移,表290中总共有16行。表290是通过状态图200生成的,并且这里用于说明将信息编码以产生编码数据。
在图2中,对于输入信息1111000的示例编码,示出了突出表示的编码路径,包括:S0 210、S1 211、S3 213、S7 217、S7 217、S6 216、S4 214和S0 210。S0 210到S1 211将1编码成11。S1 211到S3 213将1编码成10。S3 213到S7217将1编码成01。S7 217到S7 217将1编码成10。S7 217到S6 216将0编码成01。S6 216到S4 214将0编码成00。最后,S4 214到S0 210将0编码成11。其结果是输入信息(即,来自主机61-65的主机信息)1111000被编码成纠错编码数据11100110010011以存储在RAID 90中。
在图4中,示出了用于图2的状态图200和图3的表290的二进制(2,1,3)码的编码器电路220。编码器电路220是控制器80的专用电路81中的编码器86的一个实现。作为选择,编码器220可以在控制器80外部实现。编码器电路220一次一位地接收输入数据流U(J)221用来编码。编码器电路220包括m=3级移位寄存器,包括寄存器230、231和232。对于编码处理,寄存器230-232的最初内容最好为零。输入信息流U(J)221和寄存器230、231和232的输出由n=2个模2加法器选择性相加(对二进制加法不产生进位),加法器包括产生输出V(J,1)241的加法器240和产生输出V(J,2)243的加法器242。复用器251将各个编码器输出V(J,1)241和V(J,2)243串行化成编码输出V 250。模2加法器可以以专用电路81中的XOR(异或)门或者以软件、固件、专用逻辑等实现。因为模2二进制加法是线性运算,因此编码器可以作为线性前馈移位寄存器工作。由图4的V(J,1)和V(J,2)定义的索引J的每个增量输出V 250称为字。
图2-6图解编码器和输出信息流之间的离散卷积。图5-6中以其最简单的数字细节形式示出了该离散卷积。表500(图5)示出了示例输入信息1111000和产生输出V(J,1)的编码器之间的离散卷积。类似地,表501(图5)示出了示例输入信息1111000和产生输出V(J,2)的编码器之间的离散卷积。
对于表500,产生V(J,1)的编码器由数字串1011(表500右侧的顶栏)表示,这是由于在图4中,U(J)221和V(J,1)241之间存在连接(由1011中的第一个1表示),U(J-1)230和V(J,1)241之间没有连接(由1011中的0表示),而U(J-2)231和V(J,1)241之间以及U(J-3)232和V(J,1)241之间存在连接(由1011中右边的1表示)。对于表501,编码器由数字串1111表示,这是由于在图4中,U(J)221和V(J,2)243之间存在连接(由1111中的第一个1表示),U(J-1)230和V(J,2)243之间存在连接(由1111中的第二个1表示),而U(J-2)231和V(J,2)243之间以及U(J-3)232和V(J,2)243之间存在连接(由1111中最右边的1表示)。
参照表500和501(图5)描述通过卷积信息的当前和过去位来产生纠错编码数据的信息处理例子。离散卷积通过首先构建输入信息流1111000的镜像(对于时间)来实现,其中时间从左到右进行。因此,镜像0001111显示在表500和501的行1到10中。镜像0001111在表500和501的每个后继行中向右移,以图解镜像0001111一次移动一位的卷积操作。然后,不管下面示出0001111的哪些位,编码器1011或编码器1111都被该编码器的各个位逐位相乘。然后将该逐位编码的结果用模2加法来求和,以实现对于V(J,1)的表500的最右列和对于V(J,2)的表501的最右列中所示的编码结果。
通过V(J,1)241和V(J,2)243的复用得到图4的输出,来产生输出的纠错编码数据流V 250。图6的表502中图解V(J,1)241和V(J,2)243的复用。在表502中,V(J,1)和V(J,2)被交错,随后在最右列中被合并成为11100110010011000000输出流V。长度为2*m的尾随零(在图6的情况下为2*3或者6)被截断,从而获得最终的示例的纠错编码数据11100110010011。这些尾随零将存储器230-232重新初始化为0以用于下一输入信息流,从而编码器在接收信息的每个部分时,编码器可以用初始化为0的存储器230-232开始操作。这样,图5-6图解图2-4中实现的离散卷积处理,而图4是该特定离散卷积处理的实现电路的例子。
在某些实施例中,纠错编码数据(例如,如图9-10所示)在被存储到存储装置91-93之前存储在控制器80的RAM 84中。可以在将来自编码器输出(即,图4的V 250或图15的输出V 450)的纠错编码数据存储在存储装置91-93上之前使用RAM 84来保存它,直到纠错编码数据达到预定大小为止。然后可以使用写命令(即,图7所示的示例性写命令600)将来自RAM 84的纠错编码数据存储到目的存储装置(如图1的存储装置91-93)上。写命令600是SCSI写命令的一个例子,包括起始逻辑块地址(LBA)602、传送长度603和逻辑单元号(LUN)604。LUN 604指定写命令600指向存储装置91-93中的哪个。起始LBA 602指示接收数据的目的存储装置上的第一逻辑块地址,而传送长度603指示传送多少数据。写命令600可以在SCSI或光纤信道接口上实现。写命令600仅仅是可以使用的一种可能的写命令。其他SCSI写命令包括带有核对的写,例如,在写命令成功完成之前核对写入的数据。
在某些实施例中,控制器80(即,通过元数据控制器98)在处理输入信息和/或纠错编码数据之前、期间或之后还产生元数据88。图8示出元数据88的内部结构的一个例子。可以对其上存储纠错编码数据87的每个存储装置91-93使用一列元数据88。在该实现中,元数据88包括纠错编码数据在RAID 90的存储装置91-93上存储的图。元数据88可以例如包括存储装置91-93上的指示符(designator)621,例如作为可以被分配给每个存储装置(即,硬盘驱动器)的唯一名称的永久全球名称。作为选择,指示符621可以是VOLSER(卷序列号)或特定存储装置的其他唯一名称。元数据88还可以包括起始LBA 622和传送长度623,这两者都是在用于将纠错编码数据存储到存储装置91-93的SCSI写命令600中指定的。元数据88还可以包括带区宽度624,它可以是图9和16的1位,或者是等于编码器86的输出位数量“n”(对于图10是n=2位,而对于图17是n=3位)的一个字。元数据88可以包括序列号625和文件名626,从而可以在RAM 84中重组和解码从存储装置91-93中依次读取的纠错编码数据。最后,元数据88可以包括使用的编码方法,当编码数据被存储在可移动介质(如多个磁带或光盘盒)上时编码方法可能是有用的。元数据88可以存储在控制器80的非易失性存储器83和/或一个或多个目的存储装置91-93中。控制器80可以使用元数据88来从目的存储装置中取出纠错编码数据,在RAM 84中重组纠错编码数据并解码该数据来产生纠错编码数据所源自何处的信息,以便发送给主机61-65或其他信息源或接收者。
图9示出包括多个存储装置261-266的RAID 260中编码数据的存储。RAID 260中所示的编码数据可以是编码器200编码的一部分信息的结果。带区1是RAID 260中的第一带区,并且它是这一部分纠错编码数据的第一带区。带区1包括装置261中的位V(1,1)271A、装置262中的位V(1,2)271B、装置263中的位V(2,1)271C、装置264中的位V(2,2)271D、装置265中的位V(3,1)271E和装置266中的位V(3,2)271F。带区2是这同一部分纠错编码数据的RAID 260中的第二带区,并且它包括装置261中的位V(4,1)272A、装置262中的位V(4,2)272B、装置263中的位V(5,1)272C、装置264中的位V(5,2)272D、装置265中的位V(6,1)272E和装置266中的位V(6,2)272F。在某些实施例中,RAID 260具有n=2的整数倍个存储装置(即,6个存储装置)。
图10示出对于编码器220编码的信息、对图9所示的每带区每装置1位的替代。在图10中,由于编码器220具有n=2个输出,因此在n=2位宽带区中每装置存储输出V的n=2位(称为“字”)。图10示出了包括装置281-283的RAID 280的两个带区,用于图9中所示的相同部分的纠错编码数据。带区1是RAID 280的第一带区,并且它包括装置281中的位V(1,1)和V(1,2)291A、装置282中的位V(2,1)和V(2,2)291B和装置283中的V(3,1)和V(3,2)291C。类似地,带区2是RAID 280的第二带区,并且它包括装置281中的位V(4,1)和V(4,2)292A、装置282中的位V(5,1)和V(5,2)292B和装置283中的V(6,1)和V(6,2)292C。因此,可以每带区一位(图9)或每带区一个字(图10)地存储同一部分的纠错编码数据。
用卷积纠错编码数据可以容易地适应RAID扩展,这是因为对给定部分的纠错编码数据的带区全部被逻辑连接,并且没有对于特定带区来说是唯一的奇偶校验。例如,通过将RAID中的驱动器数量加倍并且将位从图10所示的配置复制到图9所示的配置中,可以将图10的RAID 280扩展为图9的RAID 260。这种RAID扩展为RAID增加了空闲空间以便进一步添加数据,而既不需要像RAID 3、4、5和6那样必须进行奇偶校验的重新计算,也不需要额外的卷积编码。可能需要对新扩展的RAID中的所有存储装置重新计算元数据88,这是因为起始LBA和存储指示符可能由于RAID扩展而改变。
图11所示的流程700示出了实现存储由从信息源接收的信息得到的纠错编码数据的一个实施例的处理。处理在步骤701开始,并且进到判定步骤705,来确定控制器80是否接收到来自源(即,主机61-65)的信息。控制器80所接收的信息可以是由客户、向客户提供服务的第三方、用户或任何其他能访问控制器80的实体发送的。如果未接收到信息,则处理返回步骤705。如果接收到信息,则处理进到步骤710,在该步骤中卷积编码器(即,编码器86)通过将该信息的当前和过去位进行卷积来处理该信息以产生纠错编码数据。编码器86可以是图4的编码器220或图15的编码器420,或者是任何其他卷积编码器。在某些实施例中,由控制器80从信息源(即,主机61-65)接收要编码和存储到存储装置91-93上的信息。主机信息接口89从主机61-65之一接收信息78并将信息78传送到连接到控制器80的其他部件(即,处理器82、专用电路81等)。在编码器86处理信息78来产生纠错编码数据87之前、期间或之后,可以将信息78临时存储到存储器件中(即,RAM 84、非易失性存储器83、专用处理器存储器等)。
处理从步骤710进到步骤715,在该步骤中,在将纠错编码数据(例如由分配器)分配到存储装置(即,RAID 90的存储装置91-93、97)之前将其存储在RAM(即,RAM 84)中。作为选择,可以将纠错编码数据存储在非易失性存储器83、另一存储器件、高速缓存等中。纠错编码数据以用于分配到存储装置的格式存储在RAM中。
处理从步骤715进到步骤720,在该步骤中,分配器(即,控制器80中实现的分配器101)将编码数据分配到多个存储装置(即,RAID 90的存储装置91-93、97),使得多个存储装置中的一个或多个在发生故障时允许从存储在未发生故障的存储装置上的编码数据重建所述信息。在一个实施例中,编码器86的纠错编码数据输出以由用户所选的带区宽度(即,1位或1字)和RAID 90中的存储装置数量D确定的格式存储在RAM 84中。
对于一个实施例,纠错编码数据包括一个或多个字,每个字包括n个位,n大于零,从卷积编码器产生每个字响应卷积编码器处理信息的一部分。信息的一部分例如可以包括k个位,其中k大于0。分配器还用于将每个字的n个位分配到多个存储装置,使得多个存储装置中没有一个接收每个字的n位中的一个位以上。图9示出了当使用(2,1,3)二进制卷积编码器(图4)处理信息来产生纠错编码数据时分配到存储装置(260)的纠错编码数据的例子。纠错编码数据的每个字可以包括例如图9所示的两个位(n=2),第一字包括V(1,1)和V(1,2),第二字包括V(2,1)和V(2,2),第三字包括V(3,1)和V(3,2)等。对于这个例子,没有一个存储装置接收每个字的两个位中的一个位以上。
图9还示出了存储器件(如RAM 84)中存储的纠错编码数据的例子的表(270)。表270被组织成列,其中每列包括存储在各个存储装置(即,存储装置91-93)中的纠错编码数据。例如,表270的第一列示出驱动器261上存储的纠错编码数据。列的长度可以变化,在一个实施例中,在将纠错编码数据分配并写入到各个存储装置之前允许列用纠错编码数据填充到指定的容量。可以用例如写命令600(图7)将纠错编码数据写入到各个驱动器。
在另一实施例中,使用(3,2,1)二进制卷积编码器来处理信息并产生纠错编码数据。图16示出当使用(3,2,1)二进制卷积编码器(图15)处理信息来产生纠错编码数据时分配到存储装置的纠错编码数据的例子。纠错编码数据的每个字可以包括例如图16所示的三个位(n=3),第一字包括V(1,1)、V(1,2)和V(1,3),第二字包括V(2,1)、V(2,2)和V(2,3),第三字包括V(3,1)、V(3,2)和V(3,3)等。对于这个例子,没有一个存储装置接收每个字的三个位中的一个位以上。可以通过增加每个字中的位数n以及增加与位数n成正比的驱动器数量来适应较大的字大小。在一个实施例中,多个存储装置的总数是n位的整数倍。对于图16所示的例子,使用了6个存储装置,是总位数(在这种情况下n=3)的整数值倍(2倍)。
在另一实施例中,纠错编码数据包括一个或多个字,每个字包括n个位,从卷积编码器产生的每个字响应于卷积编码器处理信息的一部分。信息的一部分可以包括k个位。分配器还用于将每个字分配到多个存储装置,使得多个存储装置中没有一个接收两个或多个相邻的字。图10示出了当使用(2,1,3)二进制卷积编码器(图4)处理信息来产生纠错编码数据时分配到存储装置(280)的纠错编码数据的例子。纠错编码数据的每个字可以包括例如图10所示的两个位(n=2),第一字包括V(1,1)和V(1,2),第二字包括V(2,1)和V(2,2),第三字包括V(3,1)和V(3,2)等。对于这个例子,没有一个存储装置接收两个或多个相邻的字。对于该实施例,相邻的字包括例如第一字(V(1,1)和V(1,2))与第二字(V(2,1)和V(2,2)),或者第二字V(2,1)和V(2,2))与第三字(V(3,1)和V(3,2))。不相邻的字的例子是:第一字(V(1,1)和V(1,2))与第三字(V(3,1)和V(3,2)),或者第二字V(2,1)和V(2,2))和第四字(V(4,1)和V(4,2))。
图10还示出存储在存储器件(如RAM 84)中的纠错编码数据的例子的表(290)。表290被组织成列,其中每列包括存储在各个存储装置中的纠错编码数据。例如,表290的第一列示出驱动器281上存储的纠错编码数据。列的长度可以变化,在一个实施例中,在将纠错编码数据分配并写入到各个存储装置之前允许列用纠错编码数据填充到指定的容量。在步骤725中,可以用例如写命令600(图7)将纠错编码数据写入到各个驱动器。
在另一实施例中,使用(3,2,1)二进制卷积编码器来处理信息并产生纠错编码数据。图16示出当使用(3,2,1)二进制卷积编码器(图14)处理信息来产生纠错编码数据时分配到存储装置的纠错编码数据的例子。纠错编码数据的每个字可以包括例如图15所示的三个位(n=3),第一字包括V(1,1)、V(1,2)和V(1,3),第二字包括V(2,1)、V(2,2)和V(2,3),第三字包括V(3,1)、V(3,2)和V(3,3)等。对于这个例子,没有一个存储装置接收两个或多个相邻的字。
处理从步骤725转到步骤730,在该步骤中元数据控制器(即,元数据控制器98)处理信息来产生与纠错编码数据相关联的元数据(即,图8的元数据88)。元数据可以包括指定纠错编码数据的存储位置的存储位置信息和/或指定编码数据的编码类型的编码器信息。例如,编码类型可以包括使用的特定卷积编码器、编码参数(即,图4的(2,1,3)编码器、图15的(3,2,1)编码器等)。编码类型可以包括其他与使用的编码器相关的参数。指定纠错编码数据的存储位置的存储位置信息可以包括存储装置永久名、逻辑块地址、装置号、逻辑单元号、卷序列号或其他存储位置标识符。可以使用处理器82来实现通过例如软件、专用硬件、固件或其组合执行上述功能的元数据控制器。
处理从步骤730转到步骤735,在该步骤中,元数据控制器(即,元数据控制器98)将元数据处理和存储在一个或多个存储装置或非易失性存储器(即,非易失性存储器83)中。在某些实施例中,元数据88可以在存储前可以由编码器86编码。在执行步骤730后,处理在步骤740结束。
在某些实施例中,纠错编码数据通过图12所示的处理800存储到存储装置上。在步骤809中存储在RAM 84中的纠错编码数据达到预定大小之后,可以将纠错编码数据存储到存储装置上,并且将元数据存储在一个或多个装置中(即,非易失性存储器83、RAM 84、主机61-65等)。处理从步骤809进到步骤810,将索引D_COUNT初始化为1。然后处理进到判定步骤811,在该步骤中进行D_COUNT是否超过存储装置数量D的确定。如果D_COUNT没有超过存储装置数量D,则处理进到步骤812,通过写命令(即,写命令600)将指定存储装置D_COUNT的纠错编码数据从RAM 84写入到存储装置D_COUNT。例如在图9中,表270的列中的位(即,位V(1,1)、V(4,1)等)被称为写入存储装置261的纠错编码数据段。处理然后进到步骤813,对存储在存储装置D_COUNT中的数据生成元数据88。处理进到步骤814,在该步骤中将步骤813中生成的元数据88冗余地存储在非易失性存储器83和D个存储装置中的一个或多个中。然后,处理进到步骤815,将D_COUNT加1。然后处理回到判定步骤811再次重复。一旦在步骤811中D_COUNT超过D,则处理800在步骤820中结束。
图2的状态图200仅仅是用于卷积编码的一个可能的状态图。图13图解(3,2,1)二进制卷积编码的状态图400。状态图400包括4个状态:S0 410、S1 411、S2 412和S3 413。状态图400中的各状态之间的每次转移导致将2位的输入信息编码成3位的纠错编码数据。将参照图14中的表590最佳地说明该编码。
与图3中的表290相似,图14中的表590具有四列:初始状态591、目的状态592、输入信息593和纠错编码数据594。根据状态图400中总共4种状态和从一个特定状态到下一直接可能状态的四种可能的转移,表590中总共有16行。表590是通过状态图400生成的,并且这里用于进一步说明(3,2,1)编码处理。
在图13中,对于1011110100的示例编码,示出了突出表示的编码路径S0 410、S1 411、S3 413、S3 413、S2 412和S0 410。对输入1011110100从左到右开始,S0 410到S1 411将10编码成101。S1 411到S3 413将11编码成001。S3 413到S3 413将11编码成101。S3 413到S2 412将01编码成000。最后,S2 412到S0 410将00编码成100。这样的结果是输入信息1011110100被编码成101001101000100分配并存储在RAID 90的存储装置91-93中。
在图15中,示出了图13的状态图400和图14的表590的二进制(3,2,1)码的编码器电路420。编码器电路420是可以在控制器80的装置专用电路81中实现的编码器86的另一个例子。在某些实施例中,在单个控制器(即,控制器80)中仅采用一种类型的编码器电路220或420。编码器电路420接收输入信息流U 421并且通过去复用器422将输入的位分成单个位流U(J,1)423和U(J,2)424以用来编码。编码器电路220包括m=1级移位寄存器,后者包括寄存器430和431。对于编码处理,寄存器430-431的初始内容典型地被初始化为零。输入信息流U(J,1)423和U(J,2)424以及寄存器430和431的输出由n=3个模2加法器选择性相加;加法器包括产生输出V(J,1)441的加法器440、产生输出V(J,2)443的加法器442和产生输出V(J,3)445的加法器444。复用器451将各个编码器输出V(J,1)441、V(J,2)443和V(J,3)445串行化成编码输出V 450。由图15的V(J,1)441、V(J,2)443和V(J,3)445定义的关于索引J的每个增量输出V 450称为字。
图16与图9类似,其中编码器电路420的输出被存储在经过装置461-466的1位宽的带区中。装置461-466是像图1中的存储装置91-93那样的多个存储装置。在图16中,带区1-3包括来自第一输入信息的第一部分纠错编码数据,而带区4包括来自第二输入信息的第二部分纠错编码数据。带区1是RAID 460中的第一带区,并且它是第一部分纠错编码数据的第一带区。带区1包括装置461中的位V(1,1)471A、装置462中的位V(1,2)471B、装置463中的位V(1,3)471C、装置464中的位V(2,1)471D、装置465中的位V(2,2)471E和装置466中的位V(2,3)471F。带区2是相同的第一部分纠错编码数据的RAID 460中的第二带区。带区2包括装置461中的位V(3,1)472A、装置462中的位V(3,2)472B、装置463中的位V(3,3)472C、装置464中的位V(4,1)472D、装置465中的位V(4,2)472E和装置466中的位V(4,3)472F。带区3是相同的第一部分纠错编码数据的RAID 460中的第三带区。带区3包括装置461中的位V(5,1)473A、装置462中的位V(5,2)473B、装置463中的位V(5,3)473C、装置464中的位V(6,1)473D、装置465中的位V(6,2)473E和装置466中的位V(6,3)473F。带区4是第二部分纠错编码数据的RAID 460中的第一带区。带区4包括装置461中的位V(1,1)474A、装置462中的位V(1,2)474B、装置463中的位V(1,3)474C、装置464中的位V(2,1)474D、装置465中的位V(2,2)474E和装置466中的位V(2,3)474F。
类似地,图17与图10相似,其中编码器电路420的输出被存储在经装置481-482分布的3位宽的带区(其中,n=3位包括一个“字”)中。图17示出图16所示的每带区每装置1位的替代。由于图15具有n=3个输出,因此在图17中在n=3位宽带区中每装置存储输出V的n=3位。在图17中对于包括装置481-482的RAID 480示出了来自第一输入信息的第一部分纠错编码数据的卷积编码数据的三个带区、和来自第二输入信息的第二部分纠错编码数据的一个带区。装置481-482可以是图1的存储装置91-93的任何一对。带区1是RAID 480的第一带区,并且是第一部分纠错编码数据的第一带区。带区1包括装置481中的位V(1,1)、V(1,2)、V(1,3)491A和装置482中的位V(2,1)、V(2,2)、V(1,3)491B。类似地,带区2是相同的第一部分纠错编码数据的RAID 460中的第二带区。带区2包括装置481中的位V(3,1)、V(3,3)、V(3,3)492A、装置482中的位V(4,1)、V(4,2)、V(4,3)492B。带区3是相同的第一部分纠错编码数据的RAID 480中的第三带区。带区3包括装置481中的位V(5,1)、V(5,2)、V(5,3)493A和装置482中的位V(6,1)、V(6,2)、V(6,3)493B。带区4是RAID 480中的第四带区,但它也是第二部分纠错编码数据的第一带区,因此它包括装置481中的位V(1,1)、V(1,2)、V(1,3)494A和装置482中的位V(2,1)、V(2,2)、V(2,3)494B。
这里说明卷积编码和卷积的几个具体示例。提供这些示例是为了卷积编码能够使本领域普通技术人员对所述实施例无限制地采用任何一种类型的卷积编码。
参照图16-17示出了RAID扩展的另一例子。通过将RAID中的驱动器数量三倍并且将位从图17所示的配置的位复制到图16所示的配置中,可以将图17的RAID 480扩展为图16的RAID 460。这种RAID扩展为RAID增加了空闲空间以便进一步添加数据,而既不需要像RAID 3、4、5和6那样必须进行奇偶校验的重新计算,也不需要额外的卷积编码。可能需要对新扩展的RAID中的所有存储装置重新计算元数据88,这是因为起始LBA和存储指示符可能改变。在某些实施例中,存储装置(即,RAID 90中的存储装置91-93)被分配到分离的物理位置。例如,可以通过将存储装置92-93放在不同的房间、建筑、城市、州、国家等来将每个存储装置91、92和93在物理上相互分离。
某些实施例包括为存储编码数据向客户收费,其中费用基于接收到的信息量。这可以通过例如向服务提供商发送数据的客户协议来完成,其中服务提供商负责按要求存储和取出客户的数据。服务提供商可以是存储系统的管理者和/或作为客户与另一实体之间的业务关系中的第三方。可以为客户提供到用于存储信息的系统(即,图1的SAN 10)的连接。客户可以使用该连接或其他途径将他的信息发送给系统以便存储。客户发送或SAN 10和/或控制器80接收的信息量可以通过本领域中已知的测量数据量的方法来测量。在所分配的存储空间上存储重建数据的费用可以通过考虑发送来存储的信息量和其他因素(如信息流速率、使用频率、压缩或未压缩的信息、固定月费率或其他考虑)来确定。
这里所述的实施例可以采用完全硬件实现、完全软件实现或包括硬件和软件部分的实现的形式。在某些实施例中,本发明用软件实现,包括但不限于固件、驻留软件、微代码等。
此外,这里所述的实施例可以采用可从计算机可用或计算机可读介质访问的计算机程序产品的形式,该介质提供由(或连同)计算机或任何指令执行系统使用的程序代码。为了描述的目的,计算机可用或计算机可读介质可以是任何包含、存储、通信、传播或传送由(或连同)指令执行系统、设备或装置使用的程序的装置。
介质可以电、磁、光、电磁、红外或半导体系统(或设备或装置)或传播介质。计算机可读介质的例子包括半导体或固态存储器、磁带、可移动计算机磁盘、随机存取存储器(RAM)、只读存储器(ROM)、刚性磁盘和光盘。光盘的当前例子包括紧致盘只读存储器(CD-ROM)、紧致盘读/写(CD-R/W)和DVD。
适合存储和/或执行程序代码的数据处理系统可以包括至少一个直接或间接通过系统总线连接到存储器元件的处理器。存储器元件可以包括在程序代码实际执行期间使用的局部存储器、海量存储装置和高速缓存,高速缓存提供至少一些程序代码的临时存储,以便减少在执行期间必须从海量存储装置中取出代码的次数。
输入/输出或I/O装置(包括但不限于键盘、显示器、指针装置等)可以直接或通过中间的I/O控制器连接到系统。
网络适配器还可以连接到系统以允许数据处理系统通过中间的专用或公用网络连接到其他数据处理装置或远程打印机或存储装置。调制解调器、有线调制解调器和以太网卡只是几个当前可用类型的网络适配器。
这里所述的实施例可以作为方法、装置或者使用生产软件、固件、硬件或其组合的标准编程和/或引擎技术实现的计算机程序产品。
在某些实施例中,申请人的发明包括指令,其中这些指令由处理器82(图1)和/或控制器80(图1)运行来执行图11和12中所示的流程图中的步骤。
在其他实施例中,申请人的发明包括驻留在任何其他计算机程序产品中的指令,其中这些指令由控制器80外部或内部的计算机执行。在任一种情况中,指令可以编码在信息存储介质中,介质包括磁信息存储介质、光信息存储介质、电信息存储介质等。申请人所谓的“电存储介质”是指诸如PROM、EPROM、EEPROM、闪速PROM、压缩闪存、智能卡之类的装置。
某些实施例可以针对由人或自动处理系统采用计算基础架构的方法,包括将计算机可读代码集成进执行上述实施例的操作的系统。例如,图11和12图解使用所述实施例取出编码数据格式的信息的步骤。代码与系统(即,SAN 10)的组合能够执行这里所述实施例的操作的步骤。计算基础架构的部署可以在这里所述的实施例的服务、制造和/或配置期间进行。例如,咨询公司可以有对多个系统的服务责任。这种服务责任可以包括诸如系统升级、错误诊断、性能调整和增强、安装新硬件、安装新软件、与其他系统的配置等。作为该服务的一部分,或者作为单独的服务,服务人员可以根据这里所述的技术配置系统,以便有效地允许这里所述实施例的操作。例如,该配置可以包括将计算机指令、参数、常数(即,卷积编码类型、一个字中的位数量n、带区宽度、存储装置数量等)、中断向量加载到存储器中,以便当执行代码时,系统可以执行所述的技术来实现这里所述的实施例。
上述用于说明目的的描述使用特定术语来提供对所述实施例的详尽理解。然而,本领域技术人员应当明白,这些特定细节并不是实践实施例的操作所必须的。在其他方面,公知的电路和装置用方框图的形式示出,以便避免不必要地分散对实施例的注意。因此,上述对特定实施例的描述是用于说明和描述目的。它们并不意图穷举或将实施例的操作限制于所公开的精确形式。显然,根据上述讨论,许多修改和变型是可能的。
图11和12的逻辑描述了以特定顺序发生的特定操作。在替代的实现中,一些逻辑操作可以以不同的顺序执行、修改或删除。此外,可以向上述逻辑添加步骤并且任何符合所述实现。此外,这里所述的操作可以顺序发生,或者可以并行处理某些操作,或者由单个处理执行的所述操作可以由分散的处理来执行。
图11和图12的逻辑可以用软件实现。该逻辑可以是主机的操作系统的一部分或应用程序。在另一个实现中,该逻辑可以保存在由SAN 10管理的存储区域中,或者在只读存储器或其他硬线类型的装置中。优选的逻辑可以在硬盘驱动器中实现或者在可编程和非可编程门阵列逻辑中实现。
RAID领域中的技术人员可以开发等效于这里所述实施例的其他实施例。上述说明书中采用的术语和表示方式在这里是用作描述性的术语,而非限制性,并且在使用这些术语和表示方式时并没有意图将其所示和描述的特征的等效物或其部分排除在外,应当认识到范围仅仅由权利要求书定义和限制。