Το προφίλ μας στο Google Plus
6

ZFS: Το τέλος και η αρχή των filesystems!

Είναι πιθανό να ‘χετε ακούσει γι’ αυτό. Πρόκειται για το filesystem από το μέλλον, που αδιαφορεί επιδεικτικά για τις απαρχαιωμένες ιδέες που υλοποιεί η πλειονότητα των σημερινών συστημάτων αρχείων. Μ’ έναν προκλητικό ριζοσπαστισμό το ZFS εισάγει μια ολότητα που ενσωματώνει ευέλικτο volume manager και πλούσιο σε δυνατότητες σύστημα αρχείων, αλλάζοντας εντελώς την κοινή αντίληψη για το τι είναι filesystem.

Πάντως πριν καν αναφερθούν και οι υπόλοιπες δυνατότητες του ZFS, είναι μάλλον αναμενόμενο να σκεφτεί κάποιος πως όλα αυτά ίσως είν’ αδιάφορα για τους κοινούς θνητούς – εκτός κι αν μιλάμε για κοινό θνητό που ασχολείται με πανάκριβες εγκαταστάσεις server :P Ξέρετε κάτι; Τίποτε δεν θα μπορούσε ν’ απέχει περισσότερο από την αλήθεια.

Τα άρθρα που βρίσκονται εδώ κι εδώ αποτελούν ένα μικρό αλλά περιεκτικό αφιέρωμα στο Logical Volume Manager (LVM) του Linux. Παραθέτουμε εδώ σχετικό απόσπασμα:

Η λογική του LVM περιστρέφεται γύρω από την ιδέα του storage virtualization. Χάρη στις σχετικές τεχνολογίες, το λειτουργικό σύστημα παύει να βλέπει ξεχωριστούς δίσκους και partitions αλλά έναν εικονικό, ενιαίο χώρο αποθήκευσης. Στην πραγματικότητα βέβαια αυτός ο εικονικός χώρος είν’ ένα storage pool αποτελούμενο από έναν ή περισσότερους φυσικούς δίσκους, οι οποίοι μάλιστα μπορούν να προσθαφαιρούνται δυναμικά στο pool! Ωστόσο το λειτουργικό εξακολουθεί να βλέπει έναν ενιαίο χώρο, με μέγεθος μικρότερο ή το πολύ ίσο προς το άθροισμα των μεγεθών που έχουν οι (φυσικοί) δίσκοι που απαρτίζουν το pool τη δεδομένη στιγμή.

Σ’ αυτά τα δύο άρθρα, μέσα από μια σειρά πρακτικών παραδειγμάτων γνωρίζουμε το σύστημα LVM στην πράξη. Πέρα από τα εταιρικά περιβάλλοντα, αποδεικνύεται ότι είναι κατάλληλο ακόμα και για οικιακούς fileserver, παρέχοντας τεράστια ευελιξία κι επεκτασιμότητα. Το θέμα όμως με το LVM, καθώς κι άλλες παρόμοιες λύσεις storage virtualization, είναι ότι αποτελεί ένα επίπεδο λογισμικού που ‘ναι ξεχωριστό από το όποιο filesystem χρησιμοποιείται. Πρακτικά, αυτό σημαίνει έξτρα υπολογιστικό κόστος αλλά κι αύξηση της πολυπλοκότητας υλοποίησης ενός fileserver. Βέβαια το LVM είν’ ώριμο και δοκιμασμένο, όσο να ‘ναι όμως η αυξημένη πολυπλοκότητα συνεπάγεται κι αυξημένη πιθανότητα να πάει κάτι στραβά.

Πράγματι, μια πολύ καλύτερη λύση θα ‘ταν ένα filesystem που από μόνο του παρέχει και δυνατότητες volume management. Κι αυτό ακριβώς, φίλες και φίλοι, είν’ ένα από τα βασικά χαρακτηριστικά του ZFS, ενός υπερσύγχρονου συστήματος αποθήκευσης ανοικτού λογισμικού που αναπτύχθηκε από τη Sun! (Μετά την εξαγορά της από την Oracle το σχετικό trademark ανήκει πλέον στην τελευταία.) Αρχικά το ZFS κυκλοφόρησε για το λειτουργικό σύστημα Sun Solaris, χάρη όμως στην ανοικτή άδεια χρήσης CDDL πέρασε και σ’ άλλα λειτουργικά συστήματα, όπως τα OpenSolaris, Nexenta, FreeBSD, NetBSD και GNU/kFreeBSD. Εκτός από την ενοποίηση filesystem και volume manager το ZFS προσφέρει και μια σειρά δυνατών χαρακτηριστικών όπως snapshots, multiple copies, data checksums, αυτόματη διόρθωση λαθών, συστοιχίες RAID-Z κ.ο.κ. Αλλά μην ανησυχείτε, δεν πρόκειται να ξεκινήσουμε τις βαρετές παραθέσεις, ούτε τις κουραστικές περιγραφές. Αντίθετα, μέσα από μια σειρά πρακτικών παραδειγμάτων θα σας δείξουμε πώς εξοικειωθήκαμε εμείς με το ZFS. Νομίζουμε ότι αυτός είν’ ο καλύτερος τρόπος αφενός για να κατανοήσει κανείς τις νέες έννοιες που εισάγει το ZFS, αφετέρου για ν’ αποφασίσει αν αξίζει να το δοκιμάσει και τελικά να το χρησιμοποιήσει στην πράξη. Πάντως για να μη σας κρατάμε σε αγωνία, σας λέμε από τώρα ότι το ZFS είναι άριστο ακόμα και για οικιακούς fileservers, συναρμολογημένους από φθηνό hardware!

