详谈Lustre背后的故事,ZFS前世和今生

详谈Lustre背后的故事,ZFS前世和今生_第1张图片


640?wx_fmt=gif

      故事还得从SUN和Solaris说起。曾经有一个服务器巨头,它的名字叫SUN(Sun Microsystems),给IT界带来过无限光明,无论是占据应用开发半片江山的Java,还是数据库当家花旦MySQL,以及虚拟化先驱VirtualBox,都是出之其手,更难能可贵的是这些重量级作品都是开源的(Open Source)。


      但在被Oracle收购之后Sun基本从大众视野中消失了,原来Sun的许多科学家大牛也纷纷奔走他乡,Sun的许多项目被雪藏的雪藏,闭源的闭源,其中强大的操作系统Solaris(SunOS),Solaris是Unix的衍生版,跟Linux同源,但是Sun在开发Solaris上投入了巨大的研发精力,在二十一世纪初,搭载Solaris的Sun服务器仍然是业内不少公司的首选。


      Solaris具备有许多当时Linux所没有的特性,比如ACPI,CPU HotPlug等,还有就是我们要讲的主角ZFS文件系统(Lustre基于ZFS实现存储管理)。


      ZFS文件系统(Zettabyte  File System),是由Jeff Bonwick (原Sun的CTO)领导开发的次世代文件系统,是第一个128位的文件系统,同时被Sun称作史上最后一个文件系统(The Last Word In File Systems), ZFS作为一个革命性全新的文件系统,全面抛弃传统File System + Volume Manager + Storage(文件系统+卷管理+存储)的架构,所有的存储设备是通过ZFS 池进行管理,只要把各种存储设备加入同一个ZFS 池,大家就可以轻松的在这个ZFS 池管理配置文件系统, 也就是说ZFS一方面承担着文件系统的角色,另一方面还兼顾存储管理。


      对于Sun而言,当初是ZFS作为私有闭源文件系统开发,作为Solaris的杀手锏,想依次抢回部分市场份额,继而东山再起,但是时运不济,进入二十一世纪的Sun一直在走下坡路,一直处于亏损状态,到2005年ZFS发布时,是作为OpenSolaris的一部分,CDDL(Common Development and Distribution License)开源形式,也正因为此我们现在才有机会自由研究ZFS,虽然Sun已经离我们远去,但是ZFS凭借着自身的各种优点,慢慢走进了大众的视野。


ZFS的主要特性


      不得不说Jeff Bonwick是位伟大的程序员,使得ZFS在设计上要超越同时代的操作系统,卷管理,存储池,分层缓存ARC/L2ARC等,下面我们一一细说ZFS的主要特性


1、元数据完整性


      数据完整性在文件系统中有非常重要性,ZFS文件系统采用了256位校验和,当向磁盘写入数据的时候,校验和就会被作为元数据与它相关的数据分开保存。区别于其他文件系统的是,ZFS这种校验和可以检测出错位写、误读取和误写入、DMA奇偶错误、驱动器Bug、意外过量写入以及常见的物理存储的衰减,上述的这类错误我们通常称为silent data corruption,一般的文件系统是无法感知的。


2、写时拷贝COW(Copy-On-Write)


      ZFS文件系统是使用多项技术来确保数据在磁盘上的连续性,其中就包括写时拷贝(Copy on Write),也就是当数据发生变更的时候它并不会过量写入——它总是在指针指向变更数据之前被写入到一个新块和校验和中。旧的数据可能被保存下来,在发生变更的过程中创建文件系统的快照。利用ZFS的文件写入是交易/事务型的操作——要么将所有数据写入到磁盘,要么什么都不写入。


