Ubuntu上使用ZFS(Zettabyte File System)

ZFS-基於Ubuntu使用Zettabyte File System

ZFS 的支持從 Ubuntu Wily 15.10 開始做爲技術預覽加入,到 Ubuntu Xenial 16.04 實現完整支持。注意 ZFS 只支持 64位架構。另外,ZFS 僅支持 data storage, 不支持 root filesystem(在18.04通過配置後能夠支持)。html

運行ZFS要求空餘內存多於 2GB,建議 ZFS 系統很多於 8GB 內存。linux

安裝 ZFS, 使用:緩存

sudo apt install zfsutils-linux

下面快速預覽 ZFS, 更多的關於 ZFS的信息請參考 excellent documentation ,由 Aaron Toponce 編寫。安全

注意

爲了節約篇幅,本文檔中 devices 指 /dev/sda /dev/sdb 等等。 使用device路徑 /dev/disk/by-uuid 能夠惟一地表明一個設備從而避免在設備名稱映射改變時啓動失敗。網絡

ZFS 虛擬設備 (ZFS VDEVs)

一個 VDEV 是一個meta-device,表明着一個或多個設備。ZFS 支持 7 中不一樣類型的 VDEV:架構

  • File - 預先分類的文件,爲*.img的文件,能夠做爲一個虛擬設備載入ZFS。
  • 物理磁盤驅動器 (HDD, SDD, PCIe NVME, etc)。
  • Mirror - 標準的 RAID1 mirror。
  • ZFS 軟件RAID,如 raidz1, raidz2, raidz3 'distributed' parity。
  • Hot Spare - hot spare(熱備)用於 ZFS 的軟件 raid。
  • Cache - a device for level 2 adaptive read cache (ZFS L2ARC)
  • Log - ZFS Intent Log (ZFS ZIL)。

VDEVS 動態地由 ZFS. 進行分帶。一個 device 能夠被加到 VDEV, 可是不能移除。dom

ZFS Pools

zpool 是存儲池,從一系列VDEVS中建立出來。更多的 ZFS 文件系統能夠從 ZFS pool 中建立出來。ssh

下面的例子中,名爲 "pool-test"的存儲池從3個物理磁盤驅動器中建立出來:ide

$ sudo zpool create pool-test /dev/sdb /dev/sdc /dev/sdd

Striping 被動態地執行,建立了一個零冗餘的RAID-0存儲池。佈局

注意:若是管理不少存儲驅動器,很容易引發混淆,可使用 /dev/disk/by-id/ 名稱機制,提供基於序列號的驅動器標識。上面的方法主要是爲了方便演示。

查看存儲池的狀態:

$ sudo zpool status pool-test

刪除存儲池:

$ sudo zpool destroy pool-test

建立 2 x 2 鏡像的 zpool 例子

下面建立 zpool,包含的 VDEV 有兩個 drives組成爲一個鏡像。

$ sudo zpool create mypool mirror /dev/sdc /dev/sdd

咱們再加兩個驅動器組成的鏡像到存儲池中:

$ sudo zpool add mypool mirror /dev/sde /dev/sdf -f

$ sudo zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0

該例子中:

  • /dev/sdc, /dev/sdd, /dev/sde, /dev/sdf 是物理存儲設備。
  • mirror-0, mirror-1 是虛擬的設備 VDEVs。
  • mypool 是 pool 存儲池。

有不少種佈局 VDEVs 的方法來建立一個存儲池(zpool)。

基於單個文件的 zpool

在下面的例子中,咱們使用單個 2GB 文件做爲 VDEV,而後從該虛擬存儲設備建立 zpool :

$ dd if=/dev/zero of=example.img bs=1M count=2048
$ sudo zpool create pool-test /home/user/example.img
$ sudo zpool status
  pool: pool-test
 state: ONLINE
  scan: none requested
config:

        NAME                      STATE     READ WRITE CKSUM
        pool-test                 ONLINE       0     0     0
          /home/user/example.img  ONLINE       0     0     0

該例子中:

  • /home/user/example.img 是基於文件的VDEV。
  • pool-test 是存儲池。

RAID-磁盤陣列功能

ZFS 提供幾個 RAID 選項:

條帶,Striped VDEVS

等價於 RAID0。沒有校驗和鏡像用於數據重建恢復。該方法不建議使用,當驅動器失效時會形成數據丟失。下面建立一個條帶化的存儲池,使用了 4 個 VDEVs:

