Súborový systém ZFS – konzistentnosť dát

19. 1. 2011
Doba čtení: 6 minut

Sdílet

Udržať konzistentnosť dát v súborovom systéme, kde je veľa dát, nie je často jednoduchou záležitosťou. Firma Oracle hovorí o svojom súborovom systéme ZFS ako o „A better, safer way to manage your data“. Poďme si teda ukázať zakladnú prácu s týmto zaujímavým súborovým systémom.

Rád by som upozornil, že cieľom môjho článku nie je porovnávať ostatné filesystémy, ale poukázať na nesporné výhody súborového systému ZFS a opísať moje krátke praktické skúsenosti a postrehy s jeho používaním. Príklady sú prevažne z operačného systému FreeBSD 8.2 PRERELEASE (zfs zpool testovacia verzia 28).

O čom budem konkrétne písať?

Seriál som rozdelil na tri časti. V prvej časti spomeniem, aké metódy používa ZFS na ochranu svojich dát, ako pracuje a ako si rýchlo nainštalovať FreeBSD s podporou ZFS. V druhej časti vysvetlím, ako pracovať s poolom, z čoho sa ZFS skladá a ako sa ovláda. V tretej časti si vysvetlíme, ako pracovať s datasetmi  a ako vytvoriť snapshoty, klony, nastaviť práva na snapshoty a datasety.

Teoretická časť

Úvod do ZFS

ZFS je 128-bitový filesystém, ktorý bol pôvodne vyvíjaný spoločnosťou Sun Microsystems pre operačný systém Solaris, teraz ho vlastní firma Oracle. ZFS bolo po prvý krát predstavené v júni 2006 v operačnom systéme Solaris 10. ZFS pridáva do operačného systému medzivrstvu, ktorá mapuje logické bloky dát na ich fyzické umiestnenie na disku. Skratka ZFS znamená Zettabyte File System a vďaka open-source licencii CDDL je od 6.apríla 2007 portovaný aj do FreeBSD-7.0 RELEASE (zpool verzia 6). V stabilnej verzii FreeBSD 8.1 je od júla 2010 s aktuálnou verziou zpoolu 14. Je dostupná aj opravná verzia FreeBSD 8.2-RC1 s verziou zpoolu 15, ktorá opravuje mnohé bugy predošlej verzie. Pre porovnanie aktuálny Solaris 11 Express má ZFS verziu 31 z novembra 2010.

ZFS má tieto hlavné výhody:

 – je to kompletne 128-bitový súborový systém
 – môžeme uchovať 256 quadriliónov zettabytov (1 zettabyt má 1 bilión terabytov)
 – má integrovaný volume manager
 – stráži integritu svojich dát
 – robí tzv. self-healing dát (automaticky opravuje poškodené dáta)
 – ľahké ovládanie
 – vie spraviť/obnoviť aktuálne snímky súborového systému (snapshoty)
 – na disku je teoreticky možné uchovať až 2 na 64 snapshotov
 – chybovosť dát je asi iba 0,01%

Transakčný model COPY-ON-WRITE

ZFS obsahuje patentovanú funkciu ORACLU s názvom Copy-On-Write (COW), ktorý stráži konzistenciu dát. COW je transakčný model a používa tzv. block pointers, teda ukazovatele na bloky dát v rámci svojho súborového systému. V praxi to znamená, že dátové bloky obsahujúce aktívne dáta sa neprepisujú až do chvíle, kým sa úspešne nezapíšu na iné miesto na disku. Ak je teda kopírovanie starého bloku dát ÚSPEŠNE dokončené, všetky ukazovatele na staré bloky a metadáta sú zmenené na nové bloky dát. Toto zaručí konzistenciu dát aj napríklad pri výpadku elektrického prúdu. ZFS si udržiava takisto kontrolné súčty všetkých dát a metadát. Pokiaľ sa zmení checksum nejakých dát, tak sa ich pokúsi opraviť bez manuálneho zásahu. ZFS používa 256-bitové kontrolné súčty, ktoré sú uložené priamo na disku. Z týchto dôvodov ZFS nepotrebuje fsck (file system check) na kontrolu konzistencie súborového systému. Takto sa zaručí, že pri zlyhaní diskovej operácie (napr. pri hard resete, výpadku elektrického prúdu) sa dáta budú vedieť po reštarte systému vrátiť do pôvodných dátových blokov a tak strážiť integritu svojich dát.

ZFS self-healing

ZFS self-healing je funkcia, ktorá pri mirrore dvoch a viac diskov automaticky opravuje poškodené dáta. Na spodnom obrázku vidíme v prvom kroku červený štvorec, čo značí poškodené bloky dát, kde nesedí kontrolný súčet (checksum). V druhom kroku to ZFS zistí, pozrie sa na druhý disk, kde zistí, že checksum je správny a v treťom kroku sa poškodené dáta na prvom disku automaticky prepíšu tými správnymi, ktoré sú na druhom disku. Na stránkach opensolarisu je uverejnené pekné video, ako to celé funguje.

