ZFS-自我恢復RAID
這個給了我一個簡單而又強大的理由,讓我立馬爲之折服,ZFS可以自動的檢測發生的錯誤,而且,可以自我修復這些錯誤。假設有一個時刻,磁盤陣列中的數據是錯誤的,不管是什麼原因造成的,當應用程序去訪問這一塊數據時,ZFS會像上一篇介紹的一樣通過構建每一塊數據,並且通過SHA-256方式校驗每一塊數據的校驗位,如果發現數據讀條帶數據不能匹配校驗,那麼就會認爲是發生了數據損壞,然後通過奇偶組合方式進行恢復這一塊數據,然後返回給調用他的應用程序。這一切都是由ZFS文件系統自身來完成,無需藉助特殊的硬件。另外一方面,如果條帶長於磁盤陣列,如果一個磁盤發生了故障,這裏就沒有足夠的奇偶校驗可以來重建這些數據,所以我們還必須爲此添加一塊鏡像盤以防止此類情況的發生。
如果你的文件系統和RAID是分別獨立的,他們互相不瞭解對方,那麼這種靜默式的修復是完全不可能的。
RAIDZ-1
RAIDZ-1和RAID-5是很相似的,有一個單一的奇偶校驗位位於所以的磁盤陣列中,而且條帶的寬度都是可變的,基本可以涵蓋所有的磁盤陣列的寬度,可以是很多的磁盤,或者很少的磁盤,在上一節的圖片說的很明顯了,他們都允許一個磁盤發生故障時對他進行修復,RAIDZ-1也最少使用3個磁盤,您的存儲容量是最小磁盤的容量大小減去磁盤存儲的奇偶校驗位大小,在一下的例子中,我會使用大約16G的磁盤。
要設置一個存儲池採用一個RAIDZ-1,我需要3個USB磁盤驅動器。
# zpool create tank raidz1 sde sdf sdg
# zpool status tank
pool: pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
errors: No known data errors
# zpool destroy tank
RAIDZ-2
RAIDZ-2和RAID-6十分相似,他採用雙奇偶校驗位進行校驗,分佈在陣列中的所有磁盤中,條帶的寬度也是可變的,可以涵蓋磁盤陣列的確切的寬度,很少的磁盤,或者很多的磁盤。由於採用雙奇偶校驗,所以可以允許最多2個磁盤發生故障,超過就會導致數據丟失,爲了成功搭建RAIDZ-2,必須要至少4個磁盤,您的磁盤存儲容量是最小的那個磁盤容量減去兩個存儲奇偶校驗位的大小,在例子中,我使用了大約16G的磁盤。
通過以下步驟來設置RAIDZ-2
# zpool create tank raidz2 sde sdf sdg sdh
# zpool status tank
pool: pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool ONLINE 0 0 0
raidz2-0 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
errors: No known data errors
# zpool destroy tank
RAIDZ-3
他並不能稱爲一個標準的RAID,不過可以看着是RAIDZ-1和RAIDZ-2的延伸,基本概念和RAID-1/2是一致的,只不過他擁有3組奇偶校驗位,他可以允許至多3個磁盤數據丟失,要搭建他至少需要5個磁盤,他的存儲容量爲最小盤容量減去3個奇偶校驗位產生的存儲容量,在例子中,我使用了16G磁盤。
使用以下步驟設置RAIDZ-3
# zpool create tank raidze sde sdf sdg sdh sdi
# zpool status tank
pool: pool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
pool ONLINE 0 0 0
raidz3-0 ONLINE 0 0 0
sde ONLINE 0 0 0
sdf ONLINE 0 0 0
sdg ONLINE 0 0 0
sdh ONLINE 0 0 0
sdi ONLINE 0 0 0
errors: No known data errors
# zpool destroy tank
關於RAIDZ最後一些想法
對於什麼時候使用RAIDZ-1/2/3我沒有什麼建議,有些人說,RAID-1和RAID-3應該使用在奇數個磁盤上,RAID-1的使用實在3個磁盤以上,7個磁盤一下使用,而RAID-3則實在7個磁盤以上時使用,不超過15個。RAIDZ-2應該使用偶數個磁盤上,最少6個磁盤,不超過12個的時候。這是爲了確保你的偶數數據被寫入到磁盤中時,陣列的性能最大化。
相反,在我看來,你應該保持一個低消耗的RAIDZ陣列,對與RAIDZ-1來說,3、5、9個磁盤比較合適,4、6、10、18對於RAIDZ-2比較合適,而RAIDZ-3則應該是5、7、11、19個磁盤最佳,如果不這麼做,我個人寧願使用RAID-1+0來實現RAID,因爲在很多磁盤的時候,和RAID-10對比,去計算他的RAIDZ的奇偶校驗代價真是太昂貴了。
此外,我還看到一些這樣的建議,不超過1TB的磁盤使用RAIDZ-1,2TB的磁盤使用RAIDZ-2,3TB的磁盤使用RAIDZ-3,而超出這些值時,你應該使用2路或者3路鏡像條帶化。我不能評價這些說法的準確性等,不過,我可以說的就是,在較少的磁盤數量時,你應該使用一個RAID級別容納你現在的缺點,這是不會錯誤的。在4個磁盤中,使用多個奇偶校驗會讓你犧牲大量的性能,但是如果我也遇到過2個磁盤同時失效的情況(這情況可以使用RAID-10或者RAIDZ-2來修復),這時候,既不能大量的消耗性能,也不能丟棄正確性,採用RAIDZ-1是很合適的,他可以承受一個磁盤發生故障,同時也不消耗大量的性能。當然,如果你有12個磁盤,那我認爲,RAIDZ-3會更合適,因爲他可以承受更多的磁盤發生故障而不造成數據丟失。
最終,你還是需要了解你自己本身磁盤的情況、數量,還有需要面臨的問題,然後選擇不同RAID方案,並使用合適的工具測試,比如IOZONE進行壓力測試等。你知道要存入的是什麼數據,你要知道在磁盤上安裝什麼硬件,你還要知道你需要達到一個什麼樣的效果,這些都有你來決定,如果你肯花時間來研究,做許多的功課,那麼你一定可以搭配出一套最佳的方案。
最後,在性能方面,鏡像在讀寫時要強於RAIDZ,RAIDZ-1的表現又強於RAIDZ-2,他的打開表現將優於RAIDZ-3,你去讀取或寫入數據時,越多的校驗位需要計算,那麼時間就越長,當然,你可以隨時的添加或者拆分VDEVS來讓這個數據最優。例如嵌套級別的RAID(RAID-10),他具有很強大的靈活性。總之,從快到慢,非嵌套級別的RAID順序如下:
RAID-0 (fastest)
RAID-1
RAIDZ-1
RAIDZ-2
RAIDZ-3 (slowest)