
Lundi, 09 juillet 2018
ZFS : les bases et les pièges
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.
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