2009
08.04

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.

Brak komentarzy

Dodaj własny komentarz