3、快照Snapshot和克隆Clone


      有了COW,支持快照是理所当然的事了,快照是文件系统或卷的只读副本。快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是,当活动数据集中的数据发生更改时,快照通过继续引用旧数据占用磁盘空间,从而阻止释放该空间。ZFS 快照具有以下特征:

  • 可在系统重新引导后存留下来。

  • 理论最大快照数是 264。

  • 不使用单独的后备存储。快照直接占用存储池(从中创建这些快照的文件系统所在的存储池)中的磁盘空间。

  • 递归快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。原子快照操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。


      克隆(Clone),也称为可写快照,同样是基于COW,克隆是产生两个独立的文件系统,但是跟原系统共享同一组数据块,当任何一方发生数据变化,就分配新的存储块,未改变的数据任然互相共享。


4、存储池


      存储池因起良好的可扩展性,近来越来业界越受青睐,不论是Libvirt/Qemu,还是OpenStack都引入了存储池的概念。ZFS利用可用的存储驱动器将他们聚合成为一个被称为zpool的存储池。这个存储池可以使针对容量、I/O性能 或者冗余性进行优化和扩展,如果需要更多存储的话,只需要向zpool中添加更多存储就行了——ZFS检测到新添加的容量并开始自动使用、均衡I/O和最大限度提高吞吐量。


5、内建RAID-Z和RAID-Z2


      众所周知,RAID5有一个重大缺陷——Write Hole,传统Raid5在写数据的时候,是分为两步的,首先将数据写到磁盘阵列上,然后将该stripe上数据的校验码记录到阵列上,如果在刚写完数据的时候,系统断电,那么该数据对应的校验码就没有机会再恢复了。如果接下来磁盘发生故障,RAID重建流程就会出现错误数据。唯一的解决方案就是,如果整个stripe发生过量写入,那么就会生成一个正确的奇偶块。


      RAIDZ通过使用一个不同宽度的条带来解决这个问题,这样每次写入实际上是一个完全的条带写入。再加上ZFS的写入时拷贝特性,这些就完全消除了RAID5的Write Hole缺陷。RAIDZ2也是同理,但是可以使用双奇偶允许阵列中丢失两个磁盘。


6、分级缓存ARC和L2ARC


      缓存机制是提升I/O性能,降低延时方面性价比最高的方式,不论是硬件CPU,内核,还是用户态应用,在设计上都会引入缓存的概念。ZFS有两层缓存:

  • 第一层缓存,沿用IBM的叫法ARC,位于内存中,ZFS总是尽量多的用空闲的内存去做ARC,以提高性能,ZFS的ARC算法在IBM经典ARC算法的基础上又做了扩展,使之更适用于ZFS

  • 第二层缓存,即Level2 ARC(L2ARC),唯一高速存储设备上,通常是Flash设备,SSD,Nvme等,通过预热讲慢速设备上热点数据读取到高速设备上以提高性能


7、前瞻性的容量支持


      ZFS是128位的文件系统,也就是说理论上它可以保存256千万亿ZB(1ZB=10亿TB)。实际中,它的容量远远超过所需范围,至少在可预见未来,完全不用担心过载的问题。

  • 2^48: 单目录下包含所有对象(文件,目录,子目录等)的数目

  • 16 exbibytes (2^64 bytes): 单个文件最大大小

  • 256 quadrillion zebibytes (2^128 bytes): Zpool存储池的最大大小

  • 2^48: 单个目录下的最大文件数目

  • 2^64: Zpool支持的最大设备数目

  • 2^64: 系统中Zpool最大数目

  • 2^64: 单个Zpool上可创建文件系统的个数


8、自检和修复(Resilvering and scrub)


      FSCK是Linux文件系统的标配,但是ZFS没有,ZFS是依靠内建的Scrub功能来完成自检和修复的。ZFS可以清理一个存储池中的所有数据,根据相应的校验和检查每个数据来验证其完整性,检测任何潜在的数据损毁,修复可能存在的任何错误。


      当数据被冗余保存起来的时候——保存在镜像或者RAID型阵列中——它可以修复检测出任何潜在的损坏数据,而且无需管理员的干预。因为数据损坏是被记录下来的,所以ZFS可以通过导致数据不恰当保存在硬盘中的内存模块(或者其他硬件)检测出来。数据清理的I/O优先级是很低的,因为这个流程对系统性能的影响非常小。


