克服混合闪存阵列的不确定性存储与灾备
混合闪存系统是以接近传统全磁盘阵列的成本提供高性能存储的一种流行选择。这些(系统)主要是包含硬盘驱动器和具有在闪存层保存数据功能的缓存或者分层软件层的NAND闪存的存储系统(基于区块或者文件)。
但是,所谓的闪存丢失,即当数据被请求时,缓存或闪存数据缺失,其结果要比传统磁盘阵列上数据缺失的情况更加糟糕。原因在于:使用混合闪存阵列的应用程序在设计上需要闪存的性能。用户体现的整体性能取决于应用程序软件和CPU之间高速的交互,这需要一致的存储延时过程。
值得一提的是,尽管在应用程序请求之前,闪存缓存和闪存层使用不同机制将正确的数据放入闪存,但闪存丢失的影响基本上是相同的。当数据被请求却不存在于闪存时,存储性能就变得不可预测。突然以磁盘驱动器延时(这是一个更大的数量级)取代闪存延时的闪存丢失能够使存储性能更加不可预测。这种不一致显著影响了整体应用程序的性能,而并非源于较慢的存储。
混合闪存阵列和全硬盘驱动器(HDD)阵列的不同是由大多数混合存储系统使用数量较少的较高容量的磁盘驱动器和传统的高性能磁盘阵列在设计上通常使用数量较多的磁盘轴和较快的驱动器共同造成的。因此,当真正出现闪存丢失的时候,应用程序要经受混合系统的磁盘层较大的延时。
为什么会出现丢失?
简单来说是:闪存区太小,不足以保留用户或者应用程序正在请求的数据。这是一个经济问题;更多的闪存加重了阵列的成本,使混合阵列比磁盘阵列昂贵的多。而这也缩小了混合闪存阵列和全闪存系统之间的差异,当然,后者没有闪存丢失的后顾之忧。
如果我们进一步探讨的话,会发现:有些缓存或者分层系统的效率低于其它(系统),这意味着它们实际上正在浪费闪存容量。有时,它们判定某些数据对象是否“值得使用闪存”不太有效。或者这可能是由于正被保存的数据不可预测、高度随机或者连续,以致软件无法确定其是否“值得使用闪存”。
然而,混合阵列制造商是能够有所作为的,把闪存丢失的机会降到最低。显然,这些是在评估混合闪存的时候应该考虑的设计方面的事情。
增大闪存区
制造商可以增大闪存区,或者还可以更好支持扩展闪存容量。这允许用户订制他们的闪存-磁盘驱动器混合体,更好地满足他们的工作负载。这也允许用户混合部署闪存类型,例如:将数量较少的高速、高耐久性的SLC闪存用于数据的初始创建,以及比较便宜的、更大的MLC闪存区。
让闪存区更智能
缓存和分层利用了如今正在开发的一些最成熟的软件算法,而那些算法与正被用于混合闪存阵列的软件有着显著的区别。必须理解缓存和分层软件作用方式,尤其是对最有可能被保存的特定数据类型作用方式,因为该软件的有效性是数据相关的。
有些阵列具有特定于应用程序的进程或者软件模块,能够了解在某款应用程序中何种数据对象最重要,例如数据库的索引或者日志文件。通过赋予这些数据优先权,可以确保它们(数据)在需要的时候就在闪存中。作为最后的手段,系统应该允许用户把某些数据集“压进”闪存,以确保为任务关键型应用程序提供一致的性能。
混合阵列控制器正肩负艰巨的任务,因为它们除了为系统提供整体的存储I/O性能以外,还在不断地评估并且把数据移进或者移出闪存区。因此,阵列处理数据分析和数据移动的整个进程应该尽可能的有效率。优化闪存控制器代码以及实施特殊的元数据处理程序都可以提高效率。
改善效率的另外一个方法是减小数据对象,这样将减少缓存或者分层进程对无用数据的处理。例如,有些缓存软件可以缓存单个VMDK文件,完全不同于以虚拟磁盘级别进行缓存,而且还有其它的(软件)可以在VMDK内缓存数据。
闪存优先
有些分层系统先向磁盘写入新数据,然后在数据访问达到某个临界值的时候将其提至闪存。这意味着:最新被写入系统的重要数据在较长的时间里并不存在于闪存。而反过来,新数据首先被写入闪存然后再存入磁盘,那么“闪存预热”(flash warm-up)期会被忽略,减少了闪存丢失的机率。
混合闪存阵列使用某种缓存或分层软件,以确保应用程序请求的数据存在于闪存,从而达到闪存性能最大化。但是,当请求数据不在闪存时,由此造成的闪存丢失会显著影响需要最佳存储性能的应用程序。为了解决这个问题,混合存储阵列采取了几个方法提升它们的闪存命中率。
增大闪存容量将有所帮助,但是通过将重复数据删除和压缩等数据缩减技术纳入到存储系统中来增大其有效容量也可实现。利用对常见应用程序和平台的认识或使用更特定的缓存或者分层程序使系统更有效率都能够带来类似的效果。最终,新数据先写入闪存而非硬盘的系统设计能够确保重要的数据对象在最快的时间内出现在闪存上。