webhosting by: WebSupport.sk                                             UnlimitedHosting | CustomHosting | FreeWeb.sk

Pracujeme so ZFS

holden's picture

Určite ste už počuli o filesystéme ZFS od spoločnosti Sun Microsystems. V tomto blogu si ukážeme praktické ukážky - zaobchádzanie s poolmi a filesystémami. Cieľom tohto blogu nie je pojednávať o technickej vyspelosti ZFS a iných filesystémov.

Systém na ktorom som predvádzal príklady:
SunFire V250 Solaris 10 update 2 (6/06)

# uname -a
SunOS linda 5.10 Generic_118833-33 sun4u sparc SUNW,Sun-Fire-V250

slovník pojmov

dataset: spoločné meno pre tieto ZFS objekty: clones, file systems, snapshots, volumes.
Každý dataset je identifikovaný jedinečným menom v ZFS namespace. Datasety je možné identifikovať na základe tohto formátu zápisu:
pool/path[@snapshot]

clone: zapisovateľný file systém, ktorého prvotný obsah je rovnaký ako obsah datasetu z ktorého bol vytvorený

filesystem: dataset, ktorý obsahuje štandardný POSIXový filesystém

pool: logická skupina zariadení (devices) popisujúcich usporiadanie a fyzickú charakteristiku dostupného úložného miesta. Miesto pre datasety je alokované z poolu.

snapshot: read-only obraz filesystému alebo zväzku (volume) v danom čase.

volume: dataset použitý k emulácii fyzického zariadenia (device). Napríklad môžete použiť ZFS volume ako swap.

zfs pool

Praktické použitie

kedže mám na testy jeden disk, tak si budeme ukazovať jednotlivé ukážky len na ňom.
73 GB SCSI disk som rozdelil na sedem rôzne veľkých partícií (na nich si budeme okrem iného simulovať viac diskov v systéme :)):
Disk s ktorým pracujeme je c0t1d0sX (kde X je číslo partície)

Part      Tag    Flag    First Sector        Size        Last Sector
  0        usr    wm                34        2.00GB          4194337
  1        usr    wm          4194338        4.00GB          12582945
  2        usr    wm          12582946        6.00GB          25165857
  3        usr    wm          25165858      10.00GB          46137377
  4        usr    wm          46137378      12.00GB          71303201
  5        usr    wm          71303202      15.00GB          102760481
  6        usr    wm        102760482      19.00GB          142606369
  8  reserved    wm        143358321        8.00MB          143374704

Začnime teda tým najjednoduchším a vytvorme si pool z jediného device:
# zpool create stuff c0t1d0s0

použitím tohto príkazu vytvoríme pool s názvom stuff o veľkosti 2 GB.
Máme teda pool:

# zpool list
NAME                    SIZE    USED  AVAIL    CAP  HEALTH    ALTROOT
stuff                  1.98G  83.5K  1.98G    0%  ONLINE    -

a príkaz automaticky vytvoril na poole aj filesystém s mountpointom:

# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
stuff                  76K  1.95G  24.5K  /stuff

Čo v prípade, že chceme veľkosť poolu zvačšit?

# zpool add stuff c0t1d0s1
# zpool list
NAME                    SIZE    USED  AVAIL    CAP  HEALTH    ALTROOT
stuff                  5.95G    190K  5.95G    0%  ONLINE    -
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
stuff                  77K  5.86G  24.5K  /stuff

Nový filesystém z existujúceho poolu
Keďže filesystém ZFS má veľa možností nastavenia (napr. kompresia, kvóty a pod.), môžeme chciež mať viac filesystémov v jednom poole. Vytvorme filesystém pre úživateľa user1

# zfs create stuff/user1
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
stuff                  108K  5.86G  24.5K  /stuff
stuff/user1          24.5K  5.86G  24.5K  /stuff/user1

Ako vidíte, jednotlivé filesystémy si navzájom miesto v poole zdieľajú. Keďže chcem, aby užívateľ user1 mal 100 MB kvótu, použijem tento príkaz:

# zfs set quota=100m stuff/user1
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
stuff/user1          24.5K  100M  24.5K  /stuff/user1

Ak sme slušní, môžeme túto kvótu aj garantovať (Vidíme, že obsadené miesto na celom poole sa zvýšilo o rezervovanú veľkosť pre filesystém user1):

# zfs set reservation=100m stuff/user1
# zfs list
NAME                  USED  AVAIL  REFER  MOUNTPOINT
stuff                  100M  5.76G  26.5K  /stuff
stuff/user1          24.5K  100M  24.5K  /stuff/user1

