ZFS en détails

Written by Sebastien Lambot on . Posted in Unix / Linux

Les caractéristiques de ce système de fichiers sont sa très haute capacité de stockage, l’intégration de tous les concepts précédents concernant les systèmes de fichiers et la gestion de volume en un seul produit. Il intègre la structure On-Disk, il est léger et permet facilement la mise en place d’une plate-forme de gestion de stockage.

SunZFSQu’est-ce que ZFS?

  • ZFS est un puissant système de stockage de données qui combine à la fois la gestion des volumes et le système de fichiers
  • ZFS est transactionnel Copy-on-Write et toujours consistant. Lorsque des nouvelles données doivent être écrites, ZFS utilisera des nouveaux blocs plutôt que d’écraser les anciens, de manière à conserver les deux. De plus, ZFS travaille de manière transactionnelle, à la manière des DB. Si vous exécutez un benchmark, les opérations vont se retrouver dans un « transaction group » (TXG) et les queries vont être exécutées en mode « burst » à intervalles réguliers (30 secondes).
  • ZFS est un système de fichiers 128 bits, sa capacité est de 16 milliards de milliards de fois celle des systèmes de fichiers 64 bits actuels
  • ZFS utilise des checksum pour vérifier l’intégrité de ses données
  • ZFS adore la RAM et les SSD, et sait comment les utiliser. ZFS utilise la RAM comme cache intelligent (ARC: Adaptive Replacement Cache) et y conserve jusqu’à 4 listes de cache parmi lesquelles: la MRU (Most Recently Used) et la MFU (Most Frequently Used).
    La RAM est également utilisée comme espace de « prefetch » et de « Vdev Read-Ahead », ZFS rappatrie vers la RAM les données que vous êtes susceptibles de demander pour pouvoir les fournir plus rapidement.

ZFS se résume en 2 commandes: zpool pour la création des pools et zfs pour la création des datasets

Création d’un pool

Un pool peut être créé très simplement:

zpool create pool_name disk1 disk2 disk3
zpool status

La première commande crée le pool tandis que la deuxième montre que le pool a été créé et monté dans l’arboresence. Un df -h vous montrera que l’espace libre correspond à la somme des capacités des disques (striping).
L’espace de stockage est disponible et utilisable tel quel mais si vous voulez profiter de la technologie de ZFS, il vous faudra créer un dataset.

Création d’un dataset

Un dataset est un conteneur pour lequel certaines propriétés peuvent être configurées. La liste des datasets peut être affichée grâce à la commande zfs list. Leur création est également très simple:

zfs create pool_name/dataset_name

Ce qui a pour effet de créer et de monter automatiquement le dataset comme un subdirectory de la racine zfs, ici pool_name (à ne pas confondre avec la racine du système d’exploitation).

Les zpools et leurs vdevs

Un pool est créé à partir de un ou plusieurs « vdevs » (Virtual Devices), composés eux-mêmes de un ou plusieurs périphériques physiques. Ces vdevs peuvent donc être du type:

  • disk: un disque réel. Pour afficher les disques, vous pouvez utiliser la commande BSD suivante:
    camcontrol devlist
    diskinfo -v /dev/ada0
  • file: un fichier (/vdevs/vdisk001), idéal pour faire des tests mais non-recommandé pour la production. Ces fichiers doivent faire minimum 128Mo et être pré-alloués grâce à la commande suivante sous BSD:
    dd if=/dev/zero of=vdisk001 bs=1024k count=128 
  • mirror: deux ou plusieurs disques en miroir
  • raidz1/2: trois disques ou plus en RAID5/6. Le raidz2 est en fait un raidz1 mais avec une double parité
  • spare: un disque « roue de secours »
  • log (aka ZIL SLOG): un périphérique dédié au logs (typiquement SSD)
  • cache (aka L2ARC): un périphérique dédié au cache de lecture (typiquement SSD)

Ces différents vdevs peuvent être combinés ensemble pour former des raids hybrides, par exemple:

