ZFS是什么?使⽤ZFS的理由及特性介绍
ZFS 的历史
Z ⽂件系统(Z File System)(ZFS)是由 Matthew Ahrens 和 Jeff Bonwick 在 2001 年开发的。ZFS 是作为太阳微系统(Sun MicroSystem) 公司的 OpenSolaris 的下⼀代⽂件系统⽽设计的。在 2008 年,ZFS 被移植到了 FreeBSD 。同⼀年,⼀个移植ZFS 到 Linux 的项⽬也启动了。然⽽,由于 ZFS 是通⽤开发和发布许可证 (Common Development and Distribution Licen)(CDDL)许可的,它和 GNU 通⽤公共许可证不兼容,因此不能将它迁移到 Linux 内核中。为了解决这个问题,绝⼤多数Linux 发⾏版提供了⼀些⽅法来安装 ZFS。
在甲⾻⽂公司收购太阳微系统公司之后不久,OpenSolaris 就闭源了,这使得 ZFS 的之后的开发也变成闭源的了。许多 ZFS 开发者对这件事情⾮常不满。三分之⼆的 ZFS 核⼼开发者,包括 Ahrens 和 Bonwick,因为这个决定⽽离开了甲⾻⽂公司。他们加⼊了其它公司,并于 2013 年 9 ⽉创⽴了 OpenZFS 这⼀项⽬。该项⽬引领着 ZFS 的开源开发。
让我们回到上⾯提到的许可证问题上。既然 OpenZFS 项⽬已经和 Oracle 公司分离开了,有⼈可能好奇他们为什么不使⽤和GPL 兼容的许可证,这样就可以把它加⼊到 Linux 内核中了。根据 OpenZFS 官⽹的介绍,更改许可证需要联系所有为当前OpenZFS 实现贡献过代码的⼈(包括初始的公共 ZFS 代码以
及 OpenSolaris 代码),并得到他们的许可才⾏。这⼏乎是不可能的(因为⼀些贡献者可能已经去世了或者很难找到),因此他们决定保留原来的许可证。
ZFS 是什么,它有什么特性?
正如前⾯所说过的,ZFS 是⼀个先进的⽂件系统。因此,它有⼀些有趣的特性。⽐如:
存储池
写时拷贝
快照
数据完整性验证和⾃动修复
RAID-Z
最⼤单个⽂件⼤⼩为 16 EB(1 EB = 1024 PB)
最⼤ 256 千万亿(256*1015 )的 ZB(1 ZB = 1024 EB)的存储
让我们来深⼊了解⼀下其中⼀些特性。
如何安装 ZFS?
如果你想⽴刻使⽤ ZFS(开箱即⽤),那么你需要安装 FreeBSD 或⼀个使⽤ illumos 内核的操作系统。 illumos 是OpenSolaris 内核的⼀个克隆版本。
事实上,⽀持 ZFS 是⼀些有经验的 Linux ⽤户选择 BSD 的主要原因。
如果你想在 Linux 上尝试 ZFS,那么只能在存储⽂件系统上使⽤。据我所知,没有任何 Linux 发⾏版可以在根⽬录上安装ZFS,实现开箱即⽤。如果你对在 Linux 上尝试 ZFS 感兴趣,那么 ZFS on Linux 项⽬上有⼤量的教程可以指导你怎么做。存储池
与⼤多数⽂件系统不同,ZFS 结合了⽂件系统和卷管理器的特性。这意味着,它与其他⽂件系统不同,ZFS 可以创建跨越⼀系列硬盘或池的⽂件系统。不仅如此,你还可以通过添加硬盘来增⼤池的存储容量。ZFS 可以进⾏分区和格式化
使⽤ZFS的⼗条理由及特性
1. 再也不需要fsck, scandisk
不管你是在⽤Linux,UNIX还是Windows,相信⼤家都有过类似的体会:当系统意外断电或者⾮法关
机,系统重起后发现⽂件系统有inconsistent的问题,这时候就需要fsck或者scandisk 来修复,这段时间是⾮常耗时⽽且最后不⼀定能够修复成功。更糟糕的是,如果这是⼀台服务器需要做fsck的时候,只能offline(下线),⽽且现有应⽤往往都是⼤硬盘,相应fsck修复时间也很长,这对许多使⽤该服务器的⽤户来说⼏乎不能忍受的。
⽽使⽤ZFS后⼤家可以彻底抛弃fsck这种⼯具,因为ZFS是⼀个基于COW(Copy on Write)机制的⽂件系统。COW是不会对硬盘上现有的⽂件进⾏重写,保证所有硬盘上的⽂件都是有效的。所以不会有这种inconsistent的概念,⾃然就不需要这种⼯具了。
2. 管理简单
ZFS作为⼀个全新的⽂件系统,全⾯抛弃传统File System + Volume Manager + Storage的架构,所有的存储设备是通过ZFS Pool进⾏管理,只要把各种存储设备加⼊同⼀个ZFS Pool,⼤家就可以轻松的在这个ZFS Pool管理配置⽂件系统。⼤家再也不⽤牢记各种专业概念,各种命令newfs, metinit及各种Volume Manager的⽤法。在ZFS中我们只需要两个命令,zpool(针对ZFS Pool管理)和zfs(针对ZFS⽂件系统的管理),就可以轻松管理128位的⽂件系统。举个例⼦,我们经常会遇到系统数据增长过快,现有存储容量不够,需要添加硬盘,如果依照传统的Volume Manager管理⽅式,那我们需要预先要考虑很多现有
因素,还要预先根据应⽤计算出需要配置的各种参数。在ZFS情况下,我们的系统管理员可以彻底解放,再也不需要这种⼈为的复杂考虑和计算,我们可以把这些交给ZFS,因为ZFS Pool会⾃动调节,动态适应需求。我们只需⼀个简单的命令为这个ZFS Pool加⼊新的硬盘就可以了:
zpool add zfs_pool mirror c4t0d0 c5t0d0
基于这个动态调节的ZFS Pool之上的所有的⽂件系统就可以⽴即使⽤到这个新的硬盘,并且会⾃动的选择最优化的参数。⽽且ZFS同时也提供图形化的管理界⾯
3.没有任何容量限制
ZFS(Zettabyte File System)⽂件系统就如其名字所预⽰,可以提供真正的海量存储,在现实中⼏乎不可能遇到容量问题。在现有的64位kernel(内核)下,它可以容纳达到16 Exabytes(264)⼤⼩的单个⽂件,可以使⽤264个存储设备,可以创建264个⽂件系统。
4.完全保证数据的正确和完整
由于ZFS所有的数据操作都是基于Transaction(事务),⼀组相应的操作会被ZFS解析为⼀个事务操作,事务的操作就代表着⼀组操作要么⼀起失败,要么⼀起成功。⽽且如前所说,ZFS对所有的操作是基于COW(Copy on Write),从⽽保证设备上的数据始终都是有效的,再也不会因为系统崩溃或
者意外掉电导致数据⽂件的inconsistent。
还有⼀种潜在威胁数据的可能是来⾃于硬件设备的问题,⽐如磁盘,RAID卡的硬件问题或者驱动bug。现有⽂件系统通常遇到这个问题,往往只是简单的把错误数据直接交给上层应⽤,通常我们把这个问题称作Silent Data Corruption。⽽在ZFS中,对所有数据不管是⽤户数据还是⽂件系统⾃⾝的metadata数据都进⾏256位的Checksum(校验),当ZFS在提交数据时会进⾏校验,彻底杜绝这种Silent Data Corruption情况。
5.提供优异性能和扩展性
和传统File System + Volume Manager + Storage架构不同,ZFS则是直接基于存储设备提供所有的功能,因此有⾃⼰独有的创新特性,性能⾃然⾮⽐寻常。
Dynamic Striping vs. Static Striping
由于ZFS是基于COW和⼀个全局动态的ZFS Pool,任何⼀次写操作,都是对⼀块新数据块(Block)的⼀次写操作。ZFS从ZFS Pool中动态挑选出⼀个最优的设备,并且以⼀个transaction(事务)线性写⼊,充分有效地利⽤了现有设备的带宽,我们把这个特性称为Dynamic Striping。⽽相对应的Static Striping则是传统⽂件系统所使⽤的⽅式,Static Striping需要管理员预先对这组Stripe进⾏正确地计算
⼈为设置,⽽且如果加⼊新的设备则需要再次⼈为的计算和设置,更为严重的是如果⼈为计算错误,则会直接影响系统的性能。⽽在使⽤Dynamic Striping这种特性之后,我们根本不需要⼈为介⼊,ZFS会⾃动调整,智能的为你提供最佳的设备,最快的操作⽅式。
⽀持多种⼤⼩的数据块(Multiple Block Size)
ZFS⽀持多种⼤⼩的数据块定义,从512字节到1M字节。和传统⽂件系统往往都是固定⼤⼩数据块不同,ZFS则是可以动态的根据不同⼤⼩的⽂件进⾏计算,动态的选择最佳的数据块。
因为不同⼤⼩数据块,直接影响到实际使⽤硬盘容量和读取速度。如果使⽤较⼩的数据块,存储⽂件所导致的碎⽚则较少,读写⼩⽂件更快⼀些,但是会导致需要创建更多的metadata,读写⼤⽂件则会更费时。如果使⽤较⼤的数据块,使⽤的metadata较少,更利于读写⼤⽂件,但是会导致更多的碎⽚。ZFS根据实际调查现有⽂件使⽤的情况,分析出⼀个选择数据块⼤⼩的算法,动态的根据实际⽂件⼤⼩确定最佳的数据块。所以ZFS是⾮常智能的,在不需要系统管理员介⼊,就可以得到⼀个⾃我调优的结果。当然ZFS也⽀持⽤户对单个⽂件或者整个⽂件系统所使⽤的数据块⼤⼩的⾃定义设置。
智能预读取(Intelligent Prefetch)
多数的操作系统都有这种将数据预先读取的功能,⽽ZFS则是建⽴在⽂件系统上直接提供的⼀种更加
智能的数据预读取功能。它不仅可以智能地识别出多种读取模式,进⾏提前读取数据,⽽且可以对每个读取数据流进⾏这种预读取智能识别,这个对许多流媒体提供者来说是件⾮常好的事情。
在扩展性上,和现有⽂件系统多是基于⼀个受限的静态模型不同,ZFS是采⽤ZFS Pool这个动态概念,它的metadata也是动态,并且读写操作都是可并⾏的,并且具有优先级概念,所以即使在⼤数据量,多设备的情况下仍可以保证性能的线性增长。
6.⾃我修复功能
ZFS Mirror 和 RAID-Z
传统的硬盘Mirror及RAID 4,RAID 5阵列⽅式都会遇到前⾯提到过的问题:Silent Data Corruption。如果发⽣了某块硬盘物理问题导致数据错误,现有的Mirror,包括RAID 4,RAID 5阵列会默默地把这个错误数据提交给上层应⽤。如果这个错误发⽣在Metadata中,则会直接导致系统的Panic。⽽且还有⼀种更为严重的情况是:在RAID 4和RAID 5阵列中,如果系统正在计算Parity数值,并再次写⼊新数据和新Parity值的时候发⽣断电,那么整个阵列的所有存储的数据都毫⽆意义了。
在ZFS中则提出了相对应的ZFS Mirror和RAID-Z⽅式,它在负责读取数据的时候会⾃动和256位校验码进⾏校验,会主动发现
这种Silent Data Corruption,然后通过相应的Mirror硬盘或者通过RAID-Z阵列中其他硬盘得到正确的数据返回给上层应⽤,并且同时⾃动修复原硬盘的Data Corruption 。
Fault Manager
在Solaris 10中,包含⼀个ZFS诊断引擎和Solaris的 Fault Manager(这也是Solaris 10的另⼀个新特性)交互,可以实时地诊断分析并且报告ZFS Pool和存储设备的错误,⽤户可以通过Fault Manager及时得到⼀个⾮常友善的消息。这个诊断引擎虽然不会采取主动的⾏为去修复或者解决问题,但是会在消息中提⽰系统管理员可采取的动作。类似下⾯⼀个ZFS报错消息,其中REC-ACTION就是建议采取的动作:
SUNW-MSG-ID: ZFS-8000-D3, TYPE: Fault, VER: 1, SEVERITY: Major
EVENT-TIME: Fri Mar 10 11:09:06 MST 2006
PLATFORM: SUNW,Ultra-60, CSN: -, HOSTNAME: neo
SOURCE: zfs-diagnosis, REV: 1.0
EVENT-ID: b55ee13b-cd74-4dff-8aff-ad575c372ef8
DESC: A ZFS device failed. Refer to /msg/ZFS-8000-D3 for more information.
AUTO-RESPONSE: No automated respon will occur.
IMPACT: Fault tolerance of the pool maybe compromid.
REC-ACTION: Run 'zpool status -x' and replace the bad device.
7. 安全
在安全上,ZFS⽀持类似NT风格NFSv4版的ACL(读取控制列表)。⽽且前⾯所提到的256位验证码,⽤户可选择多种验证⽅式,包括SHA-256验证算法,从⽽在物理存储单元级别上保证数据的安全性。
8. 超强功能
ZFS作为“最后⼀个⽂件系统”,涵盖了基本的⽂件系统和Volume管理的功能,同时⼀并提供许多企业级别的超强功能:Quota(配额),Rervation(预留), Compression(压缩), Snapshot(快照),Clone(克隆)。并且速度⾮常快。有了这个⽂件系统,⼤家再也不需要任何Volume Manager了。
9.兼容性
ZFS是⼀个完全兼容POSIX规范的⽂件系统,所以处于上层的应⽤程序是完全不受影响。ZFS也提供⼀个Emulated Volume模块,可以把任何⼀个ZFS⽂件系统作为普通的块设备使⽤。同时ZFS也可以使⽤基于Volume Manager构建的Volume作为存储设备单元。这样在不需要修改应⽤程序,不修改已有⽂件系统下,给了⼤家最⼤的⾃由度去获得ZFS提供的各种特性。10.开源
附加说明
这篇⽂章论述了 ZFS 的优点。现在,让我来告诉你⼀个关于 ZFS 很现实的问题。使⽤ RAID-Z 会很贵,因为你需要购买⼤量的磁盘来增⼤存储空间。
你已经使⽤过 ZFS 了吗?你的使⽤经验是什么样的?
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。如果你想了解更多相关内容请查看下⾯相关链接