Η πλατφόρμα μας
Εξαιτίας νομικών ασυμβατοτήτων μεταξύ της άδειας CDDL του ZFS και της GNU GPL που συνοδεύει τον πυρήνα του Linux, το ZFS έχει αργήσει να περάσει στον κόσμο των διανομών Linux. Αυτή τη στιγμή είναι δυνατόν να χρησιμοποιηθεί σε userspace μέσω του FUSE project, η προσέγγιση όμως αυτή είναι αργή και σίγουρα ακατάλληλη για αληθινά, πρακτικά σενάρια χρήσης. Πέρα από το FUSE, υπάρχουν δυο ενεργά πρότζεκτ δημιουργίας port του ZFS τα οποία θα μπορούν, από νομικής σκοπιάς, να ενσωματωθούν στο πυρήνα του Linux, ενώ ταυτόχρονα θα υλοποιούν τα βασικά χαρακτηριστικά του ZFS.

Με δεδομένα τα προηγούμενα, ένας από τους καλύτερους τρόπους ώστε κάποιος να γνωρίσει, αξιολογήσει καθώς και χρησιμοποιήσει στην πράξη το ZFS είναι μέσω του λειτουργικού συστήματος FreeBSD. Έτσι κρίναμε κι εμείς, έτσι και κάναμε. Κι επειδή δεν είχαμε κάποιο πρόχειρο PC για να παίξουμε, φτιάξαμε ένα virtual machine (VM) με 1GB RAM, του εγκαταστήσαμε την 64μπιτη εκδοχή της έκδοσης 8.2-RELEASE κι αμέσως αρχίσαμε την εξερεύνηση στον κόσμο του ZFS, προσθαφαιρώντας στη μηχανή σκληρούς δίσκους κατά βούληση.

Σημείωση 1: Αν είστε καινούργιος στο FreeBSD σας προτείνουμε ανεπιφύλακτα να διαβάσετε τα δύο εξαιρετικά εισαγωγικά άρθρα που είχε ετοιμάσει ο συνεργάτης μας sonicy (@sonic2000gr στο Twitter) και φιλοξενούμε εδώ κι εδώ.

Σημείωση 2: Αντί για το FreeBSD θα μπορούσαμε να παίξουμε με το FreeNAS. Πρόκειται για μια εξειδικευμένη λύση που προορίζεται για fileservers, βασίζεται στο FreeBSD, υποστηρίζει το ZFS και παρέχει κι ένα εύχρηστο web interface για απομακρυσμένη διαχείριση. Όμως το ZFS είναι πολύ διαφορετικό από τα συνηθισμένα filesystems και η κατανόηση των ιδεών που υλοποιεί κρίνεται απαραίτητη προκειμένου κάποιος να καρπωθεί τα οφέλη που παρέχει. Κι ο καλύτερος τρόπος για να μάθει κανείς ουσιαστικά το ZFS, είναι να ξεκινήσει από τη γραμμή εντολής.

Προετοιμασίες και προϋποθέσεις
Από το κεφάλαιο για το ZFS που υπάρχει στο επίσημο FreeBSD Handbook, μάθαμε ότι ένας fileserver με ZFS πρέπει να ‘χει τουλάχιστον 1GB RAM και ιδανικά 2GB ή περισσότερα. Σκεφτήκαμε, λοιπόν, πως όταν φτιάξουμε τον δικό μας, αληθινό fileserver, θα του δώσουμε 4GB RAM. Αυτή η σκέψη ήταν που μας οδήγησε να εγκαταστήσουμε και να παίξουμε με την 64μπιτη εκδοχή του FreeBSD.

Ιδανικά, ένας fileserver που βασίζεται στο ZFS καλό είναι να 'χει 4GB μνήμης RAM, συνεπώς και λειτουργικό σύστημα 64bit. Εμάς δεν μας περίσσευαν 4GB RAM για να δώσουμε στο virtual machine των δοκιμών μας, φροντίσαμε όμως να του εγκαταστήσουμε την 64μπιτη εκδοχή του FreeBSD 8.2-RELEASE ;)

Τώρα, για να ενεργοποιείται το υποσύστημα του ZFS κάθε φορά που φορτώνει το FreeBSD αρκεί να προσθέσουμε τη γραμμή

zfs_enable="YES"

