Snapshot'y wolumenów ZFS - kilka uwag
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.
powered by Hugo and Noteworthy theme