存储在线专栏文章:今天,西瓜哥来分享一下SolidFire CEO Dave的一个演讲。这哥们长得很帅,讲得更棒,有很多的技术细节,英文比较好的可以点击后面的{阅读原文}观看(建议用电脑看,因为iOS不支持flash,不过可下载vimeo客户端观看)。
这是他在今年4月份在Tech Filed Day的一个演讲。首先是一个声明,他说这些材料都是基于公开的内容,没有设计为突出某种架构好,只是说明每一种方法的权衡,当然,他内心还是认为自己的架构最好。好诚实的小伙,O(∩_∩)O哈!当然,演讲没有包括市场上全部的AFA架构,因为很多和传统的存储架构一样,很多没有丰富的特性,有些还文档缺乏。
这是AFA的竞争全景图,我们看到大帅哥把IBM的TMS放在Flash Applicance分类里面了,因为它是以硬件为中心的设计方式。3PAR是传统阵列的改良,而本质上专为全闪存系统全新设计的是Pure Storage(后面简称Pure)、XtremIO和SolidFire(后面简称SF)。这些产品的特点是采用商用硬件,以软件为中心,提供丰富的数据服务,支持在线的数据缩减功能。
为什么传统的架构不适合闪存?一是基于extent映射和固定块对齐的方式很难支持重删和压缩,二是传统的RAID方式带来闪存的性能和磨损问题,三是控制器的资源和闪存的需要不匹配,因为闪存需要更多的原数据的存储和管理。
每个架构主要从6个方面的设计来阐述他们的选择。
-
第一点,首先是系统的扩展性考虑。也就是这个架构如何支持容量和性能的扩展。
Pure采用的是纵向扩展的方式,和传统的块存储架构一样。需要更多性能,你只能升级到更强大的控制器,容量可以通过磁盘框来扩展,但性能受限于两个控制器的能力。
而SF和XtremIO都采用横向扩展的架构。性能和容量都可以线性增长。目前SF集群的节点可以是不同类型,而且性能可以动态均衡。
一般来说,纵向扩展的架构适合小型、固定可预测的负载,而横向扩展架构适合大规模、不可预测和更需要弹性的场合。
-
第二点,看一下系统冗余的设计,也就是如何保证高可用和进行数据保护的。
Pure和XtremIO都是采用双控共享硬盘的架构,和传统的块存储架构一样。如果硬盘失效,在该硬盘框内重构,控制器失效,另外一个控制器接管。如果硬盘框坏了,系统就不能运行了,也就是磁盘框是SPOF(单点失效)。
而SF采用的是啥也不共享的架构。西瓜哥认为,其实就是现在云(对象)存储,如华为的UDS常采用的架构。这种架构采用多副本技术,好像SF是2副本,可以承受最少一个节点故障。但与会嘉宾提出了“质疑”,说软件成为了SPOF,O(∩_∩)O哈!因此,软件的健壮性很重要。
这两种架构的区别如下,共享硬盘架构比较适合小容量起步的场合,硬盘成本高,而啥也不共享架构比较适合大容量场景,控制器成本高。
-
第三点,看数据的组织和IO路径。数据是如何组织,放置和定位,这个对重删的实现影响很大。现代的闪存架构对比传统的块存储就是采用大量的元数据。
Pure采用位置寻址技术。主要的元数据是一个KV仓库(映射表)。另外,需要多个附加的元数据结构,包括链接表,重删表和中间表(定向图)。所有的元数据都保存在SSD里,采用内存做Cache。
这个是IO读写的路径。
而SF和XtremIO采用的是内存寻址的方式。卷的元数据是一个KV仓库,但key指向的地方不是块的位置,而是指纹。块的元数据是一个分布的KV仓库,指向实际的块数据。这个实际就是XtremIO经常说的两阶段元数据架构。所有的元数据都保存在SSD上,但全部在内存里运行。
这是他们的读写路径。
这是两种寻址方式的对比。位置寻址只是单层映射,即LBA->位置,因此位置和元数据是紧耦合的关系,数据移动需要更新元数据,重删实现需要附加的表格和索引。而内容存储方式采用两层元数据映射LBA->块ID->位置,物理位置和元数据是松耦合,灵活性更好,天然就支持重删。位置寻址适合所有的控制器都可以全局访问元数据的架构,而内容寻址适合大规模全局重删和分布式架构。
-
第四点是如何删除不用的数据。即数据不用了,如何删除?这个对于传统的块存储不是问题,数据块重写就可以了,但对于全局重删、快照优化的架构非常复杂,因为你不知道谁还在引用这个数据。
Pure采取的是引用验证的方式。当回收空间的时候(垃圾收集),检查各种表看是否还有人在引用这个数据,如果没有就删除。
而XtremIO采取的是引用计数的方式。原理其实很简单,块的元数据(块ID->位置映射)包含一个引用计数,“写”一次计数就加一,重写时旧的块(其实就是删除)就减一。大家注意这个写打引号了,不是真正去写物理位置。如果是一个卷的删除、克隆和XCOPY操作,由于需要大量修改引用计数,因此会触发后台进程去做这件事情。当引用为零,说明没人用这个块了,就可以被条带更新时覆盖写了。(XtremIO不做系统级的垃圾收集,下面我们讨论这个问题)
SF采用的方法是标记&扫除GC的方式。块的元数据的每个入口都包含一个“在用”的标志,每隔一定的时间,所有的块都标记为未使用。卷的元数据创建当前使用的块ID的Bloom Filters(布隆滤波器,一种高效的数据结构,西瓜哥的数学是语文老师教的,大家可以百度学习),送到块层,在布隆滤波器里面的块就标志为“在用”,在GC结束后没有在用的块就删除了。这样周而复始。(西瓜哥认为这个设计的关键是找了一个高效的布隆滤波器,其特点是高效但可能有非常小的误判,但误判只是浪费一点点空间而已,即有些块没有用而标记为使用了。但这个误判不影响数据的安全,但效率大大提高)。
这个三种方法的区别如下,引用验证的方式需要存储层和元数据层紧耦合,允许几乎马上就决定那个数据不在用,特别适合全局共享元数据场景;引用计数的方式在某些操作(克隆,XCOPY)需要大量更新计数器,计数要非常精确,不能有丝毫差错,也可以几乎立即决定哪些数据没有用,非常适合单一信任源的元数据场景;而标记&扫除 GC的方式,需要GC扫除在后台运行,系统的抗干扰性非常高,允许没有改变块元数据下对卷的元数据进行处理,非常适合松耦合的分布系统。
-
第5点是关于闪存数据布局的设计。也就是数据如何组织和保存在各个固态硬盘里。传统的基于extent/chunk的布局并不合适,因为有闪存性能和写放大问题,快照和克隆的低效问题和固定的RAID几何形状和热备盘问题。
XtremIO采用的是固定块的方式。数据以一个RAID条带(23+2)条带写入,一旦硬盘写满,部分条带被新数据更新,一旦写入,数据不再“移动”,数据块固定为4K大小(现在XIOS 3.0已经改为8K,因此需要破坏升级,如昨天我们讨论的那样)。
而SF和Pure采用的是日志结构方式。SSD空间分成固定大小的段,进入的数据汇聚成段并顺序写入,一旦硬盘写满,部分的段被垃圾收集,并写到新的位置,每个块大小可以不同。
大帅哥还讲了不同SSD不同读写模式下硬盘性能的对比。
如果是普通的cMLC的硬盘,由于其控制芯片处理能力差,超供也不高,因此,刚开始性能还不错,但开始垃圾收集的时候,128K随机读性能马上下降到2500 IOPS。
如果是1M的随机读,IOPS虽然可以到9000,但抖动厉害。
但1M的顺序读性能基本可以稳定在17000 IOPS。
这也是为啥XtremIO自己不做GC的原因。因为其写是随机写。而日志架构的方式,可以做到顺序的大块聚合写。因此系统可以做GC,也就是可以采用cMLC的SSD,降低介质成本。
而XtremIO必须采用eMLC SSD,因为需要SSD自己来做GC。这个Anobit的eMLC SSD,在GC的时候,128K随机写的性能是15000IOPS。性能还是不如上面的cMLC 1M顺序写。
因此,固定块方法很难支持变长的块,大块的写会分成多个4k(或8K)的写,SSD控制器来做闪存的page管理,需要更多的SSD超供(28%),这种架构适合比较简单的文件系统,采用eMLC SSD的场景。而日志结构的方法,很容易支持变长的块,写可以联合,即多个小的写聚合成一个大块的写,存储系统帮助闪存做page管理,SSD的超供只需要7%,特别适合采用cMLC SSD,支持压缩的场景。(不过,现在XtremIO XIOS 3.0也支持压缩了)。
-
第6点,也是最后一点,讲一下掉电保护的方法。也就是掉电后如何保证数据的安全,这个和传统的存储一样,不需要特别考虑,除了性能要求很高情形和尽量平衡闪存磨损方面。仅仅写到SSD并不是一个好方法。
Pure采用镜像SLC SSD的方式,所有的数据和元数据更新流化到一个持久的日志文件里,使用2个SLC SSD做镜像,两个SSD都放在第一个硬盘框里。这种方法使用小部分的SLC SSD空间,但可以增加寿命,提供更一致的写延迟。
而XtremIO采用系统内存加UPS的方法。待写的数据和元数据保存在2个控制器的内存里,脏数据在后台聚合成RAID条带写,和VNX类似,所有的控制器需要外部UPS保护,只不过VNX2现在用的是内部的BBU。在掉电的时候,脏数据刷到磁盘框或者内部控制器的SSD。如果单个BBU故障如何处理不明(可能会继续保持运行)。
SF采用PCIe NVRAM的方式,每一个节点都内置一个8G NVRAM卡,上面有超级电容和SLC闪存,所有的数据和元数据都同时提交给2个节点,掉电时,卡把数据刷到闪存,来电的时候恢复到内存里。(这个方法和华为FusionStorage的保护方式类似)
这三种方法的对比如下。SLC SSD的方式性能最差,PCIe NMRAM其次,DRAM w/UPS方式最快。SLC SSD方式磁盘框坏了数据就不可用了,而其他两种则没有SPOF。SLC SSD和PCIe NVRAM的方式都可以防止软件崩溃,而DRAM w/UPS在双kenel panic下有数据丢失的风险,维护性也差一些。SLC SSD的方法适合从控制器去除持久数据的场景(这个就是为啥Pure支持NDU的一个原因,因为使用了无状态控制器),而DRAM w/UPS的方式实现简单,性能好,但PCIe NVRAM方式提供最高级别的保护。
最后汇总了三个闪存产品架构在这6方面的实现方法,有些方法扩展性好,有些方法实现简单,有些方法成本最优,有些方法可靠性最高。图中用不同的颜色做了标记。总的来说,Pure关注TTM,可用性和成本,而XtremIO关注TTM和扩展性,SF关注扩展性、可用性和成本。
而扩展性、可用性和成本正是下一代数据中心的关键属性。哈,原来大帅哥还是有偏见的,O(∩_∩)O哈!
总结:西瓜哥认为,这三种架构,其实各有优缺点。今天学习以后,终于知道为啥XtremIO不用做垃圾收集了,也知道为啥它不用cMLC了,也更了解为啥它的性能为啥如此好,并且能够保持一致的性能了,也了解大家对他元数据安全的担心。因此,西瓜哥的观点,如果追求性价比,我会采用Pure,如果追求极致性能,我重点考虑XtremIO,如果考虑大规模的扩展,SF是不二之选。
希望大家积极反馈你的意见和建议,微信扫描如下二维码,关注微信公众号“高端存储知识”,与作者微信互动。通过掌上DOIT移动客户端,您可以订阅西瓜哥专栏,第一时间获得知名专家和业界领袖的深度剖析与趋势分析。