$ sudo zpool create example /dev/sdb /dev/sdc /dev/sdd /dev/sde

鏡像,Mirrored VDEVs

相似於 RAID1,使用 2 個以上的VDEVs。對於 N VDEVs,當小於 N-1 個磁盤失效時數據能夠恢復。下面的例子使用 2 個VDEVs建立存儲池。

  • $ sudo zpool create example mirror /dev/sdb /dev/sdc

條帶+鏡像,Striped Mirrored VDEVs

相似於 RAID10,對於小的隨機讀 I/O 比較好。建立鏡像對,而後基於鏡像進行條帶化。 下面建立 2 x 2 條帶化的鏡像池:

sudo zpool create example mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde

或者:

sudo zpool create example mirror /dev/sdb /dev/sdc
sudo zpool add example mirror /dev/sdd /dev/sde

軟件磁盤陣列,RAIDZ

相似於 RAID5, 使用可變寬度的條帶用於奇偶校驗。容許在奇偶校驗的狀況下獲得較大的容量,而又不犧牲太多的性能。容許單個盤失敗的狀況下不丟失信息。建立 4 個VDEV的RAIDZ:

$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

軟件磁盤陣列,RAIDZ2

相似於 RAID6,與RAIDZ相似但具備雙重奇偶校驗。例如,建立 2 parity 5 VDEV 的 pool:

$ sudo zpool create example raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

軟件磁盤陣列,RAIDZ3

3 parity bits,容許三塊盤失敗而不丟失數據,性能與 RAIDZ2 和 RAIDZ差很少。例如,建立 3 parity 6 VDEV 的pool:

$ sudo zpool create example raidz3 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg

軟件磁盤陣列,Nested RAIDZ

相似 RAID50, RAID60, striped RAIDZ volumes。比 RAIDZ更好的執行性能,可是會減小容量,從而增長了使用成本。例如 2 x RAIDZ:

$ sudo zpool create example raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde
$ sudo zpool add example raidz /dev/sdf /dev/sdg /dev/sdh /dev/sdi

日誌加速,ZFS Intent Logs

ZIL (ZFS Intent Log) 驅動器能夠被添加到 ZFS pool 來加速寫入的能力,適用於任何級別的ZFS RAID。最好使用快速的 SSD來存儲ZIL。從概念上說,ZIL 是一種對於 data 和 metadata 的日誌機制,先寫入而後再刷新爲寫事務。實際上, ZIL 更爲複雜,參考 described in detail here。一個或多個驅動器能夠被用於 ZIL。

例如,加入SSDs 到存儲池 'mypool', 使用:

$ sudo zpool add mypool log /dev/sdg -f

緩存加速,ZFS Cache Drives

Cache devices 提供在 memory 和 disk的緩衝層。用於改善靜態數據的隨機讀寫性能。

例如,添加緩衝磁盤 /dev/sdh 到存儲池 'mypool', 使用:

$ sudo zpool add mypool cache /dev/sdh -f

ZFS 文件系統

ZFS 容許每一個存儲池最多建立 2^64 文件系統。咱們在存儲池  'mypool'建立文件系統,以下:

sudo zfs create mypool/tmp
sudo zfs create mypool/projects

刪除文件系統,使用:

sudo zfs destroy mypool/tmp

每個 ZFS 文件系統均可以有屬性設置,例如設置最多 10 gigabytes的使用限額:

sudo zfs set quota=10G mypool/projects

添加壓縮支持:

sudo zfs set compression=on mypool/projects

ZFS snapshot,快照

ZFS snapshot(快照)是 ZFS 文件系統或卷的只讀拷貝。能夠用於保存 ZFS 文件系統的特定時點的狀態,在之後能夠用於恢復該快照,並回滾到備份時的狀態。

下面的例子中,咱們建立 mypool/projects 文件系統的快照:

$ sudo zfs snapshot -r mypool/projects@snap1

能夠查看全部的snapshots列表,使用:

$ sudo zfs list -t snapshot
NAME                     USED  AVAIL  REFER  MOUNTPOINT
mypool/projects@snap1   8.80G      -  8.80G  -

如今, 'accidentally' 破壞文件而後回滾:

$ rm -rf /mypool/projects
$ sudo zfs rollback mypool/projects@snap1

移除snapshot,使用:

$ sudo zfs destroy mypool/projects@snap1

ZFS Clones,克隆