Ukážka automatickej opravy dát pri mirrore

• RAID-1 – ZFS robí opravu zlých dátových blokov použitím kópie z mirroru
• RAID-Z/Z2 – ZFS robí opravu zlých dátových blokov použitím parity

ZFS ARC (Adaptive Replacement Cache)

Architektúra ARC

ZFS ARC je rýchla hlavná vyrovnávacia pamäť pre operácie so ZFS, ktorá sa nachádza vo fyzickej pamäti. ARC má schopnosť dynamicky meniť svoju veľkosť cache s ohľadom na celkovú dostupnú pamäť systému. Pri stave, kedy nemá systém dostatok pamäte (potreba inej aplikácie, procesu), povie ZFS, aby nejakú okamžite uvoľnil. V mnohých prípadoch tvorí ARC asi 3/4 z celkovej dostupnej pamäte pre systém.

ZFS intent log slúži na zapisovanie všetkých, aj zamýšľaných, diskových operácií do špeciálnej časti súborového systému. Jeho účel je, aby pri výpadku existoval záznam týchto udalostí, ak nastane kernel panic alebo výpadok prúdu. Toto zabraňuje nekonzistentnosti v súborovom systéme.

L2ARC je vrstva medzi diskom a virtuálnou pamäťou ARC vo fyzickej pamäti pre ZFS. Hlavná úloha tejto pamäte je urýchlenie náhodne čítaných dát.

32bit vs. 64bit

Vzhľadom k tomu, že ZFS používa vo veľkej miere operačnú pamäť, musíme zabezpečiť dostatočne veľkú operačnú pamäť, ktorú môže obhospodarovať. Odporúča sa 64-bitová verzia operačného systému a minimálne 1GB fyzickej pamäte pri FreeBSD, 512MB pri Solarise a adekvátna veľkosť swapu. Užívatelia, ktorí používajú 32-bitovú architektúru operačného systému, by si mali skompilovať kernel nanovo a pridať option „KVA_PAGES“, ktorý definuje približne jednu štvrtinu z celkovej veľkosti fyzickej pamäte pre KVA (kernel virtual address space), ktorá dovoľuje ZFS použiť viac fyzickej pamäte. V prípade, ak dôjde k vyčerpaniu voľnej pamäte pre ZFS, nastane kernel panic a samovoľne sa reštartuje operačný systém. Ak máme napr. 1GB fyzickej pamäte, tak si nastavte v configu kernelu následovné:

 options    KVA_PAGES=256 ; 1024MB deleno 4 = 256MB

Ešte je potrebné definovať v konfiguračnom súbore /boot/loader.conf tieto hodnoty:

vm.kmem_size="512M" ; 1/2 z celkovej veľkosti RAM
vm.kmem_size_max="512M" ; 1/2 z celkovej veľkosti RAM
vfs.zfs.arc_max="256M" ; 1/2 z vm.kmem_size_max

mfsBSD

Veľmi jednoduchým spôsobom ako si nainštalovať FreeBSD s podporou filesystému ZFS je stiahnuť bootovateľné ISO mfsBSD (memory filesystem). Je to minimálna inštalácia FreeBSD, ktorá sa kompletne nahrá do operačnej pamäti. Stačí nabootovať ISO súbor, pripojiť sa na systém (heslo pre ISO je mfsroot):

# mount_cd9660 /dev/acd0 /cdrom ; namontuje ISO do /cdrom
# zfsinstall -d /dev/ad0 [-d /dev/ad1] -t /cdrom/8.1-PRERELEASE-i386.tar.xz -s 2G -p pool
# chroot /mnt ; zmeníme root systému
# passwd ; nastavíme root heslo

Skript zfsinstall nainštaluje automaticky systém s podporou ZFS filesystému na disk ad0 s 2GB swapom a názvom poolu „pool“.

Nastavíme ešte automatické spustenie SSH démona a sieťovú kartu v /etc/rc.conf, aby sme sa po reboote server vedeli opäť pripojiť:

sshd_enable="YES" ; automatický štart SSH po reboote servera
ifconfig_(sieťovka)="DHCP" ; automatické IP adresy z DHCP servera

V súbore /etc/sshd/sshd_config:

bitcoin_skoleni

PermiRootLogin yes ; povolenie prihlásenia pre roota
# shutdown -r now ; reštart systému

Po reštarte systému vidíme základnú štruktúru ZFS filesystému, ktorú nám vytvoril skript  zfsinstall:

# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
pool                 17.5G   664G    19K       none
pool/root          16.1G   664G  12.9G      /
pool/root/tmp      19K   664G    19K       /tmp
pool/root/var    180M   664G   158M      /var

Záver

Týmto by som ukončil úvodný teoretický článok o ZFS. V druhom dieli si už povieme, ako pracovať s poolmi, z čoho sa vlastne ZFS skladá a akým spôsobom ho ovládať.