A SUN forradalmi módon akarta az adattárolást, volumekezelést, filesystem gondokat megoldani, amikor megalkotta a ZFS (Zettabyte File System)-t. Azóta eléggé meghatározóvá vált maga a ZFS és mindaz a szemlélet amit magával hozott. Erről szeretnék egy összefoglalót nyújtani.
Kezdjük az elején azon dolgok összegyűjtésével ami megnehezíti a tárhelykezelést:
-
– Nevek, partíciók, volume-k, rendelekezésre állás, növelés, csökkentés, konfigurációs file-k tömege
– Limitek kezelése filesystemek, volume-k, file méretek, file számosságok, snapshotok esetén
– Külön 3rd party toolok a blokk és file alapú megosztások kezeléséhez
– Portolási problémák különböző platformok esetén (x86, SPARC, PowerPC, ARM, …)
– Lineáris létrehozási idő, fix blokk méretek, hosszadalmas RAID újraépítési idő, növekvő backup idők
Ezen dolgokon akar változtatni a SUN a zfs-el. Kezdjük az átlag felhasználó számára talán leglényegtelenebb dologgal, ami a Zettabyte névből fakad ami a tíz a huszonegyediket jelent. Ez a nagy szám már sok mindenre utal, többek között az új nagyságrendi korlátokkal is. A zfs ugyanis az átlag 64 bites rendszerekkel ellentétben 128 bites. Nézzük ez milyen új hatalmas korlátokat jelenthet a tárolásban:
- 2^64 — Number of snapshots of any file system
- 2^48 — Number of entries in any individual directory
- 6 EiB (2^64 bytes) — Maximum size of a file system
- 16 EiB — Maximum size of a single file
- 6 EiB — Maximum size of any attribute
- 256 ZiB (2^78 bytes) — Maximum size of any zpool
- 2^56 — Number of attributes of a file (actually constrained to 248 for the number of files in a ZFS file system)
- 2^64 — Number of devices in any zpool
- 2^64 — Number of zpools in a system
- 2^64 — Number of file systems in a zpool
ZFS Pool-ok
A ZFS szakítva a tradicionális volume managerekkel, amikre utána külön szeparált filesystem-et kellett rakni, egybeépítette a filesystem-et és a volumemanager-t. Viszont ezt nem úgy kell elképzelni, hogy egy termék, aminek van volume manager része, és filesystem része mint például a Veritas Storage Foundation-nek. A ZFS egy filesystem, ami egyben volume kezelésre is használható.
Hogy ezt jobban meg lehessen érteni bele kell magunkat ásni a szerkezetébe. A ZFS úgynevezett pool filozófiát követ. Egy közös zsákot, amibe egyik részről dobálunk erőforrásokat (diskeket), ezzel egy nagy közös név alatt létező adattömeget kapva, majd ebből az adat tömegből (pool-ból) oszthatunk ki tárolásra szánt filerendszereket.
Ez a pool dolog megfelel az SVM alatt egy metadevice-nak. A pool-t tehát maguk a fizikai diskek tesztesítik meg. A pool-nak lennie kell egy nevének, ami egy metadevice neveként funkcionálhat, amire hivatkozhatunk. A poolban pedig még azt kell tudnunk definiálni, hogy a fizikai diskek között milyen fajta RAID szintnek megfelelő kapcsolatot, tömbösítést kívánunk alkalmazni. Redundancia nélkül (hasonló mint a RAID 0), tükrözve (RAID 1) két vagy több eszközt, vagy RAID-Z csoportba három vagy több eszközt (egy elem kiesését tolerálja), vagy RAID-Z2 csoportba négy vagy több eszközt (két elem kiesését tolerálja). 2009 Júliusa óta a három paritásos RAID-Z3 technológia is elérhető az OpenSolaris-ban. Ezen túl poolokhoz opcionálisan adhatunk külön táró eszközöket hot spareként, illetve gyorsítótárként. Mint majd a lentebbi példákon látszik majd, nagyon könnyen megtehetjük ezt, egyszerű parancsok segítségével, a poolok bővítése, rendezése pedig szintén dinamikus és könnyű.
Ahogy SVM esetében, úgy ZFS esetében is vannak meta adatbázisok. Mi több a ZFS esetében ez sokkal fontosabb szereppel bír, mert az egész ZFS egy adminisztráció alapú meta adatbázis gyakorlatilag. Az úgynevezett Copy-on-Write alapú paradigmára épül, amit leegyszerűsítve úgy lehetne lehetne definiálni, mely fordítása talán „írás esetén másolás” lehetne – egy széles körben alkalmazott módszer a I/O műveleteinek optimalizálására. A copy-on-write jó példája az ún. lusta kiértékelés/végrehajtás (lazy evaluation) elvnek, ami azt mondja, hogy a rendszerben a költséges, vagyis sok erőforrást igénylő műveleteket el kell halasztani mindaddig, amíg azok végrehajtása már ténylegesen kikerülhetetlen nem lesz. Tehát a magát a műveletet lekönyveli a meta adabázisába, majd amikor jut idő, energia akkor ténylegesen kiírja lemezre is.
Ez az adminisztráció gyakorlatilag teljes optimalizálást tesz lehetővé a poolunk előlünk elrejtve megfelelőképp írja ki az adatokat a lemezekre, végez menetközbe optimalizálást, átszervezést, anélkül, hogy mi tudnánk, illetve, hogy foglalkozunk kellene vele.
Ebből a teljes adminisztrációból következik, hogy elég egyszerűen lehet klónozni, illetva snapshotot készíteni, hisz csak a megfelelő meta adatokat kell megduplikálni, és az utána következő módosításokat kezelni, amit a copy-on-write megoldás nagyben segít.
Limitációk és attribútomok
Az SVM-es hasonlatnál maradva, amikor létrejön egy metadevice az ugyan úgy használható, mint egy zpool. Persze a zpool a /ZPOOL_NEVE alatt egyből elérhető lesz, míg a metadevice esetében külön filesystem-et kell tennünk rá, és mountolni ahová szeretnénk. Szintén hasonló kép mint a softpartíciók esetében, a zpool esetében is lehetőségünk van filesystem-eket létrehozni a zpoolból. Amikor egy filesystemet csinálunk, az a /ZPOOL/FILESYSTEM_NEVE alatt egyből elérhető is lesz.
Alapvetően ez csak egy újabb meta adminisztrációs elem lesz. A létrejövő filesystem teljes semmilyen beállítással, vagy limitációval nem rendelkezik, így a pool összes erőforrását uralni tudja. Tehát az új filesystem-et testre kell szabnunk minden féle attributum, beállítás, limitáció megadásával. Talán a legfontosabb néhány:
– mountpoint path (mivel alapvetően a leírt struktúrában érhető el az új filesystem a mountpoint beállítás segítségével adhatjuk meg, amennyiben máshová szeretnénk mountolni)
– reservation (az adatmennyiség amit le akarunk foglalni ennek a filesystemnek, függetlenül hogy ki van e használva hogy nem)
– quota (ez csak egy felső limit amit nem léphet túl a filesystem, cserébe amennyiben más filesystemek felélik a zpool szabad kapacitását, hiába a filesystemünk nem érte el a quota határát előfordulhat, hogy nem tudunk majd már bele írni)
– compression (lehetőségünk van adattömörítés használatára, azaz x adatot ténylegesen csak y tárhelyre írunk ki, értelemszerűen x nagyobb y . Több féle tömörítő algoritmus is létezik)
– sharenfs/sharesmb (a meglővő filesystem-et egy kapcsoló segítségével meg is oszthatjuk hálózatunkon)
Deduplikáció
Megemlíteném ezt a nagyon friss újdonságot, ami jelenleg még csak a legújabb OpenSolarisokban érhető el. Ez a deduplikáció, és ahogy a nevéből is fakad az egyező adatok többszörös tárolását kivédendő szolgáltatás lenne. Kicsit talán hasonlíthatnám a tömörítéshez, de természetesen ez teljesen más.
Mikor hol használhatom a ZFS-t?
A Solaris 10 update 6 óta szerves része a ZFS a Solaris-nak, sőt még root filerendszernek is használható. Portolták már FreeBSD-re is. Sajnos a licenselése miatt a Linux kernel része nem lehet, csak userspace-ben futtatható FUSE rendszerekkel. A ZFS ennek ellenére, nyílt és szabadon fejleszthető bárki számára.
Egy hosszú példa a ZFS használatára
Parancs kimenet | Magyarázat |
---|---|
$ man zpool $ man zfs |
Dokumentáció |
$ su Password: # cd / # mkfile 100m disk1 disk2 disk3 disk5 # mkfile 50m disk4 # ls -l disk* -rw——T 1 root root 104857600 Sep 11 12:15 disk1 -rw——T 1 root root 104857600 Sep 11 12:15 disk2 -rw——T 1 root root 104857600 Sep 11 12:15 disk3 -rw——T 1 root root 52428800 Sep 11 12:15 disk4 -rw——T 1 root root 104857600 Sep 11 12:15 disk5 |
Csinálunk pár file-t amit virtuális diskként fogunk használni, természetesen ezek lehetnek slice-k is. |
# zpool create myzfs /disk1 /disk2 # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT myzfs 191M 94K 191M 0% ONLINE – |
Létrehozunk egy storage poolt, és ellenőrizzük a státuszát |
# zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Részletesebb információk a poolról. |
# zpool destroy myzfs # zpool list no pools available |
Egy storage pool megsemmisítése. |
# zpool create myzfs mirror /disk1 /disk4 invalid vdev specification use ‘-f’ to override the following errors: mirror contains devices of different sizes |
Különböző méretü diskek esetén a -f kapcsolóval kell eröltetnünk a tükör létrehozását. Ilyenkor persze a kisebb disk méretét használja csupán a rendszer. |
# zpool create myzfs mirror /disk1 /disk2 /disk3 # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT myzfs 95.5M 112K 95.4M 0% ONLINE – # zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy három utas mirror storage pool létrehozása. |
# zpool detach myzfs /disk3 # zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy device lecsatolása a poolból. |
# zpool attach myzfs /disk1 /disk3 # zpool status -v pool: myzfs state: ONLINE scrub: resilver completed with 0 errors on Tue Sep 11 13:31:49 2007 config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy új devicet adunk a poolhoz, ezzel egy három utas tükröt hozva létre. |
# zpool remove myzfs /disk3 cannot remove /disk3: only inactive hot spares can be removed # zpool detach myzfs /disk3 |
Alap esetben ezzel lehet egy device-t eltávolítani a poolból, de mirror esetén a zpool detach használandó. |
# zpool add myzfs spare /disk3 # zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Hot spare disk hozzáadása a poolhoz. |
# zpool remove myzfs /disk3 # zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Hot spare disk eltávolítása a poolból. |
# zpool offline myzfs /disk1 NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy kiválasztott disk állapotát offlinera állíthatjuk. Ebben az esetben nem történik rá írás illetve olvasás. A -t kapcsolót használva a következő rebootnál újra online állapotba jön fel. |
# zpool online myzfs /disk1 # zpool status -v pool: myzfs state: ONLINE scrub: resilver completed with 0 errors on Tue Sep 11 13:47:14 2007 config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy kiválasztott disket online-ba tenni. |
# zpool replace myzfs /disk1 /disk3 # zpool status -v pool: myzfs state: ONLINE scrub: resilver completed with 0 errors on Tue Sep 11 13:25:48 2007 config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy disk kicserélése a poolban egy másik diskre. |
# zpool scrub myzfs | Scrub futtatása esetén a metaadabázis ellenörzi a checksumokat és ha szükséges javítja az eltéréseket. FIGYELEM:A scrub nagyon I/O igényes művelet. |
# zpool export myzfs # zpool list no pools available |
Exportálni egy poolt az egyik rendszerből, hogy azt egy másik rendszer tudja importálni. |
# zpool import -d / myzfs # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT myzfs 95.5M 114K 95.4M 0% ONLINE – |
Import a previously exported storage pool. If -d is not specified, this command searches /dev/dsk. As we’re using files in this example, we need to specify the directory of the files used by the storage pool. |
# zpool upgrade This system is currently running ZFS pool version 8. All pools are formatted using this version. The following versions are supported: VER DESCRIPTION http://www.opensolaris.org/os/community/zfs/version/N Where ‘N’ is the version number. |
A pool verziójának megjelenítése és szükség esetén upgrade-lése. |
# zpool iostat 5 capacity operations bandwidth pool used avail read write read write ———- —– —– —– —– —– —– myzfs 112K 95.4M 0 4 26 11.4K myzfs 112K 95.4M 0 0 0 0 myzfs 112K 95.4M 0 0 0 0 |
I/O statisztika kérése a poolról. |
# zfs create myzfs/colin # df -h Filesystem kbytes used avail capacity Mounted on … myzfs/colin 64M 18K 63M 1% /myzfs/colin |
Filerendszer készítése. A df -h parancs jól mutatja, hogy nincs még limitáció beállítva, és automatikusan mountolódott. |
# zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 139K 63.4M 19K /myzfs myzfs/colin 18K 63.4M 18K /myzfs/colin |
ZFS lista lekérése. |
# zpool add myzfs /disk1 |
Egy szimpla device hozzáadása nem lehetséges a tükörhöz. |
# zpool add myzfs mirror /disk1 /disk5 # zpool status -v pool: myzfs state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM errors: No known data errors |
Egy Mirror párral már bővíthető a tükör pool. |
# zfs create myzfs/colin2 # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 172K 159M 21K /myzfs myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin2 18K 159M 18K /myzfs/colin2 |
Egy második filesystem-et hozunk létre. Jól látszik, hogy mindegyik mérete azonos, hisz még nem állítottunk limitációt. Természetesen a filesystemek mérete a pooléval nő ilyenkor. |
# zfs set reservation=20m myzfs/colin # zfs list -o reservation RESERV none 20M none |
Egy speciális méretű tárterületet fentartani ennek a filesystemnek, ha használja ha nem. |
# zfs set quota=20m myzfs/colin2 # zfs list -o quota myzfs/colin myzfs/colin2 QUOTA none 20M |
Quota beállítása és megtekintése |
# zfs set compression=on myzfs/colin2 # zfs list -o compression COMPRESS off off on |
Tömörítés engedélyezése, és ellenőrzése. |
# zfs set sharenfs=on myzfs/colin2 # zfs get sharenfs myzfs/colin2 NAME PROPERTY VALUE SOURCE myzfs/colin2 sharenfs on local |
Filesystem megosztása NFS-el. Nem szükséges a /etc/dfs/dfstab filet szerkeszteni. |
# zfs set sharesmb=on myzfs/colin2 # zfs get sharesmb myzfs/colin2 NAME PROPERTY VALUE SOURCE myzfs/colin2 sharesmb on local |
Filesystem megosztása SMB/CIFS. Ezáltal Windows felhasználók is el tudják érni. |
# zfs snapshot myzfs/colin@test # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 20.2M 139M 21K /myzfs myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin@test 0 – 18K – myzfs/colin2 18K 20.0M 18K /myzfs/colin2 |
Snapshot készítése test néven. |
# zfs rollback myzfs/colin@test | Visszaállás egy snapshotra. |
# zfs clone myzfs/colin@test myzfs/colin3 # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 20.2M 139M 21K /myzfs myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin@test 0 – 18K – myzfs/colin2 18K 20.0M 18K /myzfs/colin2 myzfs/colin3 0 139M 18K /myzfs/colin3 |
Egy snapshot direkt mód nem elérhető, de klónozhatunk belőle egy filesystemet, és úgy már igen. |
# zfs destroy myzfs/colin2 # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 20.1M 139M 22K /myzfs myzfs/colin 18K 159M 18K /myzfs/colin myzfs/colin@test 0 – 18K – myzfs/colin3 0 139M 18K /myzfs/colin3 |
Filesystem megsemmisítése |
# zfs destroy myzfs/colin cannot destroy ‘myzfs/colin’: filesystem has children use ‘-r’ to destroy the following datasets: myzfs/colin@test |
Egy filesystem törlése aminek van még egy gyereke, azaz a filesystem, amit ebből klónoztunk, ilyenkor meg kell -r kapcsolóval erősítenünk, hogy valóban törölni akarjuk. |
# zfs promote myzfs/colin3 # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 20.1M 139M 21K /myzfs myzfs/colin 0 159M 18K /myzfs/colin myzfs/colin3 18K 139M 18K /myzfs/colin3 myzfs/colin3@test 0 – 18K – # zfs destroy myzfs/colin # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 147K 159M 21K /myzfs myzfs/colin3 18K 159M 18K /myzfs/colin3 myzfs/colin3@test 0 – 18K – |
Előléptetjük a klónozott filesystemet így már nem fog függeni az eredeti snapshottól. |
# zfs rename myzfs/colin3 myzfs/bob # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 153K 159M 21K /myzfs myzfs/bob 18K 159M 18K /myzfs/bob myzfs/bob@test 0 – 18K – # zfs rename myzfs/bob@test myzfs/bob@newtest # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 146K 159M 20K /myzfs myzfs/bob 18K 159M 18K /myzfs/bob myzfs/bob@newtest 0 – 18K – |
Filesystem átnevezése és külön a snapshot átnevezése. |
# zfs get all NAME PROPERTY VALUE SOURCE myzfs type filesystem – myzfs creation Tue Sep 11 14:21 2007 – myzfs used 146K – myzfs available 159M – myzfs referenced 20K – […] |
Az összes dataset beállításainak lekérése. |
# zpool destroy myzfs cannot destroy ‘myzfs’: pool is not empty use ‘-f’ to force destruction anyway |
Nem lehet olyan poolt megsemmisíteni, aminek vannak aktív filesystemei. |
# zfs unmount myzfs/bob # df -h myzfs 159M 20K 159M 1% /myzfs |
ZFS filesystem lemountolása. |
# zfs mount myzfs/bob # df -h myzfs 159M 20K 159M 1% /myzfs myzfs/bob 159M 18K 159M 1% /myzfs/bob |
ZFS filesystem mountolása. Boot folyamán automatikusan megtörténik. |
# zfs send myzfs/bob@newtest | ssh localhost zfs receive myzfs/backup # zfs list NAME USED AVAIL REFER MOUNTPOINT myzfs 172K 159M 20K /myzfs myzfs/backup 18K 159M 18K /myzfs/backup myzfs/backup@newtest 0 – 18K – myzfs/bob 18K 159M 18K /myzfs/bob myzfs/bob@newtest 0 – 18K – |
Snapshot átküldése ssh-n keresztül egy másik gépre, ahol egy filesystem készül belőlle. Itt a másik gépet a localhost reprezentálja. |
# zpool history History for ‘myzfs’: 2007-09-11.15:35:50 zpool create myzfs mirror /disk1 /disk2 /disk3 2007-09-11.15:36:00 zpool detach myzfs /disk3 2007-09-11.15:36:10 zpool attach myzfs /disk1 /disk3 2007-09-11.15:36:53 zpool detach myzfs /disk3 2007-09-11.15:36:59 zpool add myzfs spare /disk3 2007-09-11.15:37:09 zpool remove myzfs /disk3 2007-09-11.15:37:18 zpool offline myzfs /disk1 2007-09-11.15:37:27 zpool online myzfs /disk1 2007-09-11.15:37:37 zpool replace myzfs /disk1 /disk3 2007-09-11.15:37:47 zpool scrub myzfs 2007-09-11.15:37:57 zpool export myzfs 2007-09-11.15:38:05 zpool import -d / myzfs 2007-09-11.15:38:52 zfs create myzfs/colin 2007-09-11.15:39:27 zpool add myzfs mirror /disk1 /disk5 2007-09-11.15:39:38 zfs create myzfs/colin2 2007-09-11.15:39:50 zfs set reservation=20m myzfs/colin 2007-09-11.15:40:18 zfs set quota=20m myzfs/colin2 2007-09-11.15:40:35 zfs set compression=on myzfs/colin2 2007-09-11.15:40:48 zfs snapshot myzfs/colin@test 2007-09-11.15:40:59 zfs rollback myzfs/colin@test 2007-09-11.15:41:11 zfs clone myzfs/colin@test myzfs/colin3 2007-09-11.15:41:25 zfs destroy myzfs/colin2 2007-09-11.15:42:12 zfs promote myzfs/colin3 2007-09-11.15:42:26 zfs rename myzfs/colin3 myzfs/bob 2007-09-11.15:42:57 zfs destroy myzfs/colin 2007-09-11.15:43:23 zfs rename myzfs/bob@test myzfs/bob@newtest 2007-09-11.15:44:30 zfs receive myzfs/backup |
Egy pool történetének kilistázása, lehetőség van csak egy bizonyos pool történéseinek limitálására, de ha egy poolt megsemmisítünk ezen információk is el fognak tűnni. |
# zpool destroy -f myzfs # zpool status -v no pools available |
A -f kapcsolóval filesystemekkel együtt megsemmisíthető egy pool. |
“ZFS – Modern kor a tárolásban” bejegyzéshez 2 hozzászólás