•写在前面
很多时候,我们所使用或者输出的数据容量非常大,动不动就几gb,有时候磁盘容量不够用,那么这个时候我们如何是好呢?其实我们可以透过一种存储机制,这种机制就是raid(磁盘阵列),那么接下来,我们就好好讲讲raid相关的东西。
磁盘阵列全名是“ redundant arrays of inexpensive disks, raid ”,翻译成中文就是,容错式廉价磁盘阵列。 raid 可以通过一个技术(软件或硬件),将多个较小的磁盘整合成为一个较大的磁盘设备,而这个较大的磁盘功能可不止是储存而已,他还具有数据保护的功能,整个raid由于选择的等级不同,而使得整合后的磁盘具有不同的功能,后面我们讲讲常见的几种等级。
- 数据安全与可靠性:指的并非网络信息安全,而是当硬件(指磁盘)损毁时,数据是否还能够安全的恢复和使用;
- 读写性能:例如raid0可以加强读写性能,让你的系统i/o部分得以改善;
- 容量:可以让多颗磁盘组合起来,故单一文件系统可以有相当大的容量。尤其数据的可靠性与完整性更是使用raid的考虑重点;
raid-0就是等量模式,即stripe,是我们要讲的几种中性能最佳的,所以放在最前面。这种模式如果使用相同型号与容量的磁盘来组成时,效果较好。这种模式的 raid 会将磁盘先切出等量的区块(chunk),一般可设置 4k~1m 之间, 然后当一个文件要写入 raid 时,该文件会依据 chunk 的大小切割好,之后再依序放到各个磁盘里面去。由于每个磁盘会交错的存放数据, 因此当你的数据要写入 raid 时,数据会被等量的放置在各个磁盘上面。 举例来说,你有两颗磁盘组成 raid-0 , 当你有 100mb 的数据要写入时,每个磁盘会各被分 配到 50mb 的储存量。raid-0 的示意图如下所示:
上图的意思是,在组成 raid-0 时,每颗磁盘 (disk a 与 disk b) 都会先被区隔成为小区块 (chunk)。 当有数据要写入 raid 时,数据会先被切割成符合小区块的大小,然后再依序一 个一个的放置到不同的磁盘去。
优势
由于数据已经先被切割并且依序放置到不同的磁盘上面,因此每颗磁盘所负责的数据量都降低了,照这样的情况来看, 越多颗磁盘组成的 raid-0 性能会越好,因为每颗负责的数据量就更低了,这表示我的数据可以分散让多颗磁盘来储存,当然性能会变的更好。此外,磁盘总容量也变大了,因为每颗磁盘的容量最终会加总成为 raid-0 的总容量。
缺点
使用此等级你必须要自行负担数据损毁的风险,由上图我们知道文件是被切割成为适合每颗磁盘分区区块的大小,然后再依序放置到各个磁盘中。想一想,如果某一颗磁盘损毁了,那么文件数据将缺一块,此时这个文件就损毁了。由于每个文件都是这样存放的,因此 raid-0 只要有任何一颗磁盘损毁,在 raid 上面的所有数据都会遗失而无法读取。 另外,如果使用不同容量的磁盘来组成 raid-0 时,由于数据是一直等量的依序放置到不同磁盘中,当小容量磁盘的区块被用完了, 那么所有的数据都将被写入到最大的那颗磁盘去。举例来说,我用 200g 与 500g 组成 raid-0 ,那么最初的 400gb 数据可同时写入两颗磁盘(各消耗 200g 的容量),后来再加入的数据就只能写入 500g 的那颗磁盘中了,此时的性能就变差了,因为只剩下一颗可以存放数据。
raid-1是映射模式,即mirror,可以完整备份数据。这种模式也是需要相同的磁盘容量的,最好也是一模一样的磁盘,如果是不同容量的磁盘组成 raid-1 时,那么总容量将以最小的那一颗磁盘为主。这种模式主要是让同一份数据,完整的保存在两颗磁盘上。举例来说,如果我有一个 100mb 的文件,且我仅有两颗磁盘组成 raid-1 时,那么这两颗磁盘将会同步写入 100mb 到他们的储存空间去。 因此,整体 raid 的容量几乎少了 50%。由于两颗硬盘内容一模一样,所以这就是为什么称他为 mirror 模式。
如上图所示,一份数据传送到 raid-1 之后会被分为两份,并分别写入到各个磁盘里。由于同一份数据会被分别写入到其他不同磁盘,因此如果要写入100mb时,数据传送到 i/o 总线后会被复制多份到各个磁盘,结果就是数据量感觉变大了。因此在大量写入raid-1 的情况下,写入的性能可能会变的非常差(这涉及到网桥)。如果你使用的是硬件 raid(磁盘阵列卡)时,磁盘阵列卡会主动的复制一份而不使用系统的 i/o总线,性能方面则还可以。如果使用软件磁盘阵列,可能性能就不好了。
优点
由于两颗磁盘内的数据一模一样,所以任何一颗硬盘损毁时,你的数据还是可以完整的保留下来的。所以我们可以说,raid-1 最大的优点就在于数据的备份。
缺点
不过由于磁盘容量有一半用在备份,因此总容量只有全部磁盘容量的一半而已。虽然raid-1的写入性能不佳,不过读取的性能去不错,这是因为数据备份存在不同的磁盘上,如果多个进程在读取同一份数据时,raid会自行取得最佳的读取平衡。
raid-0的性能虽然好,但是数据不安全,raid-1 的数据虽然安全,但是性能不佳,那么能不能将这两者整合起来设置raid 呢?当然可以呀,那就是raid 1 0或raid 0 1。所谓的 raid 1 0 就是,先让两颗磁盘组成 raid 1,并且这样的设置共有两组,然后将这两组 raid 1再组成一组raid 0。这就是 raid 1 0 。反过来说,raid 0 1 就是先组成 raid-0 再组成 raid- 1。
如上图所示,磁盘a和磁盘b组成第一组raid 1,磁盘c和磁盘d组成第二组raid 1,然后这两组再整合成为一组raid 0。如果我有100mb的数据要写入,则由于raid 0的关系,两组raid1都会写入50mb,又由于raid1的关系,因此每颗磁盘就会写入50mb而已。如此一来不论哪一组raid1的磁盘损毁,由于是raid 1的图像数据,因此就不会有任何问题发生了,这也是目前储存设备厂商最推荐的方法。
优点
为什么会推荐raid1 0呢?想像你有20颗磁盘组成的系统,每两颗组成一个raid 1,因此你就有总共10组可以自己复原的系统,然后这10组再组成一个新的raid 0,速度立刻拉升10倍了。同时要注意,因为每组raid 1是个别独立存在的,因此任何一颗磁盘损毁,数据都是从另一颗磁盘直接复制过来重建,并不像raid5/raid6必须要整组raid的磁盘共同重建一颗独立的磁盘系统,导致性能上差非常多。而且raid 1与raid 0是不需要经过计算的,读写性能也比其他的raid等级好很多。
raid-5是性能和数据备份的均衡考虑,raid-5至少需要三颗以上的磁盘才能够组成这种类型的磁盘阵列。这种磁盘阵列的数据写入有点类似raid-0,不过每个循环的写入过程中(striping)中,在每颗磁盘还加入一个同位检查数据(parity),这个数据会记录其他磁盘的备份数据,用于当有磁盘损毁时的救援,raid-5读写的情况类似下图。
如上图所示,每个循环写入时,都会有部分的同位检查码(parity)被记录,并且记录的同位检查码每次都记录在不同的磁盘,因此,任何一个磁盘损毁时都能够借由其他磁盘的检查码来重建原本磁盘内的数据。不过需要注意的是,由于有同位检查码,因此raid5的总容量相当于少一个磁盘。以上图为例,原本的3块磁盘只会剩下2块磁盘的容量,而且当损毁的磁盘数量大于等于两块时,这整组raid5的数据就损毁了。因此raid5默认仅能支持一块磁盘的损毁情况。与raid-0相比,在读写性能的比较上,读取的性能可以有得一比,不过写的性能就不见得更好。这是因为要写入raid5的数据还得要经过计算同位检查码(parity)的原因。由于加上这个计算的动作,所以写入的性能与系统的硬件关系较大,尤其当使用软件磁盘阵列时,同位检查码是通过cpu去计算而专门的磁盘阵列卡,因此性能方面还需要评估。另外,由于raid5仅能支持一块磁盘的损毁,因此近来还有发展出另外一种等级,就是raid6,这个raid6则使用两颗磁盘的容量作为parity的储存,因此整体的磁盘容量就会少两块,但是允许出错的磁盘数量就可以达到两块了,也就是说,在raid6的情况下,同时两块磁盘损毁时,数据还是可以救回来。
与raid 5相比,raid 6增加了第二个独立的奇偶校验信息块,即双重奇偶校验。两个独立的奇偶系统使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用。但raid 6需要分配给奇偶校验信息更大的磁盘空间,写性能比raid5差。因此,raid-6需要的磁盘数要大于4块,且实际容量会减少两块,一般用于对数据安全级别要求比较高的企业。
优点
- 良好的随机读性能
- 有校验机制
缺点
- 写入速度差
- 成本高
当磁盘阵列的磁盘损毁时,就得要将坏掉的磁盘拔除,然后换一块新的磁盘。换成新磁盘并且顺利启动磁盘阵列后,磁盘阵列就会开始主动的重建,原本坏掉的那颗磁盘数据到新的磁盘上,然后你磁盘阵列上面的数据就复原了,这就是磁盘阵列的优点。而为了让系统可以实时的在坏掉硬盘时主动的重建,因此就需要预备磁盘进行辅助。所谓的预备磁盘就是一块或多块没有包含在原本磁盘阵列等级中的磁盘,这块磁盘平时并不会被磁盘阵列所使用,当磁盘阵列有任何磁盘损毁时,则这块预备磁盘会被主动的拉进磁盘阵列中,并将坏掉的那块硬盘移出磁盘阵列,然后立即重建数据系统。
这里放个raid各等级的总结表格
为什么磁盘阵列又分为硬件与软件呢?所谓的硬件磁盘阵列是通过磁盘阵列卡来达成阵列的目的。磁盘阵列卡上面有一块专门的芯片在处理raid的任务,因此在性能方面会比较好。在很多任务(例如raid5的同位检查码计算)磁盘阵列并不会重复消耗原本系统的i/o总线,理论上性能会较佳。此外目前一般的中高阶磁盘阵列卡都支持热拔插,亦即在不关机的情况下抽换损坏的磁盘,对于系统的复原与数据的可靠性方面非常的好用。
不过一块好的磁盘阵列卡价格很高,便宜的在主板上面“附赠”的磁盘阵列功能可能又不支持某些高阶功能,例如低阶主板若有磁盘阵列芯片,通常仅支持到raid0与raid1 ,raid6并没有支持。此外,操作系统也必须要拥有磁盘阵列卡的驱动程序,才能够正确的捉到磁盘阵列所产生的磁盘机。
由于磁盘阵列有很多优秀的功能,然而硬件磁盘阵列卡偏偏又贵的很,因此就有发展出利用软件来仿真磁盘阵列的功能,这就是所谓的软件磁盘阵列。软件磁盘阵列主要是通过软件来仿真阵列的任务,因此会损耗较多的系统资源,比如说cpu的运算与i/o总线的资源等。