9、原生的数据压缩和去重


      鉴于数据压缩和去重在节省存储空间和降低网络开销方面的绝对优势,这一特性慢慢成为文件系统,尤其是网络文件系统的标配。ZFS作为整合了存储管理的文件系统,自然也提供了压缩和去重的功能。按照粒度划分,通常分为文件级,块级和页级,显然粒度越小空间利用越高,但是随之的开销(内存和cpu)越高,鉴于ZFS是基于数据块做存储管理的,因此ZFS的压缩以及去重都是数据块级的,并提供了多种可选压缩和去重算法


10、丰富的可配置性(Highly tunable)


      ZFS在设计之初就奔着高度可配置化而去的,开放了非常多的内部参数(总计有近百个),不论是对于ZFS文件系统,zpool还是Volume,都可以使用用户态工具直接进行参数设置,极大的方(累)便(坏)性(运)能(维)调(人)优(员)。


ZFS的各衍生版及现状


        OpenSolaris/ZFS开源时采用的是CDDL协议,跟kernel的GPL协议不完全兼容,所以zfs进kernel upstream就无望了,这样使用zfs只有两种可能,其一就是只使用zfs二进制模块,其二就是重新做backport适配kernel。


1. ZFS on FUSE


      基于linux的fuse,backport zfs的代码到上面,文件系统运行在用户态,此方案实现上简单,耦合性低,但是fuse的致命弱点就是它跑着userspace,性能无法与原生内核态的文件系统相比,此方案作为一种尝试,没能善终,最终被抛弃了。


2. Native ZFS on Linux (zfsonlinux)


      zfsonlinux是由劳伦斯利弗莫尔国家实验室(LLNL)主导开发,backport到linux kernel的原生zfs版本,其引入了一个层接口层,基于kernel的api实现一套累solaris的接口,使得对openzfs的backport实现保留原生的形态,降低耦合性,目前已经发布0.7.5的release,基本上覆盖了openZFS的全部特性,虽然稳定性目前有待加强,但瑕不掩瑜,性能较前期版本有非常大的改进,特别是对元数据及随机写的性能有非常大的改观。lustre的osd-zfs正是采用的此zfs衍生版,目前已HPC领域广泛使用。


3. ZFS port by KQ InfoTech


      基于早期LLNL实现的zvol,KQ Infotech也实现了一套原生的zfs backport,最初是直接port到FreeBSD,后来再一直到linux,但是随着LLNL实现的zfsonlinux越来越完善,KQ 最终还是将自己的版本合并到了zfsonlinux。


4. ZFS.ko by Unbuntu


      针对CDDL与GPL不兼容的现状,Ubuntu打了一个擦边球,Ubuntu 16.04 LTS ("Xenial Xerus"),在起仓库中提供了自包含的ZFS模块,允许用户直接从仓库安装zfs模块,目前来看Oracle方面并没有出现官方的反对声音,如果ubuntu此举成功,那其他发行版厂商可能也会继而效仿,直接在发行版仓库提供二进制模块的安装,届时用户救无需再通过编译源代码来尝试ZFS,对ZFS的推广颇有裨益。


      分享内容到此为止,前期将HPC行业趋势、产品和技术的分析梳理成“高性能计算(HPC)技术、方案和行业全面解析电子书,点击原文链接获取资料详细信息。

详谈Lustre背后的故事,ZFS前世和今生_第2张图片


热文阅读

  • 从高性能计算(HPC)技术演变解析方案、生态和行业发展趋势

  • 聊聊Cloud Foundry开源PaaS云平台



温馨提示:

请搜索“ICT_Architect”“扫一扫”二维码关注公众号,点击原文链接获取更多技术资料

640?wx_fmt=png

Stay hungry, Stay foolish

640?wx_fmt=gif

你可能感兴趣的:(详谈Lustre背后的故事,ZFS前世和今生)