Systeme de fichiers ZFS

De OpenWikiBSD
Aller à : navigation, rechercher

Bonnes docs

ZFS

Tuning ZFS avec des SSD en cache

Why Raid Sucks!

Dedup: Good feature ou gouffre à fric ?

Blog du papa de ZFS

ZFS utilisable sous ProxMox, bientôt!

Choix techniques

Avec un éventail de disques de tailles différentes, on va tenter de concilier :

  • Performances
  • Fiabilité
  • Espace

Bref, assez inconciliable, non ??

Dans mon panier neuf :

  • 3 disques de 1TB
  • 3 disques de 500 GB
  • 1 SSD de 30GB
  • 1 carte Raid 3Ware 8506-8LP en PCI-X
  • 1 carte Raid 3Ware 9500S-4LP en PCI-X

Ebay est parfois un endroit merveilleux..

  • On utilisera les contrôleurs Raid comme des simples contrôleurs disques exportant les disques 1 par 1 en mode JBOD, en utilisant juste le cache, mais aucune fonction raid, ZFS fera le boulot.
  • Pour limiter les dégâts liés à une panne disque, on génère des miroirs (aka Raid1) de deux disques.
  • Pour limiter les dégâts liés à une panne de contrôleur, on génère les miroirs avec chaque disque sur une carte différente.
  • Le SSD sera partitionné en 2: Une partie en cache en lecture, l'autre pour le cache en écriture.

Identification des disques

  • twa0 = AMCC 9500S-4LP
    • twa0 port 0 = da0 1TB
    • twa0 port 1 = da1 1TB
    • twa0 port 2 = da2 500GB
    • twa0 port 3 = da3 500 GB
  • twe0 = AMCC 8506-8LP
    • twe0 port 2 = twed0 500 GB
    • twe0 port 4 = twed1 1 TB
    • twe0 port 6 = twed2 1 TB
  • twe1 = AMCC 7006-2P
    • twe1 unit 0 = twed3 Boot Raid hard de 20GB

Mise en place du Pool

  • Création de l'agrégat de miroirs (stripe of mirrors)
zpool create datas mirror da0 twed1 mirror da1 twed2 mirror da3 twed0

  • Vérification
zpool status
  pool: datas
 state: ONLINE
 scrub: none requested
config:

	NAME        STATE     READ WRITE CKSUM
	datas       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da0     ONLINE       0     0     0
	    twed1   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    twed2   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    twed0   ONLINE       0     0     0

errors: No known data errors


  • Ajout d'un ZIL et d'un L2ARC sur un SSD

Le ZIL (ZFS INtent Log) est un cache en écriture

Le L2ARC est un cache en lecture.


zpool add datas log da2s1
zpool add datas cache da2s2
zpool status
  pool: datas
 state: ONLINE
 scrub: scrub completed after 0h2m with 0 errors on Wed May 11 20:39:59 2011
config:

	NAME        STATE     READ WRITE CKSUM
	datas       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da0     ONLINE       0     0     0
	    twed1   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    twed2   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    twed0   ONLINE       0     0     0
	logs
	  da2s1     ONLINE       0     0     0
	cache
	  da2s2     ONLINE       0     0     0

errors: No known data errors


Mise en place du FS

zfs create datas/films


Options

zfs get all 
zfs set compression=on datas/photos
zfs set copies=2 datas/photos

Debug

  • Commande
zpool create miroir1 mirror da0 twed1
  • Réponse
invalid vdev specification
use '-f' to override the following errors:
  • Solution

Les disques sont de tailles différentes (même légèrement); vous devez forcer la main à ZFS (-f).

zpool create -f miroir1 mirror  da0 twed1
  • COmmande
zpool add  rpool mirro da6 da7
  • Réponse
cannot add to 'rpool': root pool can not have multiple vdevs or separate logs

Une fois fabriqué, le root pool ne peut pas augmenter le nombre de vdev!

TRES Important : Une fois choisi le nombre et le type de vdev pour le root pool, vous ne pouvez plus le changer, ni l'augmenter!!! Impossible par exemple de partir, par exemple sur un agrégat de 3 miroirs de 2 disques (Raid10 3X2disques) pour passer plus tard à un agrégat de 4 miroirs de 2 disques (Raid10 4X2disques).


  • Commande
