storiq logo

La traînée de poudre

Le blog StorIQ

 

Lundi, 09 juillet 2018

ZFS : les bases et les pièges

ZOL

Depuis la disponibilité officielle de ZOL (ZFS on Linux) dans la dernière version stable d’Ubuntu, la mode ZFS bat son plein. ZFS est régulièrement présenté depuis de longues années comme la plus belle invention depuis les systèmes de fichiers journalisés.

ZFS il est vrai a de grands avantages: sécurité par l’utilisation systématique de sommes de contrôles en lecture comme en écriture, clichés (snapshots) continus, extension facile, virtualisation des volumes, différents niveau de redondance (miroir, RAIDZ, RAIDZ2, RAIDZ3…), déduplication, etc.

Mais si ZFS a ses avantages, il est nettement orienté vers l’administrateur système compétent, et fournit une ample réserve de fusils à pompe chargés à chevrotine (voire de lance-roquettes) pour se tirer des balles dans le pied. En particulier, de nombreuses manipulations irréversibles ou destructrices de données sont appliquées sans confirmation préalable aucune.

Passons ces points en revue.

Vocabulaire

Avant d’installer ZFS, il convient de se familiariser avec ses concepts. ZFS regroupe plusieurs fonctionnalités habituellement partagées entre plusieurs sous-systèmes, à savoir (sous Linux seulement):

  • la redondance (RAID)
  • les volumes logiques (LVM)
  • le système de fichiers.

Dans la tradition d’administration système Linux, pour obtenir la redondance on créera un volume RAID; pour pouvoir facilement redimensionner des volumes, attribuer des espaces de stockage dédiés à différents usages, prendre des clichés on utilisera LVM; enfin, on installera sur les volumes des systèmes de fichiers.

ZFS amène sa propre logique: on assemble les disques en vdevs, qu’on ajoute à un zpool, qu’on peut partager en volumes (sous-volumes, zvol ou clichés). La redondance (niveau de RAID) se fait au niveau du vdev, mais les clichés se font au niveau du zpool.

ARC, L2ARC et ZIL

ARC est simplement le cache disque de ZFS (dédié). Il n’utilise pas le cache VFS standard du noyau Linux.

L2ARC est un cache en lecture sur SSD. Il permet d’accélérer certaines lectures (aléatoires, petits fichiers…). Les SSD peuvent être relativement bas de gamme, et ils sont stripés.

ZIL est un cache en écriture sur SSD. Il permet d’accélérer les écritures synchrones et/ou aléatoires. Il faut des SSD très rapides, et en miroir. C’est un pur cache en écriture pour des reprises rapides en cas de coupure, etc.

Utilisation de base : créons un zpool

Un vdev est un ensemble de disques (une grappe RAID). Quand on ajoute des disques à un zpool on crée un nouveau vdev avec ces disques. On ne peut pas rajouter de disques à un vdev existant.

Commençons avec une machine sans pools:

# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0   7,3T  0 disk 
sdb           8:16   0   7,3T  0 disk 
sdc           8:32   0   7,3T  0 disk 
sdd           8:48   0   7,3T  0 disk 
sde           8:64   0   7,3T  0 disk 
sdf           8:80   0   7,3T  0 disk 
sdg           8:96   0   7,3T  0 disk 
sdh           8:112  0   7,3T  0 disk 
nvme0n1     259:0    0 119,2G  0 disk 
  nvme0n1p1 259:1    0  29,8G  0 part /
  nvme0n1p2 259:2    0   1,9G  0 part [SWAP]
  nvme0n1p3 259:3    0  87,6G  0 part 

# zpool list
no pools available

Créons le zpool:


# zpool create poolz2 raidz2 sda sdb sdc sdd sde sdf sdg sdh

# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
poolz2    58T   224K  58,0T         -     0%     0%  1.00x  ONLINE  -

# df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
udev                16G       0   16G   0% /dev
tmpfs              3,2G     11M  3,2G   1% /run
/dev/nvme0n1p1      30G    5,7G   23G  21% /
tmpfs               16G       0   16G   0% /dev/shm
tmpfs              5,0M       0  5,0M   0% /run/lock
tmpfs               16G       0   16G   0% /sys/fs/cgroup
tmpfs              3,2G    4,0K  3,2G   1% /run/user/117
tmpfs              3,2G       0  3,2G   0% /run/user/0
poolz2              40T       0   40T   0% /poolz2