zpool create (-f) mypool mirror disk1 disk2 mirror disk3 disk4

crée un RAID1+0 à partir de 2 vdevs (2 miroirs). L’option -f est nécessaire si le pool a été créé précédemment puis supprimé.

zpool create mypool raidz disk1 disk2 disk3 log ssd1 cache ssd2 spare disk4 disk5

crée un raid hybride composé de 4 vdevs

Scrubs

Un scrub permet de lire l’entièreté des données contenues dans le pool afin de vérifier si celles-ci sont toujours consistantes et de réparer les erreurs si il y en a. La commande zpool scrub doit donc être lancée périodiquement via un cron. Une fréquence d’une fois par semaine pendant les heures creuses est suffisante.

Portabilité

Les pools peuvent être importés et exportés. Cette technique est utilisée lors des reboot: la configuration est exportée lors de l’extinction pour être ensuite importée à l’allumage. De la même manière, les disques peuvent être déplacés dans une autre machine, un simple zpool import permettra de récupérer votre pool grâce aux infos contenues dans les headers des disques.

Maintenance

Vous pouvez aisément remplacer un périphérique défectueux par un disque de remplacement (spare) grâce à la commande:

zpool replace old_dev new_dev

Les périphériques peuvent être mis « offline » (pour pouvoir travailler dessus sans que ZFS ne se mêle de ce que vous faites) ou « online » grâce aux commandes:

zpool online vdev1
zpool offline vdev1

La reconstruction d’un vdev est appelée « resilver ».
Les commandes zpool attach et zpool detach permettent d’ajouter ou de retirer des périphériques à un vdev redondant (mirror).

Augmentation de la capacité d’un pool

Un pool peut être étendu grâce à la commande

zpool add pool_name vdev

Il n’est pas encore possible de diminuer la taille d’un pool (shrink).

Propriétés

Les propriétés peuvent être affichées en exécutant la commande:

zpool get all pool_name

et modifiées avec

zpool set autoreplace=on dataset_name

Parmi les propriétés d’un pool, les plus importantes sont failmode, autoreplace et listsnapshots.
Le failmode décrit la façon dont ZFS va réagir si quelque chose se passe mal: WAIT pour attendre que le problème se répare, CONTINUE pour continuer malgré le problème, PANIC pour stopper le système.
Listsnapshots permet d’afficher ou de masquer les snapshots lors d’un zfs list (désactivé par défaut).
Autoreplace permet de remplacer automatiquement un périphérique défectueux par un spare.

Historique

zpool history dataset_name

permet d’afficher les commandes qui ont été exécutées sur le dataset.

Dimensionnement

ZFS réserve 1/64ème de la capacité des pools pour la sauvegarde de données propre au Copy-on-Write.

Les datasets

Les datasets sont des points de contrôle, ils peuvent être imbriqués et héritent des propriétés de leur parent (appelé « stub »). Pour créer un dataset, rien de plus facile:
zfs create mypool/dataset

Les ZVols

Les ZVols sont des datasets qui représentent un volume (ensemble de blocs) plutôt qu’un système de fichier. Ce volume peut être partitionné, formatté en ext ou autre, et peut être créé en « thin provisioning » (sparse). C’est utilisé dans le cas des iSCSI où l’on peut avoir besoin d’assigner un LUN composé de blocs.

Propriétés

Les propriétés peuvent être affichée avec la commande:

zfs get all pool/dataset

et modifiées avec

