ZFS-自我恢復RAID

ZFS-自我恢復RAID

       這個給了我一個簡單而又強大的理由,讓我立馬爲之折服,ZFS能夠自動的檢測發生的錯誤,並且,能夠自我修復這些錯誤。假設有一個時刻,磁盤陣列中的數據是錯誤的,不論是什麼緣由形成的,當應用程序去訪問這一塊數據時,ZFS會像上一篇介紹的同樣經過構建每一塊數據,而且經過SHA-256方式校驗每一塊數據的校驗位,若是發現數據讀條帶數據不能匹配校驗,那麼就會認爲是發生了數據損壞,而後經過奇偶組合方式進行恢復這一塊數據,而後返回給調用他的應用程序。這一切都是由ZFS文件系統自身來完成,無需藉助特殊的硬件。另一方面,若是條帶長於磁盤陣列,若是一個磁盤發生了故障,這裏就沒有足夠的奇偶校驗能夠來重建這些數據,因此咱們還必須爲此添加一塊鏡像盤以防止此類狀況的發生。html

      若是你的文件系統和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的磁盤。spa

經過如下步驟來設置RAIDZ-2code

 

# 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磁盤。htm

      使用如下步驟設置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個的時候。這是爲了確保你的偶數數據被寫入到磁盤中時,陣列的性能最大化。ast

       相反,在我看來,你應該保持一個低消耗的RAIDZ陣列,對與RAIDZ-1來講,三、五、9個磁盤比較合適,四、六、十、18對於RAIDZ-2比較合適,而RAIDZ-3則應該是五、七、十一、19個磁盤最佳,若是不這麼作,我我的寧願使用RAID-1+0來實現RAID,由於在不少磁盤的時候,和RAID-10對比,去計算他的RAIDZ的奇偶校驗代價真是太昂貴了。class

      此外,我還看到一些這樣的建議,不超過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)

相關文章
相關標籤/搜索