這邊的內容是本人參考 ZFS on Linux上面的Document加上自己的使用心得所寫,由於本人學識尚淺若有錯誤在請留言告知~謝謝 <(_ _)>
首先我們必須介紹何謂虛擬裝置(Virtual Devices)或者在ZFS中被廣泛稱為VDEVs,如果你對於RAID已經足夠熟悉,這個觀念對你並不會太過陌生,雖然基本上你並不會將RAID稱之為VDEVs。我們會把一個或多個物理裝置(Physical devices)表示為後設設備或是元設備(Meta devices),在Linux中的軟體RAID (Software RAID)中我們會在/dev/下得到一個名為md0的裝置名稱,它可以被用來表示你所建制的RAID 例如: 一個擁有四個硬碟的RAID-5。這邊我們稱它為VDEV。
VDEVs在ZFS中有以下七種型態:
VDEVs在ZFS中有以下七種型態:
- 硬碟(預設)~系統上的物理硬體裝置。
- 檔案~已分配大小並有絕對路徑的檔案/映像檔。
- 鏡像裝置(Mirror)~標準軟體RAID-1的鏡像備份裝置。
- RAIDZ-1/2/3~非標準分散奇偶式軟體RAID (ZFS專屬的特殊RAID)。
- 備用磁碟(Spare)~用來作為ZFS軟體RAID之『熱備份』(Hot Spare)用的硬體裝置。
- 快取(Cache)~用來作為Level 2 快取用的硬體裝置(L2ARC)。
- Log~一個分離式的Log,ZFS稱之為SLOG或是ZIL(ZFS Intent Log)。
這邊需要注意的事 VDEVs是一個動態的Striped;待我們操作指令後會比較有感覺。底下會由四個硬碟所組成的ZFS striped,這個Striped的總容量大小是看有多少顆硬碟所組成的陣列容量。所以越多顆硬碟加入容量大小就會隨著調整,因此稱為動態Striped。
Zpool的注意事項
這邊只有針對一些關於ZFS的注意事項。
- 一旦將一個裝置加入VDEV後,此裝置就無法從VDEV中移除。
- 你無法縮小Zpool,只能加大它。
- RAID-0的速度比RAID-1快,RAID-1又比RAIDZ-1快,RAIDZ-1又比RAIDZ-2快,RAIDZ-2又比RAIDZ-3快。
- Hot Spare的動態替換功能預設是關閉,除非你去開啟它
- 一個Zpool中若使用較大的硬碟來替換原本裡面較小的硬碟時,Zpool不會自動變更總體容量大小!除非在你建立此Zpool時有開啟resize的功能(預設off)
- Zpool 本身有支援 4k sector的格式硬碟如果裝置有report的時候。
- 刪除重複資料功能(Deduplication) 是一個非常耗資源的功能,它會嚴重降低效能如果你安裝的記憶體不夠多的時候或者pool太大、非本地端的系統時
- 換句話說:壓縮功能非常的便宜就現在的CPU而言,但是它預設是關閉的。
- 當Fragmentation大量產生時,ZFS效能會有明顯感覺到降低。
- ZFS有支援原生加密,但是它不是免費的功能,所有權是屬於Oracle的。
一個簡單的Pool
我們開始建立一個由四個drives構成並且命名為clover的Pool吧:
# zpool create clover sdb sdc sde sdd
上敘的指令讓我們建立一個由四個VDEVs構成的一個名為clover的pool。注意到參數部份我們不需要給與絕對路徑,當然你也可以使用絕對路徑來設定,ZFS本身會自動從/dev/去抓取。這樣子我們就建立一個4個drives構成的RAID-0磁碟陣列了(沒有備份安全功能),接著我們來看看zpool的狀態吧。
# zpool status clover
pool : clover
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No Known data errors
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No Known data errors
我們拆除它建立一個新的zpool吧!
# zpool destroy clover
一個簡單鏡像zpool
下一個例子我們希望建立一個四個drives的鏡像陣列,在這邊命令參數裡面需多一個"mirror"。
# zpool create clover mirror sdb sdc sdd sde
# zpool status clover
pool : clover
state : ONLINE
scan : none requested
config:
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No Know data errors
state : ONLINE
scan : none requested
config:
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No Know data errors
注意!mirror-0 現在為VDEV,由它管理每一個物理裝置就如同我們先前講得:『Linux下software RAID裡的"/dev/md0"』接著我們拆除這個zpool建立另一個。
# zpool destroy clover
巢狀 VDEVs
我們也可以建立巢狀VDEVs,最簡單的例子就是RAID-1+0 (通常也寫成RAID-10),這是一個鏡像的striped剛好用來解釋巢狀VDEVs,使用下方指令來建立吧。
# zpool create clover mirror sdb sdc mirror sdd sde
# zpool status clover
pool : clover
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No known data errors
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
sdb ONLINE 0 0 0
sdc ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
sdd ONLINE 0 0 0
sde ONLINE 0 0 0
errors : No known data errors
以上就是一個RAID-1+0的巢狀VDEVs的例子。別忘了拆除它繼續下面範例!
# zpool destroy clover
檔案形式VDEVs
這邊我們先建立幾個已經有佔空間大小的檔案在EXT4的file system上面,通常檔案形式的VDEVs多為測試用,如測試壓縮率(Compression ratio)、沙盒(Sandbox)或是deduplication table而非拿來做儲存產生的資料。由於並不是透過裝置來建立所以必須給定絕對路徑,且檔案大小必須事先分配好而非稀疏檔案(spare file)或是精簡配置(thin provisioned)。
首先我們使用for這個script 搭配dd來產生四個大小約100MB的檔案。
首先我們使用for這個script 搭配dd來產生四個大小約100MB的檔案。
# for i in {1..4}; do dd if=/dev/zero of=/tmp\
>/file$i bs=10M count=10 &> /dev/null; done
>/file$i bs=10M count=10 &> /dev/null; done
# zpool create clover /tmp/file1 /tmp/file2 /tmp/file3 /tmp/file4
# zpool status clover
pool : clover
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
/tmp/file1 ONLINE 0 0 0
/tmp/file2 ONLINE 0 0 0
/tmp/file3 ONLINE 0 0 0
/tmp/file4 ONLINE 0 0 0
errors: No known data errors
state : ONLINE
scan : none requested
config :
NAME STATE READ WRITE CKSUM
clover ONLINE 0 0 0
/tmp/file1 ONLINE 0 0 0
/tmp/file2 ONLINE 0 0 0
/tmp/file3 ONLINE 0 0 0
/tmp/file4 ONLINE 0 0 0
errors: No known data errors
這邊我們建立一個以檔案作為VDEVs的RAID-0,當然你也可以作成RAID-1或是RAID-1+0 是你的需求而定。
# zpool destroy clover
混和式 pools
由於本人VM上面沒有建立那麼多的disk可以在ZFS中的pool裡面做給各位看(偷懶一下!!),所以只會列出指令給大家參考!
# zpool create clover mirror sdb sdc mirror sdd sde log mirror sdf sdg cache sdh
在這邊我們並不特別解釋這個混和pool的相關內容,只是簡單的介紹這是一個RAID-1+0並且將log資料也做鏡像保護儲存來達到資料儲存的完整性、安全性。這邊使用到ZIL(ZFS intent log)詳細內容待以後章節再來介紹。在這邊關於Cache的部份是可以使用固態硬碟(SSD)來加速效能。
此章節唯一沒介紹的是Spare(備份)主要目的是讓大家有個VDEVs的觀念與操作,並且稍微涵蓋一些RAIDZ的層級接下來後續章節會待大家更了解ZFS的file system的各項設定、優缺點....等,之後便是ZFS的主要核心部份~~待續。
此章節唯一沒介紹的是Spare(備份)主要目的是讓大家有個VDEVs的觀念與操作,並且稍微涵蓋一些RAIDZ的層級接下來後續章節會待大家更了解ZFS的file system的各項設定、優缺點....等,之後便是ZFS的主要核心部份~~待續。
留言
張貼留言