# zpool status
  pool: poolz2
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        poolz2      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            sda     ONLINE       0     0     0
            sdb     ONLINE       0     0     0
            sdc     ONLINE       0     0     0
            sdd     ONLINE       0     0     0
            sde     ONLINE       0     0     0
            sdf     ONLINE       0     0     0
            sdg     ONLINE       0     0     0
            sdh     ONLINE       0     0     0

errors: No known data errors

Les pièges de la création de zpool:

  • il est impossible de retirer un périphérique d’un zpool. Ceci induit deux corollaires:
    • si on se trompe et qu’on met un disque par erreur dans un zpool, par exemple une clef USB, tant pis: ce périphérique doit rester en place aussi longtemps que le zpool sera utilisé…
    • si on se trompe et que le disque inséré contenait des données, tant pis: elles sont irrémédiablement perdues, et ZFS ne demande pas de confirmation.

Conclusion: vérifiez très soigneusement la liste des disques que vous comptez utiliser avant de créer votre zpool.

Création de volumes

ZFS permet de créer très facilement des volumes (simples, ou clichés) à l’intérieur d’un zpool, et les monte automatiquement:

# zfs create poolz2/myshare

# cd /poolz2/myshare/
# ls
# mkdir test/
# mkdir titi tete tata toto
# for i in *; do echo rere > $i/rere; echo zeze > $i/zeze; done
# ls
tata  test  tete  titi  toto
# df -h .
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
poolz2/myshare      57T    128K   57T   1% /poolz2/myshare

par contre, attention au piège: la destruction d’un volume se fait sans le moindre préavis, ni demande de confirmation.

# cd
# zfs destroy poolz2/myshare 
# ls /poolz2/

Conclusion: avant d’utiliser la commande “zfs destroy” soyez très prudent.

Agrandissement de zpool

Il est extrêmement simple d’ajouter un nombre quelconque de disques à un zpool existant:


# zpool add poolz2 raidz2 sdi sdj sdk sdl sdm sdn sdo sdp 

Un piège lié aux précédents se présente lors de l’ajout de disques à un zpool. On serait tenté de croire qu’on peut y rajouter des disques pour l’agrandir au fur et à mesure, et effectivement si on y ajoute un disque ou deux, ZFS agrandira le zpool mais en créant un nouveau vdev à chaque ajout. Or le RAID se fait au niveau du vdev et pas au niveau du pool!

  • on ne peut pas ajouter de disques à un vdev, sauf à convertir un vdev d’un seul disque en miroir.
  • si on fait du raidz2, on doit ajouter les disques par vdev entiers, par exemple par groupes de 6, 8 ou 10 disques, faute de quoi la performance sera gravement impactée.

Un autre piège est que ZFS ne permet pas, contrairement au RAID logiciel Linux ou à la plupart des contrôleurs matériels, de changer le niveau de RAID d’un vdev ou d’étendre un vdev. Donc…

  • si on oublie un disque (on en met 9 au lieu de 10): dommage, il faut casser le zpool et le refaire. J’espère que vous n’y aviez pas encore mis de données…
  • si on se trompe de niveau de RAID : là encore c’est bien dommage, il est impossible de modifier un vdev.

Enfin, le piège mortel:

Si on perd un vdev, on perd tout le pool. Si on crée un pool avec un vdev raidz2 et qu’on ajoute un seul disque au pool, ce disque constitue alors un vdev non redondant. Si ce disque tombe en panne, tout le pool est perdu! Cas d’école: sur un serveur avec un zpool contenant 3 pétaoctets de données, on ajoute par erreur une clef USB au zpool. Quelqu’un retire la clef USB. Toutes les données sont perdues.

Clichés

Cela devrait aller sans dire et pourtant, il peut être utile de le répéter : les clichés (snapshots) ne constituent pas des sauvegardes. Un cliché fait partie du même zpool que le volume qu’il réplique : en cas de panne du zpool, les données originales aussi bien que les clichés seront perdues… Faites des sauvegardes!

Pour finir

ZFS est un système complexe pensé par et pour des administrateurs Unix chevronnés, binoclards et barbus qui méprisent les interfaces graphiques. dilbert Unix

Il n’est sûrement pas destiné aux “mangeurs de quiche”. Soyez prudents et extrêmement méthodiques en utilisant toute commande commmançant par “zpool” ou “zfs”.

lorsque vous créez ou agrandissez un zpool, vérifiez, vérifiez encore, testez, simulez. La moindre erreur peut causer des pertes massives de données…

posté à: 17:04 permalink