FreeBSD系統打造安全可靠的ZFS儲存池

myskies發表於2022-11-24

ZFS pools, VDEVs, physical drivers

  1. 大多數情況下是這樣:physical drivers(物理驅動器)組合在一起形成VDEVs(Virtual Devices虛擬裝置)。當然,VDEVs還可以是

    1. 最普通的單一的物理硬碟
    2. Mirror或是n-way mirror,或者是RAID1
    3. RAIDZ,這個基本上和RAID5一樣,但規避了RAID5的缺點.
    4. RAIDZ2或RAIDZ3,這兩者的區別是使用幾塊硬碟來進行備份
  2. 接著 VDEVs組合成一個ZFS pool。這個池裡的資料分佈在所有的VDEVs上,使用更高階別的條帶化(具說raid5就是這塊有點問題)

所以如果把資料存在池中,如果池中的 VDEVs 有一個不安全,那麼這個資料肯定也不安全。

磁碟資訊

# camcontrol devlist
<NECVMWar VMware SATA CD00 1.00>   at scbus2 target 0 lun 0 (cd0,pass0)
<VMware Virtual disk 2.0>          at scbus32 target 0 lun 0 (pass1,da0)
<VMware Virtual disk 2.0>          at scbus32 target 1 lun 0 (pass2,da1)
<ATA HGST HTS721010A9 A3W0>        at scbus33 target 0 lun 0 (pass3,da2)
<ATA ST500DM002-1BD14 KC65>        at scbus33 target 1 lun 0 (pass4,da3)
<ATA WDC WD10EZEX-08M 1A01>        at scbus33 target 2 lun 0 (pass5,da4)
<ATA ST500DM002-1BD14 KC65>        at scbus33 target 3 lun 0 (pass6,da5)

可見,當前系統有一個 CD 驅動器,兩塊VMware提供的硬碟以及4塊走通的 ATA 硬碟組成.

檢視當前分割槽:

root@nfs:/home/panjie #  gpart show
=>      40  62914480  da0  GPT  (30G)
        40      1024    1  freebsd-boot  (512K)
      1064       984       - free -  (492K)
      2048   4194304    2  freebsd-swap  (2.0G)
   4196352  58716160    3  freebsd-zfs  (28G)
  62912512      2008       - free -  (1.0M)

=>      40  62914480  da1  GPT  (30G)
        40      1024    1  freebsd-boot  (512K)
      1064       984       - free -  (492K)
      2048   4194304    2  freebsd-swap  (2.0G)
   4196352  58716160    3  freebsd-zfs  (28G)
  62912512      2008       - free -  (1.0M)

檢視池資訊

root@nfs:/home/panjie # zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
zroot  27.5G  1.35G  26.1G        -         -     0%     4%  1.00x    ONLINE  -

可見,當前有一個zroot池,大小為27.5GT,已使用了1.35G,可用容量為26.1G,使用率為4%,狀態為線上.

接下來我看看這個zroot池由幾個VDEV組成:

root@nfs:/home/panjie # zpool status
  pool: zroot
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    zroot       ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        da0p3   ONLINE       0     0     0
        da1p3   ONLINE       0     0     0

errors: No known data errors

可見當前zroot由一個VDEV組成,名稱為mirror-0,該VDEV中有兩塊硬碟塊(da0p3實際上是da0硬碟的第3個分割槽)組成.

接下來我們使用另外4塊硬碟組成RAIDZ,並新建一個池叫:yzpool

建立池及RAIDZ

RAIDZ也叫RAIDZ1,指使用1塊硬碟來做備份,組成RAIDZ要求最少有3塊硬碟。

root@nfs:/home/panjie # zpool create -f yzpool raidz da2 da3 da4 da5
root@nfs:/home/panjie # zpool list
NAME     SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
yzpool  1.81T   912K  1.81T        -         -     0%     0%  1.00x    ONLINE  -
zroot   27.5G  1.35G  26.1G        -         -     0%     4%  1.00x    ONLINE  -

此時我們便有了兩個pool,其中一個zroot用於執行系統,該pool有兩塊大小均為30G的虛擬硬碟組成,分別存放在兩塊不同的物理硬碟上。這保證了其中一塊損壞後系統也可以正常執行。另一個yzpool由4塊硬碟組成,兩塊500G,兩塊1T。得益於 ZFS 的優秀機制,我們後期可以任意替換容器小的硬碟從而達到提升儲存池大小的目的。

root@nfs:/home/panjie # zpool status yzpool
  pool: yzpool
 state: ONLINE
config:

    NAME        STATE     READ WRITE CKSUM
    yzpool      ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        da2     ONLINE       0     0     0
        da3     ONLINE       0     0     0
        da4     ONLINE       0     0     0
        da5     ONLINE       0     0     0

errors: No known data errors

此時yzpool這個新池已經被自動掛載到/yzpool上了:

root@nfs:/yzpool # df -h
...
yzpool                1.3T    140K    1.3T     0%    /yzpool

其它

# 檢視yzpool儲存池寫入讀取狀態
# zpool iostat -v yzpool
# 檢視更多寫入、等待狀態
# zpool iostat -vly yzpool 1 1

參考文件

https://docs.freebsd.org/zh-t...

https://docs.oracle.com/cd/E2...

相關文章