ZFS VDEV 虛擬裝置介紹與使用 (3)


這邊的內容是本人參考 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中有以下七種型態:
  1. 硬碟(預設)~系統上的物理硬體裝置。
  2. 檔案~已分配大小並有絕對路徑的檔案/映像檔。
  3. 鏡像裝置(Mirror)~標準軟體RAID-1的鏡像備份裝置。
  4. RAIDZ-1/2/3~非標準分散奇偶式軟體RAID (ZFS專屬的特殊RAID)。
  5. 備用磁碟(Spare)~用來作為ZFS軟體RAID之『熱備份』(Hot Spare)用的硬體裝置。
  6. 快取(Cache)~用來作為Level 2 快取用的硬體裝置(L2ARC)。
  7. 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的。
以下例子我們假設4個drives:/dev/sdb , /dev/sdc , /dev/sde , /dev/sdd 來實做。

一個簡單的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
我們拆除它建立一個新的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
注意!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
以上就是一個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  i  in  {1..4};  do  dd  if=/dev/zero  of=/tmp\
>/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
這邊我們建立一個以檔案作為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的主要核心部份~~待續。

留言