Samozrejme užívateľovi user1 sa 100 MB môže zdať málo a keďže sme dobromilní, môžeme mu nastaviť kompresiu:
# zfs set compression=on stuff/user1

Takto si môžeme pozrieť compressratio filesystému (keďže nemáme na filesystéme žiadne dáta, ratio je len 1.00):

# zfs get compressratio stuff/user1
NAME            PROPERTY      VALUE                      SOURCE
stuff/user1      compressratio  1.00x                      -

Raid1 - mirror
Vďaka tomu, že nemám na testovanie dva rovnaké disky a ani dve rovnaké partície, budem musieť improvizovať. ZFS našťastie dokáže mirrorovať aj disky (partície), ktoré nie su rovnaké:

# zpool create important mirror c0t1d0s5 c0t1d0s6
invalid vdev specification
use '-f' to override the following errors:
mirror contains devices of different sizes
# zpool create -f important mirror c0t1d0s5 c0t1d0s6

Samozrejme, že veľkosť zrkadleného poolu sa odvíja od najmenšieho člena mirror poolu:

# zpool status important
  pool: important
state: ONLINE
scrub: none requested
config:
        NAME          STATE    READ WRITE CKSUM
        important    ONLINE      0    0    0
          mirror      ONLINE      0    0    0
            c0t1d0s5  ONLINE      0    0    0
            c0t1d0s6  ONLINE      0    0    0
errors: No known data errors

Raid10 (mirror + stripe)
Príkaz v podstate rovnaký ako v prípade obyčajného mirroru, akurát ho rozšírime o ďalší mirror:

# zpool create -f important10  mirror c0t1d0s2 c0t1d0s3 mirror c0t1d0s4 c0t1d0s5
# zpool status important10
  pool: important10
state: ONLINE
scrub: none requested
config:
        NAME          STATE    READ WRITE CKSUM
        important10  ONLINE      0    0    0
          mirror      ONLINE      0    0    0
            c0t1d0s2  ONLINE      0    0    0
            c0t1d0s3  ONLINE      0    0    0
          mirror      ONLINE      0    0    0
            c0t1d0s4  ONLINE      0    0    0
            c0t1d0s5  ONLINE      0    0    0
errors: No known data errors
# zpool list important10
NAME                    SIZE    USED  AVAIL    CAP  HEALTH    ALTROOT
important10            17.9G    81K  17.9G    0%  ONLINE    -

Raid5? Nie, raidz!
ZFS podporuje niečo podobné ako raid-5 avšak ponúka lepšiu distribúciu parity (než obyčajný raid5) a eliminuje takzvanú “Raid5 write hole” kedy sa parita a dáta v prípade výpadku prúdu stávaju nekonzistentnými.

# zpool create -f important5 raidz c0t1d0s2 c0t1d0s3 c0t1d0s4
# zpool status important5
  pool: important5
state: ONLINE
scrub: none requested
config:
        NAME          STATE    READ WRITE CKSUM
        important5    ONLINE      0    0    0
          raidz1      ONLINE      0    0    0
            c0t1d0s2  ONLINE      0    0    0
            c0t1d0s3  ONLINE      0    0    0
            c0t1d0s4  ONLINE      0    0    0
errors: No known data errors
# zpool list important5
NAME                    SIZE    USED  AVAIL    CAP  HEALTH    ALTROOT
important5            17.9G    141K  17.9G    0%  ONLINE    -

nezabúdajme na to, že stále pracujeme s rôznymi veľkosťami partícií, tak sa nám môže na prvý pohľad zdať čudná veľkosť výsledného poolu.

Rušíme pooly a filesystémy

# zfs destroy stuff/user1

V prípade, že filesystém, ktorý rušíme má dedičné filesystémy, môžeme použiť

# zfs destroy -r

Pool zničíme príkazom (pozor, ked ničíme pool, tak sa neberie ohľad na existujúce filesystémy v poole)

# zpool destroy stuff

To by bolo pre základ všetko, niekedy nabudúce si povieme o ZFS Snapshotoch a ZFS ACL.

Prosím berte na vedomie, že tento blog zápis neobsahuje kompletnú prácu so ZFS - naozaj nie je a nebolo mojim cieľom prepisovať Administration guide :)

Average rating
(11 votes)
webhosting by: WebSupport.sk UnlimitedHosting | CustomHosting | FreeWeb.sk