共计 2154 个字符,预计需要花费 6 分钟才能阅读完成。
不知道大家有没有考虑过这样一个问题:在 RAID 中是否可以支持 TRIM 操作?
试想在 SSD 上建立 RAID 之后,应用软件(文件系统)直接运行在 RAID 软件之上,那么此时如何通过 TRIM 命令将 SSD 中的数据块 unmap 掉呢?看起来这好像不是一个问题,其实对于 RAID 而言这是一个比较大的问题。存储老吴可以带领大家从研发人员的角度一探 RAID 中 TRIM 所引入的问题,从中也可以一窥用户所应该注意的问题。
目前,RAID 方面的开源软件是 MD,很多用户对 MD 这套软件是非常热衷的。认为这套软件运行非常的稳定,性能不错,功能很全,并且还有很多技术人员对其进行免费开源维护。其实,和专业的 RAID 存储软件相比,MD 就是一个演示系统。目前,在 MD 软件中是不支持 SSD 的 TRIM 操作的,不是说不想加入这个功能,而是并不容易添加这个功能,这会涉及到很多的开发工作量。
对于 SSD 的 TRIM 操作,其主要想法是通过释放 SSD 内部一个逻辑地址(LBA)的映射数据块来提升 SSD 本身的性能。这主要是由于 SSD 内部采用 FTL 的方式对所有写入数据采用 Append write(追加写)的方式,所以,当没有空闲资源的时候,SSD 需要通过启动垃圾回收来获取空闲资源。垃圾回收对 SSD 的性能影响巨大,因此,如果业务能够主动释放空闲资源,那么 SSD 内部的垃圾回收就会轻松很多,从而可以提升 SSD 本身性能。TRIM 操作就是让应用层主动释放空闲资源的机制。
当应用软件直接架构在 SSD 上时,其可以很容易的向 SSD 通过发送 TRIM 命令来回收资源。但是,在应用软件和 SSD 之间引入 RAID 之后,情况发生了巨大变化。首先,让我们来认识一下一个普通的 RAID 数据布局,这个数据布局会显得非常规整:
在这样的数据布局中,每个条带都会存在一个数据校验块(RAID5),一旦条带中的一个数据块发生故障时,通过校验数据 P 就可以恢复故障数据。假设此时,位于 RAID 之上的文件系统想要 TRIM 一个数据块,这个数据块正好落在 SSD1 的 D 数据块区域。对于这种操作,RAID 需要做什么呢?一个很直观的操作是当 RAID 把 SSD1 上的 D 数据块 TRIM 掉之后,需要更新这个条带中的 P 数据块。原因在于 TRIM 操作之后,SSD1 上的 D 数据块发生了变化,如果想要保证条带数据的一致性,必须更新 P 数据块。条带中一个数据块的 TRIM 操作引发了条带校验数据的更新。这是条带 RAID 中 TRIM 操作的重要代价。
其实,事实远比条带更新更加糟糕。一个 SSD 中的数据块被 TRIM 之后,这个数据块中的数据会变的不确定。例如一个数据块被 TRIM 之后,读取的数据可能和原来一样,也有可能为零。并且随着时间的变化,存储块 TRIM 之后的数据会发生变化。而这完全取决于 SSD 内部固件程序的实现。这种数据的不确定性给 RAID 带来的致命的数据正确性问题。例如,上述案例中 SSD1 中的 D 数据块被 TRIM 之后,根据 TRIM 之后的数据更新 P 校验数据。过一段时间之后 SSD1 中的 D 数据块可能发生了变化,此时整个条带的数据将会处于不一致性状态,对数据的正确性造成影响。
从上述分析来看,RAID 的数据 TRIM 最好以条带为单位,当一个条带中的数据全部可以 TRIM,那么此时才可以对 SSD 发送 TRIM 操作命令。所以,在 RAID 中,TRIM 操作被放大到了条带级别,不再是原来的 Sector 块级别操作了。
但是,通常 RAID 设备暴露给用户仍然是 Sector 级别的块设备对象,文件系统仍然会给 RAID 发送 Sector 级别的 TRIM 操作。对于这种情况,RAID 如何将 Sector 级别的 TRIM 操作转换成条带级别的 TRIM 呢?这就需要 RAID 内部进行 TRIM 的合并,例如通过采用 Bitmap 机制将 TRIM 操作记录下来,当合并到一定程度之后,再对整条带进行 TRIM 操作。这种设计将会造成较大的实现复杂度,并且还有很多的问题需要考虑,例如 Bitmap 占用内存容量,异常掉电等问题。所以,一个优秀的 RAID 数据保护软件,将 TRIM 问题处理好是需要化一番真功夫的,并不是一件很容易的事情。
(来自存储老吴的博客——存储之道)
如何在 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/122123.htm