此章节是重点之重点。先讲基本概念。WAFL的全称是Write Anywhere File Layout. 从类似于其它UNIX的文件系统比如Berkeley Fast File System (FFS) 和 TransArc Episode file system. 它的核心理念是"文件任意地方写"。先说普通的文件系统,是由inode和data组成,inode处于硬盘的固定位置(一般是初始位置),OS/磁头默认就已经知道了inode的地址,inode可以理解成文件的目录,系统启动后读inode文件便知道此文件系统包含有哪些文件并且知道这些文件所在的地址。而在WAFL里,inode大概分为两层:root inode和inode.  root inode是处于硬盘的固定位置。root inode很小,只有128 Bytes. root inode指向inode的地址。inode是可以放在任何地方的。一个inode文件一般只有4KB. 其实在inode这一层里面是有很多链式的inode的。当一个inode文件不够大,放不下一个大data文件的所有地址时,需要有多个inode文件来为此大data文件"服务",因此WAFL便用上层inode指向下层多个inode的方式。如下图:
 
当文件很小的时候,小到小于4KB时,此文件可直接放于inode里面。节省空间。
思考: 其实微软件用的inode只包含了文件第一个数据块的地址,然后第一个数据块又包含第二个数据块的地块。因此inode不需要那么大,只需要正常大小的inode即可。为何WAFL不用此方法的?这样便可节省inode空间啊...难道因为这是微软的专利?呵呵
NVRAM. 其实准确来说,不能称之为NVRAM,而应该称之为带了电池的RAM。因为NVRAM是不需要供电就可保存数据的。而RAM是要一直供电才能保存数据。所以NetApp里的"NVRAM"其实是有电池供应的RAM。以下就把NetApp "NVRAM"称为NVRAM. 从物理上看,NVRAM有两种结构:第一种是跟RAM共享DIMM, 即一条内存里把一部分空间作为NVRAM,且这部分空间用电池"保护"起来,成为
NVRAM;第二种是NVRAM就是一个卡,跟RAM在物理上没联系,虽然它们的样子都是内存条. 在低端的NetApp产品中多用第一种,在高端的NetApp产品中多用第二种。
RAM存放data缓存,而NVRAM则放操作log. 类似于数据库的archive log.
思考: NVRAM是有电池来保护,但RAM呢?RAM里装的可是data缓存啊。它掉电了可就丢失数据了啊。咨询了很多人,都得不到明确且detail的答复。。。
RAID. NetApp只用RAID 4和RAID DP. 我们知道RAID 4在业界很不受重用,为何?因为它不能支持并发随机IO写!又是为何呢?
RAID 3是利用每一条带的长度很短例如一个扇区512bit来实现性能的提升。它用大文件的支持很有效。但对随机IO读写的时候爱莫能助,因为每一个随机IO读写都要让RAID里的所有硬盘同时工作,它做不到让一个硬盘读写一个IO而另一个硬盘读写另一个IO。所以就有了RAID 4. RAID 4只是改进了RAID 3里的条带长度,比如把512bit改为4KB. 想通过如此来支持随机IO小文件(小于4KB)的读写. 事实上RAID 4是能够支持随机IO读的,但是写的时候就碰到一难题。当一个小于4KB的小文件写的时候需要改写两个盘的数据:Data盘和校验盘,而RAID 4是把其它一个硬盘作为校验盘的,所以当有两个小文件想写的时候,校验盘同一时间只能做一个数据的写了。这样,校验盘便成了瓶颈。这也是为什么后来有RAID 5的原因。RAID 5把校验盘通过条带化分配给了所有硬盘,提高的并发的几率!所以现在RAID 3和RAID 5都有人用,但RAID 4就不受待见,没人爱用了。
而NetApp到底是如何使用了RAID 4的呢? RAID 4只有一种情况可以并发IO写,那就是当要写的两个或多个小文件刚好处于同一条带时!此时,N个数据盘上的同一条带需要改写数据,并且校验盘的同一条带也要改写。WAFL便是通过软件层来让这一情况发生。WAFL通过编程来让一段时间内要写的数据尽量处于同一条带,当然,数据大于一个条带时那就处于相邻的条带了。RAID 4便是如此,WAFL巧妙地利用了它,使它的性能达到最优化。
而RAID DP(Double Parity),其实很类似于RAID 6. 它们的目的都是通过两个校验盘来防止两个数据盘同时掉线而掉数据。只是它们算法不一样。RAID 6用的是数据乘以一个系数后再异或来产生第二个校验数据;而RAID DP是不同条带之间做异或来产生第二个校验数据, 即两个校验盘中一个是横的条带的校验,另一个是斜的条带的校验。在此就不作评细介绍了,RAID的内容有时间再用另一篇幅介绍。
SnapShot. 普遍来说,SnapShot就是某一时刻把当前的数据做一个照相,快照,把它“记”下来,等以后可以把做快照时那一刻的数据翻出来使用。各厂商实现它的时候的方法论是一致的,但方法是不同的。方法论都是把inode复制下来。因为inode文件非常小,对它的copy可在瞬间完成。但在真正实现的时候就各不一样了。主要在三个阶段: 开始snapshot时,对还在内存里的缓存怎么办?然后具体copy inode的哪些信息或者说copy哪些inode? 最后在一次snapshot完成后,怎么保护被snapshot了的数据?即如何保证snapshot之后有数据改写的时候不改变snapshot了的数据?
首先看系统如何保护还在内存中缓存的数据。这些数据是要被snapshot的,但它还没被写进磁盘,且在磁盘的inode里也没有信息。所以系统要对它进行snapshot操作。每个厂商都有不同实现,我不清楚其它厂商是如何做的。而NetApp是把内存的数据分配空间,更新inode从内存到硬盘;更新块图文件;更新磁盘缓存(注意,是硬盘上的缓存。这点也要保护)
其次,其它厂商可能是复制inode文件来作为snapshot, 而NetApp只是复制root inode来作为snapshot.
最后,NetApp是用redirect . write方式来保护snapshot数据(红皮书上写的Write . Copy是不确切的。本质上是redirect . write)。即,snapshot完成后,如果有数据要删除,则只是删除root inode、inode里相应的信息,不删除真正的data;而如果有数据要被改写,则不改变原有data,而是把改写后的数据再完整地写在其它地方,即inode指向其它地址,不占用原有的地址。
思考: 硬盘里打开缓存?那安全性可就非常不高啊。因为掉电的话没法对硬盘的缓存进行保护啊!!
上面三个便是基本概念了,以后我将转载相关文章作详细介绍。本人只写了对这些技术的理解。接下来将会对这几个技术作为整体的思考。因为他们之间关联太紧密了。
WAFL的特性:
1. root inode处于硬盘固定位置,而data和inode可放于任何地方
2. WAFL把data和inode放于相邻的位置。且尽量让一次要写的数据在RAID 4的同一条带上。
3. 利用块图文件来指示某一个块是在被哪个文件系统所用。比如是被当前文件系统所用呢,还是被某一时间的snapshot所用。
4. WAFL从来不覆盖旧块
5. WAFL每次做check point的时候,不仅将实际数据flush到新块,连inode元数据都要写到新块而不覆盖旧块,这也就是snapshot为何胆敢只拷贝root inode就完成了的原因。
思考: 其实Data .TAP是不知道RAID才对。它只负责把数据放于相邻的block上而已吧。
写过程:
RAM里存放将要写进硬盘里的data, 称为data缓存。而NVRAM里存放的着操作的log。log里记录着"新建一个属性为XX的文件", "删除XX文件里的XX内容". NVRAM的空间平均分为两部分,两个空间轮流使用。当一个空间的值超过一定的阀值或者超过10秒,(此时叫consistency point 触发点), 就进行一次flush。即根据NVRAM里的log,把inode写进硬盘,并且清除NVRAM里的log。inode写进去了,那data呢?其实在此次CP之前,data是不断被写进硬盘里的!flush做的仅是把inode写进去!在flush开始后,NVRAM里另一半的空间就接替了原空间作为当前空间接替工作。等下个CP来时,又换回另一空间继续工作。(注意,在cluster的时候
VNRAM是分为四个相同的空间。其中两空间为本node使用,另两空间为对端node使用)
WAFL给RAID芯片发送data和地址. 在这里,RAID芯片可不认识inode和root inode了,RAID只知道data,并且知道哪些data需要存进哪些LBA地址. 若探讨得更底层些,那WAFL层的data和inode是被raid写到同一条带上,当然,RAID会计算出校验数据写进同一条带上的校验盘。而WAFL层的root inode是被写进硬盘的某一固定位置(应该是头部吧?)。磁盘头从与data/inode的位置到root inode的位置需要一定的寻道时间,这个时间省不了。写数据的顺序是先写data/inode再写root inode.
因为这里也有寻道时间。之前我便有个疑惑,普通的文件系统从data到inode有寻道时间,而WAFL从data/inode到root inode也有寻道时间,这似乎并不能减少寻道时间的减少。苦苦思索后,只能这么猜想了: NetApp是在写完一个CP中的所有data/inode后,再写root inode. 这样便节省了一定的寻道时间。。这个问题有待以后慢慢思考
如此一来WAFL便不用耗费大量时间去做一致性检查了。因为它总是先写data,再写root inode. WAFL每10秒就更新一次一致点,这个一致点其实是一个内部的snapshot, 只不过此snapshot无法被访问. 当掉电时,NVRAM可保护log,即保护了操作记录。文件系统能知道掉电前的所有操作还有最近的snapshot。另外,NVRAM记录的log是很精简的,它用很少的空间大小记录了几千几万个操作。就不用再去做文件系统一致性检查了,只用很短的时间便可恢复文件系统。但有一个问题,RAM里的数据是无法保护的啊!到现在我也不知道NetApp对RAM是怎么处理的。如果它对RAM里的数据没有log起来,那它掉电情况下,数据就永远地丢了。可能NetApp只是想节省一致性检查的时间,而对数据的保护不太在乎吧?
 
另附上硬盘空间图: