最近有一台有十二顆硬碟的機器要上,想說來測試 FreeBSD 7.0 上的 ZFS,結果發現 ZFS 解決的問題有限... 不過對於軟體解決方案來說,是一個很大的進步 :p
ZFS 提供的 RAIDZ 有三種保護方式,第一種是 MIRROR,類似 RAID1 的方式,相同的資料會丟到兩顆上;第二種是 RAIDZ1,與 RAID5 類似的方式 (XOR),擁有一顆硬碟故障的容錯能力;最後則是 RAIDZ2,與 RAID6 類似的方式 (Reed-Solomon),擁有兩顆硬碟故障的容錯能力。這些都因為理論限制而沒有辦法新增硬碟。其中 RAIDZ2 (RAID6) 是目前 FreeBSD 的 gvinum 還沒有提供的功能,這是 ZFS 所帶來的第一個進展。
ZFS 所提供的「擴充性」是以相同的 virtual device 為單位,假設以三顆硬碟完成 RAIDZ1 成為一個 virtual device 後,你可以塞進一個 pool 裡面,而且是不斷的塞:
# zpool create raidz1 mypool ad4 ad6 ad8
# zpool add raidz1 mypool ad10 ad12 ad14
當你用 zpool create raidz1 建立 pool 後,就決定了你後面 zpool add 一定要用「raidz1」、「三顆硬碟」當作增加的單位 (大小倒是沒差),不然會出現:
mismatched replication level: pool uses 3-way raidz and new vdev uses 4-way raidz
或是:
mismatched replication level: pool uses 1 device parity and new vdev uses 2
看起來很像 concat,但比起傳統的 concat,新增的 pool 可以馬上分擔寫入的負荷。而且對於要大不大的企業用戶來說,每次固定增加四顆或八顆硬碟 (一張 SATA 外接卡可接的量) 比起資料搬移的停機容易接受。
再更大的話也許還是用 NetApp 之類的方案吧 :p