zfs set key=value pool/dataset
  • Disk space used vs Disk space referenced:
    L’espace disque utilisé comptabilise la quantité de données, tandis que l’espace disque référencé comprend les snapshots en plus.
  • Quota vs Reservation
    Le quota est une limite, tandis que la réservation va pré-allouer l’espace mémoire. Vous préfèrerez donc utiliser un quota pour un utilisateur simple et une réservation pour un CEO.
  • Record size
    ZFS utilise des tailles dynamiques pour les blocs, mais la taille maximum est celle spécifiée par le record size. Au-delà, les données seront fractionnées. Ce paramètre ne doit pas être modifié, à moins que vous ne fassiez du fine-tuning pour une base de données (si c’est le cas, vous préfèrerez un record size de 8k).
  • Mount point
    Définit le point de montage
  • Share NFS
    Exporte le dataset pour en faire un NFS
  • Checksum
    Il est déconseillé de le désactiver car il apporte une meilleure sécurité de l’intégrité des données et son impact sur les performances est négligeable.
  • Compression
    Permet de compresser les données
  • atime
    Garde une trace des dates d’accès aux fichiers, autrement dit ça génère des accès disques inutiles. Désactivez cette option avec la commande:

    zfs set atime=off pool_name
  • copies
    Détermine le nombre de copies à créer lors de la création de données. Utile lorsqu’on utilise un pool composé d’un seul périphérique, afin d’avoir une copie des fichiers en cas de corruption.
  • sharesmb
    Permet de partager le dataset via samba (CIFS)
  • ref_quota et ref_reservation
    Idem que pour les quotas et les réservations mais sur l’espace référencé cette fois

Les snapshots

Le snapshot crée un instantané de l’état des données au moment où il est déclenché. La restauration des données peut se faire par fichier ou par dataset complet. Le snapshot est identifié par le symbole @. De par la fonctionnalité « Copy-On-Write » de ZFS, les snapshots ne consomment pas d’espace supplémentaire. Pour prendre un snapshot, il suffit d’exécuter:

zfs snapshot pool/dataset@snapshot_name

Si la propriété snapdir est mise à « visible » (au lieu de « hidden »), vous verrez apparaître un directory .zfs contenant les dossiers des snapshots. Ces dossiers peuvent être browsés normalement (en read-only) pour récupérer des données.

# zfs snapshot -r raidpool@`date +%Y%m%d`
# zfs rename raidpool@`date +%Y%m%d` raidpool@today
# ls /mnt/raidpool
today
# zfs list -r -t snapshot
NAME                  USED  AVAIL  REFER  MOUNTPOINT
raidpool@today        128K      -   244K  -
raidpool/share1@today 244K      -  3.26G  -
# zfs list -t snapshot -o name,creation raidpool
NAME            CREATION
raidpool@today  Wed Dec 11 18:00
# zfs destroy raidpool@today
# zfs list -H -o name -t snapshot | xargs -n1 zfs destroy

Attention à la dernière commande qui supprimera tous vos snapshots!

Rollback

La fonction rollback permet de restaurer un snapshot de manière irréversible. Les snapshots plus récents seront perdus.

Clones

La fonction clones permet de créer un dataset (read-write) à partir d’un snapshot. Ce clone agit comme un dataset normal, sauf qu’il ne consomme pas d’espace. Ca peut être utile pour tester un environnement contenant d’anciennes données sans perturber les données actuelles.
Un clone peut être promu par la suite pour ne plus dépendre du dataset et avoir son propre espace disque.
Les clones peuvent être répliqués, en les transformant en data stream et en les envoyant vers un pipe:

zfs send pool/dataset@snap1 | ssh root@remote_machine zfs recv pool/dataset_backup

Ici nous avons envoyé le snapshot par ssh sur une autre machine, mais nous aurions très bien pu aussi l’envoyer vers un fichier encrypté.

Partages

ZFS permet de très facilement partager les datasets via NFS, CIFS et iSCSI en modifiant simplement le paramètre correspondant à « on ».

Monitoring I/O

2 façons de mesurer les entrées/sorties:

  • au niveau du Virtual File System (VFS) avec fsstat (le plus important)
  • au niveau des disques physiques avec iostat

Conclusion

Le système ZFS est d’une simplicité halucinante. Les mécanismes qui se cachent derrière sont le fruit d’une réflexion efficace et vont à coup sûr bouleverser les habitudes des storage admins.

Tags: ,

Trackback from your site.

Leave a comment

You must be logged in to post a comment.