στο τέλος του αρχείου /etc/rc.conf. Δείτε, π.χ., τα περιεχόμενα του /etc/rc.conf που είχε το δικό μας σύστημα (για οικονομία χώρου τα σχόλια στην αρχή παραλήφθηκαν):

[sub0@freebsd ~]$ cat /etc/rc.conf 
...
hostname="freebsd.vmlan.net"
ifconfig_em0="DHCP"
keymap="el.iso07"
nfs_client_enable="YES"
sshd_enable="YES"
zfs_enable="YES"

Για να ξεκινήσει αμέσως το ZFS χωρίς να γίνει επανεκκίνηση του λειτουργικού, σε μια κονσόλα τερματικού πληκτρολογούμε

[sub0@freebsd ~]$ sudo /etc/rc.d/zfs start

(Στο VM μας είχαμε το εργαλείο sudo εγκατεστημένο και το χρήστη sub0 στο group wheel, επομένως μπορούσαμε να εκτελούμε administrative tasks χωρίς login στο account του root.) Και κάπου εδώ είμαστε πλέον έτοιμοι ν’ αρχίσουμε τη γνωριμία μας με το ZFS.

Ένα καλό με τα VMs είναι ότι μπορούμε να τους δίνουμε όσους δίσκους θέλουμε κι όσο μεγάλους θέλουμε. Ό,τι πρέπει για να παίξουμε μ' ένα σύστημα αποθήκευσης σαν το ZFS και να εξοικειωθούμε μαζί του!

Ενδιαφέρουσα γνωριμία με προοπτική!
Το ZFS κάνει χρήση της έννοιας των storage pools ή απλά pools ή volumes, τα οποία δεν είναι τίποτε περισσότερο από συλλογές ενός ή περισσοτέρων αποθηκευτικών μέσων. Ας υποθέσουμε, π.χ., ότι ο fileserver μας έχει το δίσκο συστήματος (/dev/da0) τύπου SATA καθώς κι άλλους τρεις, επίσης τύπου SATA: τον /dev/da1 με χωρητικότητα 1TB, τον /dev/da2 με χωρητικότητα 1.5TB και τον /dev/da3 με χωρητικότητα 2TB. Για να φτιάξουμε ένα ZFS pool αποτελούμενο από τους δίσκους /dev/da1 και /dev/da2, χρησιμοποιούμε το εργαλείο zpool ως εξής:

[sub0@freebsd ~]$ sudo zpool create storage /dev/da1 /dev/da2

Με την εντολή df βλέπουμε ότι όχι μόνο δημιουργήθηκε ένα ZFS pool συνολικής χωρητικότητας 2.4TB με όνομα storage, αλλά προσαρτήθηκε κιόλας κάτω από το /storage:

[sub0@freebsd ~]$ df -hT
Filesystem   Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a  ufs      989M    273M    637M    30%    /
devfs        devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e  ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f  ufs       11G    1.0G    8.8G    10%    /usr
/dev/da0s1d  ufs      4.8G     90M    4.4G     2%    /var
storage      zfs      2.4T     21K    2.4T     0%    /storage

Απ’ ό,τι όλα δείχνουν ο αποθηκευτικός χώρος είναι έτοιμος για χρήση. Για να δούμε:

[sub0@freebsd ~]$ cd /storage
[sub0@freebsd /storage]$ sudo touch testfile 
[sub0@freebsd /storage]$ sudo mkdir testdir
[sub0@freebsd /storage]$ sudo chown sub0:sub0 testdir
[sub0@freebsd /storage]$ ls -lh
total 2
drwxr-xr-x  2 sub0  sub0      2B May 22 17:25 testdir
-rw-r--r--  1 root  wheel     0B May 22 17:25 testfile
[sub0@freebsd /storage]$ sudo rm testfile 
[sub0@freebsd /storage]$ sudo rmdir testdir 
[sub0@freebsd /storage]$ ls -lh
total 0
[sub0@freebsd /storage]$ cd
[sub0@freebsd ~]$

Απίστευτο! Ο χώρος είναι όντως έτοιμος για χρήση κι αυτό χωρίς καν να φτιάξουμε διαμερίσματα (κατατμήσεις) ή να φορμάρουμε, ώστε να δημιουργήσουμε filesystems! Αλλά οι ευχάριστες εκπλήξεις συνεχίζονται. Ας πούμε τώρα ότι θέλουμε να μεγαλώσουμε το pool μας δίνοντάς του και τον άλλο δίσκο, ο οποίος μέχρι στιγμής καθόταν ανεκμετάλλευτος. Δείτε πόσο απλά το πετυχαίνουμε:

[sub0@freebsd ~]$ sudo zpool add storage /dev/da3
[sub0@freebsd ~]$ df -hT
Filesystem   Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a  ufs      989M    273M    637M    30%    /
devfs        devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e  ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f  ufs       11G    1.0G    8.8G    10%    /usr
/dev/da0s1d  ufs      4.8G     90M    4.4G     2%    /var
storage      zfs      4.4T     22K    4.4T     0%    /storage

