共计 1924 个字符,预计需要花费 5 分钟才能阅读完成。
RAID 系统是用来对存储数据进行数据保护的有效手段。在 RAID 创建过程中往往会存在一个时间极长的系统初始化过程,为什么 RAID 初始化过程中会存在这样的一个操作呢?这个操作对 SSD 会导致什么方面的影响呢?存储老吴从技术研发的角度和大家一起对 RAID 初始化过程进行分析、研究。
传统 RAID 的基本组织结构如下图所示:
所有加入 RAID Group 的盘会按照 LBA 地址切分成一系列的切片,这些切片被称之为 Stripe Unit,不同盘中相同 LBA 地址所对应的 Stripe Unit 会组织成一个条带(Stripe)。在一个条带中对所有数据进行编码,例如 RAID6 生成两个编码数据块 P 和 Q,可以允许两个数据盘同时损坏。
所以,在 RAID 系统中,所有条带中的数据都需要满足编解码算法规则,即条带中的所有数据可以按照一定规则生成编码数据,并且该编码数据和条带中存储的编码数据相同。这种情况被称之为该条带中的数据是一致的。当一个磁盘发生故障时,可以通过存储在条带中的编码数据恢复丢失的数据块。
如果一个条带中的数据不一致,即条带中的数据计算得到的编码结果和存储的编码数据不相同,那么一旦一个磁盘发生故障,那么通过存储在条带中的编码数据将无法正确恢复丢失的数据块。所以,一个数据不一致的条带将会在故障发生时导致数据正确性问题。
在创建一个 RAID 系统时,RAID Group 中的磁盘可能是新盘,也可能是一块已经被使用过的数据盘,这些盘上的数据不会全是零。在这种情况下,采用这些盘构建的数据条带一定不能满足数据一致性的需求。即每个条带中的数据按照一定规则计算得到的编码数据和条带中的编码数据是不相符的。这种数据不一致的条带将会对 RAID 数据正确性问题引入极大的风险。
正因为这个原因,在创建一个 RAID 的时候需要考虑将系统中所有的条带进行初始化,以此来保证条带中数据的一致性。条带初始化通常可以采用两种方式来解决:
1, 通过全盘写零的方式初始化 RAID 系统中的所有的条带。数据全零的条带,其校验数据也为零。因此,全零数据可以保证条带的一致性。
2, 将所有条带进行校验计算,更新条带中的校验数据,以此达到条带数据的一致性。
当一个 RAID 系统被初始化完成后,所有条带中的数据将会变得一致,如下图所示:
RAID 系统初始化过程是一个非常漫长的过程,其主要原因是需要对系统中所有条带进行初始化。还需要考虑和前端用户 IO 之间的性能平衡,所以,RAID 系统初始化往往是一个后台执行的一个过程,会持续较长时间,并且对前端应用的性能造成影响。
对于 SSD 而言,RAID 系统初始化过程还会引入其他问题。在系统初始化过程中,无论是采用写零还是校验数据更新的方式,都需要向 SSD 盘写入数据,这个过程会导致无谓的数据写放大。用户数据还没有被写入的时候,通过初始化的方式就已经在 SSD 内部建立了数据映射表。对 SSD 而言降低了使用寿命和性能。因此,一个针对 SSD 的 RAID 系统需要考虑对系统初始化过程的优化,传统 RAID 是不会考虑到 SSD 这个特殊特性的。所以,传统 RAID 不能直接在 SSD 上进行部署,会对 SSD 本身的寿命和性能造成影响。
RAID 系统采用数据条带化的方式对数据进行保护,但是在条带化数据保护的过程同样引入了一系列问题,系统初始化就是一个典型的条带一致性问题。一个优秀的 RAID 数据保护系统在设计的过程中都会解决掉这个问题,例如 EMC 的 Data Domain RAID 就不存在系统初始化过程,当然其需要和文件系统进行配合,并且在 RAID 条带数据分布上做了很多的优化。
如何在 Linux 上构建 RAID 10 阵列 http://www.linuxidc.com/Linux/2014-12/110318.htm
Debian 软 RAID 安装笔记 – 使用 mdadm 安装 RAID1 http://www.linuxidc.com/Linux/2013-06/86487.htm
常用 RAID 技术介绍以及示例演示 (多图) http://www.linuxidc.com/Linux/2013-03/81481.htm
Linux 实现最常用的磁盘阵列 – RAID5 http://www.linuxidc.com/Linux/2013-01/77880.htm
RAID0+ 1 和 RAID5 的性能测试结果 http://www.linuxidc.com/Linux/2012-07/65567.htm
Linux 入门教程:磁盘阵列(RAID)http://www.linuxidc.com/Linux/2014-07/104444.htm
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-08/122122.htm