程序员需要知道的 RAID 基本原理

qw0325 3年前
   <p>RAID,全称为redundant array of independent disks,是目前商用服务器常见的磁盘管理技术。作为软件开发人员,需要了解各级RAID的特性,以便根据需求做出做合适的选择。本文总结了常见的RAID级别的特性,包括如下内容:</p>    <ul>     <li>RAID的基本作用</li>     <li>各级RAID的基本原理</li>    </ul>    <h2>RAID的基本作用</h2>    <p>RAID的一般有如下作用</p>    <ul>     <li>数据冗余</li>     <li>性能提升</li>    </ul>    <p>数据冗余是指把数据的校验信息存放在冗余的磁盘中,在某些磁盘数据损坏时,能从其他未损坏的磁盘中,重新构建数据。</p>    <p>性能提升是指RAID能把多块独立的磁盘组成磁盘阵列,通过把数据切成分片的方式,使得读/写数据能走多块磁盘,从而提升性能。</p>    <h2>各级RAID的基本原理</h2>    <p>根据RAID的冗余信息程度,切分数据的方式等不同,可以把RAID分成不同的级别,分别是</p>    <ul>     <li>RAID0</li>     <li>RAID1</li>     <li>RAID2</li>     <li>RAID3</li>     <li>RAID4</li>     <li>RAID5</li>     <li>RAID6</li>    </ul>    <p>接下来就讨论这些RAID级别的基本原理。</p>    <h2>RAID0的基本原理</h2>    <p>RAID0设计的目标是为了提升读写性能,但并不带数据冗余信息。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0ab608c6eef8e74f926f9c1e89753a99.png"></p>    <p>如上图,RAID0会把数据切成块,分别存储在N个磁盘上。当读数据时,如果要读的数据块比较大,分布在多次磁盘上,那么能同时从多块盘读数据;当写数据时,如果要写的数据块比较大,分布式在多块磁盘上,那么同时能从多块盘写数据。</p>    <p>因为数据分布在多块盘上,当某块磁盘损坏时,整个RAID系统就不可用了。因此,N块盘的RAID0的特性如下:</p>    <ul>     <li>读性能最好情况下是单块盘的N倍</li>     <li>写性能最好情况下是单块盘的N倍</li>     <li>空间利用率为100%</li>     <li>不具有冗余信息,任何一块磁盘损坏,整个RAID不可用</li>    </ul>    <h2>RAID1的基本原理</h2>    <p>RAID1的设计目标是为每份数据都提供冗余数据,其结构如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/595a2d853196c5b38ceee5d98032baeb.png"></p>    <p>如上图,RAID1中每个磁盘都有一个冗余的镜像盘,两个磁盘的数据是一模一样的。RAID1读数据时,如果数据分布在多块磁盘上,那么可以利用所有数据盘的带宽;写数据时,要同时写入数据盘和镜像盘,因此,需要等待最慢的磁盘写完成,写操作才完成,因此,写性能可能会略微下降。N块盘的RAID1的特性如下:</p>    <ul>     <li>读性能最好情况下是原来的N倍</li>     <li>写性能略微小于RAID0</li>     <li>空间利用率50%</li>     <li>N块盘,坏掉N/2块,RAID还能正常使用</li>    </ul>    <h2>RAID2的基本原理</h2>    <p>RAID2的设计目标是在RAID0级别的基础上,加了海明纠错码。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/2dbfb124e4b1d8926fc6f55e524174f1.png"></p>    <p>如上图,前面四个盘是数据盘,后面三个盘是纠错码。RAID2读数据时,能同时使用多个数据盘的带宽;RAID2写数据时,除了写数据盘,还需要写校验盘,写性能会有下降。因此,N块盘的RAID2的特性如下:</p>    <ul>     <li>读性能不到原来的N倍,因为还有一部分是校验盘</li>     <li>写性能会有下降,因为每次都要写校验盘,受限于校验盘的数量</li>     <li>空间利用率小于100%,因为海明纠错码需要的冗余盘一般比数据盘的数量少</li>     <li>根据海明纠错码位数的不同,能容忍的坏盘数不同,具体信息可以参考 <a href="/misc/goto?guid=4959739081193858216" rel="nofollow,noindex">海明码</a></li>    </ul>    <h2>RAID3的基本原理</h2>    <p>RAID3是把数据按照字节分别存在不同的磁盘中,并且最后一个磁盘提供纠错冗余,其结构如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/effbe3e25b8302802f9fb70544f6ea0d.png"></p>    <p>如上图,由于按照字节切分数据,读数据时,一定会同时从多个盘读数据,可以利用所有数据盘的带宽;写数据时,也会利用所有磁盘的带宽,但所有的写校验数据都会在一个盘,因此,写性能主要受限于校验盘。N快盘的RAID3的特性如下:</p>    <ul>     <li>读性能是N-1倍,其中一块盘是校验盘</li>     <li>写性能受限于校验盘的写性能</li>     <li>空间利用率为(N-1)/N</li>     <li>坏掉一块盘,RAID还能正常工作</li>    </ul>    <h2>RAID4</h2>    <p>RAID4是把数据按照分块分别存在不同的磁盘中,并且最后一个磁盘提供纠错冗余,其结构如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/1748cf5c0701f477c32471e3d5f00779.png"></p>    <p>如上图,读数据时,当数据分布在多块盘时,能够利用多块数据盘的带宽;写数据时,如果数据分布在多快盘时,能利用所有磁盘带宽,但写校验数据只能在一块盘上,因此,写性能主要受限于校验盘。N块盘的RAID4的特性如下:</p>    <ul>     <li>读性能是N-1倍,其中一块盘是校验盘</li>     <li>写性能受限于校验盘的写性能</li>     <li>空间利用率为(N-1)/N</li>     <li>坏掉一块盘,RAID还能正常工作</li>    </ul>    <h2>RAID5</h2>    <p>RAID5是把数据块按照分块分别存在不同的磁盘中,并且冗余信息也会分块分布在多块磁盘中,其结构如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/8ff9b2beeaf295dd1f41d98af50d1ebf.png"></p>    <p>如上图,读数据时,当数据分布在多块盘时,能够利用多块数据盘的带宽;写数据时,如果数据分布在多块盘时,能利用所有数据盘带宽,同时写校验数据也分散在多块盘上,但因为要额外写入校验数据,因此,写数据的性能略微有所下降。N块盘的RAID5的特性如下:</p>    <ul>     <li>读性能是N倍</li>     <li>写性能略微弱于RAID0</li>     <li>空间利用率为(N-1)/N</li>     <li>坏掉一块盘,RAID还能正常工作</li>    </ul>    <h2>RAID6</h2>    <p>RAID6是把数据块按照分块分别存在不同的磁盘中,并且冗余信息为两份奇偶校验码,分布在多块磁盘中,其结构如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e3d61ad32bd894385be86e3c1fcc8ff7.png"></p>    <p>如上图,读数据时,当数据分布在多块盘时,能够利用多块数据盘的带宽;写数据时,如果数据分布在多块盘时,能利用多块数据盘带宽,同时写校验数据也分散在多块盘中,但因为要额外写入两份校验数据,因此,写数据的性能要略微下降。N块盘的RAID6的特性如下:</p>    <ul>     <li>读性能是N倍</li>     <li>写性能略微弱于RAID0</li>     <li>空间利用率为(N-2)/N</li>     <li>坏掉两块盘,RAID还能正常工作</li>    </ul>    <h2>各级RAID的对比</h2>    <table>     <thead>      <tr>       <th>RAID级别</th>       <th>读性能</th>       <th>写性能</th>       <th>空间利用率</th>       <th>最大能容忍的坏盘数</th>      </tr>     </thead>     <tbody>      <tr>       <td>RAID0</td>       <td>单块盘的N倍</td>       <td>单块盘的N倍</td>       <td>100%</td>       <td>0</td>      </tr>      <tr>       <td>RAID1</td>       <td>单块盘的N倍</td>       <td>略微弱于单块盘的N倍</td>       <td>50%</td>       <td>N/2</td>      </tr>      <tr>       <td>RAID2</td>       <td>不到单块盘的N倍</td>       <td>单盘的写入速度 * 校验盘的数量</td>       <td>不到100%</td>       <td>取决于海明纠错码位数</td>      </tr>      <tr>       <td>RAID3</td>       <td>单块盘的N-1倍</td>       <td>校验盘的写入速度</td>       <td>(N-1)/N</td>       <td>1</td>      </tr>      <tr>       <td>RAID4</td>       <td>单块盘的N-1倍</td>       <td>校验盘的写入速度</td>       <td>(N-1)/N</td>       <td>1</td>      </tr>      <tr>       <td>RAID5</td>       <td>单块盘的N倍</td>       <td>略微弱于单块盘的N倍</td>       <td>(N-1)/N</td>       <td>1</td>      </tr>      <tr>       <td>RAID6</td>       <td>单块盘的N倍</td>       <td>略微弱于单块盘的N倍,差于RAID5</td>       <td>(N-2)/N</td>       <td>2</td>      </tr>     </tbody>    </table>    <p>一般地,RAID0容忍的坏盘数为0,风险太大,一般不常用;RAID1的信息冗余量很多,适合于对信息安全要求很高并且预算充足的场景;RAID2的控制器比较复杂,一般不常用;RAID3和RAID4由于其写入性能差,也不常用;RAID5由于读写性能、能容忍的坏盘数都比较均衡,因此,一般工业界经常使用的是RAID5;RAID6对于坏盘数容忍度较高,适合于对信息安全比较高的场景。</p>    <p> </p>    <p> </p>    <p>来自:http://oserror.com/backend/raid-principle/</p>    <p> </p>