Και να λοιπόν που χωρίς τον παραμικρό κόπο φτιάξαμε έναν ενιαίο χώρο αποθήκευσης συνολικής χωρητικότητας 4.4TB! Με το εργαλείο zpool μπορούμε να φτιάχνουμε όσα pools θέλουμε. Ιδού η λίστα με το ένα και μοναδικό pool που δημιουργήσαμε πριν λίγο:

[sub0@freebsd ~]$ sudo zpool list          
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
storage  4.47T    98K  4.47T     0%  ONLINE  -

Δίνοντας στο zpool την εντολή status ακολουθούμενη από τ’ όνομα ενός pool, παίρνουμε περισσότερες πληροφορίες για το ίδιο το pool:

[sub0@freebsd ~]$ sudo zpool status storage
  pool: storage
 state: ONLINE
 scrub: none requested
config:
	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  da1       ONLINE       0     0     0
	  da2       ONLINE       0     0     0
	  da3       ONLINE       0     0     0
errors: No known data errors

Πληκτρολογήστε zpool –help για να δείτε τι άλλες εντολές καταλαβαίνει το zpool κι έτσι να πάρετε μια πρώτη, καλή ιδέα για τις ιδιότητες των pools.

Μέχρι τώρα τα pools έχουν αποδειχθεί εντυπωσιακά. Όμως όσο απίστευτο κι αν σας φαίνεται, ακόμα δεν μας έχουν φανερώσει τις εκπληκτικές δυνατότητες του ZFS. Για να τις εκμεταλλευτούμε πρέπει να φτιάξουμε ZFS filesystems πάνω από το υπάρχον pool. Όπως θα δείτε σε πολύ λίγο, αυτά τα filesystems δεν είναι σαν τα συνηθισμένα. Κατ’ αρχάς, η δημιουργία ενός ZFS filesystem δεν συνεπάγεται την καταστροφή των όποιων δεδομένων βρίσκονται αποθηκευμένα στο pool. Επιπρόσθετα, σε κάθε filesystem που φτιάχνουμε μπορούμε να του “ενεργοποιούμε” μία ή περισσότερες ενδιαφέρουσες ιδιότητες. Αλλά ας γίνουμε συγκεκριμένοι.

Ξεκινάμε με τη δημιουργία ενός απλού filesystem με όνομα compressed, το οποίο φτιάχνουμε πάνω από το υπάρχον pool με όνομα storage.

[sub0@freebsd ~]$ sudo zfs create storage/compressed

Ενώ το εργαλείο zpool χρησιμοποιείται για τη διαχείριση pools, το zfs χρησιμοποιείται για τη διαχείριση filesystems. Η παραπάνω εντολή δεν δημιουργεί απλά ένα νέο filesystem, το προσαρτά κιόλας:

[sub0@freebsd ~]$ df -hT
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a         ufs      989M    273M    637M    30%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e         ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f         ufs       11G    1.0G    8.8G    10%    /usr
/dev/da0s1d         ufs      4.8G     90M    4.4G     2%    /var
storage             zfs      4.4T     21K    4.4T     0%    /storage
storage/compressed  zfs      4.4T     21K    4.4T     0%    /storage/compressed

Όπως φαίνεται από την έξοδο του df, το storage/compressed καταλαμβάνει τον ίδιο χώρο που καταλαμβάνει και το pool. Πράγματι, όλα τα ZFS filesystems παίρνουν μόνον όσον χώρο χρειάζονται και πάντοτε τον αντλούν από το pool στο οποίο ανήκουν! Είπαμε πριν λίγο ότι τα ZFS filesystems μπορούν να ‘χουν ενδιαφέρουσες ιδιότητες. Μια απ’ αυτές είναι η αυτόματη συμπίεση των δεδομένων που φιλοξενούν:

[sub0@freebsd ~]$ sudo zfs set compression=gzip-9 storage/compressed

Μόλις ορίσαμε πώς ό,τι γράφεται στο /storage/compressed θα συμπιέζεται αυτόματα κατά GZip και μάλιστα στο μέγιστο επιτρεπτό βαθμό (που είναι το 9). Ας ελέγξουμε τη δυνατότητα της αυτόματης συμπίεσης. Ξεκινάμε φτιάχνοντας ένα μεγάλο plain text file:

[sub0@freebsd ~]$ sudo ls -lR / > ~/allfiles.txt
[sub0@freebsd ~]$ ls -lh ~/allfiles.txt 
-rw-r--r--  1 sub0  sub0    13M May 22 20:37 allfiles.txt

Ωραία. Το αρχείο μας είναι έτοιμο κι έχει μέγεθος 13MB. Το αντιγράφουμε στον κατάλογο /storage/compressed κι ελέγχουμε το μέγεθός του:

[sub0@freebsd ~]$ sudo cp ~/allfiles.txt /storage/compressed/
[sub0@freebsd ~]$ ls -lh /storage/compressed/
total 1
-rw-r--r--  1 root  wheel    13M May 22 20:39 allfiles.txt

