Snapshot'y wolumenów ZFS - kilka uwag

Tue 04 August 2009 by admin

OpenSolaris posłużył mi niedawno jako iSCSI target.
Wþływ na ten wybór miał bezwątpienia systemów plików ZFS, dzięki któremu mogłem w łatwy sposób wykonywać snapshot'y i replikacje.
Jednak wykonując snapshot stworzonego wolumenu natknąłem się na drobną przeszkodę rzadko opisywaną, o której będzie za chwilę...

Tymczasem krok po kroku jak do tego może dojść.

Na potrzeby tego krótkiego testu użyłem backing store zpool'a w postaci pliku

# cd /tmp

# mkfile 256m /tmp/vdev.1

# zpool create tank /tmp/vdev.1

następnie stworzyłem wolumen ZFS o zdefiniowanej wielkości

# zfs create -V 150m tank/vol0

zamiast tworzyć iSCSI target stworzyłem (na potrzeby testów) po prostu system plików UFS

# newfs /dev/zvol/rdsk/tank/vol0

# mount /dev/zvol/dsk/tank/vol0 /mnt

# df -h -t ufs

Filesystem      Size  Used Avail Use% Mounted on

/dev/zvol/dsk/tank/vol0
                      141M  1.1M    126M    1% /mnt

wszystko wydaje się ok.

# zfs snapshot tank/vol0@snap0

przebiega pomyślnie, jednak gdy zapełnimy nieco wolumen

# cd /mnt

# mkfile 100m foo.bar

# zfs snapshot tank/vol0@snap1

cannot create snapshot 'tank/vol0@snap1': out of space

to okazuje się, że na nasz snapshot nie ma już miejsca # zfs list -r tank NAME USED AVAIL REFER MOUNTPOINT tank 160M 57.7M 19K /tank tank/vol0 160M 107M 110M -

gdyż tworzać wolumen ZFS zarezerwowaliśmy przestrzeń na niego

# zfs get refreservation tank/vol0
NAME        PROPERTY        VALUE   SOURCE
tank/vol0   refreservation      150M    local

zatem snapshot musi się znaleźć poza obszarem tej rezerwacji, a tam dostępne jest jedynie 57.7MB co nie wystarczy na zrobienie snapshot'a, gdyż wymagana ,,bezpieczna'' przestrzeń to ok. 100MB
aby obejść ten problem możemy wyłączyć wymaganą rezerwację przestrzeni

zfs set refreservation=none tank/vol0

wówczas cała zarezerwowane przestrzeń trafi do całej puli

# zfs list -r tank

NAME    USED    AVAIL   REFER   MOUNTPOINT
tank    111M    107M    19K /tank
tank/vol0   111M    107M    110M    -

jednak musimy się liczyć z możliwymi problemami, gdy zaalokowana przestrzeń zostanie zajęta przez inny wolumen,system plików

# cd /tank

# mkfile 99m make.a.mess

# cd /mnt

# mkfile 20m foo.bar2
# umount /mnt

# fsck /dev/zvol/rdsk/tank/vol0

** /dev/zvol/rdsk/tank/vol0

** Last Mounted on /mnt

** Phase 1 - Check Blocks and Sizes

INCORRECT DISK BLOCK COUNT I=5 (30736 should be 208)

CORRECT?

widać, że zarezerwowane przestrzeń na wolumen nie jest chroniona stąd fsck pokazuje błędy, od wersji 9 zfs domyślną akcją przy tworzeniu jest rezerwacja przestrzeni, chyba, że przy tworzeniu wolumenu skorzystamy z opcji -s czyli tzw. spare volume wówczas parametr refreservation przyjmie wartość none.

Tym krótkim przykładem chciałem zwrócić uwagę na fakt, że tworząc snapshoty musimy uwzględniać ich przyszłą wielkość i rozsądnie gospodarować parametrami takimi jak (ref)reservation zwłaszcza gdy mamy wolumeny z utworzonymi na nich systemami plików, które się rozrastają.
Następnym razem nieco wiecej o ograniczeniach, rezerwacjach.


Comments