zpool create miroir1 mirror da1 twed2
  • Réponse
/dev/da1 is part of potentially active pool 'datas'
use '-f' to override the following errors:
  • Solution

Un disque (au moins) appartient déja à une grappe ZFS; vous allez tout casser. Si vous êtes certain de ce que vous faites, vous devez forcer la main à ZFS (-f).

zpool create -f miroir2 mirror  da1 twed2
  • (Spécial ZFSGUru ??) : Impossible de créer la table de partition GPT sur un disque de plus de 1TB

[1]

  gpart backup da0 > da0.gpt

où da0 est un disque bien formaté par l'utilitaire ZFSGuru

 gpart restore -F /dev/da1 < da0.gpt

où da1 est le disque à problème.Même si da1 est plus grand que da0. Ensuite, dans l'interface ZFSGuru vous augmentez dynamiquement la taille de da1.

Un souci de disque ?

zpool status
 pool: datas
 state: DEGRADED
 scrub: scrub completed after 2h26m with 0 errors on Sat May 14 09:58:05 2011
 config:
	NAME        STATE     READ WRITE CKSUM
	datas       DEGRADED     0     0     0
	  mirror    DEGRADED     0     0     0
	    da0     REMOVED      0     0     0
	    twed1   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    twed2   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    twed0   ONLINE       0     0     0
	logs
	  da2s1     ONLINE       0     0     0
	cache
	  da2s2     ONLINE       0     0     0
 errors: No known data errors

Oui..un souci, on peut le dire, le disque da0 est parti en vrille..

On sort le disque du pool

zpool offline datas da0

On le remet..En fait j'ai éteint, vérifié les cx sata et redémarré :

zpool status

 pool: datas
 state: ONLINE
 status: One or more devices has experienced an unrecoverable error.  An
	attempt was made to correct the error.  Applications are unaffected.
 action: Determine if the device needs to be replaced, and clear the errors
	using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-9P
 scrub: resilver in progress for 0h2m, 3.48% done, 1h15m to go
 config:
	NAME        STATE     READ WRITE CKSUM
	datas       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da0     ONLINE       0     0     2  7.88G resilvered
	    twed1   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    twed2   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    twed0   ONLINE       0     0     0
	logs
	  da2s1     ONLINE       0     0     0
	cache
	  da2s2     ONLINE       0     0     0
 errors: No known data errors

D'ici 1h et des brouettes, je retrouverai ma redondance!

Il faudra que je vérifie si le disque est récupérable ou pas.

  • Durant le réargentage (la reconstruction, le resilvering, quoi!), le disque est soumis à rude épreuve :
q                        extended device statistics  
device     r/s   w/s    kr/s    kw/s wait svc_t  %b  
da0        0.0 424.9     0.0 46803.6    4   4.0  53 
twed1    199.8   6.4 23796.5    13.3    0  19.1  53 
twed2     68.8   6.6  7972.8    13.3    0  11.8  27 
da1       69.2   6.6  8081.6    13.3    0  24.7  60 
twed0     43.2   6.6  4890.3    13.3    0  10.3  19 
da3       32.8   6.6  3708.1    13.3    2  20.1  42 
da2        0.2   1.0     3.2     8.8    0 203.9   6 
pass1      0.0   0.0     0.0     0.0    0   0.0   0 
pass2      0.0   0.0     0.0     0.0    0   0.0   0 
twed3      0.0   0.0     0.0     0.0    0   0.0   0 
pass3      0.0   0.0     0.0     0.0    0   0.0   0 
pass0      0.0   0.0     0.0     0.0    0   0.0   0 
  • da0 écrit 46803 ko/s
  • twed1, l'autre disque du miroir lit 23796 ko/s
  • les autres disques de la grappe participent également de l'effort de reconstruction : 7972+8081+4890+3708 = 24651 ko/s

Il faut comprendre que l'algo de resilvering est très futé et optimisé au mieux la lecture sur les différents disques pour ne pas en faire un goulet d’étranglement. Pas con ZFS !