Περιέργως, το μέγεθος του αρχείου μέσα στο /storage/compressed δείχνει να μην έχει μεταβληθεί. Μήπως δεν δουλεύει η συμπίεση; Για δούμε, τι έχει να μας πει και το zfs για το χώρο που καταλαμβάνει το filesystem με όνομα compressed…

[sub0@freebsd ~]$ zfs list storage/compressed
NAME                 USED  AVAIL  REFER  MOUNTPOINT
storage/compressed  2.38M  4.40T  2.38M  /storage/compressed

Αχά! Ο χώρος που καταλαμβάνει το filesystem μας δεν είναι 13 αλλά μόλις 2,38ΜΒ! Αν τώρα συμπιέσετε χειροκίνητα το πρωτότυπο αρχείο allfiles.txt με χρήση του προγράμματος gzip, θα δείτε ότι περιορίζεται στα 2,3MB:

[sub0@freebsd ~]$ gzip -9 allfiles.txt 
[sub0@freebsd ~]$ ls -lh allfiles.txt.gz 
-rw-r--r--  1 sub0  sub0   2.3M May 22 20:37 allfiles.txt.gz

Περίεργα πράγματα; Καθόλου. To ZFS filesystem που δημιουργήσαμε όντως συμπιέζει αυτόματα ό,τι του δίνουμε, όμως στις εφαρμογές δεν έχει λόγο να δείχνει τα συμπιεσμένα μεγέθη των αρχείων του αλλά τα πραγματικά, μ’ άλλα λόγια αυτά που έχουν όταν δεν είναι συμπιεσμένα.

Τη συμπίεση ενός filesystem μπορούμε να την απενεργοποιούμε ανά πάσα στιγμή δίνοντας κάτι σαν

[sub0@freebsd ~]$ sudo zfs set compression=off storage/compressed

Σημειώστε ότι η απενεργοποίηση της συμπίεσης δεν σημαίνει ότι αποσυμπιέζονται όσα αρχεία βρίσκονται ήδη στο filesystem, απλά ότι στο εξής όσα αποθηκεύονται σ’ αυτό δεν θα συμπιέζονται αυτόματα. Νομίζουμε ότι δεν χρειάζεται να εξηγήσουμε πώς η συμπίεση ενεργοποιείται εκ νέου :)

Ελάτε τώρα να δούμε μια άλλη ιδιότητα των ZFS filesystems. Ξεκινάμε φτιάχνοντας ένα, μέσα στο οποίο θ’ αποθηκεύουμε εξαιρετικά σημαντικά αρχεία:

[sub0@freebsd ~]$ sudo zfs create storage/important
[sub0@freebsd ~]$ zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
storage             16.7M  4.40T    24K  /storage
storage/compressed  16.6M  4.40T  16.6M  /storage/compressed
storage/important     21K  4.40T    21K  /storage/important

Μια χαρά. Από τη στιγμή που το storage/important προορίζεται για αποθήκευση πολύτιμων δεδομένων, θα ζητήσουμε τη δημιουργία δύο data block για κάθε ένα που γράφεται:

[sub0@freebsd ~]$ sudo zfs set copies=2 storage/important

Ας αντιγράψουμε στο /storage/compressed ένα αρχείο μεγέθους 53MB και μετά ας δούμε πόσο χώρο κατέλαβε στην πραγματικότητα:

[sub0@freebsd ~]$ ls -lh presentation.ppt 
-rw-r--r--  1 sub0  sub0    53M May 22 23:10 presentation.ppt
[sub0@freebsd ~]$ sudo cp presentation.ppt /storage/important/
[sub0@freebsd ~]$ df -hT
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a         ufs      989M    273M    637M    30%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e         ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f         ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d         ufs      4.8G     90M    4.4G     2%    /var
storage             zfs      4.4T     24K    4.4T     0%    /storage
storage/compressed  zfs      4.4T     17M    4.4T     0%    /storage/compressed
storage/important   zfs      4.4T    106M    4.4T     0%    /storage/important

Από την τελευταία γραμμή και προσέχοντας τη στήλη Size, βλέπουμε ότι κατέλαβε το διπλάσιο ακριβώς χώρο, όπως δηλαδή αναμέναμε. Στην περίπτωση που κάτι δεν πάει καλά με το pool, η πιθανότητα πλήρους ανάκτησης του αρχείου presentation.ppt θα ‘ναι σαφώς μεγαλύτερη σε σχέση με την περίπτωση που δεν τηρούταν αντίγραφο των data block.

Περιττό να σημειώσουμε ότι τα ZFS filesystems μπορούν να ‘χουν περισσότερες από μία ιδιότητες ταυτόχρονα. Για παράδειγμα, δίνοντας διαδοχικές εντολές με το εργαλείο zfs μπορούμε να ζητήσουμε και συμπίεση δεδομένων και δημιουργία αντιγράφων data block για το ίδιο filesystem.