一個ZFS clon是文件系統的可寫的拷貝。一個 ZFS clone 只能從 ZFS snapshot中建立,該 snapshot 不能被銷燬,直到該 clones 也被銷燬爲止。

例如,克隆 mypool/projects,首先建立一個 snapshot 而後 clone:

$ sudo zfs snapshot -r mypool/projects@snap1
$ sudo zfs clone mypool/projects@snap1 mypool/projects-clone

ZFS Send 和 Receive

ZFS send 發送文件系統的快照,而後流式傳送到文件或其餘機器。ZFS receive 接收該 stream 而後寫到 snapshot 拷貝,做爲 ZFS 文件系統。 這對於備份和經過網絡發送拷貝 (e.g. using ssh) 來拷貝文件系統。

例如,建立 snapshot 而後 save 到文件:

sudo zfs snapshot -r mypool/projects@snap2
sudo zfs send mypool/projects@snap2 > ~/projects-snap.zfs

..而後接收回來:

sudo zfs receive -F mypool/projects-copy < ~/projects-snap.zfs

ZFS Ditto Blocks,重複塊

Ditto blocks 建立更多的冗餘拷貝。對於只有一個設備的 storage pool ,ditto blocks are spread across the device, trying to place the blocks at least 1/8 of the disk apart。對於多設備的 pool,ZFS 試圖分佈 ditto blocks 到多個 獨立的 VDEVs. 1 到 3 份拷貝能夠被設置。設置三份拷貝到 mypool/projects:

$ sudo zfs set copies=3 mypool/projects

ZFS Deduplication,文件去重

ZFS dedup 將丟棄重複數據塊,並以到現有數據塊的引用來替代。這將節約磁盤空間,大須要大量的內存。內存中的去重記錄表須要消耗大約 ~320 bytes/block。表格尺寸越大,寫入時就會越慢。

啓用去重功能在 mypool/projects, 使用:

$ sudo zfs set dedup=on mypool/projects

爲了更多的去重 pros/cons ,參考 http://constantin.glez.de/blog/2011/07/zfs-dedupe-or-not-dedupe

ZFS Pool Scrubbing,檢修

初始化數據完整性檢測,經過 zfs scrub 命令執行。如:

$ sudo zpool scrub mypool

經過zpool status 使用 scrub,例如:

$ sudo zpool status -v mypool

數據恢復,簡單的例子

假設有一個 2 x 2 鏡像的zpool:

$ sudo zpool create mypool mirror /dev/sdc /dev/sdd mirror /dev/sde /dev/sdf -f
$ sudo zpool status
  pool: mypool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0

填充數據,而後檢查:

$ dd if=/dev/urandom of=/mypool/random.dat bs=1M count=4096
$ md5sum /mypool/random.dat
f0ca5a6e2718b8c98c2e0fdabd83d943  /mypool/random.dat

模擬 catastrophic data loss,覆蓋 VDEV devices:

$ sudo dd if=/dev/zero of=/dev/sde bs=1M count=8192

初始化 scrub:

$ sudo zpool scrub mypool

而後檢測狀態:

$ sudo zpool status
  pool: mypool
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
        attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
        using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-9P
  scan: scrub in progress since Tue May 12 17:34:53 2015
    244M scanned out of 1.91G at 61.0M/s, 0h0m to go
    115M repaired, 12.46% done
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            sde     ONLINE       0     0   948  (repairing)
            sdf     ONLINE       0     0     0

...從 pool移除驅動器:

$ sudo zpool detach mypool /dev/sde

..熱切換,而後添加一個新的:

$ sudo zpool attach mypool /dev/sdf /dev/sde  -f

..而後初始化scrub,修復 2 x 2 mirror:

$ sudo zpool scrub mypool

ZFS 壓縮

如以前提到,ZFS支持數據的壓縮。經過現代的 CPUs,壓縮減小了數據尺寸,從而讀寫的數據量減小而得到更好的 I/O。ZFS提供了一系列的壓縮方法。缺省的是 lz4 (a high performance replacement of lzjb) ,提供了較快的壓縮和解壓縮效率和較高的壓縮比。能夠設置壓縮的級別。

sudo zfs set compression=gzip-9 mypool

以及設置壓縮的類型:

sudo zfs set compression=lz4 mypool

檢查壓縮比:

sudo zfs get compressratio

lz4 比其它的要快,lz4 是最安全的選項。

相關文章
相關標籤/搜索