une fois terminé :

zpool status -x
  pool: datas
 state: ONLINE
status: One or more devices has experienced an unrecoverable error.  An
	attempt was made to correct the error.  Applications are unaffected.
action: Determine if the device needs to be replaced, and clear the errors
	using 'zpool clear' or replace the device with 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-9P
 scrub: resilver completed after 0h48m with 0 errors on Sat May 14 15:00:25 2011
config:

	NAME        STATE     READ WRITE CKSUM
	datas       ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da0     ONLINE       0     0     2  139G resilvered
	    twed1   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da1     ONLINE       0     0     0
	    twed2   ONLINE       0     0     0
	  mirror    ONLINE       0     0     0
	    da3     ONLINE       0     0     0
	    twed0   ONLINE       0     0     0
	logs
	  da2s1     ONLINE       0     0     0
	cache
	  da2s2     ONLINE       0     0     0

errors: No known data errors


Ce qui n'est pas possible avec ZFS

  • Changer le niveau de raid
  • Modifier le pool racine
  • Changer le nombre de disques dans un agrégat
  • Importer/Exporter le pool root si il est monté (et comme il contient les binaires systèmes, il est indémontable) SOlution : Un LIveCD

Commandes communes

Un excellent résumé

Extension de taille de volume

10s secondes chrono !

#zfs list
NAME       USED  AVAIL  REFER  MOUNTPOINT
SAN        251G   284G   655M  /SAN
SAN/ESX1   250G   528G  5,92G  -

# zfs get volsize SAN/ESX1
NAME      PROPERTY  VALUE     SOURCE
SAN/ESX1  volsize   250G      -

# zfs set volsize=300G SAN/ESX1

# zfs get volsize SAN/ESX1
NAME      PROPERTY  VALUE     SOURCE
SAN/ESX1  volsize   300G      -


Extension d'un pool par remplacement de disque

Il faut lire les docs avant..

celle-ci et [2]

C'est une opération à faire de manière si le disque à changer est encore présent; ça rend l'opération moins stressante ..

Disque Mort

On a un agrégat de miroirs. Un de ces miroirs est

mirror-3    ONLINE       0     0     0
      gpt/Dev6  ONLINE       0     0     0
      gpt/Dev7  ONLINE       0     0     0

Et on veut remplacer Dev7 par Dev8 . Dev6 est du même modèle que Dev8.

  • D'abord un bon scrub pour vérifier que toutes les données sont OK.
zpool scrub zroot
  • 10h plus tard, on y va :On retire Dev7, on éteint, on rebranche Dev8, on met à jour sa Gpt (la nouvelle table de partition) et on l'intègre dans le pool:
zpool detach zroot gpt/Dev7
gpart backup /dev/da6 > /root/gpart_da6.gpt
gpart restore /dev/da8 < /root/gpart_da6.gpt 
gpart show /dev/da8
=>        34  3906228157  da8  GPT  (1.8T)
         34         512    1  freebsd-boot  (256k)
        546        1502       - free -  (751k)
       2048  3906226143    2  freebsd-zfs  (1.8T)
zpool attach  -f zroot gpt/Dev6 gpt/Dev8


zpool status

  pool: zroot
 state: ONLINE
 status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
 action: Wait for the resilver to complete.
  scan: resilver in progress since Sun May  4 12:02:27 2014
        196G scanned out of 3.66T at 334M/s, 3h1m to go
        51.6G resilvered, 5.22% done
 config:

	NAME          STATE     READ WRITE CKSUM
	zroot         ONLINE       0     0     0
	  mirror-0    ONLINE       0     0     0
	    gpt/Dev0  ONLINE       0     0     0
	    gpt/Dev1  ONLINE       0     0     0
	  mirror-1    ONLINE       0     0     0
	    gpt/Dev2  ONLINE       0     0     0
	    gpt/Dev3  ONLINE       0     0     0
	  mirror-2    ONLINE       0     0     0
	    gpt/Dev4  ONLINE       0     0     0
	    gpt/Dev5  ONLINE       0     0     0
	  mirror-3    ONLINE       0     0     0
	    gpt/Dev6  ONLINE       0     0     0
	    gpt/Dev8  ONLINE       0     0     0  (resilvering)

 errors: No known data errors