Μια άλλη, εξαιρετικά χρήσιμη ιδιότητα του ZFS είναι η δημιουργία snapshots. Ας πάρουμε ένα για το storage/important:

[sub0@freebsd ~]$ sudo zfs snapshot storage/important@2011-05-22

(Μετά το @ πηγαίνει το όνομα του snapshot.) Μέσα στον κατάλογο .zfs/snapshots κάθε ZFS filesystem βλέπουμε όλα τα snapshots του:

[sub0@freebsd ~]$ ls -lh /storage/important/.zfs/snapshot
total 2
drwxr-xr-x  2 root  wheel     3B May 22 23:31 2011-05-22

Ας διαγράψουμε το αρχείο presentation.ppt από το /storage/important

[sub0@freebsd ~]$ sudo rm /storage/important/presentation.ppt 
[sub0@freebsd ~]$ ls -lh /storage/important/
total 0
[sub0@freebsd ~]$

Τι θα γίνει τώρα αν επαναφέρουμε το snapshot; Δεν έχουμε παρά να δούμε!

[sub0@freebsd ~]$ sudo zfs rollback storage/important@2011-05-22
[sub0@freebsd ~]$ ls -lh /storage/important/
total 108109
-rw-r--r--  1 root  wheel    53M May 22 23:31 presentation.ppt
[sub0@freebsd ~]$

Και ναι, το presentation.ppt επέστρεψε! Το ίδιο εύκολη με τη δημιουργία είναι και η καταστροφή ενός snapshot:

[sub0@freebsd ~]$ sudo zfs destroy storage/important@2011-05-22
[sub0@freebsd ~]$ ls -lh /storage/important/.zfs/snapshot
total 0
[sub0@freebsd ~]$

Κάθε ZFS filesystem μπορούμε να το (απο)προσαρτάμε κατά βούληση – πάντα με τη βοήθεια του εργαλείου zfs. Ιδού πώς:

[sub0@freebsd ~]$ sudo zfs umount storage/important
[sub0@freebsd ~]$ sudo zfs umount storage/compressed
[sub0@freebsd ~]$ df -hT
Filesystem                     Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a                    ufs      989M    273M    637M    30%    /
devfs                          devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e                    ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f                    ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d                    ufs      4.8G     90M    4.4G     2%    /var
storage                        zfs      4.4T     24K    4.4T     0%    /storage
[sub0@freebsd ~]$ sudo zfs mount storage/important
[sub0@freebsd ~]$ sudo zfs mount storage/compressed
[sub0@freebsd ~]$ df -hT
Filesystem                     Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a                    ufs      989M    273M    637M    30%    /
devfs                          devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e                    ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f                    ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d                    ufs      4.8G     90M    4.4G     2%    /var
storage                        zfs      4.4T     24K    4.4T     0%    /storage
storage/compressed             zfs      4.4T     17M    4.4T     0%    /storage/compressed
storage/important              zfs      4.4T    106M    4.4T     0%    /storage/important
[sub0@freebsd ~]$ 

Αν μέχρι τώρα δεν σας έχει ξετρελάνει το ZFS, ειλικρινά δεν μπορούμε να φανταστούμε τι θα μπορούσε να σας ξετρελάνει.

Σοβαρά σας το λέμε.

Τα ZFS filesystems δεν έχουν καμία -μα καμία- σχέση με τα συμβατικά. Σ' αυτό το άρθρο επιδεικνύουμε δύο μόνο από τις ενδιαφέρουσες ιδιότητές τους (αυτόματη, on-the-fly συμπίεση και δημιουργία copies σε block level) κι αυτό που βλέπετε είναι μέρος μόνο της λίστας με όλες τις σχετικές ιδιότητες.

Ασφάλεια πάνω απ’ όλα!
Μια άλλη, εξαιρετικά χρήσιμη δυνατότητα των ZFS pools είναι η υποστήριξη mirroring και RAID-Z. Πριν δούμε περί τίνος πρόκειται, ας καταστρέψουμε τα ZFS filesystems και το μοναδικό pool που φτιάξαμε:

[sub0@freebsd ~]$ df -hT
Filesystem          Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a         ufs      989M    273M    637M    30%    /
devfs               devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e         ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f         ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d         ufs      4.8G     90M    4.4G     2%    /var
storage             zfs      4.4T     24K    4.4T     0%    /storage
storage/compressed  zfs      4.4T     17M    4.4T     0%    /storage/compressed
storage/important   zfs      4.4T    106M    4.4T     0%    /storage/important

[sub0@freebsd ~]$ sudo zfs destroy storage/important
[sub0@freebsd ~]$ sudo zfs destroy storage/compressed
[sub0@freebsd ~]$ sudo zpool destroy storage

[sub0@freebsd ~]$ df -hT
Filesystem   Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a  ufs      989M    273M    637M    30%    /
devfs        devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e  ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f  ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d  ufs      4.8G     90M    4.4G     2%    /var
[sub0@freebsd ~]$

