Netapp存儲基礎之WAFL, NVRAM, RAID, SnapShot

此章節是重點之重點。先講基本概念。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只是想節省一致性檢查的時間,而對數據的保護不太在乎吧?
 
另附上硬盤空間圖:
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章