334 Mo/s ! Je n'ai pas de SSD et les disques sont des bons gros SATA 2To....

Vous n'oublierez pas de mettre à jour le gpt avec les infos de boot: Vous cliquez sur la partition du disque intitulée freebsd-boot (Sous ZFSGuru) et vous faites un update du mbr.

Disque Encore vivant

On a un agrégat de miroirs. Un de ces miroirs est

mirror-3    ONLINE       0     0     0
      gpt/Dev9  ONLINE       0     0     0
      gpt/Dev5  ONLINE       0     0     0

Et on veut remplacer Dev5 par Dev10 . Dev10 n'est pas du même modèle que Dev6.

da4 correspond à Dev5

da8 correspond à Dev10


  • D'abord un bon scrub pour vérifier que toutes les données sont OK.
zpool scrub zroot
  • 10h plus tard, on y va

Voilà l'état du pool :

Zroot1.png

  • On configure le pool pour bénéficier automatiquement de l'augmentation de taille:
zpool set autoexpand=on zroot

La suite des opérations :

  • On ajoute Dev10
  • On met à jour la GPT de Dev10
  • On remplace Dev5 par Dev10 (Resilvering)
  • On enlève Dev5 :


gpart backup /dev/da6 > /root/gpart_da6.gpt

On ne garde que les lignes correspondantes au boot :

cat /root/gpart_da6.gpt 
 GPT 128
 1   freebsd-boot         34        512  
gpart restore /dev/da10 < /root/gpart_da6.gpt 

ZfsGuru :

On update le bootloader du disque

On formate en zfs le reste


gpart show /dev/da10
=>        34  3906228157  da8  GPT  (1.8T)
         34         512    1  freebsd-boot  (256k)
        546        1502       - free -  (751k)
       2048  3906226143    2  freebsd-zfs  (1.8T)
/sbin/zpool replace -f zroot gpt/Dev5 gpt/Dev10


zpool status

  
zpool status
  pool: zroot
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
	continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Thu May  8 09:37:49 2014
        75.8G scanned out of 3.66T at 300M/s, 3h29m to go
        18.3G resilvered, 2.02% done
config:

	NAME             STATE     READ WRITE CKSUM
	zroot            ONLINE       0     0     0
	  mirror-0       ONLINE       0     0     0
	    gpt/Dev0     ONLINE       0     0     0
	    gpt/Dev1     ONLINE       0     0     0
	  mirror-1       ONLINE       0     0     0
	    gpt/Dev2     ONLINE       0     0     0
	    gpt/Dev3     ONLINE       0     0     0
	  mirror-2       ONLINE       0     0     0
	    gpt/Dev9     ONLINE       0     0     0
	    replacing-1  ONLINE       0     0     0
	      gpt/Dev5   ONLINE       0     0     0
	      gpt/Dev10  ONLINE       0     0     0  (resilvering)
	  mirror-3       ONLINE       0     0     0
	    gpt/Dev6     ONLINE       0     0     0
	    gpt/Dev8     ONLINE       0     0     0

errors: No known data errors


334 Mo/s ! Je n'ai pas de SSD et les disques sont des bons gros SATA 2To....

Vous n'oublierez pas de mettre à jour le gpt avec les infos de boot: Vous cliquez sur la partition du disque intitulée freebsd-boot (Sous ZFSGuru) et vous faites un update du mbr.


A la fin du réargentage (;-) ) ou resilvering, l'extension du volume du pool sera effective, moyennant, peut-être, un zpool export && zpool import, ou bien, si vous avez bien configuré le pool pour s'étendre.

Zroot2.png

Obtenir l'historique

zpool history

Quel est la config d'un pool ?

zfs get all datas

= Vérifier le pool

  • Lancer la vérification
zpool scrub  datas
  • Stopper la vérification
zpool scrub -s datas

Partage réseau

NFS

zfs set sharenfs=on datas/films

et c'est tout ! Pas de démon à relancer, c'est immédiatement disponible.

Attention, vos users doivent avoir le même UID entre le client et le serveur pour pouvoir lire/écrire..