Από εδώ και στο εξής υποθέτουμε ότι ο υπολογιστής έχει πέντε δίσκους SATA: Εκείνον του λειτουργικού κι άλλους τέσσερις, με χωρητικότητα 2TB έκαστος. Μιας κι o υπολογιστής μας είναι εικονικός, είναι εύκολο να του βγάλουμε τους δίσκους που είχαμε ως τώρα και να του δώσουμε τους νέους.

Τώρα, ένας τρόπος για να προστατεύουμε τα δεδομένα μας είναι μέσω ενός mirrored pool, μ’ άλλα λόγια ενός pool που αποτελείται από δύο δίσκους ίσου μεγέθους: ό,τι γράφεται στον έναν γράφεται και στο άλλον, επομένως στην περίπτωση που χτυπήσει ο ένας τα δεδομένα παραμένουν ασφαλή στον άλλο. Ας φτιάξουμε, λοιπόν, ένα mirrored pool αποτελούμενο από τους δύο πρώτους δίσκους, δηλαδή τον /dev/da1 και /dev/da2:

[sub0@freebsd ~]$ sudo zpool create storage mirror /dev/da1 /dev/da2
[sub0@freebsd ~]$ df -hT
Filesystem   Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a  ufs      989M    273M    637M    30%    /
devfs        devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e  ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f  ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d  ufs      4.8G     90M    4.4G     2%    /var
storage      zfs      2.0T     21K    2.0T     0%    /storage

Όπως βλέπουμε κι από την έξοδο της df, η χωρητικότητα του mirrored pool με όνομα storage που μόλις φτιάξαμε είναι 2 κι όχι 4TB, αφού όντως αυτή είναι η ωφέλιμη. Ιδού και μια άλλη όψη του νέου pool

[sub0@freebsd ~]$ zpool list
NAME      SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
storage  1.98T  76.5K  1.98T     0%  ONLINE  -

καθώς και μια περισσότερο λεπτομερής:

[sub0@freebsd ~]$ zpool status
  pool: storage
 state: ONLINE
 scrub: none requested
config:
	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    da2     ONLINE       0     0     0
errors: No known data errors

Ελάτε τώρα να εξομοιώσουμε την καταστροφή του δίσκου /dev/da1, θέτοντάς τον offline:

[sub0@freebsd ~]$ sudo zpool offline storage da1

Για να δούμε την κατάσταση του pool μας τώρα:

sub0@freebsd ~]$ zpool status
  pool: storage
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
	Sufficient replicas exist for the pool to continue functioning in a
	degraded state.
action: Online the device using 'zpool online' or replace the device with
	'zpool replace'.
 scrub: scrub completed after 0h0m with 0 errors on Tue May 24 07:40:37 2011
config:
	NAME        STATE     READ WRITE CKSUM
	storage     DEGRADED     0     0     0
	  mirror    DEGRADED     0     0     0
	    da1     OFFLINE      0     0     0
	    da2     ONLINE       0     0     0
errors: No known data errors
[sub0@freebsd ~]$

Παρά το γεγονός ότι είναι DEGRADED, το pool συνεχίζει να λειτουργεί κι εμείς είμαστε σε θέση να γράφουμε δεδομένα πάνω του. Σε αληθινές συνθήκες κάποια στιγμή θα κλείναμε τον fileserver, θ’ αντικαταστούσαμε τον χτυπημένο δίσκο κι αφού σηκώναμε ανοίγαμε ξανά το μηχάνημα και σηκώναμε το λειτουργικό θα τον εντάσαμε ξανά στο mirrored pool μας:

[sub0@freebsd ~]$ sudo zpool online storage da1
[sub0@freebsd ~]$ zpool status                 
  pool: storage
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue May 24 08:07:07 2011
config:
	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0  17.5K resilvered
	    da2     ONLINE       0     0     0
errors: No known data errors
[sub0@freebsd ~]$

Μια χαρά όλα :) Κοιτάξτε τώρα πόσο ευέλικτο είναι το ZFS. Ενώ έχουμε ήδη ένα pool με δύο mirrored δίσκους, μπορούμε να του προσθέσουμε άλλους δύο mirrored δίσκους και να πάρουμε ένα μεγαλύτερο pool, το οποίο θα αποτελείται από δύο ζεύγη mirrored δίσκων!

[sub0@freebsd ~]$ sudo zpool add storage mirror /dev/da3 /dev/da4
[sub0@freebsd ~]$ df -hT
Filesystem   Type     Size    Used   Avail Capacity  Mounted on
/dev/da0s1a  ufs      989M    273M    637M    30%    /
devfs        devfs    1.0K    1.0K      0B   100%    /dev
/dev/da0s1e  ufs      989M     14K    910M     0%    /tmp
/dev/da0s1f  ufs       11G    1.2G    8.7G    12%    /usr
/dev/da0s1d  ufs      4.8G     90M    4.4G     2%    /var
storage      zfs      3.9T     21K    3.9T     0%    /storage

Να και μια άλλη όψη του νέου μας pool:

