ZFS 文件系统研究

ZFS是SUN推出的世界上第一个128位的文件系统,这意味着它能存储1800亿亿(18.4 × 10^1 8)倍于当前64位文件系统的数据。ZFS的设计如此超前以至于这个极限就当前现实际可能永远无法遇到。

以下是ZFS的一些理论极限:

* 2^48 — 任意文件系统的快照数量 (2 × 10^14)
* 2^48 — 任何单独文件系统的文件数 (2 × 10^14)
* 16 exabytes (2^64 byte) — 文件系统最大尺寸
* 16 exabytes (2^64 byte) — 最大单个文件尺寸
* 16 exabytes (2^64 byte) — 最大属性大小
* 3 × 10^23 petabytes (2^78 byte) — 最大zpool大小
* 2^56 — 单个文件的属性数量(受ZFS文件数量的约束,实际为2^4 8)
* 2^56 — 单个目录的文件数(受ZFS文件数量的约束,实际为2^4 8)
* 2^64 — 单一zpool的设备数
* 2^64 — 系统的zpools数量
* 2^64 — 单一zpool的文件系统数量

以上天文数字可以用一句话总结: 以后不用考虑容量的问题

其实上述的数据都是没有太大的意义的,我们其实更想知道的是,在参数在那些情况下 performance 最优,比如,虽然一个目录下的文件数目是可以说没有限制的,但是达到多少性能最优等问题。

ZFS 的一些创新的点:

1)ZPOOL,一个动态可扩展的存储池 

其对外提供一个虚拟的设备,可以动态的添加磁盘,移除坏盘,做mirror, raid0, raidz 等。 基于这个动态调节的ZFS Pool之上的新的逻辑硬盘可以被文件系统使用,并且会自动的选择最优化的参数。

这个有点像SAN ,SAN 对外提供的也是一个虚拟磁盘,该磁盘时可以跨网络的, ZFS是本地文件系统,只能实现本地磁盘。

2)Copy-on-write 技术。 这个技术并不复杂,也不难理解。但是这个技术是有严重的performance的问题的。 

有人说有了这个后,就不需要fsck, scandisk了,这个说法是不对的。 事实上,有了日志文件系(journal filesystem) 后,就不需要fsck这个ugly的东西了。

Copy-on-Write 技术是可以认为是另一个journal 的实现,和日志不同的是,它不是re-do 日志,而是直接修改文件的block的指针。它对于文件本身的数据的完整性是没有问题的,当写一个新的block 时,没有performance的影响,当些一个旧的block时,需要先copy一份,性能可想要大跌。对于元数据,性能损失就更加明显了。

总之,通过这个技术,和Transaction技术一起,确实可以对数据的一致性得到比较好的保护,但是性能的损失如何去弥补,这是一个问题。

3)智能预读取(Intelligent Prefetch)

 prefetch 技术是顺序读的一个性能优化的很好的技术。 ZFS实现了更智能的预定模式。

目前预取技术就是对顺序读比较有效。对于其它类型的访问模式,一是模式检测比较难,其次即使检测出来,由于性能的 bottleneck 可能在别的地方,性能优化并不理想。 ZFS的预取技术,增加了Strip模式的预取,这在ZFS模式下是有效的,其它的模式并没有看到。其次目前都是针对单流预取,针对多流很少。

4)Dynamic Striping

所谓的动态striping,就是可以再不同设备上分配 block,不同设备上当然是并发的写入, 可以认为是一种strip操作。 和 static striping 不同,是需要事前设置。 这个是ZFS的动态存储池本身的架构带来的优势。

5)增加了数据的Checksum校验

这个技术是小技巧,没啥可评价的,看下面的介绍。
由于ZFS所有的数据操作都是基于Transaction(事务),一组相应的操作会被ZFS解析为一个事务操作,事务的操作就代表着一组操作要么一起失败,要么一起成功。而且如前所说,ZFS对 所有的操作是基于COW(Copy on Write), 从而保证设备上的数据始终都是有效的,再也不会因为系统崩溃或者意外掉电导致数据文件的inconsistent。
还有一种潜在威胁数据的可能是来自于硬件设备的问题,比如磁盘,RAID卡的硬件问题或者驱动bug。现有文件系统通常遇到这个问题,往往只是简单的把错误数据直接交给上层应用,通常我们把这个问题称作 Silent Data Corruption。而在ZFS中,对所有数据不管是用户数据还是文件系统自身的metadata数据都进行256位的Checksum(校验),当ZFS在提交数据时会进行校验,彻底杜绝这种Silent Data Corruption情况。

值得注意的是,ZFS通过COW技术和Chumsum技术有效的保护了数据的完整性。

6)Extent的概念:支持多种 大小的数据块(Multiple Block Size)

目前最新的思想,都是丢弃block的概念,引入Extent的概念,Extent就是连续的多个block,注意Extent的block是变长的。多种Block Size 对大文件和 小文件都可以有很好的优化。这个只是剩如何实现了。

7)自我修复功能 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 。

8)提供许多企业级别的超强功能:Quota(配额), Reservation(预留), Compression(压 缩), Snapshot(快照),Clone(克隆)。并且速度非常快。

对于本地文件系统系统,支持Quota,Reservation,Compression 并不难,对于用COW技术,Snapshot,Clone几乎是COW的附带的产品,实现都很容易。

9)ZFS的容量无限制。

他是如何做到的呢?一个就是ZPOOL, 这使得容量可以动态扩展,其次,元数据也是动态分配的,也就是inode也是动态分配的。 对于本地文件系统,我们说的扩展性,这的是容量线性扩展, performance的线性扩展,包括IOPS 和 Bandwidth , 对于ZFS,声称可以实现线性扩展。

最后,有人读过ZFS的源代码吗?最近搜ZFS,BTRFS,EXT4,XFS等文件系统,发现很少有深入的分析,除了几篇概括性的介绍,都还是互相借鉴的结果。ZFS,EXT4 ,BTRFS都出来好多年了啊,还是呼唤源代码级别的深度研究者来分享一下。

你可能感兴趣的:(ZFS 文件系统研究)