Samba

zfs set sharesmb=on datas/films

et ... rien ne se passe !

cd  /usr/ports/net/samba35
make config install clean


echo 'samba_enable="YES"
winbindd_enable="YES"
' >> /etc/rc.conf

Ou bien, plus granulaire :

echo 'nmbd_enable="YES"
smbd_enable="YES"
winbindd_enable="YES"
' >> /etc/rc.conf


Puis, il faut configurer le fichier de config : /usr/local/etc/smb.conf

En particulier :

  workgroup = MYGROUP

Attention à ajouter (smbpasswd -a USER) l'utilisateur nécessaire. (USER existe déja dans un référentiel , genre /etc/master.passwd)

Si vous ajoutez un partage depuis un pool ZFS, jetez un oeil sur la fin du fichier :

;[zpool]
;    path = /tank/zpool
;    unix extensions = no
;    vfs objects = zfsacl
;    nfs4:mode = special
;    nfs4:acedup = merge
;    nfs4:chown = yes
    writable = yes
    browseable = yes
    valid users =  polyp


Attention, la ligne

    ;vfs objects = zfsacl

Fait planter les connexions réseau chez moi; une fois décommentée, aucun souci.

Snapshot & Rollback

Comment faire les modifs, les c..ries qu'on veut sur un FS (même le FS root) et revenir à une situation stable.

 zfs snapshot -r nom-du-pool@nom-du-snapshot
 zfs list -t snapshot
 zfs rollback nom-du-pool@nom-du-snapshot


Backup/restore et synchro vers une autre machine

Il faut utiliser les snapshot et ssh, seul outil supplémentaire nécessaire !

  • Serveur 1

On fait le snapshot du FS

zfs snapshot  -r zroot/share/iso@iso-Transfert
  • Serveur 2

Ajouter utilisateur au groupe possédant les droits sur le partage

Exemple avec ZFS GUru user : ssh, pool : zroot/Share

zfs allow ssh receive,create,mount zroot/share
  • Serveur 1:
zfs send    -R zroot/share/iso@iso-Transfert | ssh ssh@Serveur2 zfs receive  -Fv zroot/share/iso

Et c'est parti !

Un souci ?, on reprend de manière incrémentale à la méthode rsync. On ajoute "-i" dans le send

Spécificités FreeBSD

Configuration et lancement

  • Sous archi i386, il faut ajouter cela
echo "vfs.zfs.prefetch_disable=0" >> /boot/loader.conf


  • Pour démarrer ZFS au boot :
echo 'zfs_enable="YES"' >> /etc/rc.conf


  • Il faut ajuster la config mémoire :
echo 'vm.kmem_size_max="512M"' >> /boot/loader.conf
echo 'vm.kmem_size="512M"' >> /boot/loader.conf
echo 'vfs.zfs.arc_max="256M"' >> /boot/loader.conf
echo 'vfs.zfs.txg.timeout="5"' >> /boot/loader.conf


Attention vfs.zfs.arc_max doit être inférieur à vm.kmem_size.

Attention également à ne pas trop faire grossir vm.kmem_size; au dela de 512M, vous devez recompiler le noyo. Vous risquez un souci..

Pour les explications :[3]


Spécificités Linux : ZFS on Linux

Installe les outils en userland

apt-get install zfs-fuse

...C'est à peu près tout..

Spécificités Solaris

Surveillance

Munin#ZFS


Comment réutiliser un disque ZFS sous un autre OS

parted /dev/sdc
mklabel msdos
quit

Sauver un pool ZFS du désastre

Vous avez monté un pool ZFS bien redondant et vous avez rencontré un gros souci (du type... serveur qui tombe avec les disques en marche...)

  • Rebranchez tout et changez les connecteurs SATA explosés.
  • Installez un système de version identique voire supérieure (genre FreeBSD 10.2)
zpool status
zpool import -R /mnt zroot
mount -t zfs zroot /mnt/
  • Faites vos backup


MOnter deux pools ZFS de noms identiques

[4]

zpool import

Affiche les pools importables

Récuperez l'iD du pool

zpool import -f 12770398678035415080 old-datas
zpool status