[sub0@freebsd ~]$ zpool status
  pool: storage
 state: ONLINE
 scrub: resilver completed after 0h0m with 0 errors on Tue May 24 08:07:07 2011
config:
	NAME        STATE     READ WRITE CKSUM
	storage     ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0  17.5K resilvered
	    da2     ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    da4     ONLINE       0     0     0
errors: No known data errors

Κάνουμε πραγματικά την καρδιά πέτρα και για λόγους χώρου δεν συζητάμε για τις συστοιχίες RAID-Z που υποστηρίζει το ZFS. Yποσχόμαστε πάντως να επανέλθουμε στο όλο θέμα του ZFS, ενδεχομένως στο Parabing!

Αξίζει για το σπίτι;
Όπως είπαμε και στην αρχή του άρθρου, από την ενασχόλησή μας με το ZFS συμπεράναμε ότι δεν είναι κατάλληλο μόνο για εταιρικά περιβάλλοντα, όπου εκεί είναι συνηθισμένο να συναντάμε μεγάλους fileservers με δεκάδες ή ακόμη κι εκατοντάδες terabyte αποθηκευτικού χώρου.

Μετά απ’ όσα είδε ο γράφων πραγματικά δεν βλέπει την ώρα ν’ αντικαταστήσει τον Ubuntu, LVM-based fileserver που έχει στο Northern Outpost (TM) μ’ έναν νέο, ο οποίος θα βασίζεται στο FreeBSD και στο ZFS.

Τέλος, να σημειώσουμε και κάτι που επισήμανε ο φίλος Αλέξανδρος, γνωστός και μη εξαιρετέος θαμώνας στη fan page του περιοδικού στο Facebook. Ο Αλέξανδρος έχει πρακτική εμπειρία από το ZFS και σε σχετική συζήτηση που έγινε στη fan page μάς ανέφερε ότι σε περιβάλλοντα με πολλούς χρήστες το ZFS δεν έχει τις καλύτερες δυνατές επιδόσεις. Όμως σε τέτοια περιβάλλοντα ούτως ή άλλως γίνεται χρήση της δυνατότητας του ZFS για caching – και φυσικά το caching αυτό λαμβάνει χώρα πάνω σε δίσκους SSD. Πάντως σε περιβάλλον μικρού εργαστηρίου ή εταιρείας και φυσικά στο σπίτι, είναι μάλλον απίθανο να γίνει αντιληπτή η συγκριτικά χαμηλή ταχύτητα του ZFS.

Λοιπόν, άντε μην εξοπλήσει ο γράφων τον ZFS fileserver του και με δίσκο SSD.

Έτσι, απλά, για την πόρωση :)

Σας άρεσε το άρθρο; Αν ναι, τι θα λέγατε για ένα tip στο PayPal;

6 Responses to “ZFS: Το τέλος και η αρχή των filesystems!”

  1. takmast | 03/01/2012 at 18:56

    Μου θυμιζει πολυ το ADVFS file system με τα domains και τα filesets, απο το TRU64 (DEC UNIX), βεβαια ZFS ειναι πολυ πιο λειτουργικο στο volume mngt. Με λιγα λογια ειναι φανταστικο !

    • subZraw | 03/01/2012 at 21:12

      Ένα από τα πράγματα που αξίζουν και θα φέρει το 2012 είναι το FreeBSD 9.0-RELEASE. Απειροελάχιστο αποτέλεσμα αυτού του σπουδαίου γεγονότος, θα ‘ναι ένας νέος ZFS-based fileserver στο Northern HQ της Parabing Creations :D

      (Η μοναδική μου επαφή με το ADVFS έγινε μέσω ενός στιγμιαίου βλέμματος σε κάποια σελίδα της Wikipedia :S)

  2. user | 05/10/2012 at 16:50

    Ενδίκνειται για χρήση σε SSD (όσον αφορά το performance) συγκρινόμενο με log based FS (e.g. NILFS2 , BTRFS) ;

    • subZraw | 05/10/2012 at 16:59

      Στους ZFS-based fileservers, ο δίσκος SSD χρησιμοποιείται κυρίως για caching. Για τα δεδομένα αυτά καθεαυτά, χρησιμοποιούνται κλασικοί δίσκοι, συχνά σε RAID configurations. Το δε BTRFS, ενώ είναι πολλά υποσχόμενο δεν είναι ακόμα Αρκετά Ώριμο (TM) και προς το παρόν κάθε σύγκριση με το ZFS νομίζω ότι δεν έχει και πολύ νόημα. Όσο για το NILFS-Something που λες, πρώτη φορά το ακούω στη ζωή μου :D

  3. user | 05/10/2012 at 18:10

    >Για τα δεδομένα αυτά καθεαυτά, χρησιμοποιούνται κλασικοί δίσκοι, συχνά σε RAID configurations

    SSD δεν χρησιμοποιούνται σε RAID configurations για λόγους κόστους η χαμηλότερου MTBF ?

    NILFS:
    http://www.linux-mag.com/id/7345/

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων